uodate doc and cleaning
This commit is contained in:
100
DEBUG.md
100
DEBUG.md
@@ -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
|
|
||||||
51
README.md
51
README.md
@@ -4,10 +4,11 @@ Une application web moderne pour gérer des campagnes de budgets participatifs,
|
|||||||
|
|
||||||
## 🚀 Technologies utilisées
|
## 🚀 Technologies utilisées
|
||||||
|
|
||||||
- **Frontend**: Next.js 14 avec TypeScript et App Router
|
- **Frontend**: Next.js 15 avec TypeScript et App Router
|
||||||
- **UI/UX**: Tailwind CSS + Shadcn/ui + Lucide React
|
- **UI/UX**: Tailwind CSS 4 + Shadcn/ui + Lucide React
|
||||||
- **Base de données**: PostgreSQL via Supabase
|
- **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.
|
- **Déploiement**: Compatible Vercel, Netlify, etc.
|
||||||
|
|
||||||
## 📋 Fonctionnalités
|
## 📋 Fonctionnalités
|
||||||
@@ -54,6 +55,12 @@ Une application web moderne pour gérer des campagnes de budgets participatifs,
|
|||||||
- Validation du budget total
|
- Validation du budget total
|
||||||
- Sauvegarde des votes
|
- 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**
|
#### 🎨 **Interface moderne**
|
||||||
- **Shadcn/ui** : Composants modernes et accessibles
|
- **Shadcn/ui** : Composants modernes et accessibles
|
||||||
- **Design responsive** : Adaptation mobile/desktop
|
- **Design responsive** : Adaptation mobile/desktop
|
||||||
@@ -155,6 +162,12 @@ L'application sera accessible sur `http://localhost:3000`
|
|||||||
- `created_at`: Date de création
|
- `created_at`: Date de création
|
||||||
- `updated_at`: Date de dernière modification
|
- `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
|
## 🎨 Interface utilisateur
|
||||||
|
|
||||||
### Page d'accueil
|
### Page d'accueil
|
||||||
@@ -167,6 +180,7 @@ L'application sera accessible sur `http://localhost:3000`
|
|||||||
- **Gestion des campagnes** : CRUD complet avec interface moderne
|
- **Gestion des campagnes** : CRUD complet avec interface moderne
|
||||||
- **Navigation fluide** : Liens vers les pages de gestion détaillées
|
- **Navigation fluide** : Liens vers les pages de gestion détaillées
|
||||||
- **Recherche** : Filtrage en temps réel des campagnes
|
- **Recherche** : Filtrage en temps réel des campagnes
|
||||||
|
- **Paramètres** : Configuration SMTP et autres paramètres
|
||||||
|
|
||||||
### Pages de gestion détaillées
|
### Pages de gestion détaillées
|
||||||
- **Propositions** : Interface complète avec avatars et informations détaillées
|
- **Propositions** : Interface complète avec avatars et informations détaillées
|
||||||
@@ -186,7 +200,12 @@ src/
|
|||||||
│ ├── page.tsx # Page d'accueil
|
│ ├── page.tsx # Page d'accueil
|
||||||
│ ├── admin/ # Pages d'administration (protégées)
|
│ ├── admin/ # Pages d'administration (protégées)
|
||||||
│ │ ├── page.tsx # Dashboard principal
|
│ │ ├── page.tsx # Dashboard principal
|
||||||
|
│ │ ├── settings/ # Paramètres SMTP
|
||||||
│ │ └── campaigns/[id]/ # Pages de gestion par campagne
|
│ │ └── campaigns/[id]/ # Pages de gestion par campagne
|
||||||
|
│ ├── api/ # API Routes
|
||||||
|
│ │ ├── send-participant-email/
|
||||||
|
│ │ ├── test-email/
|
||||||
|
│ │ └── test-smtp/
|
||||||
│ └── campaigns/[id]/ # Pages publiques
|
│ └── campaigns/[id]/ # Pages publiques
|
||||||
│ ├── propose/ # Dépôt de propositions
|
│ ├── propose/ # Dépôt de propositions
|
||||||
│ └── vote/[participantId] # Vote public
|
│ └── vote/[participantId] # Vote public
|
||||||
@@ -194,10 +213,13 @@ src/
|
|||||||
│ ├── ui/ # Composants Shadcn/ui
|
│ ├── ui/ # Composants Shadcn/ui
|
||||||
│ ├── AuthGuard.tsx # Protection des routes
|
│ ├── AuthGuard.tsx # Protection des routes
|
||||||
│ ├── Navigation.tsx # Navigation principale
|
│ ├── Navigation.tsx # Navigation principale
|
||||||
|
│ ├── SmtpSettingsForm.tsx # Configuration SMTP
|
||||||
│ └── [Modals] # Modales de gestion
|
│ └── [Modals] # Modales de gestion
|
||||||
├── lib/ # Services et configuration
|
├── lib/ # Services et configuration
|
||||||
│ ├── supabase.ts # Configuration Supabase
|
│ ├── supabase.ts # Configuration Supabase
|
||||||
│ ├── services.ts # Services de données
|
│ ├── services.ts # Services de données
|
||||||
|
│ ├── email.ts # Service d'envoi d'emails
|
||||||
|
│ ├── encryption.ts # Chiffrement des données sensibles
|
||||||
│ └── utils.ts # Utilitaires
|
│ └── utils.ts # Utilitaires
|
||||||
└── types/ # Types TypeScript
|
└── types/ # Types TypeScript
|
||||||
└── index.ts # Définitions des types
|
└── index.ts # Définitions des types
|
||||||
@@ -208,12 +230,19 @@ src/
|
|||||||
- **propositionService** : CRUD des propositions
|
- **propositionService** : CRUD des propositions
|
||||||
- **participantService** : CRUD des participants
|
- **participantService** : CRUD des participants
|
||||||
- **voteService** : Gestion des votes et statuts
|
- **voteService** : Gestion des votes et statuts
|
||||||
|
- **settingsService** : Gestion des paramètres de configuration
|
||||||
|
|
||||||
### Authentification
|
### Authentification
|
||||||
- **AuthGuard** : Composant de protection des routes
|
- **AuthGuard** : Composant de protection des routes
|
||||||
- **Supabase Auth** : Authentification sécurisée
|
- **Supabase Auth** : Authentification sécurisée
|
||||||
- **Session management** : Gestion des sessions utilisateur
|
- **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
|
## 🚀 Déploiement
|
||||||
|
|
||||||
### Vercel (recommandé)
|
### 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
|
- **Validation côté serveur** : Vérification des données avant sauvegarde
|
||||||
- **URLs sécurisées** : Liens publics avec identifiants uniques
|
- **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
|
## 🎯 Workflow d'utilisation
|
||||||
|
|
||||||
### 1. Configuration initiale
|
### 1. Configuration initiale
|
||||||
1. Créer un compte Supabase
|
1. Créer un compte Supabase
|
||||||
2. Configurer la base de données
|
2. Configurer la base de données
|
||||||
3. Créer un utilisateur admin
|
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
|
### 2. Création d'une campagne
|
||||||
1. Se connecter à l'administration
|
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"
|
2. Passer en mode "En cours de vote"
|
||||||
3. Partager les liens de vote personnels
|
3. Partager les liens de vote personnels
|
||||||
4. Suivre la participation en temps réel
|
4. Suivre la participation en temps réel
|
||||||
|
5. Envoyer des rappels par email (optionnel)
|
||||||
|
|
||||||
### 5. Résultats
|
### 5. Résultats
|
||||||
1. Consulter les statistiques de vote
|
1. Consulter les statistiques de vote
|
||||||
2. Analyser les résultats
|
2. Analyser les résultats
|
||||||
3. Clôturer la campagne
|
3. Clôturer la campagne
|
||||||
|
|
||||||
|
## 📚 Documentation supplémentaire
|
||||||
|
|
||||||
|
- **SETUP.md** : Guide de configuration détaillé
|
||||||
|
- **SETTINGS.md** : Documentation des paramètres et configurations
|
||||||
|
|
||||||
## 🤝 Contribution
|
## 🤝 Contribution
|
||||||
|
|
||||||
1. Fork le projet
|
1. Fork le projet
|
||||||
@@ -299,4 +340,4 @@ Pour toute question ou problème :
|
|||||||
|
|
||||||
**Développé avec ❤️ pour faciliter la démocratie participative**
|
**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.*
|
||||||
|
|||||||
@@ -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;
|
|
||||||
@@ -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
|
|
||||||
Reference in New Issue
Block a user