karbe/src/lib/amenities.ts
Karbé Architect b9bfc5ee32 feat(espace-hote): CRUD carbet propriétaire + upload médias S3/MinIO
Interface propriétaire sous /espace-hote/carbets :
- Liste, création, édition et suppression de carbets (formulaire complet :
  présentation, localisation, accès pirogue, commodités).
- Upload photos/vidéos vers S3/MinIO (route handler multipart), réordonnancement
  et suppression des médias, photo de couverture.
- Statut de publication (brouillon / publié / archivé) avec garde
  « au moins un média avant publication ».

Réutilise le schéma Prisma (SYS-2) et l'authentification NextAuth (SYS-3) :
gating via requireRole([OWNER, ADMIN]) et contrôle de propriété sur chaque
mutation. Stockage objet configurable par variables S3_* (compatible MinIO).

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-29 04:58:12 +00:00

37 lines
1.5 KiB
TypeScript

export type AmenityDefinition = {
key: string;
label: string;
description?: string;
};
// Catalogue de commodités adapté aux carbets fluviaux de Guyane.
// Les lignes Amenity sont créées à la demande (upsert par `key`) lors de
// l'enregistrement d'un carbet, ce qui évite un script de seed dédié.
export const AMENITY_CATALOG: AmenityDefinition[] = [
{ key: "hamac", label: "Hamacs fournis" },
{ key: "moustiquaire", label: "Moustiquaires" },
{ key: "eau_potable", label: "Eau potable" },
{ key: "electricite_solaire", label: "Électricité solaire" },
{ key: "groupe_electrogene", label: "Groupe électrogène" },
{ key: "toilettes_seches", label: "Toilettes sèches" },
{ key: "douche", label: "Douche" },
{ key: "cuisine_equipee", label: "Cuisine équipée" },
{ key: "rechaud_gaz", label: "Réchaud à gaz" },
{ key: "glaciere", label: "Glacière / réfrigérateur" },
{ key: "carbet_couvert", label: "Carbet couvert" },
{ key: "baignade_riviere", label: "Baignade en rivière" },
{ key: "materiel_peche", label: "Matériel de pêche" },
{ key: "kayak_canoe", label: "Kayak / canoë" },
{ key: "barbecue", label: "Barbecue / foyer" },
{ key: "guide_local", label: "Guide local disponible" },
];
const CATALOG_BY_KEY = new Map(AMENITY_CATALOG.map((a) => [a.key, a]));
export function isKnownAmenityKey(key: string): boolean {
return CATALOG_BY_KEY.has(key);
}
export function amenityLabel(key: string): string {
return CATALOG_BY_KEY.get(key)?.label ?? key;
}