public IActionResult UpdateArticle(ArticleModel model) { if (ModelState.IsValid) { using (var db = new FusekiContext()) { var article = db.Articles .Include(aa => aa.Tags) .First(el => el.Id == model.Id); //allow extended chars in title. But links and finding will strip them. article.Title = model.Title; var normalized = Renderer.Normalize(model.Body); article.Body = normalized; var now = DateTime.Now; article.Updated = now; if (article.Created == DateTime.MinValue) { article.Created = now; } //rectify tags. var empty = new List <string>(); var tags = model.Tags?.Split(",").Select(el => el.Trim()) ?? new string[0]; var newTagNames = tags .Select(el => el.Trim()) .Where(ee => !string.IsNullOrWhiteSpace(ee)) .ToHashSet(); var existingTags = article.Tags.Select(el => el.Name).ToHashSet(); var todelete = existingTags.Except(newTagNames); var toadd = newTagNames.Except(existingTags); foreach (var bad in todelete) { var tag = db.Tags.Where(el => el.ArticleId == article.Id && el.Name == bad).First(); db.Remove(tag); } foreach (var good in toadd) { var tag = CreateTag(article, good); db.Add(tag); } db.SaveChanges(); return(Redirect($"../{model.Title}")); } } else { return(View()); } }
public IActionResult SetTags(int id, string tagLine = "") { if (string.IsNullOrEmpty(tagLine)) { tagLine = ""; } var newTags = Helpers.TagLine2Tags(tagLine); var didSomething = false; var result = ""; using (var db = new FusekiContext()) { var image = db.Images .Include(el => el.ImageTags) .FirstOrDefault(el => el.Id == id); var exiTags = image.ImageTags ?? new List <ImageTag>(); //exiTags = new List<ImageTag>(); var toDelete = new List <ImageTag>(); foreach (var tag in newTags) { if (exiTags.FirstOrDefault(el => el.Name == tag) == null) { var newImageTag = new ImageTag(); newImageTag.Image = image; newImageTag.Name = tag; db.Add(newImageTag); didSomething = true; result += $"\ncreated new tag for image: {tag}"; } } foreach (var exiTag in exiTags) { if (newTags.FirstOrDefault(el => el == exiTag.Name) == null) { db.Remove(exiTag); didSomething = true; result += $"\nremoved old tag on image: {exiTag.Name}"; } } if (didSomething) { db.SaveChanges(); } } var arm = new ActionResultModel(); arm.NextLink = "/image/viewall"; arm.NextLinkDescription = "back to image list"; arm.SetResult(result); return(View("ActionResult", arm)); }