private async Task <Article> MappingFromParameter(ArticleUpdateParameter parameter) { var isUpdate = parameter.Id != 0; Article entity; if (isUpdate) { entity = await GetByIdIncludedAsync(parameter.Id); if (entity == null) { throw new EntityNotFoundException <Article>(); } DropRelations(entity); var createdAt = entity.CreatedAt; entity = _mapper.Map(parameter, entity); if (!parameter.CreatedAt.HasValue) { entity.CreatedAt = createdAt; } entity.UpdatedAt = DateTime.Now; } else { entity = _mapper.Map <Article>(parameter); } return(entity); }
public async Task <IActionResult> Update([FromBody] ArticleUpdateParameter parameter) { return(Ok(await _service.UpsertAsync(parameter))); }
public virtual async Task <ArticleViewModel> UpsertAsync(ArticleUpdateParameter parameter) { parameter.Alias = UrlHelper.ToUrlSafeString(parameter.Alias ?? parameter.Title, true); if (parameter.Id == 0 && _context.Article.Any(x => x.Title == parameter.Title || x.Alias == parameter.Alias)) { throw new DuplicateEntityException <Article>(nameof(Article.Title), nameof(Article.Alias)); } var isUpdate = parameter.Id != 0; Article entity = null; if (isUpdate) { entity = await GetByIdIncludedAsync(parameter.Id); if (entity == null) { throw new EntityNotFoundException <Article>(); } DropRelations(entity); entity.UpdatedAt = DateTime.Now; _mapper.Map(parameter, entity); } else { entity = _mapper.Map <Article>(parameter); } var category = await _context.Category.Select(x => new { x.Id, x.Name }) .FirstOrDefaultAsync(x => parameter.Category == x.Name); if (category == null) { entity.CategoryNavigation = new Category { Name = parameter.Category, Alias = UrlHelper.UrlStringEncode(parameter.Category), }; } else { entity.Category = category.Id; } var tags = await _context.Tag .Where(x => parameter.Tags.Contains(x.Name)).ToListAsync(); var newTags = parameter.Tags .Except(tags.Select(x => x.Name)) .Select(x => new Tag { Name = x, Alias = UrlHelper.UrlStringEncode(x) }); if (!isUpdate) { await _context.Article.AddAsync(entity); } await _context.ArticleTags .AddRangeAsync(tags.Concat(newTags) .Select(x => new ArticleTags { ArticleNavigation = entity, TagNavigation = x })); await _context.SaveChangesAsync(); await DropUnusedTagsAndCategories(); var viewModel = _mapper.Map <ArticleViewModel>(entity); viewModel.Path = GetArticleRoutePath(viewModel); return(viewModel); }
public virtual async Task <ArticleViewModel> UpsertAsync(ArticleUpdateParameter parameter) { // validation parameter.Alias = UrlHelper.ToUrlSafeString(parameter.Alias ?? parameter.Title, true); if (parameter.Id == 0 && _context.Article.Any(x => x.Title == parameter.Title || x.Alias == parameter.Alias)) { throw new DuplicateEntityException <Article>(nameof(Article.Title), nameof(Article.Alias)); } var entity = await MappingFromParameter(parameter); // category var category = await _context.Category.Select(x => new { x.Id, x.Name }) .FirstOrDefaultAsync(x => parameter.Category == x.Name); if (category == null) { entity.CategoryNavigation = new Category { Name = parameter.Category, Alias = UrlHelper.UrlStringEncode(parameter.Category), }; } else { entity.Category = category.Id; } // tags var tags = await _context.Tag .Where(x => parameter.Tags.Contains(x.Name)).ToListAsync(); var newTags = parameter.Tags .Except(tags.Select(x => x.Name)) .Select(x => new Tag { Name = x, Alias = UrlHelper.UrlStringEncode(x) }); // upsert if (parameter.Id == 0) { await _context.Article.AddAsync(entity); } await _context.ArticleTags .AddRangeAsync(tags.Concat(newTags) .Select(x => new ArticleTags { ArticleNavigation = entity, TagNavigation = x })); await _context.SaveChangesAsync(); await DropUnusedTagsAndCategories(); var viewModel = _mapper.Map <ArticleViewModel>(entity); viewModel.Path = GetArticleRoutePath(viewModel); return(viewModel); }