예제 #1
0
        public async Task <IActionResult> Save()
        {
            string  targetFilePath = null;
            BookDTO dto            = null;

            if (!MultipartRequestHelper.IsMultipartContentType(Request.ContentType))
            {
                return(BadRequest($"Requisição precisa ser 'multipart'."));
            }

            var boundary = MultipartRequestHelper.GetBoundary(MediaTypeHeaderValue.Parse(Request.ContentType), MaxBoundaryLengthLimit);
            var reader   = new MultipartReader(boundary, HttpContext.Request.Body);
            var section  = await reader.ReadNextSectionAsync();

            while (section != null)
            {
                ContentDispositionHeaderValue contentDisposition;
                var hasContentDispositionHeader = ContentDispositionHeaderValue.TryParse(section.ContentDisposition, out contentDisposition);
                var key = HeaderUtilities.RemoveQuotes(contentDisposition.Name);
                if (hasContentDispositionHeader)
                {
                    if (MultipartRequestHelper.HasFileContentDisposition(contentDisposition))
                    {
                        if (key.ToString() == "file")
                        {
                            var imageValidator        = new ImageValidator();
                            var fileName              = HeaderUtilities.RemoveQuotes(contentDisposition.FileName).ToString();
                            var imageValidationResult = imageValidator.Validate(fileName);

                            if (imageValidationResult.HasError)
                            {
                                return(BadRequest(imageValidationResult.ErrorMessage));
                            }

                            targetFilePath = Path.GetTempFileName();
                            using (var targetStream = System.IO.File.Create(targetFilePath))
                            {
                                await section.Body.CopyToAsync(targetStream);
                            }
                        }
                    }
                    else if (MultipartRequestHelper.HasFormDataContentDisposition(contentDisposition))
                    {
                        if (key.ToString() == "value")
                        {
                            using (var streamReader = new StreamReader(section.Body))
                            {
                                var json = await streamReader.ReadToEndAsync();

                                dto = JsonConvert.DeserializeObject <BookDTO>(json);
                            }
                        }
                    }
                }
                section = await reader.ReadNextSectionAsync();
            }
            var validationContext = new ValidationContext(bookFacade, authorService, publisherService);
            var bookValidator     = new BookValidator(validationContext);
            var validationResult  = bookValidator.Validate(dto);

            if (validationResult.HasError)
            {
                return(BadRequest(validationResult.ErrorMessage));
            }

            var bookFound = await bookFacade.FindById(dto.Id);

            if (bookFound == null && dto.Id != 0)
            {
                return(NotFound($"Nenhum livro encontrado com o ID: {dto.Id}."));
            }

            try
            {
                var book = dto.FromBookViewItem(new DefaultValidationResultDataLookUp(validationResult));

                book = await bookFacade.Save(book, targetFilePath);

                return(Ok(await book.ToBookViewItem(serviceDataLookUp)));
            }
            catch (BookSaveException ex)
            {
                try
                {
                    System.IO.File.Delete(targetFilePath);
                }
                catch
                {
                    //Ignore
                }
                return(BadRequest(ex.Message));
            }
            catch (ImageSaveException ex)
            {
                return(BadRequest(ex.Message));
            }
        }