diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2PresentationApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2PresentationApiController.php index fefae881..e46869bb 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2PresentationApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2PresentationApiController.php @@ -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()); } diff --git a/app/Services/Model/IPresentationService.php b/app/Services/Model/IPresentationService.php index 4b4957e7..fbd635dc 100644 --- a/app/Services/Model/IPresentationService.php +++ b/app/Services/Model/IPresentationService.php @@ -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 ); diff --git a/app/Services/Model/PresentationService.php b/app/Services/Model/PresentationService.php index 8f0052f8..1c4c2e34 100644 --- a/app/Services/Model/PresentationService.php +++ b/app/Services/Model/PresentationService.php @@ -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)));