54 lines
1.5 KiB
TypeScript
54 lines
1.5 KiB
TypeScript
import { json } from "@remix-run/server-runtime";
|
|
import type { DashboardSummary, DashboardWidgetSummary } from "@trigger.dev/core/v3/schemas";
|
|
import type { BuiltInDashboard } from "~/presenters/v3/MetricDashboardPresenter.server";
|
|
import { createLoaderApiRoute } from "~/services/routeBuilders/apiBuilder.server";
|
|
import { builtInDashboard } from "~/presenters/v3/BuiltInDashboards.server";
|
|
|
|
const BUILT_IN_DASHBOARD_KEYS = ["overview", "llm"];
|
|
|
|
function serializeDashboard(dashboard: BuiltInDashboard): DashboardSummary {
|
|
const widgets: DashboardWidgetSummary[] = [];
|
|
|
|
if (dashboard.layout.version === "1") {
|
|
for (const [id, widget] of Object.entries(dashboard.layout.widgets)) {
|
|
// Skip title widgets — they're just section headers
|
|
if (widget.display.type === "title") continue;
|
|
|
|
widgets.push({
|
|
id,
|
|
title: widget.title,
|
|
query: widget.query,
|
|
type: widget.display.type,
|
|
});
|
|
}
|
|
}
|
|
|
|
return {
|
|
key: dashboard.key,
|
|
title: dashboard.title,
|
|
widgets,
|
|
};
|
|
}
|
|
|
|
export const loader = createLoaderApiRoute(
|
|
{
|
|
allowJWT: true,
|
|
corsStrategy: "all",
|
|
findResource: async () => 1,
|
|
authorization: {
|
|
action: "read",
|
|
resource: () => ({ type: "query", id: "dashboards" }),
|
|
},
|
|
},
|
|
async () => {
|
|
const dashboards = BUILT_IN_DASHBOARD_KEYS.map((key) => {
|
|
try {
|
|
return serializeDashboard(builtInDashboard(key));
|
|
} catch {
|
|
return null;
|
|
}
|
|
}).filter((d): d is DashboardSummary => d !== null);
|
|
return json({ dashboards });
|
|
}
|
|
);
|