import { Body, Controller, Get, Patch, Req, UseGuards } from '@nestjs/common'; import { ApiBearerAuth, ApiOperation, ApiTags } from '@nestjs/swagger'; import { IsIn } from 'class-validator'; import { ApiProperty } from '@nestjs/swagger'; import type { Request } from 'express'; import { CampaignsService } from './campaigns.service'; import { JwtAuthGuard } from '../auth/jwt-auth.guard'; export class SetAvailabilityDto { @ApiProperty({ enum: ['looking', 'suspended'] }) @IsIn(['looking', 'suspended']) availability!: 'looking' | 'suspended'; } /** * The candidate's own job-seeking status. * * Deliberately NOT under /admin. A suspension exists to ask one question - "are * you still looking?" - and only the person can answer it. An operator who could * clear it for them would be answering on their behalf, which is how you end up * putting a no-show in front of a fourth company. */ @ApiTags('Availability') @ApiBearerAuth() @Controller('me/availability') @UseGuards(JwtAuthGuard) export class AvailabilityController { constructor(private readonly campaigns: CampaignsService) {} @Get() @ApiOperation({ summary: 'My job-seeking status, and the history behind it' }) async get(@Req() req: Request) { const user = req.user as { id: string }; return this.campaigns.availabilityFor(user.id); } @Patch() @ApiOperation({ summary: 'Set my job-seeking status' }) async set(@Req() req: Request, @Body() dto: SetAvailabilityDto) { const user = req.user as { id: string }; return this.campaigns.setAvailability(user.id, dto.availability); } }