Commit Graph
21 Commits
Author SHA1 Message Date
Claude a4915b445d Cartes promo : cadre image carré 1:1 (adapté aux visuels Facebook)
Les visuels promo sont carrés (posts Facebook) : un cadre 1200/630 laissait des
bandes floues sur les côtés. Passage du cadre image en 1:1 partout (accueil,
fiche, aperçu espace adhérent, modération) → les images carrées remplissent
sans bords. Conseil d'upload : image carrée (1080×1080).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XwfhYHzC9hQWPDnQ2p53GL
2026-06-27 21:18:18 +00:00
Claude 7037e8863b Cartes promo : zone image en aspect-ratio 1200/630 (nouvelle maquette)
Aligne les cartes promo sur la dernière refonte Claude Design : la zone image
passe d'une hauteur fixe à un ratio 1200/630, au-dessus du composant PromoImage
existant (remplissage flou + contain). Appliqué à l'accueil, la fiche adhérent,
l'aperçu de l'espace adhérent et la modération. Conseil d'upload : 1200×630.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XwfhYHzC9hQWPDnQ2p53GL
2026-06-27 15:54:22 +00:00
Claude e2cf03c9f3 Anime la page d'accueil : apparitions au défilement + étoiles en mouvement
- Composant Reveal (IntersectionObserver) + keyframes CSS : sections et grilles
  apparaissent en fondu/glissement, cartes en cascade (stagger). Respecte
  prefers-reduced-motion + repli no-JS.
- Étoiles (sparkles) : l'animation twinkle inclut désormais une dérive
  (translation) pour un mouvement nettement visible.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XwfhYHzC9hQWPDnQ2p53GL
