Пример #1
0
        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);
        }
Пример #2
0
 public async Task <IActionResult> Update([FromBody] ArticleUpdateParameter parameter)
 {
     return(Ok(await _service.UpsertAsync(parameter)));
 }
Пример #3
0
        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);
        }
Пример #4
0
        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);
        }