Shaheer Sarfaraz fe0aebe01a
Small bits and bobs, codebase quality (#129)
* initial change

* nav highlighting

* icon change

* deeeedoooop

* text

* show version number on all pages

* icon

* remove unused code

* add knip

* formatting

* remove unused code

* types fix

* remove notion completely from the codebase.

* update test for new url structure

* clean up the fucking shop boys

* make a "create job" factory and use that

* moar factories

* formatting
2026-02-10 20:01:58 +00:00

127 lines
3.9 KiB
TypeScript

import {
DEMO_DEFAULT_JOBS,
DEMO_DEFAULT_PIPELINE_RUNS,
DEMO_DEFAULT_SETTINGS,
DEMO_DEFAULT_STAGE_EVENTS,
type DemoDefaultSettings,
} from "@server/config/demo-defaults";
import { db, schema } from "@server/db/index";
type BuiltDemoBaseline = {
resetAt: string;
settings: DemoDefaultSettings;
pipelineRuns: Array<typeof schema.pipelineRuns.$inferInsert>;
jobs: Array<typeof schema.jobs.$inferInsert>;
stageEvents: Array<typeof schema.stageEvents.$inferInsert>;
};
const { interviews, jobs, pipelineRuns, settings, stageEvents, tasks } = schema;
function toIsoFromOffset(now: Date, offsetMinutes: number): string {
return new Date(now.getTime() - offsetMinutes * 60 * 1000).toISOString();
}
function makeDemoLink(
baseUrl: string,
jobId: string,
kind: "job" | "apply",
): string {
const trimmed = baseUrl.replace(/\/+$/, "");
return `${trimmed}/${kind}/${jobId}`;
}
export function buildDemoBaseline(now: Date): BuiltDemoBaseline {
const resetAt = now.toISOString();
return {
resetAt,
settings: DEMO_DEFAULT_SETTINGS,
pipelineRuns: DEMO_DEFAULT_PIPELINE_RUNS.map((run) => ({
id: run.id,
status: run.status,
startedAt: toIsoFromOffset(now, run.startedOffsetMinutes),
completedAt: toIsoFromOffset(now, run.completedOffsetMinutes),
jobsDiscovered: run.jobsDiscovered,
jobsProcessed: run.jobsProcessed,
errorMessage: run.errorMessage ?? null,
})),
jobs: DEMO_DEFAULT_JOBS.map((job) => ({
id: job.id,
source: job.source,
title: job.title,
employer: job.employer,
jobUrl: makeDemoLink(job.jobUrl, job.id, "job"),
applicationLink: makeDemoLink(job.applicationLink, job.id, "apply"),
location: job.location,
salary: job.salary,
deadline: job.deadline,
jobDescription: job.jobDescription,
status: job.status,
suitabilityScore: job.suitabilityScore,
suitabilityReason: job.suitabilityReason,
tailoredSummary: job.tailoredSummary ?? null,
tailoredHeadline: job.tailoredHeadline ?? null,
tailoredSkills: job.tailoredSkills
? JSON.stringify(job.tailoredSkills)
: null,
selectedProjectIds: job.selectedProjectIds ?? null,
pdfPath: job.pdfPath ?? null,
discoveredAt: toIsoFromOffset(now, job.discoveredOffsetMinutes),
appliedAt:
job.status === "applied" && typeof job.appliedOffsetMinutes === "number"
? toIsoFromOffset(now, job.appliedOffsetMinutes)
: null,
createdAt: toIsoFromOffset(now, job.discoveredOffsetMinutes),
updatedAt: resetAt,
})),
stageEvents: DEMO_DEFAULT_STAGE_EVENTS.map((event) => ({
id: event.id,
applicationId: event.applicationId,
title: event.title,
fromStage: event.fromStage,
toStage: event.toStage,
occurredAt: Math.floor(
(now.getTime() - event.occurredOffsetMinutes * 60 * 1000) / 1000,
),
metadata: event.metadata,
outcome: null,
groupId: null,
})),
};
}
export async function applyDemoBaseline(
baseline: BuiltDemoBaseline,
): Promise<void> {
db.transaction((tx) => {
tx.delete(stageEvents).run();
tx.delete(tasks).run();
tx.delete(interviews).run();
tx.delete(jobs).run();
tx.delete(pipelineRuns).run();
tx.delete(settings).run();
const settingRows = Object.entries(baseline.settings).map(
([key, value]) => ({
key,
value,
createdAt: baseline.resetAt,
updatedAt: baseline.resetAt,
}),
);
if (settingRows.length > 0) {
tx.insert(settings).values(settingRows).run();
}
if (baseline.pipelineRuns.length > 0) {
tx.insert(pipelineRuns).values(baseline.pipelineRuns).run();
}
if (baseline.jobs.length > 0) {
tx.insert(jobs).values(baseline.jobs).run();
}
if (baseline.stageEvents.length > 0) {
tx.insert(stageEvents).values(baseline.stageEvents).run();
}
});
}