async function getPublicHomepageWithQuery()

in backend/src/lib/controllers/homepage-ctrl.ts [83:161]


async function getPublicHomepageWithQuery(req: Request, res: Response) {
  const { q } = req.query;
  if (!q) {
    return getHomepage(req, res);
  }
  const query = (q as string).toLowerCase().trim();

  const repo = HomepageRepository.getInstance();
  let homepage = await repo.getHomepage();
  if (!homepage) {
    homepage = HomepageFactory.getDefaultHomepage();
  }

  const dashboardRepo = DashboardRepository.getInstance();
  const dashboards = await dashboardRepo.listPublishedDashboards();
  let publicDashboards = dashboards.map(DashboardFactory.toPublic);

  if (publicDashboards) {
    var index = publicDashboards.length;

    while (index--) {
      let found = false;
      let dashboard = publicDashboards[index];
      dashboard.queryMatches = [];

      const dashboardWithWidgets = await dashboardRepo.getDashboardWithWidgets(
        dashboard.id
      );

      if (dashboardWithWidgets.name.toLowerCase().includes(query)) {
        dashboard.queryMatches.push(dashboardWithWidgets.name);
        found = true;
      }

      if (dashboardWithWidgets.description.toLowerCase().includes(query)) {
        dashboard.queryMatches.push(dashboardWithWidgets.description);
        found = true;
      }

      if (dashboardWithWidgets.widgets) {
        for (var widget of dashboardWithWidgets.widgets) {
          if (widget.content.text) {
            let matches = splitAndSearch(widget.content.text, query);
            if (matches.length) {
              dashboard.queryMatches = dashboard.queryMatches.concat(matches);
              found = true;
            }
          }

          if (widget.content.title) {
            let matches = splitAndSearch(widget.content.title, query);
            if (matches.length) {
              dashboard.queryMatches = dashboard.queryMatches.concat(matches);
              found = true;
            }
          }

          if (widget.content.summary) {
            let matches = splitAndSearch(widget.content.summary, query);
            if (matches.length) {
              dashboard.queryMatches = dashboard.queryMatches.concat(matches);
              found = true;
            }
          }
        }
      }

      if (!found) {
        publicDashboards.splice(index, 1);
      }
    }
  }

  return res.json({
    title: homepage.title,
    description: homepage.description,
    dashboards: publicDashboards,
  });
}