From 66a9e65d9b22dcd78152f6954873ee33ffdd3d7e Mon Sep 17 00:00:00 2001 From: richarjiang Date: Thu, 16 Oct 2025 16:43:42 +0800 Subject: [PATCH] =?UTF-8?q?feat(diet-records):=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E8=90=A5=E5=85=BB=E6=88=90=E5=88=86=E5=88=86=E6=9E=90=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=E5=88=A0=E9=99=A4=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加删除营养成分分析记录的API端点,支持软删除机制 - 新增DELETE /nutrition-analysis-records/:id接口 - 添加DeleteNutritionAnalysisRecordResponseDto响应DTO - 在NutritionAnalysisService中实现deleteAnalysisRecord方法 - 包含完整的权限验证和错误处理逻辑 --- src/diet-records/diet-records.controller.ts | 33 ++++++++++++++++++- .../dto/nutrition-analysis-record.dto.ts | 23 +++++++++++++ .../services/nutrition-analysis.service.ts | 26 +++++++++++++++ 3 files changed, 81 insertions(+), 1 deletion(-) diff --git a/src/diet-records/diet-records.controller.ts b/src/diet-records/diet-records.controller.ts index 3e1e373..6dbb231 100644 --- a/src/diet-records/diet-records.controller.ts +++ b/src/diet-records/diet-records.controller.ts @@ -19,7 +19,7 @@ import { NutritionAnalysisService } from './services/nutrition-analysis.service' import { CreateDietRecordDto, UpdateDietRecordDto, GetDietHistoryQueryDto, DietRecordResponseDto, DietHistoryResponseDto, NutritionSummaryDto, FoodRecognitionRequestDto, FoodRecognitionResponseDto, FoodRecognitionToDietRecordsResponseDto } from '../users/dto/diet-record.dto'; import { NutritionAnalysisResponseDto } from './dto/nutrition-analysis.dto'; import { NutritionAnalysisRequestDto } from './dto/nutrition-analysis-request.dto'; -import { NutritionAnalysisRecordsResponseDto, GetNutritionAnalysisRecordsQueryDto, NutritionAnalysisRecordDto } from './dto/nutrition-analysis-record.dto'; +import { NutritionAnalysisRecordsResponseDto, GetNutritionAnalysisRecordsQueryDto, NutritionAnalysisRecordDto, DeleteNutritionAnalysisRecordResponseDto } from './dto/nutrition-analysis-record.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'; @@ -264,4 +264,35 @@ export class DietRecordsController { return NutritionAnalysisRecordsResponseDto.createError('获取营养成分分析记录失败,请稍后重试'); } } + + /** + * 删除营养成分分析记录 + */ + @UseGuards(JwtAuthGuard) + @Delete('nutrition-analysis-records/:id') + @HttpCode(HttpStatus.OK) + @ApiOperation({ summary: '删除营养成分分析记录' }) + @ApiResponse({ status: 200, description: '成功删除营养成分分析记录', type: DeleteNutritionAnalysisRecordResponseDto }) + @ApiResponse({ status: 404, description: '营养分析记录不存在' }) + async deleteNutritionAnalysisRecord( + @Param('id') recordId: string, + @CurrentUser() user: AccessTokenPayload, + ): Promise { + this.logger.log(`删除营养成分分析记录 - 用户ID: ${user.sub}, 记录ID: ${recordId}`); + + try { + const success = await this.nutritionAnalysisService.deleteAnalysisRecord(user.sub, parseInt(recordId)); + + if (!success) { + this.logger.warn(`删除营养成分分析记录失败 - 用户ID: ${user.sub}, 记录ID: ${recordId}, 记录不存在或无权限`); + return DeleteNutritionAnalysisRecordResponseDto.createError('营养分析记录不存在或无权限删除'); + } + + this.logger.log(`营养成分分析记录删除成功 - 用户ID: ${user.sub}, 记录ID: ${recordId}`); + return DeleteNutritionAnalysisRecordResponseDto.createSuccess(); + } catch (error) { + this.logger.error(`删除营养成分分析记录失败 - 用户ID: ${user.sub}, 记录ID: ${recordId}, 错误: ${error instanceof Error ? error.message : String(error)}`); + return DeleteNutritionAnalysisRecordResponseDto.createError('删除营养分析记录失败,请稍后重试'); + } + } } \ No newline at end of file diff --git a/src/diet-records/dto/nutrition-analysis-record.dto.ts b/src/diet-records/dto/nutrition-analysis-record.dto.ts index 73e58bc..8c8c729 100644 --- a/src/diet-records/dto/nutrition-analysis-record.dto.ts +++ b/src/diet-records/dto/nutrition-analysis-record.dto.ts @@ -122,4 +122,27 @@ export class GetNutritionAnalysisRecordsQueryDto { @IsOptional() @IsString() status?: string; +} + +/** + * 删除营养分析记录响应DTO + */ +export class DeleteNutritionAnalysisRecordResponseDto extends ApiResponseDto { + constructor(code: number, message: string) { + super(code, message, null); + } + + /** + * 创建成功响应 + */ + static createSuccess(message: string = '删除营养分析记录成功'): DeleteNutritionAnalysisRecordResponseDto { + return new DeleteNutritionAnalysisRecordResponseDto(0, message); + } + + /** + * 创建失败响应 + */ + static createError(message: string = '删除营养分析记录失败'): DeleteNutritionAnalysisRecordResponseDto { + return new DeleteNutritionAnalysisRecordResponseDto(1, message); + } } \ No newline at end of file diff --git a/src/diet-records/services/nutrition-analysis.service.ts b/src/diet-records/services/nutrition-analysis.service.ts index b0c470e..73519b2 100644 --- a/src/diet-records/services/nutrition-analysis.service.ts +++ b/src/diet-records/services/nutrition-analysis.service.ts @@ -428,4 +428,30 @@ export class NutritionAnalysisService { totalPages, }; } + + /** + * 删除营养成分分析记录(软删除) + * @param userId 用户ID + * @param recordId 记录ID + * @returns 删除结果 + */ + async deleteAnalysisRecord(userId: string, recordId: number): Promise { + try { + const record = await this.nutritionAnalysisRecordModel.findOne({ + where: { id: recordId, userId, deleted: false } + }); + + if (!record) { + this.logger.warn(`未找到要删除的营养分析记录 - 用户ID: ${userId}, 记录ID: ${recordId}`); + return false; + } + + await record.update({ deleted: true }); + this.logger.log(`营养分析记录已删除 - 用户ID: ${userId}, 记录ID: ${recordId}`); + return true; + } catch (error) { + this.logger.error(`删除营养分析记录失败 - 用户ID: ${userId}, 记录ID: ${recordId}, 错误: ${error instanceof Error ? error.message : String(error)}`); + return false; + } + } } \ No newline at end of file