private async Task <Unit> TryToHandle(LeaveGroupCommand request) { User user = await _context.Users.FindAsync(request.UserId) ?? throw new InvalidCommandException($"El usuario con id {request.UserId} no existe"); Group group = await _context.Groups.Include(group1 => group1.Admin).FirstOrDefaultAsync(g => g.Id == request.GroupId) ?? throw new InvalidCommandException($"El grupo con id {request.GroupId} no existe"); if (group.Admin.Id == request.UserId) { throw new InvalidCommandException("El administrador no puede irse del grupo"); } Domain.Membership membership = await _context.Memberships.FirstOrDefaultAsync(m => m.Group.Id == group.Id && m.User.Id == user.Id) ?? throw new InvalidCommandException($"Usuario no es parte del grupo"); group.Memberships.Remove(membership); _context.Memberships.Remove(membership); var toDelete = _context.Participants.Where(p => p.Purchase.Group.Id == group.Id && p.UserId == user.Id); _context.Participants.RemoveRange(toDelete); var cantLeave = _context.Purchases.Any(p => p.Purchaser.Id == user.Id && p.Group.Id == group.Id); if (cantLeave) { throw new InvalidCommandException("No te podes ir del grupo si compraste algo"); } await _context.SaveChangesAsync(); return(Unit.Value); }
private async Task <Domain.Membership> GetMemberships(int userId, Group group) { User user = await _context.Users.FindAsync(userId) ?? throw new InvalidCommandException($"Miembro del grupo con id {userId} no existe"); Domain.Membership membership = await _context.Memberships.FirstOrDefaultAsync(mem => mem.UserId == user.Id && group.Id == mem.GroupId); return(membership ?? new Domain.Membership() { User = user, UserId = user.Id, Group = group, GroupId = group.Id }); }