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()); }
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()); }