Exemple #1
0
        public async Task <IActionResult> Add(ChapterModel chapterModel)
        {
            if (ModelState.IsValid)
            {
                if (await _titleManager.GetById(chapterModel.TitleId) is var title && title == null)
                {
                    return(Json(new
                    {
                        success = false,
                        messages = new[] { ValidationMessages.TitleNotFound }
                    }));
                }

                if ((await _chapterManager.GetAll()).Any(entity => entity.TitleId == title.Id && entity.Number == chapterModel.Number))
                {
                    return(Json(new
                    {
                        success = false,
                        messages = new[] { ValidationMessages.ChapterNumberAlreadyExist }
                    }));
                }

                byte[]? content = null;

                switch (chapterModel)
                {
                case ComicChapterModel comicChapterModel:
                    if (comicChapterModel.Pages == null)
                    {
                        return(Json(new
                        {
                            success = false,
                            messages = new[] { ValidationMessages.ChapterMustHavePages }
                        }));
                    }

                    await using (var memoryStream = new MemoryStream())
                    {
                        await comicChapterModel.Pages.CopyToAsync(memoryStream);

                        content = memoryStream.ToArray();
                    }

                    if (!await _chapterArchiver.IsValidComicChapterContent(content))
                    {
                        return(Json(new
                        {
                            success = false,
                            messages = new[] { ValidationMessages.ZipDoesntContainSupportedImage }
                        }));
                    }
                    break;

                case NovelChapterModel novelChapterModel:
                    content = Encoding.Default.GetBytes(novelChapterModel.Content);
                    break;
                }

                if (await _chapterArchiver.AddChapter(Mapper.MapToEntity(chapterModel), content))
                {
                    TempData["SuccessMessage"] = new[] { OtherMessages.ChapterAddedSuccessfully };

                    return(Json(new
                    {
                        success = true,
                        destination = Url.Action("Index", new { titleId = title.Id })
                    }));
                }

                ModelState.AddModelError("SomethingWrong", OtherMessages.SomethingWrong);
            }

            return(Json(new
            {
                success = false,
                messages = ModelState.SelectMany(state => state.Value.Errors).Select(error => error.ErrorMessage)
            }));
        }