2026-06-26 22:09:43 +00:00
Claude 9c4bdbe09d Élargit la barre de recherche de l'accueil jusqu'au bord droit
Le formulaire passe en pleine largeur (display:flex, width:100%) et le champ
occupe l'espace disponible (flex:1).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XwfhYHzC9hQWPDnQ2p53GL
2026-06-26 22:02:26 +00:00
Claude 856fbc1c90 Gestion des catégories dans le back-office (admin)
Nouvelle page /backend/categories : lister, ajouter (slug + couleur auto),
renommer et supprimer des catégories. Capacité RBAC manageCategories (admin) ;
lien ajouté à la barre latérale. La suppression détache les adhérents concernés
(transaction) pour éviter toute violation de clé étrangère.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XwfhYHzC9hQWPDnQ2p53GL
2026-06-26 21:58:46 +00:00
Claude 4ab05c5d71 Élargit fortement la liste des catégories d'adhérents (59) + select dynamique
Seed enrichi avec ~59 catégories (bouche, mode/beauté, maison/bâtiment, auto,
santé, services aux particuliers & entreprises, loisirs/culture, industrie),
slugs existants conservés. Le select « Catégorie » de l'espace adhérent lit
désormais la liste depuis la base (plus de liste codée en dur). Insertion
idempotente : relancer le seed ajoute les nouvelles catégories sans doublon.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XwfhYHzC9hQWPDnQ2p53GL
2026-06-26 21:52:49 +00:00
Claude e5ce8ab528 Retire le logo + titre de l'en-tête (haut-gauche) et du pied de page (bas-gauche)
Le menu reste aligné à droite et le bloc contact à droite, conformément aux
maquettes d'origine.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XwfhYHzC9hQWPDnQ2p53GL
2026-06-26 21:43:45 +00:00
Claude 5b6445b571 En-tête/pied de page partagés et cohérents + retrait du bloc métiers
- Menu identique sur toutes les pages publiques (Accueil, Annuaire, Promotions,
  L'association, Espace adhérent) via SiteHeader/SiteFooter : on peut toujours
  revenir à l'accueil depuis l'annuaire et inversement (page courante en gras).
- Retire la section « Parcourir par métier » de la page d'accueil.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XwfhYHzC9hQWPDnQ2p53GL
2026-06-26 21:34:30 +00:00
Claude ef6b233c95 Fiche adhérent complète, fidèle à la maquette
Enrichit la fiche : couverture + avatar, identité (catégorie, localisation,
adhérent depuis, boutons Appeler/Itinéraire), à propos multi-paragraphes + tags,
informations pratiques (horaires + contact tél/email/site), carte Google Maps,
colonne promotions en cours et CTA contact.

Ajoute les champs members: cover_url, phone, website, postal_code, member_since,
hours, tags (migration 0001) ; éditables dans le back-office ; seed enrichi
(Au Bon Pain conforme à la maquette).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XwfhYHzC9hQWPDnQ2p53GL
2026-06-26 21:25:45 +00:00
Claude a6718c90f1 Ajoute la page Annuaire publique (/annuaire) reliée aux fiches adhérents
Liste des adhérents actifs avec recherche (nom/métier), filtre par commune,
filtres catégories (chips + compteurs), tri (A–Z / avec promotions), état vide
et CTA d'adhésion — fidèle à la maquette. Chaque carte ouvre la fiche adhérent
(/adherents/[id]). La recherche de l'accueil et la nav pointent vers /annuaire
(la barre de recherche pré-remplit via ?q=). Nouvelles requêtes annuaire.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XwfhYHzC9hQWPDnQ2p53GL
2026-06-26 21:13:59 +00:00
Claude 3a6273c5b4 Ajoute la page fiche adhérent publique (/adherents/[id])
Profil public d'un commerçant : vitrine, catégorie, localisation, description,
bouton de contact et promotions en cours. Réservée aux adhérents actifs (404
sinon). Les cartes « À l'honneur » de l'accueil pointent désormais vers la fiche.
Nouvelles requêtes getPublicMember / getMemberLivePromotions.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XwfhYHzC9hQWPDnQ2p53GL
2026-06-26 21:06:02 +00:00
Claude 39221fd7ef Corrige la suppression d'adhérent (FK) et intègre le vrai logo
- deleteMember: supprime d'abord les promotions liées et détache les comptes
  utilisateurs (transaction) avant de supprimer l'adhérent, ce qui évite la
  violation de clé étrangère (erreur serveur au clic « Supprimer »).
- Logo: remplace le SVG provisoire par le logo officiel (public/assets/logo.png)
  et met à jour toutes les références (accueil, login, backend, favicon).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XwfhYHzC9hQWPDnQ2p53GL
2026-06-26 18:26:31 +00:00
Claude 51f5691f45 Corrige la redirection login derrière un reverse proxy (AUTH_URL)
La redirection vers /login utilisait http://localhost:8413 (ancienne valeur par
défaut d'AUTH_URL). On retire ce défaut localhost : AUTH_URL prend la valeur
fournie (ex. https://pleinr.ffnancy.fr) et pilote la redirection. Ajout de
AUTH_TRUST_HOST=true (confiance aux en-têtes X-Forwarded-*) et l'entrypoint
supprime AUTH_URL si vide. Vérifié : la redirection pointe vers le domaine public.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XwfhYHzC9hQWPDnQ2p53GL
2026-06-26 17:25:31 +00:00
Claude e9f5d4ced5 Connecte Postgres via le nom de conteneur unique (pleinr-postgres)
Le nom générique "postgres" entrait en collision avec d'autres conteneurs
"postgres" présents sur le réseau proxy partagé (nginx_default), d'où les
ECONNREFUSED vers de mauvaises IP. On utilise désormais pleinr-postgres,
unique et présent uniquement sur le réseau interne.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XwfhYHzC9hQWPDnQ2p53GL
2026-06-26 17:02:11 +00:00
Claude 41d2cd785e Réseaux explicites : app et Postgres partagent un réseau interne dédié
Corrige ECONNREFUSED vers postgres:5432 apparu après l'ajout du réseau proxy.
Postgres et l'app sont désormais tous deux sur un réseau "internal" dédié
(résolution fiable de l'hôte "postgres"), l'app étant en plus sur le réseau
externe "proxy" pour le reverse proxy.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XwfhYHzC9hQWPDnQ2p53GL
2026-06-26 16:58:41 +00:00
Claude 785f7169cc Attache l'app au réseau externe du reverse proxy (NPM)
Le conteneur app rejoint son réseau interne (accès Postgres) ET le réseau
externe partagé avec Nginx Proxy Manager, afin que NPM puisse l'atteindre par
nom (pleinr-app:3000) sans 504. Nom du réseau paramétrable via PROXY_NETWORK
(défaut: nginx_default).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XwfhYHzC9hQWPDnQ2p53GL
2026-06-26 16:54:30 +00:00
Claude 71fb0ec032 Corrige l'échec du build Docker : initialisation paresseuse du client DB
`next build` collecte les données de page en important les modules serveur sans
DATABASE_URL ; l'ancien client jetait une erreur dès l'import. Le client Drizzle
est désormais initialisé paresseusement (via un Proxy) à la première requête,
donc l'import est sans effet de bord et le build n'exige plus DATABASE_URL.
Vérifié : build OK sans variables d'env, et requêtes runtime OK via le proxy.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XwfhYHzC9hQWPDnQ2p53GL
2026-06-26 16:35:38 +00:00
Claude 718a704868 Rend AUTH_SECRET optionnel : génération auto + persistance au déploiement
Le compose ne requiert plus AUTH_SECRET (`:?` retiré). Si la variable est vide,
docker-entrypoint.sh génère un secret aléatoire et le persiste dans le volume
app-data (/app/data/auth_secret), réutilisé aux redémarrages. Surcharge possible
en définissant AUTH_SECRET. Déploiement Portainer sans configuration requise.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XwfhYHzC9hQWPDnQ2p53GL
2026-06-26 16:26:26 +00:00
Claude 639c0614cd Change le mapping des ports hôte vers des ports peu courants
- App : 8413 (hôte) → 3000 (conteneur)
- Postgres : 54329 (hôte) → 5432 (conteneur)
AUTH_URL, .env.example et README mis à jour en conséquence. Les ports internes
des conteneurs (3000, 5432) et DATABASE_URL (réseau interne) restent inchangés.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XwfhYHzC9hQWPDnQ2p53GL
2026-06-26 16:23:49 +00:00
Claude cd4dba9be4 Relie l'historique initial de main (placeholder README) à la branche Plein R 2026-06-26 15:28:18 +00:00
Claude 7e22ec50d4 Implémente le site Plein R (Accueil + Backend) sur Next.js + Postgres + Docker
Application unique Next.js (App Router, TypeScript) servant :
- Accueil public : héro, recherche, métiers, promotions, mises à l'honneur
  (données issues de Postgres)
- Backend authentifié avec RBAC : tableau de bord, adhérents (CRUD), modération
  des promotions, administrateurs, espace adhérent (publication avec aperçu)

Technique :
- Drizzle ORM + drizzle-kit (migrations versionnées) sur driver pg
- Auth.js v5 (credentials, sessions JWT), rôles admin/moderator/editor/member
- Middleware de protection de /backend + gardes par rôle dans chaque vue
- Server actions pour toutes les mutations (vérif auth + capacité + revalidate)
- Design fidèle aux maquettes (design-system CSS, animations, responsive)

Conteneurisation :
- 1 conteneur applicatif (sortie standalone) + 1 conteneur Postgres externe
- docker-compose avec healthcheck ; migrations + seed au démarrage
- scripts migrate/seed bundlés (esbuild) pour un runtime sans devDeps

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XwfhYHzC9hQWPDnQ2p53GL
2026-06-26 12:06:21 +00:00