import { Controller, Get, Post, Put, Delete, Body, Query, UseGuards, Logger } from '@nestjs/common'; import { ApiTags, ApiOperation, ApiResponse, ApiBearerAuth } from '@nestjs/swagger'; import { MoodCheckinsService } from './mood-checkins.service'; import { CreateMoodCheckinDto, UpdateMoodCheckinDto, RemoveMoodCheckinDto, MoodCheckinResponseDto, GetMoodCheckinsQueryDto, GetMoodHistoryQueryDto, MoodStatistics } from './dto/mood-checkin.dto'; import { JwtAuthGuard } from '../common/guards/jwt-auth.guard'; import { CurrentUser } from '../common/decorators/current-user.decorator'; import { AccessTokenPayload } from 'src/users/services/apple-auth.service'; @ApiTags('心情打卡') @ApiBearerAuth() @UseGuards(JwtAuthGuard) @Controller('mood-checkins') export class MoodCheckinsController { private readonly logger = new Logger(MoodCheckinsController.name); constructor(private readonly moodCheckinsService: MoodCheckinsService) { } @Post() @ApiOperation({ summary: '创建心情打卡' }) @ApiResponse({ status: 201, description: '心情打卡创建成功', type: MoodCheckinResponseDto }) @ApiResponse({ status: 400, description: '请求参数错误' }) @ApiResponse({ status: 401, description: '未授权' }) async create( @Body() createMoodCheckinDto: CreateMoodCheckinDto, @CurrentUser() user: AccessTokenPayload, ): Promise { this.logger.log(`用户 ${user.sub} 创建心情打卡: ${JSON.stringify(createMoodCheckinDto)}`); return this.moodCheckinsService.create(createMoodCheckinDto, user.sub); } @Put() @ApiOperation({ summary: '更新心情打卡' }) @ApiResponse({ status: 200, description: '心情打卡更新成功', type: MoodCheckinResponseDto }) @ApiResponse({ status: 400, description: '请求参数错误' }) @ApiResponse({ status: 401, description: '未授权' }) @ApiResponse({ status: 403, description: '无权操作' }) @ApiResponse({ status: 404, description: '记录不存在' }) async update( @Body() updateMoodCheckinDto: UpdateMoodCheckinDto, @CurrentUser() user: AccessTokenPayload, ): Promise { this.logger.log(`用户 ${user.sub} 更新心情打卡: ${JSON.stringify(updateMoodCheckinDto)}`); return this.moodCheckinsService.update(updateMoodCheckinDto, user.sub); } @Delete() @ApiOperation({ summary: '删除心情打卡' }) @ApiResponse({ status: 200, description: '心情打卡删除成功', type: MoodCheckinResponseDto }) @ApiResponse({ status: 401, description: '未授权' }) @ApiResponse({ status: 403, description: '无权操作' }) @ApiResponse({ status: 404, description: '记录不存在' }) async remove( @Body() removeMoodCheckinDto: RemoveMoodCheckinDto, @CurrentUser() user: AccessTokenPayload, ): Promise { this.logger.log(`用户 ${user.sub} 删除心情打卡: ${removeMoodCheckinDto.id}`); return this.moodCheckinsService.remove(removeMoodCheckinDto, user.sub); } @Get('daily') @ApiOperation({ summary: '获取每日心情打卡' }) @ApiResponse({ status: 200, description: '获取成功', type: MoodCheckinResponseDto }) @ApiResponse({ status: 400, description: '日期格式错误' }) @ApiResponse({ status: 401, description: '未授权' }) async getDaily( @Query() query: GetMoodCheckinsQueryDto, @CurrentUser() user: AccessTokenPayload, ): Promise { this.logger.log(`用户 ${user.sub} 获取每日心情打卡: ${query.date || '今天'}`); return this.moodCheckinsService.getDaily(user.sub, query.date); } @Get('history') @ApiOperation({ summary: '获取心情打卡历史' }) @ApiResponse({ status: 200, description: '获取成功', type: MoodCheckinResponseDto }) @ApiResponse({ status: 400, description: '日期范围错误' }) @ApiResponse({ status: 401, description: '未授权' }) async getHistory( @Query() query: GetMoodHistoryQueryDto, @CurrentUser() user: AccessTokenPayload, ): Promise { this.logger.log(`用户 ${user.sub} 获取心情打卡历史: ${query.startDate} - ${query.endDate}`); return this.moodCheckinsService.getHistory(user.sub, query); } @Get('statistics') @ApiOperation({ summary: '获取心情统计数据' }) @ApiResponse({ status: 200, description: '获取成功', type: MoodCheckinResponseDto }) @ApiResponse({ status: 400, description: '日期范围错误' }) @ApiResponse({ status: 401, description: '未授权' }) async getStatistics( @Query('startDate') startDate: string, @Query('endDate') endDate: string, @CurrentUser() user: AccessTokenPayload, ): Promise> { this.logger.log(`用户 ${user.sub} 获取心情统计: ${startDate} - ${endDate}`); return this.moodCheckinsService.getStatistics(user.sub, startDate, endDate); } }