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;
}
}