feat(diet-records): 新增营养成分分析记录删除功能
添加删除营养成分分析记录的API端点,支持软删除机制 - 新增DELETE /nutrition-analysis-records/:id接口 - 添加DeleteNutritionAnalysisRecordResponseDto响应DTO - 在NutritionAnalysisService中实现deleteAnalysisRecord方法 - 包含完整的权限验证和错误处理逻辑
This commit is contained in:
@@ -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 { CreateDietRecordDto, UpdateDietRecordDto, GetDietHistoryQueryDto, DietRecordResponseDto, DietHistoryResponseDto, NutritionSummaryDto, FoodRecognitionRequestDto, FoodRecognitionResponseDto, FoodRecognitionToDietRecordsResponseDto } from '../users/dto/diet-record.dto';
|
||||||
import { NutritionAnalysisResponseDto } from './dto/nutrition-analysis.dto';
|
import { NutritionAnalysisResponseDto } from './dto/nutrition-analysis.dto';
|
||||||
import { NutritionAnalysisRequestDto } from './dto/nutrition-analysis-request.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 { JwtAuthGuard } from '../common/guards/jwt-auth.guard';
|
||||||
import { CurrentUser } from '../common/decorators/current-user.decorator';
|
import { CurrentUser } from '../common/decorators/current-user.decorator';
|
||||||
import { AccessTokenPayload } from '../users/services/apple-auth.service';
|
import { AccessTokenPayload } from '../users/services/apple-auth.service';
|
||||||
@@ -264,4 +264,35 @@ export class DietRecordsController {
|
|||||||
return NutritionAnalysisRecordsResponseDto.createError('获取营养成分分析记录失败,请稍后重试');
|
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<DeleteNutritionAnalysisRecordResponseDto> {
|
||||||
|
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('删除营养分析记录失败,请稍后重试');
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -122,4 +122,27 @@ export class GetNutritionAnalysisRecordsQueryDto {
|
|||||||
@IsOptional()
|
@IsOptional()
|
||||||
@IsString()
|
@IsString()
|
||||||
status?: string;
|
status?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除营养分析记录响应DTO
|
||||||
|
*/
|
||||||
|
export class DeleteNutritionAnalysisRecordResponseDto extends ApiResponseDto<null> {
|
||||||
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -428,4 +428,30 @@ export class NutritionAnalysisService {
|
|||||||
totalPages,
|
totalPages,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除营养成分分析记录(软删除)
|
||||||
|
* @param userId 用户ID
|
||||||
|
* @param recordId 记录ID
|
||||||
|
* @returns 删除结果
|
||||||
|
*/
|
||||||
|
async deleteAnalysisRecord(userId: string, recordId: number): Promise<boolean> {
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user