perf: DB-Indizes, Footer als Server Component, Site-weite Fehlerseiten
Datenbank (prisma/migrations/20260904120000_add_performance_indexes): 7 fehlende Indizes auf Fremdschluessel-/Filter-Spalten ergaenzt (Order.customerId+createdAt, Order.status, Order.createdAt, Order.discountCodeId, OrderItem.orderId, Address.customerId, AuditLog.createdAt) — bislang volle Tabellenscans bei Bestelluebersicht, Admin-Dashboard, Checkout-Gutscheinpruefung und Audit-Log. Bundle-Groesse: Footer (TikTok/YouTube/Instagram-Icons, Copyright-Zeile) aus dem client-seitigen site-chrome.tsx in eine eigene Server Component (site-footer.tsx) ausgelagert — brauchte "use client" nur wegen useI18n(), jetzt getDictionary()-Server-Aufruf wie auf jeder Admin-Seite. Entfernt ungenutztes clientseitiges JS/Hydration aus jedem Seitenaufruf (Footer steht im Root-Layout). UX: app/not-found.tsx und app/error.tsx ergaenzt (Next.js-Konventionen fuer 404 bzw. Laufzeitfehler) — beide fehlten komplett, unbekannte Routen und Rendering-Fehler zeigten bisher Next.js' generische, unbrandete Standardseiten statt einer zur Seite passenden Nutzerfuehrung. Dictionary-Kollision dabei aufgefallen und aufgeloest: eine bereits bestehende, admin-interne errorPage-Uebersetzung (src/app/admin/error.tsx, seit dem urspruenglichen App-Grundgeruest vorhanden) blieb unangetastet, die neue site-weite Fehlerseite nutzt einen eigenen Schluessel (siteErrorPage). Verifiziert: tsc --noEmit clean, 118/118 Tests gruen, pnpm build clean. Co-Authored-By: Claude Sonnet 5 <[email protected]>
This commit is contained in:
1 parent
9e8da18875
commit
04cc3061cf
13 files changed
+344
-215
No files matched your search
@@ -0,0 +1,35 @@
|
||||
-- CreateIndex
|
||||
-- "Meine Bestellungen" (Konto) sowie der Datenexport filtern nach customerId
|
||||
-- und sortieren nach createdAt absteigend — ein zusammengesetzter Index
|
||||
-- bedient beides in einem Indexzugriff statt eines vollen Tabellenscans.
|
||||
CREATE INDEX "orders_customerId_createdAt_idx" ON "orders"("customerId", "createdAt");
|
||||
|
||||
-- CreateIndex
|
||||
-- Statusfilter in der Admin-Bestellliste (exakte Gleichheit) und Basis fuer
|
||||
-- die Status-Auswertungen im Admin-Dashboard.
|
||||
CREATE INDEX "orders_status_idx" ON "orders"("status");
|
||||
|
||||
-- CreateIndex
|
||||
-- Datumsbereichs-Filter im Admin-Dashboard (Tages-/Monatsumsatz, Umsatztrend)
|
||||
-- sowie Standardsortierung in Bestelllisten ohne weiteren Filter.
|
||||
CREATE INDEX "orders_createdAt_idx" ON "orders"("createdAt");
|
||||
|
||||
-- CreateIndex
|
||||
-- Nutzungszaehlung eines Rabattcodes beim Checkout (Order.count nach
|
||||
-- discountCodeId + status).
|
||||
CREATE INDEX "orders_discountCodeId_idx" ON "orders"("discountCodeId");
|
||||
|
||||
-- CreateIndex
|
||||
-- Wird bei jedem Laden der Positionen einer Bestellung (Konto, Admin,
|
||||
-- Rechnung, Datenexport) ueber die order.items-Relation abgefragt.
|
||||
CREATE INDEX "order_items_orderId_idx" ON "order_items"("orderId");
|
||||
|
||||
-- CreateIndex
|
||||
-- Adressliste und Standardadresse-Update im Kundenkonto filtern nach
|
||||
-- customerId.
|
||||
CREATE INDEX "addresses_customerId_idx" ON "addresses"("customerId");
|
||||
|
||||
-- CreateIndex
|
||||
-- Admin-Audit-Log-Seite sortiert eine unbegrenzt wachsende Tabelle nach
|
||||
-- createdAt absteigend (ORDER BY + LIMIT ohne weiteren Filter).
|
||||
CREATE INDEX "audit_logs_createdAt_idx" ON "audit_logs"("createdAt");
|
||||
@@ -124,6 +124,8 @@ model Address {
|
||||
|
||||
customer Customer @relation(fields: [customerId], references: [id], onDelete: Cascade)
|
||||
|
||||
/// Adressliste und Standardadresse-Update im Kundenkonto filtern nach customerId.
|
||||
@@index([customerId])
|
||||
@@map("addresses")
|
||||
}
|
||||
|
||||
@@ -359,6 +361,16 @@ model Order {
|
||||
invoice Invoice?
|
||||
returnRequest ReturnRequest?
|
||||
|
||||
/// Bedient sowohl "Meine Bestellungen" (Filter nach customerId, sortiert nach
|
||||
/// createdAt) als auch den reinen customerId-Filter beim Datenexport.
|
||||
@@index([customerId, createdAt])
|
||||
/// Statusfilter im Admin-Bestellungen-Bereich (exakte Gleichheit).
|
||||
@@index([status])
|
||||
/// Datumsbereichs-Filter (Tages-/Monatsumsatz, Umsatztrend im Admin-Dashboard)
|
||||
/// sowie Standard-Sortierung in Bestelllisten ohne weiteren Filter.
|
||||
@@index([createdAt])
|
||||
/// Nutzungszaehlung eines Rabattcodes beim Checkout (Order.count nach discountCodeId).
|
||||
@@index([discountCodeId])
|
||||
@@map("orders")
|
||||
}
|
||||
|
||||
@@ -403,6 +415,9 @@ model OrderItem {
|
||||
product Product @relation(fields: [productId], references: [id], onDelete: Restrict)
|
||||
batch Batch? @relation(fields: [batchId], references: [id], onDelete: Restrict)
|
||||
|
||||
/// Wird bei jedem Laden der Positionen einer Bestellung (Konto, Admin,
|
||||
/// Rechnung) ueber die order.items-Relation abgefragt.
|
||||
@@index([orderId])
|
||||
@@map("order_items")
|
||||
}
|
||||
|
||||
@@ -598,6 +613,9 @@ model AuditLog {
|
||||
|
||||
admin Customer? @relation(fields: [adminId], references: [id], onDelete: SetNull)
|
||||
|
||||
/// Admin-Audit-Log-Seite sortiert unbegrenzt wachsende Tabelle nach
|
||||
/// createdAt absteigend (ORDER BY + LIMIT ohne weiteren Filter).
|
||||
@@index([createdAt])
|
||||
@@map("audit_logs")
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user