47 lines
1.5 KiB
TypeScript
47 lines
1.5 KiB
TypeScript
|
|
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 };
|
|||
|
|
}
|
|||
|
|
}
|