예제 #1
0
        public async Task <UpdateTopicOperationResponse> Execute(UpdateTopicOperationRequest request)
        {
            var topic = await _topicRepository.GetByIdAsync(request.NewTopic.Id);

            if (topic == null)
            {
                throw new ApplicationException("Topic not found");
            }

            if (request.NewTopic.ParentTopicId.HasValue)
            {
                await EnsureNewParentIsNotChild(request.NewTopic.Id, request.NewTopic.ParentTopicId.Value);
            }

            bool versionsMatch =
                topic.Subject == request.OldTopic.Subject &&
                topic.Description == request.OldTopic.Description &&
                topic.ParentTopicId == request.OldTopic.ParentTopicId;

            if (!versionsMatch)
            {
                return(new UpdateTopicOperationResponse
                {
                    UpdatedTopic = MapTopic(topic)
                });
            }

            topic.ParentTopicId = request.NewTopic.ParentTopicId;
            topic.Description   = request.NewTopic.Description;
            topic.Subject       = request.NewTopic.Subject;

            try
            {
                await _topicRepository.UpdateAsync(topic);
            }
            catch (DbUpdateConcurrencyException ex)
            {
                //optimistic locking
                return(new UpdateTopicOperationResponse
                {
                    UpdatedTopic = MapTopic(topic)
                });
            }

            return(new UpdateTopicOperationResponse());
        }
예제 #2
0
        public async Task <IActionResult> UpdateTopic(UpdateTopicModel model)
        {
            var updateRequest = new UpdateTopicOperationRequest
            {
                NewTopic = new UpdateTopicOperationRequest.Topic
                {
                    Id            = model.NewTopic.TopicId,
                    ParentTopicId = model.NewTopic.ParentTopicId,
                    Description   = model.NewTopic.Description,
                    Subject       = model.NewTopic.Subject
                },
                OldTopic = new UpdateTopicOperationRequest.Topic
                {
                    Id            = model.OldTopic.TopicId,
                    ParentTopicId = model.OldTopic.ParentTopicId,
                    Description   = model.OldTopic.Description,
                    Subject       = model.OldTopic.Subject
                },
            };
            UpdateTopicOperationResponse response;

            try
            {
                response = await _updateTopicOperation.Execute(updateRequest);
            }
            catch (ApplicationException ex)
            {
                return(BadRequest(new ErrorModel(ex.Message)));
            }

            if (response.UpdatedTopic != null)
            {
                return(Conflict(new UpdateTopicResponseModel(response.UpdatedTopic)));
            }

            return(Ok());
        }