import { Controller, Get, HttpCode, Post, Query, UseGuards } from '@nestjs/common'; import { ApiBearerAuth, ApiOperation, ApiQuery, ApiTags } from '@nestjs/swagger'; import { JwtAuthGuard } from '../auth/jwt-auth.guard'; import { RolesGuard } from '../auth/roles.guard'; import { Roles } from '../auth/roles.decorator'; import { AdminUserQuery, UsersAdminService } from './users-admin.service'; /** * Who is on the platform. * * Guarded the same way every other admin surface is - JWT plus RolesGuard, * which reads the role from the database on each request, so a token issued * before somebody was demoted does not still open this. */ @ApiTags('Admin: users') @Controller('admin/users') @UseGuards(JwtAuthGuard, RolesGuard) @Roles('admin') @ApiBearerAuth() export class UsersAdminController { constructor(private readonly admin: UsersAdminService) {} /** * Fill in signup dates for accounts that predate the column. * * POST because it writes, even though it takes no body. Idempotent — it only * touches rows that are still NULL — so running it twice is harmless. */ @Post('backfill-signup-dates') @HttpCode(200) @ApiOperation({ summary: 'Recover signup dates for accounts created before they were recorded' }) backfillSignupDates() { return this.admin.backfillSignupDates(); } @Get('stats') @ApiOperation({ summary: 'Headline counts for the user base' }) stats() { return this.admin.stats(); } @Get() @ApiOperation({ summary: 'List users, filtered and sorted' }) @ApiQuery({ name: 'page', required: false, type: Number }) @ApiQuery({ name: 'limit', required: false, type: Number }) @ApiQuery({ name: 'search', required: false }) @ApiQuery({ name: 'sort', required: false, enum: ['newest', 'oldest', 'active', 'inactive', 'name'] }) @ApiQuery({ name: 'activity', required: false, enum: ['all', 'active', 'inactive', 'never'] }) @ApiQuery({ name: 'source', required: false, enum: ['all', 'campaign', 'direct'] }) @ApiQuery({ name: 'verified', required: false, enum: ['all', 'yes', 'no'] }) @ApiQuery({ name: 'availability', required: false, enum: ['all', 'looking', 'suspended'] }) @ApiQuery({ name: 'role', required: false, enum: ['all', 'admin', 'candidate'] }) list(@Query() query: AdminUserQuery) { return this.admin.list(query); } }