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,
});
}