78 lines
2.0 KiB
TypeScript
78 lines
2.0 KiB
TypeScript
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,
|
||
|
|
);
|
||
|
|
}
|
||
|
|
};
|