File size: 2,329 Bytes
d5ba26c
fe607c0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d5ba26c
 
 
 
 
 
 
 
 
 
 
 
 
fe607c0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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);
  }
}