- Add slug/short_id fields to database with auto-generation
- Create migration script for existing data - Update admin interface to show only short URLs - Implement redirect system to avoid code duplication - Maintain backward compatibility with old URLs
This commit is contained in:
@@ -1,106 +1,201 @@
|
||||
# 📁 Structure du Projet - Mes Budgets Participatifs
|
||||
# Structure du Projet
|
||||
|
||||
## 🗂️ **Organisation des dossiers**
|
||||
## 📁 Organisation des fichiers
|
||||
|
||||
```
|
||||
mes-budgets-participatifs/
|
||||
├── 📚 docs/ # Documentation complète
|
||||
│ ├── README.md # Index de la documentation
|
||||
│ ├── SETUP.md # Guide de configuration
|
||||
│ ├── MIGRATION-GUIDE.md # Migration vers la sécurité
|
||||
│ ├── SECURITY-SUMMARY.md # Résumé de la sécurisation
|
||||
│ └── SETTINGS.md # Configuration avancée
|
||||
│
|
||||
├── 🗄️ database/ # Scripts de base de données
|
||||
│ └── supabase-schema.sql # Schéma complet avec sécurité
|
||||
│
|
||||
├── 🛠️ scripts/ # Outils et scripts
|
||||
│ └── test-security.js # Tests de sécurité
|
||||
│
|
||||
├── 📱 src/ # Code source de l'application
|
||||
│ ├── app/ # Pages Next.js (App Router)
|
||||
│ ├── components/ # Composants React
|
||||
│ ├── lib/ # Services et utilitaires
|
||||
│ └── types/ # Types TypeScript
|
||||
│
|
||||
├── 🎨 public/ # Assets statiques
|
||||
├── 📦 node_modules/ # Dépendances (généré)
|
||||
├── ⚙️ Configuration files # Fichiers de configuration
|
||||
└── 📖 README.md # Documentation principale
|
||||
├── src/
|
||||
│ ├── app/ # Pages Next.js (App Router)
|
||||
│ │ ├── page.tsx # Page d'accueil
|
||||
│ │ ├── admin/ # Pages d'administration (protégées)
|
||||
│ │ │ ├── page.tsx # Dashboard principal
|
||||
│ │ │ ├── settings/ # Paramètres SMTP
|
||||
│ │ │ └── campaigns/[id]/ # Pages de gestion par campagne
|
||||
│ │ ├── api/ # API Routes
|
||||
│ │ │ ├── send-participant-email/
|
||||
│ │ │ ├── test-email/
|
||||
│ │ │ └── test-smtp/
|
||||
│ │ ├── campaigns/[id]/ # Pages publiques (anciennes routes)
|
||||
│ │ │ ├── propose/ # Dépôt de propositions
|
||||
│ │ │ └── vote/[participantId] # Vote public
|
||||
│ │ ├── p/[slug]/ # Pages publiques (nouvelles routes courtes)
|
||||
│ │ │ ├── page.tsx # Dépôt de propositions par slug
|
||||
│ │ │ └── success/ # Page de succès pour dépôt
|
||||
│ │ │ └── page.tsx
|
||||
│ │ └── v/[shortId]/ # Pages de vote (nouvelles routes courtes)
|
||||
│ │ ├── page.tsx # Vote par short_id
|
||||
│ │ └── success/ # Page de succès pour vote
|
||||
│ │ └── page.tsx
|
||||
│ ├── components/ # Composants React
|
||||
│ │ ├── ui/ # Composants Shadcn/ui
|
||||
│ │ ├── AuthGuard.tsx # Protection des routes
|
||||
│ │ ├── Navigation.tsx # Navigation principale
|
||||
│ │ ├── SmtpSettingsForm.tsx # Configuration SMTP
|
||||
│ │ └── [Modals] # Modales de gestion
|
||||
│ ├── lib/ # Services et configuration
|
||||
│ │ ├── supabase.ts # Configuration Supabase
|
||||
│ │ ├── services.ts # Services de données
|
||||
│ │ ├── email.ts # Service d'envoi d'emails
|
||||
│ │ ├── encryption.ts # Chiffrement des données sensibles
|
||||
│ │ └── utils.ts # Utilitaires
|
||||
│ └── types/ # Types TypeScript
|
||||
├── database/
|
||||
│ └── supabase-schema.sql # Schéma de base de données
|
||||
├── scripts/
|
||||
│ ├── test-security.js # Tests de sécurité
|
||||
│ └── migrate-short-links.js # Migration des liens courts
|
||||
└── docs/ # Documentation
|
||||
```
|
||||
|
||||
## 📋 **Fichiers principaux**
|
||||
## 🔗 Routes de l'application
|
||||
|
||||
### **Configuration**
|
||||
- `package.json` - Dépendances et scripts
|
||||
- `tsconfig.json` - Configuration TypeScript
|
||||
- `next.config.ts` - Configuration Next.js
|
||||
- `env.example` - Exemple de variables d'environnement
|
||||
### Routes publiques
|
||||
|
||||
### **Documentation**
|
||||
- `README.md` - Documentation principale
|
||||
- `docs/README.md` - Index de la documentation
|
||||
- `PROJECT-STRUCTURE.md` - Ce fichier
|
||||
#### Nouvelles routes courtes (recommandées)
|
||||
- **`/p/[slug]`** - Dépôt de propositions
|
||||
- Exemple : `/p/budget-2024`
|
||||
- Utilise le slug de la campagne pour un lien court et lisible
|
||||
|
||||
### **Base de données**
|
||||
- `database/supabase-schema.sql` - Schéma complet avec sécurité
|
||||
- **`/v/[shortId]`** - Vote public
|
||||
- Exemple : `/v/ABC123`
|
||||
- Utilise un identifiant court unique pour chaque participant
|
||||
|
||||
### **Outils**
|
||||
- `scripts/test-security.js` - Tests de sécurité
|
||||
#### Anciennes routes (compatibilité)
|
||||
- **`/campaigns/[id]/propose`** - Dépôt de propositions
|
||||
- Exemple : `/campaigns/123e4567-e89b-12d3-a456-426614174000/propose`
|
||||
|
||||
## 🔧 **Scripts disponibles**
|
||||
- **`/campaigns/[id]/vote/[participantId]`** - Vote public
|
||||
- Exemple : `/campaigns/123e4567-e89b-12d3-a456-426614174000/vote/987fcdeb-51a2-43d1-b789-123456789abc`
|
||||
|
||||
### Routes d'administration
|
||||
- **`/admin`** - Dashboard principal
|
||||
- **`/admin/settings`** - Paramètres SMTP
|
||||
- **`/admin/campaigns/[id]/propositions`** - Gestion des propositions
|
||||
- **`/admin/campaigns/[id]/participants`** - Gestion des participants
|
||||
- **`/admin/campaigns/[id]/stats`** - Statistiques de la campagne
|
||||
|
||||
## 🗄️ Structure de la base de données
|
||||
|
||||
### Tables principales
|
||||
|
||||
#### `campaigns`
|
||||
- `id` (UUID) - Identifiant unique
|
||||
- `title` (TEXT) - Titre de la campagne
|
||||
- `description` (TEXT) - Description
|
||||
- `status` (TEXT) - Statut : 'deposit', 'voting', 'closed'
|
||||
- `budget_per_user` (INTEGER) - Budget par utilisateur
|
||||
- `spending_tiers` (TEXT) - Montants disponibles (ex: "10,25,50,100")
|
||||
- **`slug` (TEXT, UNIQUE)** - Slug pour les liens courts
|
||||
- `created_at`, `updated_at` (TIMESTAMP)
|
||||
|
||||
#### `participants`
|
||||
- `id` (UUID) - Identifiant unique
|
||||
- `campaign_id` (UUID) - Référence vers la campagne
|
||||
- `first_name`, `last_name` (TEXT) - Nom et prénom
|
||||
- `email` (TEXT) - Adresse email
|
||||
- **`short_id` (TEXT, UNIQUE)** - Identifiant court pour les liens de vote
|
||||
- `created_at` (TIMESTAMP)
|
||||
|
||||
#### `propositions`
|
||||
- `id` (UUID) - Identifiant unique
|
||||
- `campaign_id` (UUID) - Référence vers la campagne
|
||||
- `title`, `description` (TEXT) - Titre et description
|
||||
- `author_first_name`, `author_last_name`, `author_email` (TEXT) - Informations de l'auteur
|
||||
- `created_at` (TIMESTAMP)
|
||||
|
||||
#### `votes`
|
||||
- `id` (UUID) - Identifiant unique
|
||||
- `campaign_id` (UUID) - Référence vers la campagne
|
||||
- `participant_id` (UUID) - Référence vers le participant
|
||||
- `proposition_id` (UUID) - Référence vers la proposition
|
||||
- `amount` (INTEGER) - Montant voté
|
||||
- `created_at`, `updated_at` (TIMESTAMP)
|
||||
|
||||
### Fonctions PostgreSQL
|
||||
|
||||
#### `generate_slug(title TEXT)`
|
||||
Génère automatiquement un slug unique à partir du titre d'une campagne.
|
||||
|
||||
#### `generate_short_id()`
|
||||
Génère automatiquement un identifiant court unique pour les participants.
|
||||
|
||||
## 🔧 Services et utilitaires
|
||||
|
||||
### Services principaux (`src/lib/services.ts`)
|
||||
|
||||
#### `campaignService`
|
||||
- `getAll()` - Récupère toutes les campagnes
|
||||
- `create(campaign)` - Crée une nouvelle campagne (génère automatiquement le slug)
|
||||
- `update(id, updates)` - Met à jour une campagne
|
||||
- `delete(id)` - Supprime une campagne
|
||||
- `getBySlug(slug)` - Récupère une campagne par son slug
|
||||
- `getStats(campaignId)` - Récupère les statistiques d'une campagne
|
||||
|
||||
#### `participantService`
|
||||
- `getByCampaign(campaignId)` - Récupère les participants d'une campagne
|
||||
- `create(participant)` - Crée un nouveau participant (génère automatiquement le short_id)
|
||||
- `update(id, updates)` - Met à jour un participant
|
||||
- `delete(id)` - Supprime un participant
|
||||
- `getByShortId(shortId)` - Récupère un participant par son short_id
|
||||
|
||||
#### `propositionService`
|
||||
- `getByCampaign(campaignId)` - Récupère les propositions d'une campagne
|
||||
- `create(proposition)` - Crée une nouvelle proposition
|
||||
- `update(id, updates)` - Met à jour une proposition
|
||||
- `delete(id)` - Supprime une proposition
|
||||
|
||||
#### `voteService`
|
||||
- `getByParticipant(campaignId, participantId)` - Récupère les votes d'un participant
|
||||
- `create(vote)` - Crée un nouveau vote
|
||||
- `deleteByParticipant(campaignId, participantId)` - Supprime tous les votes d'un participant
|
||||
|
||||
## 🚀 Scripts de migration
|
||||
|
||||
### `scripts/migrate-short-links.js`
|
||||
Script pour migrer les données existantes et générer les slugs et short_ids manquants.
|
||||
|
||||
**Usage :**
|
||||
```bash
|
||||
# Développement
|
||||
npm run dev
|
||||
|
||||
# Build de production
|
||||
npm run build
|
||||
|
||||
# Tests de sécurité
|
||||
npm run test:security
|
||||
|
||||
# Linting
|
||||
npm run lint
|
||||
npm run lint:fix
|
||||
node scripts/migrate-short-links.js
|
||||
```
|
||||
|
||||
## 📚 **Documentation par type**
|
||||
**Fonctionnalités :**
|
||||
- Génère automatiquement les slugs pour les campagnes existantes
|
||||
- Génère automatiquement les short_ids pour les participants existants
|
||||
- Gère les conflits et génère des identifiants uniques
|
||||
- Affiche un rapport détaillé de la migration
|
||||
|
||||
### **🚀 Démarrage rapide**
|
||||
- `docs/SETUP.md` - Installation et configuration
|
||||
## 🔒 Sécurité
|
||||
|
||||
### **🔒 Sécurité**
|
||||
- `docs/SECURITY-SUMMARY.md` - Vue d'ensemble de la sécurité
|
||||
- `docs/SETTINGS.md` - Configuration SMTP et paramètres
|
||||
### Authentification
|
||||
- Utilisation de Supabase Auth pour l'authentification des administrateurs
|
||||
- Protection des routes d'administration avec `AuthGuard`
|
||||
|
||||
### **🗄️ Base de données**
|
||||
- `database/supabase-schema.sql` - Schéma complet avec RLS
|
||||
### Autorisation
|
||||
- Row Level Security (RLS) activé sur toutes les tables
|
||||
- Contrôle d'accès basé sur les rôles utilisateur
|
||||
|
||||
## 🎯 **Points d'entrée**
|
||||
### Validation des données
|
||||
- Validation côté client et serveur
|
||||
- Sanitisation des entrées utilisateur
|
||||
- Protection contre les injections SQL
|
||||
|
||||
### **Pour les développeurs :**
|
||||
1. `README.md` - Vue d'ensemble
|
||||
2. `docs/SETUP.md` - Configuration
|
||||
3. `src/` - Code source
|
||||
## 📱 Interface utilisateur
|
||||
|
||||
### **Pour les administrateurs :**
|
||||
1. `docs/SECURITY-SUMMARY.md` - Sécurité
|
||||
2. `docs/SETTINGS.md` - Configuration
|
||||
### Composants UI
|
||||
- Utilisation de Shadcn/ui pour une interface cohérente
|
||||
- Design responsive et accessible
|
||||
- Support du mode sombre
|
||||
- Composants réutilisables
|
||||
|
||||
### **Pour les déploiements :**
|
||||
1. `database/supabase-schema.sql` - Base de données
|
||||
2. `scripts/test-security.js` - Vérification
|
||||
3. `env.example` - Variables d'environnement
|
||||
### Pages publiques
|
||||
- Interface épurée et intuitive
|
||||
- Formulaires de dépôt et de vote optimisés
|
||||
- Feedback visuel en temps réel
|
||||
- Gestion des erreurs et des états de chargement
|
||||
|
||||
## 🔄 **Workflow de développement**
|
||||
|
||||
1. **Configuration** → `docs/SETUP.md`
|
||||
2. **Développement** → `src/`
|
||||
3. **Tests** → `scripts/test-security.js`
|
||||
4. **Documentation** → `docs/`
|
||||
5. **Déploiement** → `database/` + configuration
|
||||
|
||||
---
|
||||
|
||||
**Dernière mise à jour :** Réorganisation complète de la structure ✅
|
||||
### Interface d'administration
|
||||
- Dashboard avec statistiques en temps réel
|
||||
- Gestion complète des campagnes, propositions et participants
|
||||
- Import/export de données
|
||||
- Envoi d'emails personnalisés
|
||||
|
||||
Reference in New Issue
Block a user