feat(sammler): mehrere sammler mit eigener sammlung und wunschliste
Der Katalog bleibt gemeinsam - ein Set existiert einmal, unabhaengig davon, wer es hat. Besitz und Wunschlisten gehoeren dagegen je einem Sammler. Damit beantwortet "hat er das schon?" jetzt die Frage "hat *er* das schon?": ein Set, das nur die Schwester besitzt, faellt fuer den Bruder wieder unter "fehlt noch" und darf auf seine Wunschliste. Wichtig fuer den Alltag: Solange es nur einen Sammler gibt, taucht die Unterscheidung nirgends in der Oberflaeche auf. Kein Umschalter, keine Abfrage beim Hinzufuegen, keine Badges - die App bleibt exakt so einfach wie vorher. Erst der zweite Sammler schaltet all das frei. Die Besitzlogik liegt weiterhin an genau einer Stelle (src/lib/ownership.ts) und hat nur eine Dimension dazubekommen. Das automatische "erfuellt" auf Wunschlisten fragt jetzt ebenfalls je Liste: ein Wunsch auf Max' Liste ist erfuellt, wenn Max das Set bekommt - nicht wenn Mia es hat. Listen ohne Sammler verhalten sich wie bisher. Die Migration legt einen Sammler "Sammlung" an und ordnet ihm alles Vorhandene zu; umbenennen laesst er sich unter Verwaltung -> Sammler. Der Seed uebernimmt ihn statt einen dritten anzulegen. Refs Phase 3 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -88,6 +88,22 @@ export const locationSchema = z.object({
|
||||
parentLocationId: optionalId,
|
||||
});
|
||||
|
||||
export const collectorColorEnum = z.enum([
|
||||
'blue',
|
||||
'green',
|
||||
'amber',
|
||||
'rose',
|
||||
'violet',
|
||||
'slate',
|
||||
]);
|
||||
|
||||
export const collectorSchema = z.object({
|
||||
name: z.string().trim().min(1, 'Bitte einen Namen angeben.').max(60),
|
||||
color: collectorColorEnum.default('blue'),
|
||||
birthday: optionalDate,
|
||||
notes: optionalText(500),
|
||||
});
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Catalog
|
||||
// ---------------------------------------------------------------------------
|
||||
@@ -127,6 +143,7 @@ export const conditionEnum = z.enum(['new_sealed', 'like_new', 'good', 'used', '
|
||||
|
||||
export const collectionItemSchema = z.object({
|
||||
setId: z.string().trim().min(1),
|
||||
collectorId: optionalId,
|
||||
status: collectionStatusEnum.default('owned'),
|
||||
completeness: completenessEnum.default('unknown'),
|
||||
condition: z
|
||||
@@ -171,6 +188,7 @@ export const occasionEnum = z.enum(['christmas', 'birthday', 'easter', 'other'])
|
||||
|
||||
export const wishlistSchema = z.object({
|
||||
title: z.string().trim().min(1, 'Bitte einen Titel angeben.').max(80),
|
||||
collectorId: optionalId,
|
||||
occasion: occasionEnum.default('other'),
|
||||
eventDate: optionalDate,
|
||||
note: optionalText(1000),
|
||||
@@ -205,3 +223,4 @@ export type LocationInput = z.infer<typeof locationSchema>;
|
||||
export type SetInput = z.infer<typeof setSchema>;
|
||||
export type CollectionItemInput = z.infer<typeof collectionItemSchema>;
|
||||
export type WishlistInput = z.infer<typeof wishlistSchema>;
|
||||
export type CollectorInput = z.infer<typeof collectorSchema>;
|
||||
|
||||
Reference in New Issue
Block a user