Files
stock-listing-app/server/plugins/db.ts
T

78 lines
2.0 KiB
TypeScript
Raw Normal View History

import {
ensureAdditiveColumns,
getDbExec,
runMigrations,
} from "@agent-native/core/db";
import * as schema from "../db/schema.js";
const runStocksMigrations = runMigrations(
[
{
version: 1,
name: "stocks-table",
sql: `CREATE TABLE IF NOT EXISTS stocks (
id TEXT PRIMARY KEY,
symbol TEXT NOT NULL,
company_name TEXT NOT NULL,
exchange TEXT NOT NULL DEFAULT 'NASDAQ',
sector TEXT,
currency TEXT NOT NULL DEFAULT 'USD',
price REAL NOT NULL DEFAULT 0,
change_percent REAL NOT NULL DEFAULT 0,
market_cap INTEGER,
watchlisted BOOLEAN NOT NULL DEFAULT FALSE,
owner_email TEXT NOT NULL,
created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP
)`,
},
{
version: 2,
name: "stocks-owner-symbol-unique-index",
sql: `CREATE UNIQUE INDEX IF NOT EXISTS idx_stocks_owner_symbol
ON stocks (owner_email, symbol)`,
},
{
version: 3,
name: "stocks-owner-watchlisted-index",
sql: `CREATE INDEX IF NOT EXISTS idx_stocks_owner_watchlisted
ON stocks (owner_email, watchlisted)`,
},
],
{ table: "stocks_migrations" },
);
function isDrizzleTable(value: unknown): value is object {
return (
!!value &&
typeof value === "object" &&
Object.getOwnPropertySymbols(value).some((s) =>
s.toString().includes("drizzle"),
)
);
}
const schemaTables = Object.values(schema).filter(isDrizzleTable);
export default async (nitroApp: any): Promise<void> => {
await runStocksMigrations(nitroApp);
try {
const summary = await ensureAdditiveColumns({
db: getDbExec(),
tables: schemaTables,
});
if (summary.errors.length > 0) {
console.warn(
"[db] ensureAdditiveColumns completed with errors:",
summary.errors,
);
}
} catch (err) {
console.warn(
"[db] ensureAdditiveColumns failed (non-fatal):",
err instanceof Error ? err.message : err,
);
}
};