Fixed multipart form request for slide updates (PUT)

Change-Id: I47e0698de233e070d8b5b2867665642fc535d58f
This commit is contained in:
smarcet 2019-04-25 14:34:43 -03:00
parent 6d08cc94ac
commit 06572735fd
3 changed files with 37 additions and 9 deletions

View File

@ -28,6 +28,7 @@ use Exception;
use models\utils\IEntity;
use ModelSerializers\SerializerRegistry;
use services\model\IPresentationService;
use utils\ParseMultiPartFormDataInputStream;
/**
* Class OAuth2PresentationApiController
@ -675,7 +676,24 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController
$summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id);
if (is_null($summit)) return $this->error404();
$data = $request->all();
$content_type = $request->headers->has('Content-Type') ? strtolower( $request->headers->get('Content-Type')) : null;
if (false !== $pos = strpos($content_type, ';')) {
$content_type = substr($content_type, 0, $pos);
}
if(!strstr($content_type, 'multipart/form-data'))
return $this->error400();
$parser = new ParseMultiPartFormDataInputStream(file_get_contents('php://input'));
$input = $parser->getInput();
$data = $input['parameters'];
$files = $input['files'];
$file = null;
if(isset($files['file']))
$file = $files['file'];
$rules = [
'link' => 'nullable|url',
@ -700,7 +718,10 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController
'description',
];
$slide = $this->presentation_service->updateSlide($request, $presentation_id, $slide_id, HTMLCleaner::cleanData($data, $fields));
$slide = $this->presentation_service->updateSlide
(
$request, $presentation_id, $slide_id, HTMLCleaner::cleanData($data, $fields), $file
);
return $this->updated(SerializerRegistry::getInstance()->getSerializer($slide)->serialize());
}

View File

@ -21,6 +21,7 @@ use models\summit\PresentationSlide;
use models\summit\PresentationVideo;
use models\summit\Summit;
use Illuminate\Http\Request as LaravelRequest;
use Illuminate\Http\UploadedFile;
/**
* Interface IPresentationService
* @package services\model
@ -115,6 +116,7 @@ interface IPresentationService
* @param int $presentation_id
* @param int $slide_id
* @param array $slide_data
* @param UploadedFile $file
* @param array $allowed_extensions
* @param int $max_file_size
* @return mixed|PresentationSlide
@ -126,6 +128,7 @@ interface IPresentationService
$presentation_id,
$slide_id,
array $slide_data,
UploadedFile $file = null,
array $allowed_extensions = ['ppt', 'pptx', 'xps', 'key', 'pdf', 'jpg', 'jpeg', 'png', 'svg', 'bmp', 'tga', 'tiff', 'gif'],
$max_file_size = 10485760
);

View File

@ -38,6 +38,7 @@ use libs\utils\ITransactionService;
use models\summit\Summit;
use Illuminate\Http\Request as LaravelRequest;
use App\Services\Model\IFolderService;
use Illuminate\Http\UploadedFile;
/**
* Class PresentationService
* @package services\model
@ -642,7 +643,7 @@ final class PresentationService
if (!$presentation instanceof Presentation)
throw new EntityNotFoundException('presentation not found!');
$hasLink = isset($slide_data['link']);
$hasLink = isset($slide_data['link']) && !empty($slide_data['link']);
$hasFile = $request->hasFile('file');
if($hasFile && $hasLink){
@ -683,11 +684,11 @@ final class PresentationService
* @param int $presentation_id
* @param int $slide_id
* @param array $slide_data
* @param UploadedFile $file
* @param array $allowed_extensions
* @param int $max_file_size
* @return mixed|PresentationSlide
* @throws EntityNotFoundException
* @throws ValidationException
* @throws \Exception
*/
public function updateSlide
(
@ -695,9 +696,11 @@ final class PresentationService
$presentation_id,
$slide_id,
array $slide_data,
UploadedFile $file = null,
array $allowed_extensions = ['ppt', 'pptx', 'xps', 'key', 'pdf', 'jpg', 'jpeg', 'png', 'svg', 'bmp', 'tga', 'tiff', 'gif'],
$max_file_size = 10485760
){
$slide = $this->tx_service->transaction(function () use
(
$request,
@ -705,7 +708,8 @@ final class PresentationService
$slide_data,
$max_file_size,
$allowed_extensions,
$slide_id
$slide_id,
$file
) {
$presentation = $this->presentation_repository->getById($presentation_id);
@ -724,8 +728,9 @@ final class PresentationService
if (!$slide instanceof PresentationSlide)
throw new EntityNotFoundException('slide not found!');
$hasLink = isset($slide_data['link']);
$hasFile = $request->hasFile('file');
$hasLink = isset($slide_data['link']) && !empty($slide_data['link']);
$hasFile = !is_null($file);
if($hasFile && $hasLink){
throw new ValidationException("you must provide a file or a link, not both.");
@ -746,7 +751,6 @@ final class PresentationService
// check if there is any file sent
if($hasFile){
$file = $request->file('file');
if (!in_array($file->extension(), $allowed_extensions)) {
throw new ValidationException(
sprintf("file does not has a valid extension '(%s)'.", implode("','", $allowed_extensions)));