diff --git a/config/sync/rest.resource.concept_autocomplete_rest_resource.yml b/config/sync/rest.resource.concept_autocomplete_rest_resource.yml new file mode 100644 index 0000000..b10bc21 --- /dev/null +++ b/config/sync/rest.resource.concept_autocomplete_rest_resource.yml @@ -0,0 +1,18 @@ +uuid: 96dd83b8-5a29-43d5-a87e-a3be17c8b96c +langcode: en +status: true +dependencies: + module: + - serialization + - user + - yufu_concept +id: concept_autocomplete_rest_resource +plugin_id: concept_autocomplete_rest_resource +granularity: resource +configuration: + methods: + - GET + formats: + - json + authentication: + - cookie diff --git a/config/sync/user.role.anonymous.yml b/config/sync/user.role.anonymous.yml index 3d919db..6ba9c02 100644 --- a/config/sync/user.role.anonymous.yml +++ b/config/sync/user.role.anonymous.yml @@ -5,6 +5,7 @@ dependencies: config: - node.type.concept - rest.resource.add_concept_rest_resource + - rest.resource.concept_autocomplete_rest_resource - workflows.workflow.concept_workflow module: - content_moderation @@ -22,6 +23,7 @@ permissions: - 'access content' - 'create concept content' - 'edit any concept content' + - 'restful get concept_autocomplete_rest_resource' - 'restful post add_concept_rest_resource' - 'use concept_workflow transition create_new_draft' - 'view media' diff --git a/config/sync/user.role.authenticated.yml b/config/sync/user.role.authenticated.yml index fc5a6c7..5adfc21 100644 --- a/config/sync/user.role.authenticated.yml +++ b/config/sync/user.role.authenticated.yml @@ -6,10 +6,12 @@ dependencies: - node.type.article - node.type.concept - rest.resource.add_concept_rest_resource + - rest.resource.concept_autocomplete_rest_resource - taxonomy.vocabulary.tags - workflows.workflow.concept_workflow module: - content_moderation + - file - media - node - rest @@ -28,7 +30,9 @@ permissions: - 'create concept content' - 'create media' - 'create terms in tags' + - 'delete own files' - 'edit any concept content' + - 'restful get concept_autocomplete_rest_resource' - 'restful post add_concept_rest_resource' - 'use concept_workflow transition create_new_draft' - 'use jsonapi operation link' diff --git a/web/modules/custom/yufu_concept/config/install/rest.resource.add_concept_rest_resource.yml b/web/modules/custom/yufu_concept/config/install/rest.resource.add_concept_rest_resource.yml new file mode 100644 index 0000000..888e462 --- /dev/null +++ b/web/modules/custom/yufu_concept/config/install/rest.resource.add_concept_rest_resource.yml @@ -0,0 +1,18 @@ +uuid: 589ee957-7efd-45d3-979b-93b5b1018761 +langcode: en +status: true +dependencies: + module: + - serialization + - user + - yufu_concept +id: add_concept_rest_resource +plugin_id: add_concept_rest_resource +granularity: resource +configuration: + methods: + - POST + formats: + - json + authentication: + - cookie diff --git a/web/modules/custom/yufu_concept/config/install/rest.resource.concept_autocomplete_rest_resource.yml b/web/modules/custom/yufu_concept/config/install/rest.resource.concept_autocomplete_rest_resource.yml new file mode 100644 index 0000000..b10bc21 --- /dev/null +++ b/web/modules/custom/yufu_concept/config/install/rest.resource.concept_autocomplete_rest_resource.yml @@ -0,0 +1,18 @@ +uuid: 96dd83b8-5a29-43d5-a87e-a3be17c8b96c +langcode: en +status: true +dependencies: + module: + - serialization + - user + - yufu_concept +id: concept_autocomplete_rest_resource +plugin_id: concept_autocomplete_rest_resource +granularity: resource +configuration: + methods: + - GET + formats: + - json + authentication: + - cookie diff --git a/web/modules/custom/yufu_concept/src/Plugin/rest/resource/ConceptAutocomplete.php b/web/modules/custom/yufu_concept/src/Plugin/rest/resource/ConceptAutocomplete.php new file mode 100644 index 0000000..ca8086a --- /dev/null +++ b/web/modules/custom/yufu_concept/src/Plugin/rest/resource/ConceptAutocomplete.php @@ -0,0 +1,116 @@ +entityTypeManager = $entity_type_manager; + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) { + return new static( + $configuration, + $plugin_id, + $plugin_definition, + $container->getParameter('serializer.formats'), + $container->get('logger.channel.yufu_concept'), + $container->get('entity_type.manager') + ); + } + + public function get(Request $request) { + $results = []; + $input = $request->query->get('q');// Get the typed string from the URL, if + // it exists. + $num = $request->query->get('num') ?? 10; + $start = $request->query->get('start') ?? 0; + if (!$input) { + return new JsonResponse($results); + } + $input = Xss::filter($input); + $node_storage = $this->entityTypeManager->getStorage('node'); + $query = $node_storage->getQuery() + ->condition('type', 'concept') + ->condition('title', $input, 'CONTAINS') + ->groupBy('nid') + ->sort('created', 'DESC') + ->accessCheck(TRUE) + ->range($start, $num); + $ids = $query->execute(); + $nodes = $ids ? $node_storage->loadMultiple($ids) : []; + foreach ($nodes as $id => $node) { + $results[$id] = [ + 'title' => $node->getTitle(), + 'id' => $node->id(), + 'revision_id' => $node->getRevisionId(), + 'revision_uid' => $node->getRevisionUserId(), + 'uuid' => $node->uuid(), + 'uid' => $node->uid->target_id, + ]; + } + return new JsonResponse($results); + } + +}