Ejemplo n.º 1
0
        public async Task <IActionResult> Create(ThreadAnonymousCreateViewModel viewModel)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    var categoryDto = await _categoryService.GetAsync(viewModel.CategoryAlias);

                    var threadDto = _mapper.Map <ThreadDto>(viewModel);
                    threadDto.BumpLimit = categoryDto.DefaultBumpLimit;
                    threadDto.ShowThreadLocalUserHash = categoryDto.DefaultShowThreadLocalUserHash;
                    threadDto.CategoryId = categoryDto.Id;

                    var postDto = _mapper.Map <PostDto>(viewModel);
                    postDto.UserIpAddress = UserIpAddress.ToString();
                    postDto.UserAgent     = UserAgent;

                    var threadCreateDto = new ThreadPostCreateDto
                    {
                        Category = categoryDto,
                        Thread   = threadDto,
                        Post     = postDto,
                    };

                    var createResultDto = await _threadService.CreateThreadPostAsync(viewModel.Attachments, threadCreateDto, true);

                    return(RedirectToAction("Details", "Threads", new { categoryAlias = viewModel.CategoryAlias, threadId = createResultDto.ThreadId }));
                }
                catch (Exception ex)
                {
                    _logger.LogError(EventIdentifiers.ThreadCreateError.ToEventId(), ex, $"Can't create new thread due to exception");

                    ViewBag.ErrorMessage = "Can't create new thread";
                    return(View(viewModel));
                }
            }
            else
            {
                ViewBag.ErrorMessage = ModelState.ModelErrorsToString();
                return(View(viewModel));
            }
        }
Ejemplo n.º 2
0
        public async Task <IActionResult> Create(PostAnonymousCreateViewModel viewModel)
        {
            if (ModelState.IsValid)
            {
                var categoryDto = await _categoryService.GetAsync(viewModel.CategoryAlias);

                var threadDto = await _threadService.GetAsync(viewModel.ThreadId);

                if (!threadDto.IsClosed)
                {
                    var postDto = _mapper.Map <PostDto>(viewModel);
                    postDto.UserIpAddress = UserIpAddress.ToString();
                    postDto.UserAgent     = UserAgent;

                    var threadPostCreateDto = new ThreadPostCreateDto
                    {
                        Category = categoryDto,
                        Thread   = threadDto,
                        Post     = postDto,
                    };

                    var createResultDto = await _threadService.CreateThreadPostAsync(viewModel.Attachments, threadPostCreateDto, false);

                    return(Redirect(Url.Action("Details", "Threads",
                                               new
                    {
                        categoryAlias = viewModel.CategoryAlias,
                        threadId = createResultDto.ThreadId,
                    }) + "#" + createResultDto.PostId));
                }
                else
                {
                    throw new HttpResponseException(HttpStatusCode.Forbidden, $"Thread {threadDto.Id} is closed.");
                }
            }
            else
            {
                ViewBag.ErrorMessage = ModelState.ModelErrorsToString();
                return(View(viewModel));
            }
        }
Ejemplo n.º 3
0
        public async Task <ThreadPostCreateResultDto> CreateThreadPostAsync(IFormFileCollection attachments, ThreadPostCreateDto dto, bool createNewThread)
        {
            await using var transaction = await _context.Database.BeginTransactionAsync();

            if (createNewThread)
            {
                var thread = MapDtoToNewEntity <ThreadDto, Thread>(dto.Thread);
                thread.Category = _context.GetLocalOrAttach <Category>(dto.Category.Id);
                await _context.Threads.AddAsync(thread);

                await _context.SaveChangesAsync();

                dto.Post.ThreadId = thread.Id;
            }
            var postingPermissionDto = await _banService.IsPostingAllowedAsync(dto.Post.ThreadId, dto.Post.UserIpAddress);

            if (!postingPermissionDto.IsPostingAllowed)
            {
                throw new HttpResponseException(HttpStatusCode.Forbidden, postingPermissionDto.Ban?.Reason);
            }
            else
            {
                var postEntity = MapDtoToNewEntity <PostDto, Post>(dto.Post);
                postEntity.Thread = _context.GetLocalOrAttach <Thread>(dto.Post.ThreadId);
                await _context.Posts.AddAsync(postEntity);

                await _context.SaveChangesAsync();

                var containerName = dto.Post.ThreadId.ToString();
                if (string.IsNullOrWhiteSpace(containerName))
                {
                    throw new Exception($"{nameof(containerName)} is null or whitespace");
                }

                if (attachments != null && attachments.Any())
                {
                    await CreateAttachmentsAsync(containerName, postEntity, attachments);
                }

                await transaction.CommitAsync();

                return(new ThreadPostCreateResultDto
                {
                    PostId = postEntity.Id,
                    ThreadId = dto.Post.ThreadId,
                });
            }
        }