public void UpdateThreadTags(ThreadUpdateTags input) { // check user and permissions Session.EnsureAuthenticated(); var threadModel = _threadRepository.Find(input.Id); var tags = _threadRepository.GetAll().Where(x => x.Id == input.Id) .SelectMany(x => x.Tags).ToList(); // tags if (input.Tags != null && input.Tags.Length > 0) { // remove removed tags tags.RemoveAll(x => input.Tags.Select(y => y.Id).Contains(x.TagId) == false); // add new existing tags var newExistingTags = input.Tags.Where(x => x.Id.HasValue && tags.Select(y => y.TagId).Contains(x.Id.Value) == false); tags.AddRange(newExistingTags.Select(x => new Entities.ThreadTag { Id = Guid.NewGuid(), TagId = x.Id.Value, })); // add new not-existing tags var newNotExistingTags = input.Tags.Where(x => x.Id.HasValue == false); var newNotExistingTagEntities = newNotExistingTags .Select(x => new Entities.Tag { Id = Guid.NewGuid(), CreatedAt = DateTime.UtcNow, CreatedByUserId = Session.AuthenticatedUserId.Value, Name = x.Name }) .ToArray(); _tagRepository.BatchInsert(newNotExistingTagEntities); tags.AddRange(newNotExistingTagEntities.Select(x => new Entities.ThreadTag { Id = Guid.NewGuid(), TagId = x.Id, })); } else { tags.RemoveAll(x => true); } threadModel.Tags = tags; threadModel.UpdatedAt = DateTime.UtcNow; threadModel.UpdatedByUserId = Session.AuthenticatedUserId.Value; _threadRepository.Update(threadModel); }
public IActionResult UpdateThreadTags([FromBody] ThreadUpdateTags input) { _threadService.UpdateThreadTags(input); return(Ok()); }