import { Body, Controller, HttpCode, HttpStatus, Post, Put, Delete, UseGuards, Get, Query } from '@nestjs/common'; import { ApiBody, ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger'; import { CheckinsService } from './checkins.service'; import { CreateCheckinDto, UpdateCheckinDto, CompleteCheckinDto, RemoveCheckinDto, CheckinResponseDto, GetDailyCheckinsQueryDto, GetDailyStatusRangeQueryDto, DailyStatusItem } from './dto/checkin.dto'; import { JwtAuthGuard } from '../common/guards/jwt-auth.guard'; import { CurrentUser } from '../common/decorators/current-user.decorator'; import { AccessTokenPayload } from '../users/services/apple-auth.service'; @ApiTags('checkins') @Controller('checkins') @UseGuards(JwtAuthGuard) export class CheckinsController { constructor(private readonly checkinsService: CheckinsService) { } @Post('create') @HttpCode(HttpStatus.OK) @ApiOperation({ summary: '创建打卡' }) @ApiBody({ type: CreateCheckinDto }) @ApiResponse({ type: CheckinResponseDto }) async create(@Body() dto: CreateCheckinDto, @CurrentUser() user: AccessTokenPayload): Promise { return this.checkinsService.create(dto, user.sub); } @Put('update') @HttpCode(HttpStatus.OK) @ApiOperation({ summary: '更新打卡' }) @ApiBody({ type: UpdateCheckinDto }) @ApiResponse({ type: CheckinResponseDto }) async update(@Body() dto: UpdateCheckinDto, @CurrentUser() user: AccessTokenPayload): Promise { return this.checkinsService.update(dto, user.sub); } @Post('complete') @HttpCode(HttpStatus.OK) @ApiOperation({ summary: '完成打卡' }) @ApiBody({ type: CompleteCheckinDto }) @ApiResponse({ type: CheckinResponseDto }) async complete(@Body() dto: CompleteCheckinDto, @CurrentUser() user: AccessTokenPayload): Promise { return this.checkinsService.complete(dto, user.sub); } @Delete('remove') @HttpCode(HttpStatus.OK) @ApiOperation({ summary: '删除打卡' }) @ApiBody({ type: RemoveCheckinDto }) @ApiResponse({ type: CheckinResponseDto }) async remove(@Body() dto: RemoveCheckinDto, @CurrentUser() user: AccessTokenPayload): Promise { return this.checkinsService.remove(dto, user.sub); } @Get('daily') @HttpCode(HttpStatus.OK) @ApiOperation({ summary: '按天获取打卡列表' }) async getDaily(@Query() query: GetDailyCheckinsQueryDto, @CurrentUser() user: AccessTokenPayload): Promise { return this.checkinsService.getDaily(user.sub, query.date); } @Get('range/daily-status') @HttpCode(HttpStatus.OK) @ApiOperation({ summary: '按时间范围返回每天是否打卡' }) @ApiResponse({ description: '数组,元素含 date(YYYY-MM-DD) 与 checkedIn(boolean)' }) async getDailyStatusRange(@Query() query: GetDailyStatusRangeQueryDto, @CurrentUser() user: AccessTokenPayload): Promise> { return this.checkinsService.getDailyStatusRange(user.sub, query); } }