api-server/src/modules/review/admin-review.controller.ts

47 lines
1.5 KiB
TypeScript
Raw Normal View History

import { Controller, Get, Query, UseGuards } from '@nestjs/common';
import { ApiTags, ApiBearerAuth, ApiOperation, ApiQuery } from '@nestjs/swagger';
import { PrismaService } from '../../infrastructure/database/prisma.service';
import { AdminAuthGuard } from '../../common/guards/admin-auth.guard';
import { AdminRolesGuard } from '../../common/guards/admin-roles.guard';
@ApiTags('admin-review')
@ApiBearerAuth()
@Controller('admin-api/reviews')
@UseGuards(AdminAuthGuard, AdminRolesGuard)
export class AdminReviewController {
constructor(private readonly prisma: PrismaService) {}
@Get()
@ApiOperation({ summary: '复习卡片列表Admin' })
@ApiQuery({ name: 'search', required: false })
@ApiQuery({ name: 'status', required: false })
@ApiQuery({ name: 'page', required: false })
@ApiQuery({ name: 'limit', required: false })
async list(
@Query('search') search?: string,
@Query('status') status?: string,
@Query('page') page?: string,
@Query('limit') limit?: string,
) {
const take = Math.min(Number(limit) || 20, 100);
const skip = (Math.max(Number(page) || 1, 1) - 1) * take;
const where: any = {};
if (status) where.status = status;
if (search) {
where.frontText = { contains: search };
}
const [items, total] = await Promise.all([
this.prisma.reviewCard.findMany({
where,
orderBy: { createdAt: 'desc' },
take,
skip,
}),
this.prisma.reviewCard.count({ where }),
]);
return { items, total };
}
}