72 lines
2.0 KiB
TypeScript
72 lines
2.0 KiB
TypeScript
import { Router } from "express";
|
|
import type { Db } from "@paperclipai/db";
|
|
import { and, count, eq, gt, isNull, sql } from "drizzle-orm";
|
|
import { instanceUserRoles, invites } from "@paperclipai/db";
|
|
import type { DeploymentExposure, DeploymentMode } from "@paperclipai/shared";
|
|
|
|
export function healthRoutes(
|
|
db?: Db,
|
|
opts: {
|
|
deploymentMode: DeploymentMode;
|
|
deploymentExposure: DeploymentExposure;
|
|
authReady: boolean;
|
|
companyDeletionEnabled: boolean;
|
|
} = {
|
|
deploymentMode: "local_trusted",
|
|
deploymentExposure: "private",
|
|
authReady: true,
|
|
companyDeletionEnabled: true,
|
|
},
|
|
) {
|
|
const router = Router();
|
|
|
|
router.get("/", async (_req, res) => {
|
|
if (!db) {
|
|
res.json({ status: "ok" });
|
|
return;
|
|
}
|
|
|
|
let bootstrapStatus: "ready" | "bootstrap_pending" = "ready";
|
|
let bootstrapInviteActive = false;
|
|
if (opts.deploymentMode === "authenticated") {
|
|
const roleCount = await db
|
|
.select({ count: count() })
|
|
.from(instanceUserRoles)
|
|
.where(sql`${instanceUserRoles.role} = 'instance_admin'`)
|
|
.then((rows) => Number(rows[0]?.count ?? 0));
|
|
bootstrapStatus = roleCount > 0 ? "ready" : "bootstrap_pending";
|
|
|
|
if (bootstrapStatus === "bootstrap_pending") {
|
|
const now = new Date();
|
|
const inviteCount = await db
|
|
.select({ count: count() })
|
|
.from(invites)
|
|
.where(
|
|
and(
|
|
eq(invites.inviteType, "bootstrap_ceo"),
|
|
isNull(invites.revokedAt),
|
|
isNull(invites.acceptedAt),
|
|
gt(invites.expiresAt, now),
|
|
),
|
|
)
|
|
.then((rows) => Number(rows[0]?.count ?? 0));
|
|
bootstrapInviteActive = inviteCount > 0;
|
|
}
|
|
}
|
|
|
|
res.json({
|
|
status: "ok",
|
|
deploymentMode: opts.deploymentMode,
|
|
deploymentExposure: opts.deploymentExposure,
|
|
authReady: opts.authReady,
|
|
bootstrapStatus,
|
|
bootstrapInviteActive,
|
|
features: {
|
|
companyDeletionEnabled: opts.companyDeletionEnabled,
|
|
},
|
|
});
|
|
});
|
|
|
|
return router;
|
|
}
|