import pointsBalanceView from './db/tables/points_balance_view.cjs' /** * Recreate billing-owned derived views. * * This is explicit schema maintenance for dev/test sync scripts, not runtime app startup. * @param {import('knex').Knex} db */ export async function recreateBillingViews(db) { await recreateView(db, pointsBalanceView) } /** * @param {import('knex').Knex} db * @param {{ viewName: string, createViewSql: () => string }} view */ async function recreateView(db, view) { await db.raw(`DROP VIEW IF EXISTS ${quoteIdent(view.viewName)}`) await db.raw(view.createViewSql()) } /** * @param {string} name */ function quoteIdent(name) { if (!/^[A-Za-z0-9_]+$/.test(name)) throw new Error(`invalid SQL identifier: ${name}`) return `\`${name}\`` }