diff --git a/Controller/ApiController.php b/Controller/ApiController.php index 60fe71b..8831a22 100644 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -21,6 +21,7 @@ use Modules\Media\Models\CollectionMapper; use Modules\Media\Models\Media; use Modules\Media\Models\MediaMapper; use Modules\Media\Models\NullCollection; +use Modules\Media\Models\NullMedia; use Modules\Media\Models\PathSettings; use Modules\Media\Models\PermissionState; use Modules\Media\Models\UploadFile; @@ -32,6 +33,7 @@ use phpOMS\Message\RequestAbstract; use phpOMS\Message\ResponseAbstract; use phpOMS\System\MimeType; use phpOMS\Utils\Parser\Markdown\Markdown; +use phpOMS\Model\Message\FormValidation; /** * Media class. @@ -98,7 +100,7 @@ final class ApiController extends Controller public function apiMediaUpload(RequestAbstract $request, ResponseAbstract $response, $data = null) : void { $uploads = $this->uploadFiles( - $request->getData('name') ?? '', + $request->getData('name') === null || $request->getFiles() !== null ? '' : $request->getData('name'), $request->getFiles(), $request->getHeader()->getAccount(), (string) ($request->getData('path') ?? __DIR__ . '/../../../Modules/Media/Files'), @@ -189,7 +191,7 @@ final class ApiController extends Controller * @param array $status Files * @param int $account Uploader * - * @return array + * @return Media[] * * @since 1.0.0 */ @@ -323,6 +325,83 @@ final class ApiController extends Controller return $media; } + /** + * Api method to create a collection. + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + public function apiCollectionCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + { + if (!empty($val = $this->validateCollectionCreate($request))) { + $response->set('collection_create', new FormValidation($val)); + + return; + } + + $collection = $this->createCollectionFromRequest($request); + $this->createModel($request->getHeader()->getAccount(), $collection, CollectionMapper::class, 'collection'); + $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Collection', 'Collection successfully created.', $collection); + } + + /** + * Validate collection create request + * + * @param RequestAbstract $request Request + * + * @return array Returns the validation array of the request + * + * @since 1.0.0 + */ + private function validateCollectionCreate(RequestAbstract $request) : array + { + $val = []; + if (($val['name'] = empty($request->getData('name'))) + || ($val['media'] = empty($request->getDataJson('media-list'))) + ) { + return $val; + } + + return []; + } + + /** + * Method to create collection from request. + * + * @param RequestAbstract $request Request + * + * @return Collection Returns the collection from the request + * + * @since 1.0.0 + */ + private function createCollectionFromRequest(RequestAbstract $request) : Collection + { + $mediaCollection = new Collection(); + $mediaCollection->setName($request->getData('name') ?? ''); + $mediaCollection->setDescription($description = Markdown::parse($request->getData('description') ?? '')); + $mediaCollection->setDescriptionRaw($description); + $mediaCollection->setCreatedBy(new NullAccount($request->getHeader()->getAccount())); + + $media = $request->getDataJson('media-list'); + foreach ($media as $file) { + $mediaCollection->addSource(new NullMedia((int) $file)); + } + + $mediaCollection->setVirtualPath($request->getData('virtualpath') ?? '/'); + $mediaCollection->setPath($request->getData('virtualpath') ?? '/'); + + CollectionMapper::create($mediaCollection); + + return $mediaCollection; + } + /** * Method to create media collection from request. * diff --git a/Models/CollectionMapper.php b/Models/CollectionMapper.php index a7587d0..eb48ae5 100644 --- a/Models/CollectionMapper.php +++ b/Models/CollectionMapper.php @@ -32,10 +32,10 @@ final class CollectionMapper extends MediaMapper */ protected static array $hasMany = [ 'sources' => [ - 'mapper' => MediaMapper::class, /* mapper of the related object */ - 'table' => 'media_relation', /* table of the related object, null if no relation table is used (many->1) */ + 'mapper' => MediaMapper::class, + 'table' => 'media_relation', 'external' => 'media_relation_dst', - 'self' => 'media_relation_src', + 'self' => 'media_relation_src', ], ]; diff --git a/Theme/Backend/Components/Upload/BaseView.php b/Theme/Backend/Components/Upload/BaseView.php index 56349d4..7372f3f 100644 --- a/Theme/Backend/Components/Upload/BaseView.php +++ b/Theme/Backend/Components/Upload/BaseView.php @@ -66,7 +66,7 @@ class BaseView extends View /** * {@inheritdoc} */ - public function render(...$data): string + public function render(...$data) : string { $this->form = $data[0]; $this->name = $data[1] ?? 'UNDEFINED';