- 5 SVG placeholder product images (minimal dark style with watermark initials) - Seed data updated to reference .svg placeholders - Nostr DM inbox in admin (Messages tab) with shop npub display - GET /api/admin/nostr-info endpoint for shop pubkey - My Orders page: customers look up orders by NIP-07 Nostr identity - GET /api/orders/by-pubkey/:pubkey endpoint with hex validation - SeoMeta component for OG/Twitter meta tags - SEO meta on HomeView and ProductView - Base OG meta tags in index.html - "My Orders" link in shop header nav - Splash logo doubled in size on desktop (680px max) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
43 lines
1.6 KiB
TypeScript
43 lines
1.6 KiB
TypeScript
import express from 'express'
|
|
import helmet from 'helmet'
|
|
import cors from 'cors'
|
|
import cookieParser from 'cookie-parser'
|
|
import { getDb } from './db/connection.js'
|
|
import { initSchema } from './db/schema.js'
|
|
import { seedProducts } from './db/seed.js'
|
|
import { productsRouter } from './routes/products.js'
|
|
import { ordersRouter } from './routes/orders.js'
|
|
import { webhooksRouter } from './routes/webhooks.js'
|
|
import { adminRouter } from './routes/admin.js'
|
|
import { adminProductsRouter } from './routes/adminProducts.js'
|
|
import { adminOrdersRouter } from './routes/adminOrders.js'
|
|
import { uploadRouter } from './routes/upload.js'
|
|
import { adminNostrRouter } from './routes/adminNostr.js'
|
|
import { ordersByPubkeyRouter } from './routes/ordersByPubkey.js'
|
|
|
|
const app = express()
|
|
const port = Number(process.env.PORT) || 3141
|
|
|
|
app.use(helmet({ contentSecurityPolicy: false }))
|
|
app.use(cors({ origin: true, credentials: true }))
|
|
app.use(cookieParser())
|
|
app.use(express.json({ limit: '1mb' }))
|
|
|
|
const db = getDb()
|
|
initSchema(db)
|
|
seedProducts(db)
|
|
|
|
app.use('/api/products', productsRouter)
|
|
app.use('/api/orders', ordersRouter)
|
|
app.use('/api/webhooks', webhooksRouter)
|
|
app.use('/api/admin', adminRouter)
|
|
app.use('/api/admin/products', adminProductsRouter)
|
|
app.use('/api/admin/orders', adminOrdersRouter)
|
|
app.use('/api/admin/upload', uploadRouter)
|
|
app.use('/api/admin', adminNostrRouter)
|
|
app.use('/api/orders/by-pubkey', ordersByPubkeyRouter)
|
|
|
|
app.get('/api/health', (_req, res) => { res.json({ ok: true, timestamp: new Date().toISOString() }) })
|
|
|
|
app.listen(port, () => { console.log(`Antonym API running on http://localhost:${port}`) })
|