refactor(web): move website into turbo app workspace
This commit is contained in:
parent
2664804e91
commit
b4e626a868
66 changed files with 318 additions and 298 deletions
147
apps/web/src/lib/server/dashboard.ts
Normal file
147
apps/web/src/lib/server/dashboard.ts
Normal file
|
|
@ -0,0 +1,147 @@
|
|||
import { dimensionLabDashboardFixture } from "$lib/model/fixtures/dimensionlab";
|
||||
import type { DashboardDocument } from "$lib/model";
|
||||
import {
|
||||
createDashboardStore,
|
||||
DashboardPersistenceValidationError,
|
||||
type DashboardStore,
|
||||
} from "$lib/server/db/dashboard-store";
|
||||
import { UnsupportedDashboardModelVersionError } from "$lib/server/db/model-migrations";
|
||||
|
||||
export type DashboardRuntimeState =
|
||||
| DashboardRuntimeEmpty
|
||||
| DashboardRuntimeInvalid
|
||||
| DashboardRuntimeLoading
|
||||
| DashboardRuntimeReady;
|
||||
|
||||
export interface DashboardRuntimeReady {
|
||||
state: "ready";
|
||||
document: DashboardDocument;
|
||||
schemaVersion: string;
|
||||
currentRevisionId: string;
|
||||
}
|
||||
|
||||
export interface DashboardRuntimeEmpty {
|
||||
state: "empty";
|
||||
title: string;
|
||||
subtitle: string;
|
||||
message: string;
|
||||
}
|
||||
|
||||
export interface DashboardRuntimeLoading {
|
||||
state: "loading";
|
||||
title: string;
|
||||
subtitle: string;
|
||||
message: string;
|
||||
}
|
||||
|
||||
export interface DashboardRuntimeInvalid {
|
||||
state: "invalid";
|
||||
title: string;
|
||||
subtitle: string;
|
||||
message: string;
|
||||
errors: string[];
|
||||
}
|
||||
|
||||
export interface DashboardRuntimeOptions {
|
||||
refreshSeedDocument?: boolean;
|
||||
seedIfEmpty?: boolean;
|
||||
seedDocument?: DashboardDocument;
|
||||
}
|
||||
|
||||
export function loadDashboardRuntime(
|
||||
store?: DashboardStore,
|
||||
options: DashboardRuntimeOptions = {},
|
||||
): DashboardRuntimeState {
|
||||
const dashboardStore = store || createDashboardStore();
|
||||
|
||||
try {
|
||||
const seedDocument = options.seedDocument || dimensionLabDashboardFixture;
|
||||
const active = dashboardStore.getActiveDashboard();
|
||||
if (active) {
|
||||
if (
|
||||
options.refreshSeedDocument &&
|
||||
shouldRefreshSeedDashboard(active, seedDocument)
|
||||
) {
|
||||
const refreshed = dashboardStore.commitDashboard(seedDocument, {
|
||||
actor: "initial-seed",
|
||||
message: "refresh bundled dashboard document",
|
||||
});
|
||||
return readyRuntimeState(refreshed.document, refreshed.id);
|
||||
}
|
||||
|
||||
return readyRuntimeState(active.document, active.currentRevisionId);
|
||||
}
|
||||
|
||||
if (!options.seedIfEmpty) {
|
||||
return {
|
||||
state: "empty",
|
||||
title: "No Dashboard Model",
|
||||
subtitle: "No active document",
|
||||
message: "No validated dashboard document is active yet.",
|
||||
};
|
||||
}
|
||||
|
||||
const seeded = dashboardStore.seedDashboardIfEmpty(
|
||||
seedDocument,
|
||||
{
|
||||
actor: "initial-seed",
|
||||
message: "load initial dashboard document",
|
||||
},
|
||||
);
|
||||
|
||||
return readyRuntimeState(seeded.document, seeded.id);
|
||||
} catch (error) {
|
||||
if (error instanceof DashboardPersistenceValidationError) {
|
||||
return invalidRuntimeState(error.failure.errors);
|
||||
}
|
||||
|
||||
if (error instanceof UnsupportedDashboardModelVersionError) {
|
||||
return invalidRuntimeState([error.message]);
|
||||
}
|
||||
|
||||
throw error;
|
||||
} finally {
|
||||
if (!store) dashboardStore.close();
|
||||
}
|
||||
}
|
||||
|
||||
function readyRuntimeState(
|
||||
document: DashboardDocument,
|
||||
currentRevisionId: string,
|
||||
): DashboardRuntimeReady {
|
||||
return {
|
||||
state: "ready",
|
||||
document,
|
||||
schemaVersion: document.schemaVersion,
|
||||
currentRevisionId,
|
||||
};
|
||||
}
|
||||
|
||||
function invalidRuntimeState(errors: string[]): DashboardRuntimeInvalid {
|
||||
return {
|
||||
state: "invalid",
|
||||
title: "Invalid Dashboard Model",
|
||||
subtitle: "Validation failed",
|
||||
message: "The active dashboard document could not be validated.",
|
||||
errors,
|
||||
};
|
||||
}
|
||||
|
||||
function shouldRefreshSeedDashboard(
|
||||
active: { document: DashboardDocument; revision: { actor: string } },
|
||||
seedDocument: DashboardDocument,
|
||||
): boolean {
|
||||
if (active.revision.actor !== "initial-seed") return false;
|
||||
if (!isBundledDimensionLabSeed(active.document, seedDocument)) return false;
|
||||
return JSON.stringify(active.document) !== JSON.stringify(seedDocument);
|
||||
}
|
||||
|
||||
function isBundledDimensionLabSeed(
|
||||
document: DashboardDocument,
|
||||
seedDocument: DashboardDocument,
|
||||
): boolean {
|
||||
return (
|
||||
document.metadata.title === seedDocument.metadata.title &&
|
||||
document.metadata.description === seedDocument.metadata.description
|
||||
);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue