public async Task <ActionResult> UpdateGroupRoom(int roomId, [FromBody] JsonPatchDocument <GroupRoomUpdateModel> patchDoc) { var userId = _identityService.GetUserIdentity(); var roomResult = await _roomsService.GetAsync(roomId); if (roomResult.Succeeded) { return(BadRequest(roomResult.Errors)); } var room = roomResult.Data; if (room.Type == RoomType.Private) { var errors = new[] { "Unable to update private room." }; return(BadRequest(errors)); } var groupRoom = room as GroupRoomModel; var updateModel = GroupRoomUpdateModel.From(groupRoom); patchDoc.ApplyTo(updateModel); TryValidateModel(updateModel); if (!ModelState.IsValid) { var validationErrors = ModelState .Keys .SelectMany(k => ModelState[k].Errors) .Select(e => e.ErrorMessage) .ToArray(); return(BadRequest(validationErrors)); } var updateResult = await _groupRoomsService.UpdateAsync(roomId, updateModel, userId); if (!updateResult.Succeeded) { return(BadRequest(updateResult.Errors)); } return(Ok()); }
public async Task <Result> UpdateAsync(int roomId, GroupRoomUpdateModel model, string callerId) { var room = await _context.Set <GroupRoom>() .Include(r => r.Members) .SingleOrDefaultAsync(r => r.Id == roomId); if (room is null) { var error = Errors.GroupRoomNotFound(roomId); return(Result.Failure(error)); } if (room.OwnerId != model.OwnerId) { if (room.OwnerId != callerId) { var error = Errors.MemberMustBeGroupRoomOwner(roomId, callerId); return(Result.Failure(error)); } var newOwnerIsMember = room.Members.Any(r => r.UserId == model.OwnerId); if (!newOwnerIsMember) { var error = Errors.MemberNotFound(roomId, model.OwnerId); return(Result.Failure(error)); } room.OwnerId = model.OwnerId; } room.Name = model.Name; var roomUpdatedEvent = new GroupRoomUpdatedIntegrationEvent(roomId, room.Name, room.OwnerId); await _integrationEventService.SaveEventsAndUsersContextChangesAsync(roomUpdatedEvent); await _integrationEventService.PublishThroughEventBusAsync(roomUpdatedEvent); return(Result.Success); }