using BuildFlow.Shared.Domain.Common; using File.Application.Features.Folders.Commands; using File.Domain.Exceptions; using File.Infrastructure.Persistence; using MediatR; namespace File.Application.Features.Folders.Handlers; /// 移动文件命令处理器。校验目标文件夹归属与文件归属后改挂。 public class MoveFileCommandHandler(FileDbContext db, ICurrentUserContext currentUser) : IRequestHandler { public async Task Handle(MoveFileCommand req, CancellationToken ct) { var owner = currentUser.GetRequiredUserId(); if (req.TargetFolderId is not null) { var target = await db.Folders.FirstOrDefaultAsync(f => f.Id == req.TargetFolderId, ct); if (target is null) throw new NotFoundException("目标文件夹不存在"); if (target.OwnerId != owner) throw new ForbiddenException("无权访问目标文件夹"); } var file = await db.Files.FirstOrDefaultAsync(f => f.Id == req.Id && f.OwnerId == owner, ct) ?? throw new NotFoundException("文件不存在或无权操作"); file.FolderId = req.TargetFolderId; await db.SaveChangesAsync(ct); return Unit.Value; } }