generated from wiz4apps/templates.OnlineShop
Implement the data layer from docs/PLAN.md §4 (card #55): - db/migrations/0001_init.sql: idempotent DDL for the 16 entities (category, product, product_category, product_image, product_variant, product_feature, cart, cart_item, customer, address, orders, order_item, payment, promo_code, content_page, delivery_option) with relations and indexes; explicit index on orders.number (product.slug/category.slug are unique-indexed by their keys). - Currency BYN (R4/Q1): STORE_CURRENCY = 'BYN', money as integer minor units (BYN * 100), no float, no interim currency, no FX conversion. - Idempotent seed: 14 categories (11 visible + 3 hidden visible=false, R13) and 93 products from docs/CATALOG.md §3 (broken #59 excluded, R14) with prices, old prices and badges; cross-listing, images, variants, PDP fields (R9), store constants (CATALOG §6), 1 admin + 1 customer and 2 orders. - scripts/{migrate,seed,verify}.ts + src/db: CLI entry points and an in-process Postgres verification harness (satisfies `migrate` + `seed` on a clean clone). - db/seed/0001_seed.sql: generated single-file SQL for the platform Data Tables (`/db-forms`, run_sql) to converge tenant_1 without a Node process. - Placeholder dev server + storefront currency/constants and money helpers. Verified on a clean Postgres (PGlite): product = 93; category = 14 with visible = 11; orders = 2; money integer BYN minor units (0 float rows).
16 lines
441 B
TypeScript
16 lines
441 B
TypeScript
import 'dotenv/config';
|
|
import { createPgClient } from '../src/db/client';
|
|
import { migrate } from '../src/db/migrate';
|
|
|
|
const client = createPgClient();
|
|
try {
|
|
const applied = await migrate(client);
|
|
if (applied.length === 0) {
|
|
console.log('migrate: nothing to do — schema is up to date');
|
|
} else {
|
|
console.log(`migrate: applied ${applied.length} migration(s): ${applied.join(', ')}`);
|
|
}
|
|
} finally {
|
|
await client.end();
|
|
}
|