diff --git a/DEBUG.md b/DEBUG.md deleted file mode 100644 index 7ed7a09..0000000 --- a/DEBUG.md +++ /dev/null @@ -1,100 +0,0 @@ -# Guide de Débogage - Problème de Suppression - -## 🔍 Étapes de débogage - -### 1. Vérifier les variables d'environnement - -Assurez-vous que votre fichier `.env.local` contient les bonnes valeurs : - -```env -NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co -NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key-here -``` - -### 2. Vérifier la console du navigateur - -1. Ouvrez les outils de développement (F12) -2. Allez dans l'onglet "Console" -3. Essayez de supprimer une campagne -4. Regardez les logs qui s'affichent - -Vous devriez voir : -- "Début de la suppression de la campagne: [ID]" -- "Tentative de suppression de la campagne: [ID]" -- "Campagne supprimée avec succès" -- "handleCampaignDeleted appelé" -- "Rechargement des campagnes..." - -### 3. Vérifier les politiques RLS dans Supabase - -Dans votre projet Supabase, allez dans **Authentication > Policies** et vérifiez que vous avez bien : - -```sql -CREATE POLICY "Allow public delete access to campaigns" ON campaigns FOR DELETE USING (true); -``` - -### 4. Tester la suppression directement dans Supabase - -1. Allez dans **Table Editor** dans Supabase -2. Sélectionnez la table `campaigns` -3. Essayez de supprimer une ligne manuellement -4. Vérifiez s'il y a des erreurs - -### 5. Vérifier les contraintes de clés étrangères - -Assurez-vous que les tables ont bien les contraintes `ON DELETE CASCADE` : - -```sql -campaign_id UUID NOT NULL REFERENCES campaigns(id) ON DELETE CASCADE -``` - -## 🚨 Problèmes courants - -### Problème 1 : Variables d'environnement manquantes -**Symptôme** : Erreur "supabaseUrl is required" -**Solution** : Vérifiez votre fichier `.env.local` - -### Problème 2 : Politiques RLS manquantes -**Symptôme** : Erreur "new row violates row-level security policy" -**Solution** : Ajoutez la politique de suppression dans Supabase - -### Problème 3 : Contraintes de clés étrangères -**Symptôme** : Erreur de contrainte lors de la suppression -**Solution** : Vérifiez que les contraintes CASCADE sont bien définies - -### Problème 4 : Connexion Supabase -**Symptôme** : Erreur de connexion -**Solution** : Vérifiez l'URL et la clé anon de Supabase - -## 🔧 Solutions rapides - -### Réinitialiser les politiques RLS -```sql --- Supprimer toutes les politiques existantes -DROP POLICY IF EXISTS "Allow public read access to campaigns" ON campaigns; -DROP POLICY IF EXISTS "Allow public insert access to campaigns" ON campaigns; -DROP POLICY IF EXISTS "Allow public update access to campaigns" ON campaigns; -DROP POLICY IF EXISTS "Allow public delete access to campaigns" ON campaigns; - --- Recréer les politiques -CREATE POLICY "Allow public read access to campaigns" ON campaigns FOR SELECT USING (true); -CREATE POLICY "Allow public insert access to campaigns" ON campaigns FOR INSERT WITH CHECK (true); -CREATE POLICY "Allow public update access to campaigns" ON campaigns FOR UPDATE USING (true); -CREATE POLICY "Allow public delete access to campaigns" ON campaigns FOR DELETE USING (true); -``` - -### Vérifier la configuration Supabase -```javascript -// Dans la console du navigateur, testez : -import { createClient } from '@supabase/supabase-js'; -const supabase = createClient(process.env.NEXT_PUBLIC_SUPABASE_URL, process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY); -console.log('Supabase URL:', process.env.NEXT_PUBLIC_SUPABASE_URL); -``` - -## 📞 Support - -Si le problème persiste, vérifiez : -1. Les logs dans la console du navigateur -2. Les logs dans Supabase (Dashboard > Logs) -3. Les politiques RLS dans Supabase -4. La configuration des variables d'environnement diff --git a/README.md b/README.md index 9b92eea..5bd8b34 100644 --- a/README.md +++ b/README.md @@ -4,10 +4,11 @@ Une application web moderne pour gérer des campagnes de budgets participatifs, ## 🚀 Technologies utilisées -- **Frontend**: Next.js 14 avec TypeScript et App Router -- **UI/UX**: Tailwind CSS + Shadcn/ui + Lucide React +- **Frontend**: Next.js 15 avec TypeScript et App Router +- **UI/UX**: Tailwind CSS 4 + Shadcn/ui + Lucide React - **Base de données**: PostgreSQL via Supabase -- **Authentification**: Supabase Auth (implémenté) +- **Authentification**: Supabase Auth +- **Email**: Nodemailer avec support SMTP - **Déploiement**: Compatible Vercel, Netlify, etc. ## 📋 Fonctionnalités @@ -54,6 +55,12 @@ Une application web moderne pour gérer des campagnes de budgets participatifs, - Validation du budget total - Sauvegarde des votes +#### 📧 **Système d'email** +- **Configuration SMTP** : Interface d'administration pour configurer les paramètres email +- **Envoi d'emails** : Notifications aux participants +- **Test d'envoi** : Fonctionnalité de test des paramètres SMTP +- **Templates personnalisables** : Messages d'email configurables + #### 🎨 **Interface moderne** - **Shadcn/ui** : Composants modernes et accessibles - **Design responsive** : Adaptation mobile/desktop @@ -155,6 +162,12 @@ L'application sera accessible sur `http://localhost:3000` - `created_at`: Date de création - `updated_at`: Date de dernière modification +### Table `settings` +- `key`: Clé de configuration +- `value`: Valeur de configuration +- `category`: Catégorie (email, general, etc.) +- `description`: Description de la configuration + ## 🎨 Interface utilisateur ### Page d'accueil @@ -167,6 +180,7 @@ L'application sera accessible sur `http://localhost:3000` - **Gestion des campagnes** : CRUD complet avec interface moderne - **Navigation fluide** : Liens vers les pages de gestion détaillées - **Recherche** : Filtrage en temps réel des campagnes +- **Paramètres** : Configuration SMTP et autres paramètres ### Pages de gestion détaillées - **Propositions** : Interface complète avec avatars et informations détaillées @@ -186,7 +200,12 @@ src/ │ ├── 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 │ ├── propose/ # Dépôt de propositions │ └── vote/[participantId] # Vote public @@ -194,10 +213,13 @@ src/ │ ├── 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 └── index.ts # Définitions des types @@ -208,12 +230,19 @@ src/ - **propositionService** : CRUD des propositions - **participantService** : CRUD des participants - **voteService** : Gestion des votes et statuts +- **settingsService** : Gestion des paramètres de configuration ### Authentification - **AuthGuard** : Composant de protection des routes - **Supabase Auth** : Authentification sécurisée - **Session management** : Gestion des sessions utilisateur +### Système d'email +- **Configuration SMTP** : Interface d'administration +- **Envoi d'emails** : Service Nodemailer +- **Chiffrement** : Protection des mots de passe SMTP +- **Templates** : Messages personnalisables + ## 🚀 Déploiement ### Vercel (recommandé) @@ -246,13 +275,19 @@ L'application peut être déployée sur n'importe quelle plateforme supportant N - **Validation côté serveur** : Vérification des données avant sauvegarde - **URLs sécurisées** : Liens publics avec identifiants uniques +### Données sensibles +- **Chiffrement SMTP** : Mots de passe SMTP chiffrés en base +- **Variables d'environnement** : Configuration sécurisée +- **Validation des entrées** : Protection contre les injections + ## 🎯 Workflow d'utilisation ### 1. Configuration initiale 1. Créer un compte Supabase 2. Configurer la base de données 3. Créer un utilisateur admin -4. Déployer l'application +4. Configurer les paramètres SMTP (optionnel) +5. Déployer l'application ### 2. Création d'une campagne 1. Se connecter à l'administration @@ -270,12 +305,18 @@ L'application peut être déployée sur n'importe quelle plateforme supportant N 2. Passer en mode "En cours de vote" 3. Partager les liens de vote personnels 4. Suivre la participation en temps réel +5. Envoyer des rappels par email (optionnel) ### 5. Résultats 1. Consulter les statistiques de vote 2. Analyser les résultats 3. Clôturer la campagne +## 📚 Documentation supplémentaire + +- **SETUP.md** : Guide de configuration détaillé +- **SETTINGS.md** : Documentation des paramètres et configurations + ## 🤝 Contribution 1. Fork le projet @@ -299,4 +340,4 @@ Pour toute question ou problème : **Développé avec ❤️ pour faciliter la démocratie participative** -*Application complète et prête pour la production avec authentification, interface moderne et toutes les fonctionnalités de gestion de budgets participatifs.* +*Application complète et prête pour la production avec authentification, interface moderne, système d'email et toutes les fonctionnalités de gestion de budgets participatifs.* diff --git a/migration-smtp-settings.sql b/migration-smtp-settings.sql deleted file mode 100644 index 81a5cf7..0000000 --- a/migration-smtp-settings.sql +++ /dev/null @@ -1,31 +0,0 @@ --- Migration pour ajouter les paramètres SMTP --- À exécuter dans l'éditeur SQL de Supabase après la migration des paramètres de base - --- Paramètres SMTP (seulement s'ils n'existent pas déjà) -INSERT INTO settings (key, value, category, description) VALUES - ('smtp_host', '', 'email', 'Serveur SMTP') -ON CONFLICT (key) DO NOTHING; - -INSERT INTO settings (key, value, category, description) VALUES - ('smtp_port', '587', 'email', 'Port SMTP') -ON CONFLICT (key) DO NOTHING; - -INSERT INTO settings (key, value, category, description) VALUES - ('smtp_username', '', 'email', 'Nom d''utilisateur SMTP') -ON CONFLICT (key) DO NOTHING; - -INSERT INTO settings (key, value, category, description) VALUES - ('smtp_password', '', 'email', 'Mot de passe SMTP (chiffré)') -ON CONFLICT (key) DO NOTHING; - -INSERT INTO settings (key, value, category, description) VALUES - ('smtp_secure', 'true', 'email', 'Connexion sécurisée SSL/TLS') -ON CONFLICT (key) DO NOTHING; - -INSERT INTO settings (key, value, category, description) VALUES - ('smtp_from_email', '', 'email', 'Adresse email d''expédition') -ON CONFLICT (key) DO NOTHING; - -INSERT INTO settings (key, value, category, description) VALUES - ('smtp_from_name', 'Mes Budgets Participatifs', 'email', 'Nom d''expédition') -ON CONFLICT (key) DO NOTHING; diff --git a/next.config.js b/next.config.js deleted file mode 100644 index 662bb14..0000000 --- a/next.config.js +++ /dev/null @@ -1,14 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - // Désactiver le pré-rendu statique pour les pages qui utilisent Supabase - experimental: { - // Optimisations pour le développement - }, - // Configuration pour éviter les erreurs de build avec les variables d'environnement - env: { - NEXT_PUBLIC_SUPABASE_URL: process.env.NEXT_PUBLIC_SUPABASE_URL, - NEXT_PUBLIC_SUPABASE_ANON_KEY: process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY, - }, -} - -module.exports = nextConfig