validateEquipmentCreate($request))) { $response->header->status = RequestStatusCode::R_400; $this->createInvalidCreateResponse($request, $response, $val); return; } /** @var Equipment $equipment */ $equipment = $this->createEquipmentFromRequest($request); $this->createModel($request->header->account, $equipment, EquipmentMapper::class, 'equipment', $request->getOrigin()); if (!empty($request->files) || !empty($request->getDataJson('media')) ) { $this->createEquipmentMedia($equipment, $request); } $this->createStandardCreateResponse($request, $response, $equipment); } /** * Method to create equipment from request. * * @param RequestAbstract $request Request * * @return Equipment Returns the created equipment from the request * * @since 1.0.0 */ public function createEquipmentFromRequest(RequestAbstract $request) : Equipment { $equipment = new Equipment(); $equipment->name = $request->getDataString('name') ?? ''; $equipment->info = $request->getDataString('info') ?? ''; $equipment->type = new NullBaseStringL11nType((int) ($request->getDataInt('type') ?? 0)); $equipment->status = EquipmentStatus::tryFromValue($request->getDataInt('status')) ?? EquipmentStatus::INACTIVE; $equipment->unit = $request->getDataInt('unit') ?? $this->app->unitId; return $equipment; } /** * Create media files for equipment * * @param Equipment $equipment Equipment * @param RequestAbstract $request Request incl. media do upload * * @return void * * @since 1.0.0 */ private function createEquipmentMedia(Equipment $equipment, RequestAbstract $request) : void { $path = $this->createEquipmentDir($equipment); $collection = null; if (!empty($uploadedFiles = $request->files)) { $uploaded = $this->app->moduleManager->get('Media', 'Api')->uploadFiles( names: [], fileNames: [], files: $uploadedFiles, account: $request->header->account, basePath: __DIR__ . '/../../../Modules/Media/Files' . $path, virtualPath: $path, pathSettings: PathSettings::FILE_PATH ); foreach ($uploaded as $media) { $this->createModelRelation( $request->header->account, $equipment->id, $media->id, EquipmentMapper::class, 'files', '', $request->getOrigin() ); if ($collection === null) { /** @var \Modules\Media\Models\Collection $collection */ $collection = MediaMapper::getParentCollection($path)->limit(1)->execute(); if ($collection->id === 0) { $collection = $this->app->moduleManager->get('Media')->createRecursiveMediaCollection( $path, $request->header->account, __DIR__ . '/../../../Modules/Media/Files' . $path ); } } $this->createModelRelation( $request->header->account, $collection->id, $media->id, CollectionMapper::class, 'sources', '', $request->getOrigin() ); } } $mediaFiles = $request->getDataJson('media'); foreach ($mediaFiles as $file) { /** @var \Modules\Media\Models\Media $media */ $media = MediaMapper::get()->where('id', (int) $file)->limit(1)->execute(); $this->createModelRelation( $request->header->account, $equipment->id, $media->id, EquipmentMapper::class, 'files', '', $request->getOrigin() ); $ref = new Reference(); $ref->name = $media->name; $ref->source = new NullMedia($media->id); $ref->createdBy = new NullAccount($request->header->account); $ref->setVirtualPath($path); $this->createModel($request->header->account, $ref, ReferenceMapper::class, 'media_reference', $request->getOrigin()); if ($collection === null) { /** @var \Modules\Media\Models\Collection $collection */ $collection = MediaMapper::getParentCollection($path)->limit(1)->execute(); if ($collection->id === 0) { $collection = $this->app->moduleManager->get('Media')->createRecursiveMediaCollection( $path, $request->header->account, __DIR__ . '/../../../Modules/Media/Files' . $path ); } } $this->createModelRelation( $request->header->account, $collection->id, $ref->id, CollectionMapper::class, 'sources', '', $request->getOrigin() ); } } /** * Validate equipment create request * * @param RequestAbstract $request Request * * @return array Returns the validation array of the request * * @since 1.0.0 */ private function validateEquipmentCreate(RequestAbstract $request) : array { $val = []; if (($val['name'] = !$request->hasData('name')) || ($val['type'] = !$request->hasData('type')) ) { return $val; } return []; } /** * Api method to create a bill * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response * @param array $data Generic data * * @return void * * @api * * @since 1.0.0 */ public function apiMediaAddToEquipment(RequestAbstract $request, ResponseAbstract $response, array $data = []) : void { if (!empty($val = $this->validateMediaAddToEquipment($request))) { $response->header->status = RequestStatusCode::R_400; $this->createInvalidAddResponse($request, $response, $val); return; } /** @var \Modules\EquipmentManagement\Models\Equipment $equipment */ $equipment = EquipmentMapper::get()->where('id', (int) $request->getData('equipment'))->execute(); $path = $this->createEquipmentDir($equipment); $uploaded = []; if (!empty($uploadedFiles = $request->files)) { $uploaded = $this->app->moduleManager->get('Media', 'Api')->uploadFiles( names: [], fileNames: [], files: $uploadedFiles, account: $request->header->account, basePath: __DIR__ . '/../../../Modules/Media/Files' . $path, virtualPath: $path, pathSettings: PathSettings::FILE_PATH, hasAccountRelation: false, readContent: $request->getDataBool('parse_content') ?? false ); $collection = null; foreach ($uploaded as $media) { $this->createModelRelation( $request->header->account, $equipment->id, $media->id, EquipmentMapper::class, 'files', '', $request->getOrigin() ); if ($request->hasData('type')) { $this->createModelRelation( $request->header->account, $media->id, $request->getDataInt('type'), MediaMapper::class, 'types', '', $request->getOrigin() ); } if ($collection === null) { /** @var \Modules\Media\Models\Collection $collection */ $collection = MediaMapper::getParentCollection($path)->limit(1)->execute(); if ($collection->id === 0) { $collection = $this->app->moduleManager->get('Media')->createRecursiveMediaCollection( $path, $request->header->account, __DIR__ . '/../../../Modules/Media/Files' . $path, ); } } $this->createModelRelation( $request->header->account, $collection->id, $media->id, CollectionMapper::class, 'sources', '', $request->getOrigin() ); } } $mediaFiles = $request->getDataJson('media'); foreach ($mediaFiles as $media) { $this->createModelRelation( $request->header->account, $equipment->id, (int) $media, EquipmentMapper::class, 'files', '', $request->getOrigin() ); } $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Media', 'Media added to equipment.', [ 'upload' => $uploaded, 'media' => $mediaFiles, ]); } /** * Create media directory path * * @param Equipment $equipment Equipment * * @return string * * @since 1.0.0 */ private function createEquipmentDir(Equipment $equipment) : string { return '/Modules/EquipmentManagement/Equipment/' . $this->app->unitId . '/' . $equipment->id; } /** * Method to validate bill creation from request * * @param RequestAbstract $request Request * * @return array * * @since 1.0.0 */ private function validateMediaAddToEquipment(RequestAbstract $request) : array { $val = []; if (($val['media'] = (!$request->hasData('media') && empty($request->files))) || ($val['equipment'] = !$request->hasData('equipment')) ) { return $val; } return []; } /** * Api method to create notes * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response * @param array $data Generic data * * @return void * * @api * * @since 1.0.0 */ public function apiNoteCreate(RequestAbstract $request, ResponseAbstract $response, array $data = []) : void { if (!empty($val = $this->validateNoteCreate($request))) { $response->header->status = RequestStatusCode::R_400; $this->createInvalidCreateResponse($request, $response, $val); return; } $request->setData('virtualpath', '/Modules/EquipmentManagement/Equipment/' . $request->getData('id'), true); $this->app->moduleManager->get('Editor', 'Api')->apiEditorCreate($request, $response, $data); if ($response->header->status !== RequestStatusCode::R_200) { return; } $responseData = $response->getDataArray($request->uri->__toString()); if (!\is_array($responseData)) { return; } $model = $responseData['response']; $this->createModelRelation($request->header->account, (int) $request->getData('id'), $model->id, EquipmentMapper::class, 'notes', '', $request->getOrigin()); } /** * Validate item note create request * * @param RequestAbstract $request Request * * @return array * * @since 1.0.0 */ private function validateNoteCreate(RequestAbstract $request) : array { $val = []; if (($val['id'] = !$request->hasData('id')) ) { return $val; } return []; } /** * Api method to update Equipment * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response * @param array $data Generic data * * @return void * * @api * * @since 1.0.0 */ public function apiEquipmentFind(RequestAbstract $request, ResponseAbstract $response, array $data = []) : void { } /** * Api method to update Equipment * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response * @param array $data Generic data * * @return void * * @api * * @since 1.0.0 */ public function apiEquipmentUpdate(RequestAbstract $request, ResponseAbstract $response, array $data = []) : void { if (!empty($val = $this->validateEquipmentUpdate($request))) { $response->header->status = RequestStatusCode::R_400; $this->createInvalidUpdateResponse($request, $response, $val); return; } /** @var \Modules\EquipmentManagement\Models\Equipment $old */ $old = EquipmentMapper::get()->where('id', (int) $request->getData('id'))->execute(); $new = $this->updateEquipmentFromRequest($request, clone $old); $this->updateModel($request->header->account, $old, $new, EquipmentMapper::class, 'equipment', $request->getOrigin()); $this->createStandardUpdateResponse($request, $response, $new); } /** * Method to update Equipment from request. * * @param RequestAbstract $request Request * @param Equipment $new Model to modify * * @return Equipment * * @todo Implement API update function * * @since 1.0.0 */ public function updateEquipmentFromRequest(RequestAbstract $request, Equipment $new) : Equipment { $new->name = $request->getDataString('name') ?? $new->name; $new->info = $request->getDataString('info') ?? $new->info; $new->type = $request->hasData('type') ? new NullBaseStringL11nType((int) ($request->getDataInt('type') ?? 0)) : $new->type; $new->status = EquipmentStatus::tryFromValue($request->getDataInt('status')) ?? $new->status; $new->unit = $request->getDataInt('unit') ?? $this->app->unitId; return $new; } /** * Validate Equipment update request * * @param RequestAbstract $request Request * * @return array * * @todo Implement API validation function * * @since 1.0.0 */ private function validateEquipmentUpdate(RequestAbstract $request) : array { $val = []; if (($val['id'] = !$request->hasData('id'))) { return $val; } return []; } /** * Api method to delete Equipment * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response * @param array $data Generic data * * @return void * * @api * * @since 1.0.0 */ public function apiEquipmentDelete(RequestAbstract $request, ResponseAbstract $response, array $data = []) : void { if (!empty($val = $this->validateEquipmentDelete($request))) { $response->header->status = RequestStatusCode::R_400; $this->createInvalidDeleteResponse($request, $response, $val); return; } /** @var \Modules\EquipmentManagement\Models\Equipment $equipment */ $equipment = EquipmentMapper::get()->where('id', (int) $request->getData('id'))->execute(); $this->deleteModel($request->header->account, $equipment, EquipmentMapper::class, 'equipment', $request->getOrigin()); $this->createStandardDeleteResponse($request, $response, $equipment); } /** * Validate Equipment delete request * * @param RequestAbstract $request Request * * @return array * * @since 1.0.0 */ private function validateEquipmentDelete(RequestAbstract $request) : array { $val = []; if (($val['id'] = !$request->hasData('id'))) { return $val; } return []; } /** * Api method to update Note * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response * @param array $data Generic data * * @return void * * @api * * @since 1.0.0 */ public function apiNoteUpdate(RequestAbstract $request, ResponseAbstract $response, array $data = []) : void { $accountId = $request->header->account; if (!$this->app->accountManager->get($accountId)->hasPermission( PermissionType::MODIFY, $this->app->unitId, $this->app->appId, self::NAME, PermissionCategory::EQUIPMENT_NOTE, $request->getDataInt('id')) ) { $this->fillJsonResponse($request, $response, NotificationLevel::HIDDEN, '', '', []); $response->header->status = RequestStatusCode::R_403; return; } $this->app->moduleManager->get('Editor', 'Api')->apiEditorUpdate($request, $response, $data); } /** * Api method to delete Note * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response * @param array $data Generic data * * @return void * * @api * * @since 1.0.0 */ public function apiNoteDelete(RequestAbstract $request, ResponseAbstract $response, array $data = []) : void { $accountId = $request->header->account; if (!$this->app->accountManager->get($accountId)->hasPermission( PermissionType::DELETE, $this->app->unitId, $this->app->appId, self::NAME, PermissionCategory::EQUIPMENT_NOTE, $request->getDataInt('id')) ) { $this->fillJsonResponse($request, $response, NotificationLevel::HIDDEN, '', '', []); $response->header->status = RequestStatusCode::R_403; return; } $this->app->moduleManager->get('Editor', 'Api')->apiEditorDelete($request, $response, $data); } }