package photo import ( "context" "photography-backend/internal/model" "photography-backend/internal/svc" "photography-backend/internal/types" "photography-backend/pkg/errorx" fileUtil "photography-backend/pkg/utils/file" "github.com/zeromicro/go-zero/core/logx" ) type DeletePhotoLogic struct { logx.Logger ctx context.Context svcCtx *svc.ServiceContext } // 删除照片 func NewDeletePhotoLogic(ctx context.Context, svcCtx *svc.ServiceContext) *DeletePhotoLogic { return &DeletePhotoLogic{ Logger: logx.WithContext(ctx), ctx: ctx, svcCtx: svcCtx, } } func (l *DeletePhotoLogic) DeletePhoto(req *types.DeletePhotoRequest) (resp *types.DeletePhotoResponse, err error) { // 1. 获取当前用户ID (从JWT中间件获取) userID := l.ctx.Value("userID") if userID == nil { return nil, errorx.NewWithCode(errorx.AuthError) } currentUserID := userID.(int64) // 2. 查询照片是否存在 photo, err := l.svcCtx.PhotoModel.FindOne(l.ctx, req.Id) if err != nil { if err == model.ErrNotFound { return nil, errorx.NewWithCode(errorx.PhotoNotFound) } logx.Errorf("查询照片失败: %v", err) return nil, errorx.NewWithCode(errorx.ServerError) } // 3. 检查权限 - 只有照片所有者可以删除 if photo.UserId != currentUserID { return nil, errorx.NewWithCode(errorx.Forbidden) } // 4. 删除数据库记录 err = l.svcCtx.PhotoModel.Delete(l.ctx, req.Id) if err != nil { logx.Errorf("删除照片记录失败: %v", err) return nil, errorx.NewWithCode(errorx.ServerError) } // 5. 删除文件系统中的文件 // 删除原图 if photo.FilePath != "" { if err := fileUtil.DeleteFile(photo.FilePath); err != nil { logx.Errorf("删除原图文件失败: %v", err) // 注意:即使文件删除失败,我们也不回滚数据库操作,因为文件可能已经被手动删除 } } // 删除缩略图 if photo.ThumbnailPath != "" { if err := fileUtil.DeleteFile(photo.ThumbnailPath); err != nil { logx.Errorf("删除缩略图文件失败: %v", err) // 注意:即使文件删除失败,我们也不回滚数据库操作 } } // 6. 返回成功响应 return &types.DeletePhotoResponse{ BaseResponse: types.BaseResponse{ Code: errorx.Success, Message: "照片删除成功", }, }, nil }