public async Task <IActionResult> Create(ProjectEntryViewModel model)
        {
            if (!ModelState.IsValid)
            {
                return(View(model));
            }

            var entry = new ProjectEntry();

            ParseModel(entry, model);

            foreach (var tag in model.TopicTagEntries)
            {
                entry.TopicTagEntries.Add(_context.TopicTags.Any(tt => tt.Title == tag)
                    ? new TopicTagEntry {
                    ProjectEntry = entry, TopicTag = _context.TopicTags.Single(tt => tt.Title == tag)
                }
                    : new TopicTagEntry
                {
                    ProjectEntry = entry, TopicTag = new TopicTag {
                        Title = tag
                    }
                });
            }

            await _context.ProjectEntries.AddAsync(entry);

            await _context.SaveChangesAsync();

            return(RedirectToAction("Index", new { slug = entry.Slug }));
        }
        public async void ParseModel(ProjectEntry entry, ProjectEntryViewModel model)
        {
            entry.Title            = model.Title;
            entry.RepositorySource = model.RepositorySource;
            entry.LanguageImage    = model.LanguageImage;
            entry.Summary          = model.Summary;
            entry.Description      = model.Description;

            if (entry.DateCreated == default(DateTime))
            {
                entry.DateCreated = DateTime.Now;
            }
            else
            {
                entry.LastModified = DateTime.Now;
            }
            if (entry.TopicTagEntries == null)
            {
                entry.TopicTagEntries = new List <TopicTagEntry>();
            }

            entry.Slug = !string.IsNullOrWhiteSpace(model.Slug) ?
                         model.Slug : entry.Title.GenerateSlug();

            if (model.ProjectImageFile == null)
            {
                entry.ProjectImage = model.LanguageImage;
            }
            else
            {
                var projectImgRoot = Path.Combine(_hostingEnvironment.WebRootPath, "img", "projects");
                if (!string.IsNullOrWhiteSpace(entry.ProjectImage) && entry.ProjectImage != entry.LanguageImage)
                {
                    var delPath = Path.Combine(projectImgRoot, entry.ProjectImage);
                    if (System.IO.File.Exists(delPath))
                    {
                        System.IO.File.Delete(delPath);
                    }
                }

                var filenameSplitter = model.ProjectImageFile.FileName.Split('.');
                var filename         = $"{model.Slug}-{Guid.NewGuid().ToString()}.{filenameSplitter.Last()}";
                var path             = Path.Combine(projectImgRoot, filename);

                using (var stream = new FileStream(path, FileMode.Create))
                    await model.ProjectImageFile.CopyToAsync(stream);

                entry.ProjectImage = filename;
            }
        }
        public async Task <IActionResult> Modify(ProjectEntryViewModel model)
        {
            if (!ModelState.IsValid)
            {
                return(View(model));
            }

            var entry = await _context.ProjectEntries
                        .Include(pe => pe.TopicTagEntries)
                        .ThenInclude(tte => tte.TopicTag)
                        .FirstOrDefaultAsync(pe => pe.ID == model.ID);

            if (entry == default(ProjectEntry))
            {
                return(RedirectToAction("NoResource", "Error"));
            }

            ParseModel(entry, model);

            foreach (var tag in model.TopicTagEntries.Where(tte => entry.TopicTagEntries.All(tt => tt.TopicTag.Title != tte)))
            {
                entry.TopicTagEntries.Add(_context.TopicTags.Any(tt => tt.Title == tag)
                    ? new TopicTagEntry {
                    ProjectEntry = entry, TopicTag = _context.TopicTags.Single(tt => tt.Title == tag)
                }
                    : new TopicTagEntry
                {
                    ProjectEntry = entry, TopicTag = new TopicTag {
                        Title = tag
                    }
                });
            }

            foreach (var tag in entry.TopicTagEntries.Where(tte =>
                                                            model.TopicTagEntries.All(mtte => mtte != tte.TopicTag.Title)))
            {
                _context.TopicTagEntries.Remove(tag);
            }

            _context.ProjectEntries.Update(entry);
            await _context.SaveChangesAsync();

            return(RedirectToAction("Index", new { slug = entry.Slug }));
        }