diff --git a/Admin/Install/Search.php b/Admin/Install/Search.php new file mode 100644 index 0000000..b45bb7d --- /dev/null +++ b/Admin/Install/Search.php @@ -0,0 +1,43 @@ + __DIR__ . '/SearchCommands.php']); + } +} diff --git a/Admin/Install/SearchCommands.php b/Admin/Install/SearchCommands.php new file mode 100644 index 0000000..b3038d8 --- /dev/null +++ b/Admin/Install/SearchCommands.php @@ -0,0 +1,32 @@ + [ + [ + 'dest' => '\Modules\Knowledgebase\Controller\SearchController:searchGeneral', + 'verb' => RouteVerb::ANY, + 'permission' => [ + 'module' => SearchController::NAME, + 'type' => PermissionType::READ, + 'state' => PermissionCategory::WIKI, + ], + ], + ], +]; diff --git a/Controller/ApiController.php b/Controller/ApiController.php index cc06dea..28ca5ee 100755 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -106,8 +106,10 @@ final class ApiController extends Controller /** @var \Modules\Admin\Models\Account $account */ $account = AccountMapper::get()->where('id', $request->header->account)->execute(); + $collection = null; + if (!empty($uploadedFiles = $request->files)) { - $uploaded = $this->app->moduleManager->get('Media')->uploadFiles( + $uploaded = $this->app->moduleManager->get('Media', 'Api')->uploadFiles( names: [], fileNames: [], files: $uploadedFiles, @@ -116,7 +118,6 @@ final class ApiController extends Controller virtualPath: $path, ); - $collection = null; foreach ($uploaded as $media) { $this->createModelRelation( $request->header->account, @@ -140,13 +141,11 @@ final class ApiController extends Controller $this->createModel($request->header->account, $ref, ReferenceMapper::class, 'media_reference', $request->getOrigin()); - if ($collection === null) { - $collection = $this->app->moduleManager->get('Media')->createRecursiveMediaCollection( - $accountPath, - $request->header->account, - __DIR__ . '/../../../Modules/Media/Files/Accounts/' . $account->id . '/Knowledgebase/' . ($doc->category?->id ?? '0') . '/' . $doc->id - ); - } + $collection ??= $this->app->moduleManager->get('Media')->createRecursiveMediaCollection( + $accountPath, + $request->header->account, + __DIR__ . '/../../../Modules/Media/Files/Accounts/' . $account->id . '/Knowledgebase/' . ($doc->category?->id ?? '0') . '/' . $doc->id + ); $this->createModelRelation( $request->header->account, @@ -160,48 +159,43 @@ final class ApiController extends Controller } } - if (!empty($mediaFiles = $request->getDataJson('media'))) { - $collection = null; + $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, + $doc->id, + $media->id, + WikiDocMapper::class, + 'files', + '', + $request->getOrigin() + ); - 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, - $doc->id, - $media->id, - WikiDocMapper::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); - $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()); - $this->createModel($request->header->account, $ref, ReferenceMapper::class, 'media_reference', $request->getOrigin()); + $collection ??= $this->app->moduleManager->get('Media')->createRecursiveMediaCollection( + $path, + $request->header->account, + __DIR__ . '/../../../Modules/Media/Files' . $path + ); - if ($collection === null) { - $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() - ); - } + $this->createModelRelation( + $request->header->account, + $collection->id, + $ref->id, + CollectionMapper::class, + 'sources', + '', + $request->getOrigin() + ); } } @@ -864,8 +858,6 @@ final class ApiController extends Controller * * @return array * - * @todo Implement API validation function - * * @since 1.0.0 */ private function validateCategoryL11nDelete(RequestAbstract $request) : array diff --git a/Controller/SearchController.php b/Controller/SearchController.php new file mode 100644 index 0000000..85f8584 --- /dev/null +++ b/Controller/SearchController.php @@ -0,0 +1,78 @@ +with('tags') + ->with('tags/title') + ->where('name', '%' . ($request->getDataString('search') ?? '') . '%', 'LIKE') + ->where('docRaw', '%' . ($request->getDataString('search') ?? '') . '%', 'LIKE', 'OR') + ->where('language', $request->header->l11n->language) + ->where('tags/title/language', $response->header->l11n->language) + ->sort('createdAt', OrderType::DESC) + ->limit(8) + ->execute(); + + $results = []; + foreach ($docs as $doc) { + $results[] = [ + 'title' => $doc->name, + 'summary' => '', + 'link' => '{/base}/wiki/doc/view?id=' . $doc->id, + 'account' => '', + 'createdAt' => $doc->createdAt, + 'image' => '', + 'tags' => $doc->tags, + 'type' => 'list_links', + 'module' => 'Knowledgebase', + ]; + } + + $response->header->set('Content-Type', MimeType::M_JSON . '; charset=utf-8', true); + $response->add($request->uri->__toString(), $results); + } +} diff --git a/Models/Elastic/WikiDoc.json b/Models/Elastic/WikiDoc.json new file mode 100644 index 0000000..3aa7e63 --- /dev/null +++ b/Models/Elastic/WikiDoc.json @@ -0,0 +1,7 @@ +{ + "id": "{id}", + "title": "{title}", + "content": "{content}", + "language": "{language}", + "tags": ["{tags}"] +} \ No newline at end of file diff --git a/info.json b/info.json index 80511ac..ce91204 100755 --- a/info.json +++ b/info.json @@ -24,7 +24,8 @@ }, "providing": { "Navigation": "*", - "Media": "*" + "Media": "*", + "Search": "*" }, "load": [ {