feat(seed): update pricing item seeding to upsert on every deploy
Some checks are pending
CI/CD / test-and-build (push) Waiting to run
CI/CD / deploy (push) Blocked by required conditions

This commit is contained in:
Najjar\NajjarV02 2026-05-19 17:46:22 +04:00
parent fe5f1ce25f
commit 2eac53dac3
3 changed files with 24 additions and 24 deletions

View File

@ -9,7 +9,7 @@ echo "→ Syncing database schema..."
# db push creates the SQLite file and syncs tables to match schema.prisma # db push creates the SQLite file and syncs tables to match schema.prisma
/app/node_modules/.bin/prisma db push /app/node_modules/.bin/prisma db push
echo "→ Seeding database (idempotent — skips existing records)..." echo "→ Seeding database (idempotent — pricing rows are upserted every deploy)..."
/app/node_modules/.bin/tsx /app/prisma/seed.ts /app/node_modules/.bin/tsx /app/prisma/seed.ts
echo "→ Starting Next.js on port ${PORT:-3000}..." echo "→ Starting Next.js on port ${PORT:-3000}..."

Binary file not shown.

View File

@ -47,13 +47,12 @@ async function main() {
console.log('✓ JWT secret already exists, skipping.'); console.log('✓ JWT secret already exists, skipping.');
} }
// Seed default pricing items (idempotent — only if table is empty) // Pricing items — upserted on every deploy so the code is the source of truth.
const pricingCount = await prisma.pricingItem.count();
if (pricingCount === 0) {
// Prices in AED. USD → AED at 3.6725 (CBUAE peg). // Prices in AED. USD → AED at 3.6725 (CBUAE peg).
// Basic = Unitree G1 retail ($16k) + $5k markup = $21k ≈ 77,125 AED. // Basic = Unitree G1 retail ($16k) + $5k markup = $21k ≈ 77,125 AED.
// EDU = $40k flat ≈ 146,900 AED. // EDU = $40k flat ≈ 146,900 AED.
// All persona attire = 5,000 AED each. // All persona attire = 5,000 AED each.
// Note: any prior admin-UI edits to these item prices/labels will be reset on each deploy.
const defaultItems = [ const defaultItems = [
{ id: 'base', label: 'G1 Robot Basic', price: 77125, sortOrder: 0 }, { id: 'base', label: 'G1 Robot Basic', price: 77125, sortOrder: 0 },
{ id: 'edu', label: 'G1 Robot EDU', price: 146900, sortOrder: 1 }, { id: 'edu', label: 'G1 Robot EDU', price: 146900, sortOrder: 1 },
@ -65,12 +64,13 @@ async function main() {
{ id: 'security-guard', label: 'Security Guard', price: 5000, sortOrder: 7 }, { id: 'security-guard', label: 'Security Guard', price: 5000, sortOrder: 7 },
]; ];
for (const item of defaultItems) { for (const item of defaultItems) {
await prisma.pricingItem.create({ data: item }); await prisma.pricingItem.upsert({
} where: { id: item.id },
console.log(`✓ Seeded ${defaultItems.length} default pricing items.`); create: item,
} else { update: { label: item.label, price: item.price, sortOrder: item.sortOrder },
console.log(`${pricingCount} pricing items already exist, skipping.`); });
} }
console.log(`✓ Upserted ${defaultItems.length} pricing items from code defaults.`);
console.log('Seeding complete!'); console.log('Seeding complete!');
} }