Files
lst_v3/backend/configs/scaler.config.ts
2026-03-01 14:10:19 -06:00

194 lines
4.5 KiB
TypeScript

//import path from "node:path";
//import { fileURLToPath } from "node:url";
import type { Express } from "express";
//const __filename = fileURLToPath(import.meta.url);
// const __dirname = path.dirname(__filename);
import os from "node:os";
import { apiReference } from "@scalar/express-api-reference";
// const port = 3000;
import type { OpenAPIV3_1 } from "openapi-types";
import { cronerActiveJobs } from "../scaler/cronerActiveJobs.spec.js";
import { cronerStatusChange } from "../scaler/cronerStatusChange.spec.js";
import { prodLoginSpec } from "../scaler/login.spec.js";
import { openDockApt } from "../scaler/opendockGetRelease.spec.js";
import { prodRestartSpec } from "../scaler/prodSqlRestart.spec.js";
import { prodStartSpec } from "../scaler/prodSqlStart.spec.js";
import { prodStopSpec } from "../scaler/prodSqlStop.spec.js";
import { prodRegisterSpec } from "../scaler/register.spec.js";
// all the specs
import { statusSpec } from "../scaler/stats.spec.js";
export const openApiBase: OpenAPIV3_1.Document = {
openapi: "3.1.0",
info: {
title: "LST API",
version: "3.0.0",
description: "Label System Tracking API",
},
servers: [
{
// TODO: change this to the https:// if we are in production and port if not.
url: `http://${os.hostname()}:3000${process.env.NODE_ENV?.trim() !== "production" ? "/lst" : "/"}`,
description: "Development server",
},
],
components: {
securitySchemes: {
bearerAuth: {
type: "http",
scheme: "bearer",
bearerFormat: "JWT",
},
ApiKeyAuth: {
type: "apiKey",
description: "API key required for authentication",
name: "api_key",
in: "header",
},
basicAuth: {
type: "http",
scheme: "basic",
description: "Basic authentication using username and password",
},
cookieAuth: {
type: "apiKey",
in: "cookie",
name: "better-auth.session_token",
},
},
// schemas: {
// Error: {
// type: "object",
// properties: {
// error: { type: "string" },
// message: { type: "string" },
// },
// },
// },.
},
// security: [
// {
// cookieAuth: [],
// basicAuth: [],
// },
// ],
tags: [
{
name: "Auth",
description:
"Authentication section where you get and create users and api keys",
},
{
name: "System",
description: "All system endpoints that will be available to run",
},
{
name: "Utils",
description: "All routes related to the utilities on the server",
},
{
name: "Open Dock",
description: "All routes related to the opendock on the server",
},
// { name: "TMS", description: "TMS integration" },
],
paths: {}, // Will be populated
};
export const setupApiDocsRoutes = (baseUrl: string, app: Express) => {
// const mergedDatamart = {
// "/api/datamart": {
// ...(cronerActiveJobs["/api/datamart"] ?? {}),
// ...(datamartAddSpec["/api/datamart"] ?? {}),
// ...(datamartUpdateSpec["/api/datamart"] ?? {}),
// },
// "/api/datamart/{name}": getDatamartSpec["/api/datamart/{name}"],
// };
// const mergeUtils = {
// "/api/utils/croner": {
// ...(cronerActiveJobs["/api/utils/croner"] ?? {}),
// },
// "/api/utils/{name}": cronerActiveJobs["/api/utils/{name}"],
// };
const fullSpec = {
...openApiBase,
paths: {
...statusSpec,
...prodStartSpec,
...prodStopSpec,
...prodRestartSpec,
...prodLoginSpec,
...prodRegisterSpec,
//...mergedDatamart,
...cronerActiveJobs,
...cronerStatusChange,
...openDockApt,
// Add more specs here as you build features
},
};
app.get(`${baseUrl}/api/docs.json`, (_, res) => {
res.json(fullSpec);
});
app.use(
`${baseUrl}/api/docs`,
apiReference({
url: `${baseUrl}/api/docs.json`,
theme: "purple",
darkMode: true,
persistAuth: true,
authentication: {
securitySchemes: {
httpBasic: {
username: "username",
password: "password",
},
},
},
defaultHttpClient: {
targetKey: "node",
clientKey: "axios",
},
documentDownloadType: "json",
hideClientButton: true,
hiddenClients: {
// C
c: ["libcurl"],
// Clojure
clojure: ["clj_http"],
// C#
// csharp: ["httpclient", "restsharp"],
// Dart
dart: ["http"],
// F#
fsharp: ["httpclient"],
// Java
java: ["asynchttp", "nethttp", "okhttp", "unirest"],
// Objective-C
objc: ["nsurlsession"],
// OCaml
ocaml: ["cohttp"],
// PHP
php: ["curl", "guzzle"],
// R
r: ["httr"],
// Ruby
ruby: ["native"],
// Rust
rust: ["reqwest"],
// Swift
swift: ["nsurlsession"],
},
}),
);
};