fix(harvests): allow several harvests of the same type per year
Docker Image bauen und veroeffentlichen / build-and-push (push) Successful in 2m15s
Docker Image bauen und veroeffentlichen / build-and-push (push) Successful in 2m15s
The ApiCore sync failed with "Unique constraint failed on the constraint:
harvests_year_type_key" as soon as ApiCore had two harvests of the same
honey type in one year, which is normal (several extractions per season).
Every bottling of that harvest was then skipped too.
- Drop the (year, type) unique index. The slug is now the only unique,
public identifier: /ernten/<slug>, e.g. bluetenhonig-2026, then
bluetenhonig-2026-07-14 for a further harvest of the same type.
- New Harvest.apicoreHarvestId as the sync key, backfilled from the old
"apicore-<id>" slugs; the sync gives those rows a readable slug.
- Slugs are generated by one shared slugify() that normalizes Unicode
(decomposed umlauts) and writes out umlauts. The migration repairs
manual slugs created by the old umlaut bug ("fr-htracht-2026").
- Slug collisions are resolved by the database unique index, so parallel
writers cannot produce duplicates; known slugs are skipped up front to
keep the logs free of handled P2002 errors.
- Old URLs /ernten/<year>/<type> answer with 308 to the new address.
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
This commit is contained in:
1 parent
f1c0da4673
commit
641afa1ae4
15 files changed
+407
-83
No files matched your search
@@ -148,9 +148,14 @@ model Address {
|
||||
model Harvest {
|
||||
id String @id @default(cuid())
|
||||
year Int
|
||||
/// z.B. "Fruehtracht", "Sommertracht"
|
||||
/// z.B. "Fruehtracht", "Sommertracht". Bewusst NICHT eindeutig je Jahr:
|
||||
/// dieselbe Sorte wird oft mehrmals im Jahr geerntet.
|
||||
type String
|
||||
/// Oeffentliche Adresse /ernten/<slug> — siehe lib/harvest-slug.ts.
|
||||
slug String @unique
|
||||
/// ID der Ernte in ApiCore; Wiedererkennungs-Schluessel des Syncs
|
||||
/// (admin/actions/apicore-sync.ts). null fuer von Hand angelegte Ernten.
|
||||
apicoreHarvestId String? @unique
|
||||
harvestDate DateTime
|
||||
location String @default("Altenmuenster")
|
||||
description String
|
||||
@@ -170,7 +175,8 @@ model Harvest {
|
||||
batches Batch[]
|
||||
products Product[]
|
||||
|
||||
@@unique([year, type])
|
||||
/// Nur noch fuer die Weiterleitung alter Adressen /ernten/<jahr>/<sorte>.
|
||||
@@index([year, type])
|
||||
@@map("harvests")
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user