Ejemplo n.º 1
0
        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);
        }