using AutoMapper; using ContactService.Domain; using ContactService.WebApi.Application.Dtos; using IM.Commons; namespace ContactService.WebApi.Application.FriendRequest { public class FriendRequestService { private readonly IFriendRequestReposity reposity; private readonly FriendRequestDomainService service; private readonly IMapper mapper; public FriendRequestService(IFriendRequestReposity reposity, FriendRequestDomainService service, IMapper mapper) { this.reposity = reposity; this.service = service; this.mapper = mapper; } public async Task> CreateAsync(CreateFriendRequestCommand command) { var request = await service.CreateAsync(command.ownerId, command.targetId, command.description, command.remarkName); if (!request.Succeeded) { return Result.Fail(request); } return Result.Success(mapper.Map(request.Data)); } public async Task> UpdateStatusAsync(FriendRequestHandleCommand command) { var request = await reposity.FindByIdAsync(command.RequestId); if (request == null) { return Result.Fail(ResultCode.FRIEND_REQUEST_NOT_FOUND); } if (request.TargetId != command.UserId) { return Result.Fail(ResultCode.PERMISSION_DENIED); } switch (command.Action) { case FriendRequestAction.Accpet: request.Accept(command.RemarkName); break; case FriendRequestAction.Block: request.Block(); break; case FriendRequestAction.Reject: request.Reject(); break; default: return Result.Fail(ResultCode.PARAMETER_ERROR); } return Result.Success(mapper.Map(request)); } public async Task>> GetByOwnerIdAsync(Guid ownerId) { var requests = await reposity.FindByOwnerIdAsync(ownerId); return Result>.Success(mapper.Map>(requests)); } public async Task>> GetByTargetIdAsync(Guid targetId) { var requests = await reposity.FindByTargetIdAsync(targetId); return Result>.Success(mapper.Map>(requests)); } public async Task>> GetByTargetIdOrOwnerIdAsync(Guid id) { var requests = await reposity.FindByTargetIdAsync(id); var requests2 = await reposity.FindByOwnerIdAsync(id); return Result>.Success(mapper.Map>(requests.Concat(requests2))); } } }