ContainerSearchService.java

package de.dlr.shepard.common.search.services;

import de.dlr.shepard.auth.users.entities.User;
import de.dlr.shepard.auth.users.services.UserService;
import de.dlr.shepard.common.neo4j.entities.BasicContainer;
import de.dlr.shepard.common.neo4j.io.BasicContainerIO;
import de.dlr.shepard.common.search.daos.SearchDAO;
import de.dlr.shepard.common.search.io.ContainerSearchBody;
import de.dlr.shepard.common.search.io.ContainerSearchParams;
import de.dlr.shepard.common.search.io.ContainerSearchResult;
import de.dlr.shepard.common.search.query.Neo4jQueryBuilder;
import de.dlr.shepard.common.search.query.QueryValidator;
import de.dlr.shepard.common.util.PaginationHelper;
import de.dlr.shepard.common.util.SortingHelper;
import jakarta.enterprise.context.RequestScoped;
import jakarta.inject.Inject;
import java.util.List;

@RequestScoped
public class ContainerSearchService {

  @Inject
  SearchDAO searchDAO;

  @Inject
  UserService userService;

  public ContainerSearchResult search(
    ContainerSearchBody containerSearchBody,
    PaginationHelper pagination,
    SortingHelper sortOrder
  ) {
    User user = userService.getCurrentUser();

    ContainerSearchParams containerSearchParams = containerSearchBody.getSearchParams();
    QueryValidator.checkQuery(containerSearchBody.getSearchParams().getQuery());
    String neo4jSelectionQuery = Neo4jQueryBuilder.containerSelectionQueryWithNeo4jId(
      containerSearchParams.getQuery(),
      containerSearchParams.getQueryType(),
      sortOrder,
      user.getUsername()
    );
    List<BasicContainerIO> resultList = findContainerList(neo4jSelectionQuery, containerSearchParams, pagination);
    Integer totalResultCount = searchDAO.getContainerTotalCount(
      neo4jSelectionQuery,
      containerSearchParams.getQueryType().getTypeAlias()
    );
    ContainerSearchResult containerSearchResult = new ContainerSearchResult(
      resultList,
      containerSearchBody.getSearchParams(),
      totalResultCount
    );
    return containerSearchResult;
  }

  private List<BasicContainerIO> findContainerList(
    String neo4jSelectionQuery,
    ContainerSearchParams searchParams,
    PaginationHelper pagination
  ) {
    List<BasicContainer> resultContainers = searchDAO.findContainers(
      neo4jSelectionQuery,
      pagination,
      searchParams.getQueryType().getTypeAlias()
    );
    List<BasicContainerIO> ret = resultContainers.stream().map(BasicContainerIO::new).toList();
    return ret;
  }
}