diff --git a/.gitignore b/.gitignore index ea6d6c6..2461195 100644 --- a/.gitignore +++ b/.gitignore @@ -52,3 +52,6 @@ bld/ # Configuration sensible - NE PAS COMMIT ! # Décommentez si vous voulez ignorer votre configuration locale # **/Configuration/AppSettings.cs + +appsettings.json +.env \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index 87896ae..0000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,182 +0,0 @@ -# 📅 Changelog - TravelMate Admin - -Toutes les modifications notables de ce projet seront documentées dans ce fichier. - -Le format est basé sur [Keep a Changelog](https://keepachangelog.com/fr/1.0.0/), -et ce projet adhère à [Semantic Versioning](https://semver.org/lang/fr/). - -## [1.0.0] - 2026-01-12 - -### ✨ Ajouté - -#### Architecture & Structure -- Architecture MVVM complète avec CommunityToolkit.Mvvm -- Pattern strict avec séparation Models/Views/ViewModels/Services -- Injection de dépendances configurée dans MauiProgram.cs -- Navigation Shell avec TabBar - -#### Models -- `Message.cs` : Modèle pour les messages de demande avec propriétés calculées -- `SupportRequest.cs` : Modèle pour les demandes support avec propriétés calculées - -#### Services -- `IDatabaseService.cs` : Interface du service de base de données -- `DatabaseService.cs` : Implémentation complète avec MySqlConnector - - Connexion à MariaDB/MySQL - - Méthodes CRUD asynchrones - - Gestion des erreurs et logs - - Test de connexion - -#### ViewModels -- `DashboardViewModel.cs` : Gestion du tableau de bord avec statistiques -- `MessagesViewModel.cs` : Gestion de la liste des messages avec filtres -- `SupportViewModel.cs` : Gestion des demandes support avec filtres -- Utilisation de `[ObservableProperty]` et `[RelayCommand]` -- Commandes asynchrones pour toutes les opérations - -#### Views -- `DashboardPage.xaml/.cs` : Page principale avec cartes de statistiques -- `MessagesPage.xaml/.cs` : Liste des messages avec CollectionView -- `SupportPage.xaml/.cs` : Liste des demandes support -- Design moderne avec dark theme (#1a1a1a) -- Layout responsive -- Indicateurs de chargement - -#### UI/UX -- Dark theme par défaut avec palette de couleurs cohérente -- Cartes avec ombres et coins arrondis -- Animations smooth pour les interactions -- Empty states pour listes vides -- Pull-to-refresh sur les listes -- Filtres dynamiques (Tout / À faire / Fait) - -#### Converters -- `BoolToStatusTextConverter` : Conversion bool → texte bouton -- `BoolToColorConverter` : Conversion bool → couleur bouton - -#### Configuration -- `AppSettings.cs` : Configuration centralisée de la connexion DB -- Paramètres modifiables (Server, Port, Database, User, Password) - -#### Base de Données -- Script SQL `database_setup.sql` complet : - - Création de la base `travelmateadmin` - - Table `messages` avec 8 colonnes et index - - Table `support_requests` avec 8 colonnes et index - - 4 messages de test - - 4 demandes support de test - - Encodage UTF-8 (utf8mb4) - -#### Fonctionnalités -- Dashboard avec statistiques en temps réel -- Filtrage des demandes (tout/à faire/fait) -- Changement de statut d'une demande (toggle done) -- Tri par date (plus récent en haut) -- Rafraîchissement manuel des données -- Navigation entre les sections -- Indicateur de connexion DB - -#### Packages NuGet -- `CommunityToolkit.Mvvm` v8.3.2 -- `MySqlConnector` v2.4.0 - -#### Documentation -- `README.md` : Documentation complète du projet (sections détaillées) -- `QUICKSTART.md` : Guide de démarrage rapide (5 minutes) -- `CONFIGURATION.md` : Guide de configuration DB avec exemples -- `ARCHITECTURE.md` : Documentation architecture MVVM détaillée -- `COMMANDS.md` : Référence des commandes de développement -- `SQL_REFERENCE.md` : Référence complète des requêtes SQL -- `PROJECT_SUMMARY.md` : Résumé du projet et checklist -- `.gitignore` : Configuration Git adaptée .NET MAUI - -#### DevOps -- Configuration csproj pour multi-plateforme (Mac/Win/Android/iOS) -- Build scripts pour toutes les plateformes -- Compilation vérifiée et réussie - -### 🎯 Plateformes Supportées -- ✅ macOS (MacCatalyst) - net10.0-maccatalyst -- ✅ Windows - net10.0-windows10.0.19041.0 -- ⚠️ Android - net10.0-android (non testé) -- ⚠️ iOS - net10.0-ios (non testé) - -### 📊 Statistiques -- **Fichiers créés** : 35+ -- **Lignes de code** : ~2000+ (C# + XAML) -- **Modèles** : 2 -- **Services** : 1 (+ interface) -- **ViewModels** : 3 -- **Views** : 3 (+ code-behind) -- **Documentation** : 8 fichiers MD - ---- - -## [Unreleased] - Fonctionnalités Futures - -### 🚀 Planifié pour v1.1.0 -- [ ] Mode light/dark configurable -- [ ] Recherche/filtrage avancé -- [ ] Export de données (CSV, PDF) -- [ ] Pagination pour grandes listes -- [ ] Statistiques graphiques (charts) - -### 🔮 Planifié pour v1.2.0 -- [ ] Authentification utilisateur -- [ ] Gestion des permissions -- [ ] Historique des modifications -- [ ] Notifications push -- [ ] Multi-langue (i18n) - -### 🧪 Planifié pour v1.3.0 -- [ ] Tests unitaires (ViewModels) -- [ ] Tests d'intégration (Services) -- [ ] CI/CD avec GitHub Actions -- [ ] Couverture de code - -### 🎨 Améliorations UI/UX -- [ ] Animations de transitions -- [ ] Thèmes personnalisables -- [ ] Accessibilité (screen readers) -- [ ] Raccourcis clavier - -### 🔧 Améliorations Techniques -- [ ] Connection pooling optimisé -- [ ] Cache des données -- [ ] Offline mode -- [ ] Synchronisation automatique -- [ ] Logs structurés (Serilog) - -### 🔐 Sécurité -- [ ] Chiffrement de la chaîne de connexion -- [ ] Variables d'environnement -- [ ] Azure Key Vault integration -- [ ] Audit trail -- [ ] Rate limiting - ---- - -## Types de Changements - -- `Added` ✨ : Nouvelles fonctionnalités -- `Changed` 🔄 : Modifications de fonctionnalités existantes -- `Deprecated` ⚠️ : Fonctionnalités bientôt supprimées -- `Removed` 🗑️ : Fonctionnalités supprimées -- `Fixed` 🐛 : Corrections de bugs -- `Security` 🔐 : Corrections de sécurité - ---- - -## Format des Versions - -``` -[MAJOR.MINOR.PATCH] - YYYY-MM-DD - -MAJOR : Changements incompatibles de l'API -MINOR : Nouvelles fonctionnalités rétrocompatibles -PATCH : Corrections de bugs rétrocompatibles -``` - ---- - -**Note** : Ce fichier sera mis à jour à chaque release avec les changements apportés. diff --git a/COMMANDS.md b/COMMANDS.md deleted file mode 100644 index a0e35d9..0000000 --- a/COMMANDS.md +++ /dev/null @@ -1,311 +0,0 @@ -# Commandes Utiles - TravelMate Admin - -## 🔧 Développement - -### Restaurer les packages -```bash -dotnet restore -``` - -### Build le projet -```bash -# MacCatalyst -dotnet build -f net10.0-maccatalyst - -# Windows -dotnet build -f net10.0-windows10.0.19041.0 - -# Android -dotnet build -f net10.0-android - -# iOS -dotnet build -f net10.0-ios -``` - -### Lancer l'application -```bash -# MacCatalyst -dotnet build -t:Run -f net10.0-maccatalyst - -# Windows -dotnet build -t:Run -f net10.0-windows10.0.19041.0 -``` - -### Nettoyer le projet -```bash -dotnet clean -rm -rf TravelMateAdmin/bin TravelMateAdmin/obj -``` - -### Rebuild complet -```bash -dotnet clean -dotnet restore -dotnet build -``` - -## 🗄️ Base de Données - -### Créer la base de données -```bash -mysql -u root -p < database_setup.sql -``` - -### Se connecter à MySQL -```bash -mysql -u root -p travelmateadmin -``` - -### Afficher les tables -```sql -USE travelmateadmin; -SHOW TABLES; -``` - -### Voir les données -```sql --- Tous les messages -SELECT * FROM messages ORDER BY created_at DESC; - --- Messages en attente -SELECT * FROM messages WHERE done = FALSE; - --- Statistiques -SELECT - COUNT(*) as total, - SUM(done = FALSE) as pending, - SUM(done = TRUE) as completed -FROM messages; -``` - -### Ajouter un message de test -```sql -INSERT INTO messages (nom, prenom, email, message, done, created_at) -VALUES ('Test', 'User', 'test@example.com', 'Ceci est un test', FALSE, NOW()); -``` - -### Marquer tous les messages comme non traités -```sql -UPDATE messages SET done = FALSE; -UPDATE support_requests SET done = FALSE; -``` - -### Réinitialiser les données -```bash -mysql -u root -p travelmateadmin < database_setup.sql -``` - -### Backup de la base -```bash -mysqldump -u root -p travelmateadmin > backup_$(date +%Y%m%d_%H%M%S).sql -``` - -### Restore depuis un backup -```bash -mysql -u root -p travelmateadmin < backup_20260112_143000.sql -``` - -## 📦 NuGet Packages - -### Voir les packages installés -```bash -dotnet list TravelMateAdmin/TravelMateAdmin.csproj package -``` - -### Mettre à jour un package -```bash -dotnet add TravelMateAdmin/TravelMateAdmin.csproj package CommunityToolkit.Mvvm -dotnet add TravelMateAdmin/TravelMateAdmin.csproj package MySqlConnector -``` - -### Mettre à jour tous les packages -```bash -dotnet list TravelMateAdmin/TravelMateAdmin.csproj package --outdated -``` - -## 🐛 Debugging - -### Voir les logs -Dans le terminal où vous avez lancé l'app, les logs apparaissent via : -```csharp -System.Diagnostics.Debug.WriteLine("Mon log"); -``` - -### Tests de connexion MySQL -```bash -# Tester si MySQL est accessible -nc -zv localhost 3306 - -# Voir les processus MySQL -ps aux | grep mysql - -# Démarrer MySQL (Mac avec Homebrew) -brew services start mysql - -# Démarrer MySQL (Linux) -sudo service mysql start - -# Démarrer MySQL (MAMP) -# Utiliser l'interface MAMP -``` - -## 📱 Plateforme Spécifique - -### MacCatalyst - Voir les logs système -```bash -log stream --predicate 'processImagePath contains "TravelMateAdmin"' --level debug -``` - -### Android - Voir les logs -```bash -adb logcat | grep TravelMateAdmin -``` - -### iOS Simulator - Voir les logs -```bash -xcrun simctl spawn booted log stream --level debug | grep TravelMateAdmin -``` - -## 🔍 Code Analysis - -### Format le code -```bash -dotnet format TravelMateAdmin/TravelMateAdmin.csproj -``` - -### Analyser le code -```bash -dotnet build /p:TreatWarningsAsErrors=true -``` - -## 📊 Statistiques du Projet - -### Compter les lignes de code -```bash -find TravelMateAdmin -name "*.cs" -not -path "*/obj/*" -not -path "*/bin/*" | xargs wc -l -``` - -### Voir l'arborescence -```bash -tree -I 'bin|obj' TravelMateAdmin/ -``` - -### Taille du projet -```bash -du -sh TravelMateAdmin/ -``` - -## 🚀 Publication - -### Publish MacCatalyst -```bash -dotnet publish -f net10.0-maccatalyst -c Release -p:CreatePackage=true -``` - -### Publish Windows -```bash -dotnet publish -f net10.0-windows10.0.19041.0 -c Release -``` - -### Créer un package pour Mac App Store -```bash -dotnet publish -f net10.0-maccatalyst -c Release \ - -p:RuntimeIdentifier=maccatalyst-arm64 \ - -p:CreatePackage=true \ - -p:CodesignKey="Apple Distribution: Your Name" \ - -p:CodesignProvision="Your Provisioning Profile" -``` - -## 🧪 Tests (futur) - -### Ajouter un projet de tests -```bash -dotnet new xunit -n TravelMateAdmin.Tests -dotnet sln add TravelMateAdmin.Tests/TravelMateAdmin.Tests.csproj -dotnet add TravelMateAdmin.Tests reference TravelMateAdmin/TravelMateAdmin.csproj -``` - -### Lancer les tests -```bash -dotnet test -``` - -## 📝 Git - -### Initialiser le repo -```bash -git init -git add . -git commit -m "Initial commit: TravelMate Admin MAUI app" -``` - -### Ignorer les fichiers de build -Le `.gitignore` est déjà configuré pour : -- bin/, obj/ -- .vs/, .vscode/ -- Configuration sensible - -### Créer une branche -```bash -git checkout -b feature/nouvelle-fonctionnalite -``` - -## 🔐 Sécurité - -### Chiffrer la configuration (exemple) -```bash -# Générer une clé -openssl rand -base64 32 - -# Chiffrer un fichier -openssl enc -aes-256-cbc -salt -in AppSettings.cs -out AppSettings.cs.enc - -# Déchiffrer -openssl enc -d -aes-256-cbc -in AppSettings.cs.enc -out AppSettings.cs -``` - -## 🛠️ Maintenance - -### Vérifier les dépendances obsolètes -```bash -dotnet list package --outdated -``` - -### Mettre à jour .NET -```bash -# Vérifier la version actuelle -dotnet --version - -# Télécharger la dernière version -# https://dotnet.microsoft.com/download -``` - -### Nettoyer NuGet cache -```bash -dotnet nuget locals all --clear -``` - ---- - -## 💡 Tips & Tricks - -### Hot Reload -Lors du développement, les changements XAML sont appliqués en temps réel avec Hot Reload. - -### Raccourcis Visual Studio -- `F5` : Run avec debug -- `Ctrl+F5` (Cmd+F5 Mac) : Run sans debug -- `Shift+F5` : Stop debugging - -### Performance -```bash -# Build en Release pour tester les performances réelles -dotnet build -c Release -f net10.0-maccatalyst -``` - -### Multi-targeting -Pour cibler plusieurs plateformes en une fois : -```bash -dotnet build -# Build toutes les plateformes définies dans TargetFrameworks -``` diff --git a/CONFIGURATION.md b/CONFIGURATION.md deleted file mode 100644 index bc03546..0000000 --- a/CONFIGURATION.md +++ /dev/null @@ -1,102 +0,0 @@ -# Configuration de l'Application TravelMate Admin - -## Configuration de Base de Données - -Pour configurer la connexion à votre base de données, modifiez le fichier : -`TravelMateAdmin/Configuration/AppSettings.cs` - -### Exemple pour une connexion locale : - -```csharp -public const string Server = "localhost"; -public const string Port = "3306"; -public const string Database = "travelmateadmin"; -public const string User = "root"; -public const string Password = "monmotdepasse"; -``` - -### Exemple pour une connexion distante : - -```csharp -public const string Server = "192.168.1.100"; // IP du serveur -public const string Port = "3306"; -public const string Database = "travelmateadmin"; -public const string User = "admin"; -public const string Password = "motdepassesecurise"; -``` - -### Exemple avec un serveur cloud (ex: AWS RDS, Azure Database) : - -```csharp -public const string Server = "myserver.mysql.database.azure.com"; -public const string Port = "3306"; -public const string Database = "travelmateadmin"; -public const string User = "myadmin@myserver"; -public const string Password = "P@ssw0rd!"; -``` - -## Sécurité - -⚠️ **Important** : Ne commitez JAMAIS vos mots de passe dans Git ! - -Pour une meilleure sécurité en production : - -1. Utilisez des variables d'environnement -2. Utilisez un système de gestion des secrets (Azure Key Vault, AWS Secrets Manager) -3. Chiffrez la chaîne de connexion - -### Exemple avec variables d'environnement : - -```csharp -public static string GetConnectionString() -{ - var server = Environment.GetEnvironmentVariable("DB_SERVER") ?? Server; - var port = Environment.GetEnvironmentVariable("DB_PORT") ?? Port; - var database = Environment.GetEnvironmentVariable("DB_NAME") ?? Database; - var user = Environment.GetEnvironmentVariable("DB_USER") ?? User; - var password = Environment.GetEnvironmentVariable("DB_PASSWORD") ?? Password; - - return $"Server={server};Port={port};Database={database};User={user};Password={password};"; -} -``` - -## Paramètres Supplémentaires MySQL - -Vous pouvez ajouter des paramètres supplémentaires à la chaîne de connexion : - -```csharp -public static string GetConnectionString() -{ - return $"Server={Server};Port={Port};Database={Database};User={User};Password={Password};" + - "SslMode=Required;" + // Pour SSL/TLS - "AllowPublicKeyRetrieval=True;" + // Pour l'authentification - "ConnectionTimeout=30;" + // Timeout en secondes - "DefaultCommandTimeout=30;"; // Timeout des commandes -} -``` - -## Test de Connexion - -Pour tester votre connexion, lancez l'application et vérifiez : -1. Le dashboard doit afficher "✓ Connecté" en haut à droite -2. Les statistiques doivent se charger -3. Si "✗ Déconnecté", vérifiez vos paramètres et les logs de débogage - -## Dépannage Connexion - -### Erreur "Access denied" -- Vérifiez le nom d'utilisateur et le mot de passe -- Vérifiez que l'utilisateur a les droits sur la base de données : - ```sql - GRANT ALL PRIVILEGES ON travelmateadmin.* TO 'user'@'localhost'; - FLUSH PRIVILEGES; - ``` - -### Erreur "Cannot connect to server" -- Vérifiez que MySQL est démarré -- Vérifiez le serveur et le port -- Vérifiez les règles de firewall - -### Erreur "Unknown database" -- Vérifiez que la base de données existe -- Exécutez le script `database_setup.sql` diff --git a/INDEX.md b/INDEX.md deleted file mode 100644 index c477d8b..0000000 --- a/INDEX.md +++ /dev/null @@ -1,232 +0,0 @@ -# 📚 Index de Documentation - TravelMate Admin - -Guide complet pour naviguer dans la documentation du projet. - ---- - -## 🚀 Pour Commencer - -**Nouveau sur le projet ? Commencez ici :** - -1. 📖 [README.md](README.md) - **Lisez-moi d'abord** - Vue d'ensemble du projet -2. ⚡ [QUICKSTART.md](QUICKSTART.md) - Installation en 5 minutes -3. 🎉 Lancez l'application ! - ---- - -## 📂 Documentation par Catégorie - -### 🏗️ Architecture & Développement - -| Fichier | Description | Quand le consulter | -|---------|-------------|-------------------| -| [ARCHITECTURE.md](ARCHITECTURE.md) | Architecture MVVM détaillée, flux de données, patterns | Comprendre la structure du code | -| [PROJECT_SUMMARY.md](PROJECT_SUMMARY.md) | Résumé complet, fichiers créés, checklist | Vue d'ensemble technique | -| [CHANGELOG.md](CHANGELOG.md) | Historique des versions et modifications | Voir les changements apportés | - -### ⚙️ Configuration & Installation - -| Fichier | Description | Quand le consulter | -|---------|-------------|-------------------| -| [QUICKSTART.md](QUICKSTART.md) | Guide rapide d'installation (5 min) | Première installation | -| [CONFIGURATION.md](CONFIGURATION.md) | Configuration de la base de données | Problèmes de connexion DB | -| [README.md](README.md) | Guide complet avec tous les détails | Documentation générale | - -### 💻 Développement & Maintenance - -| Fichier | Description | Quand le consulter | -|---------|-------------|-------------------| -| [COMMANDS.md](COMMANDS.md) | Commandes utiles (build, DB, debug) | Tâches de développement | -| [SQL_REFERENCE.md](SQL_REFERENCE.md) | Requêtes SQL complètes | Gérer la base de données | - -### 📊 Base de Données - -| Fichier | Description | Quand le consulter | -|---------|-------------|-------------------| -| [database_setup.sql](database_setup.sql) | Script SQL de création + données test | Initialiser la DB | -| [SQL_REFERENCE.md](SQL_REFERENCE.md) | Guide complet des requêtes SQL | Opérations sur les données | - ---- - -## 🎯 Guides par Scénario - -### Scénario 1 : Je veux installer l'app rapidement -1. [QUICKSTART.md](QUICKSTART.md) - Suivez les 5 étapes -2. [database_setup.sql](database_setup.sql) - Exécutez ce script -3. Modifiez `TravelMateAdmin/Configuration/AppSettings.cs` -4. Lancez l'app ! - -### Scénario 2 : J'ai des problèmes de connexion DB -1. [CONFIGURATION.md](CONFIGURATION.md) - Guide de dépannage -2. Vérifiez `AppSettings.cs` -3. [COMMANDS.md](COMMANDS.md) - Commandes de test MySQL - -### Scénario 3 : Je veux comprendre le code -1. [ARCHITECTURE.md](ARCHITECTURE.md) - Pattern MVVM expliqué -2. [PROJECT_SUMMARY.md](PROJECT_SUMMARY.md) - Structure des fichiers -3. Lisez les commentaires dans le code source - -### Scénario 4 : Je veux ajouter une fonctionnalité -1. [ARCHITECTURE.md](ARCHITECTURE.md) - Section "Extensibilité" -2. [COMMANDS.md](COMMANDS.md) - Commandes de build/test -3. Suivez le pattern existant (Models → Services → ViewModels → Views) - -### Scénario 5 : Je veux gérer les données -1. [SQL_REFERENCE.md](SQL_REFERENCE.md) - Toutes les requêtes SQL -2. [COMMANDS.md](COMMANDS.md) - Section "Base de Données" - -### Scénario 6 : Je veux personnaliser l'UI -1. [README.md](README.md) - Section "Personnalisation" -2. Modifiez les couleurs dans les fichiers XAML -3. Consultez les Views existantes comme exemples - ---- - -## 📖 Structure de la Documentation - -``` -Documentation/ -├── README.md ⭐ Point d'entrée principal -├── QUICKSTART.md 🚀 Installation rapide -├── ARCHITECTURE.md 🏗️ Architecture technique -├── CONFIGURATION.md ⚙️ Configuration DB -├── COMMANDS.md 💻 Commandes de dev -├── SQL_REFERENCE.md 📊 Référence SQL -├── PROJECT_SUMMARY.md 📝 Résumé complet -├── CHANGELOG.md 📅 Historique des versions -└── INDEX.md 📚 Ce fichier - -Code Source/ -├── TravelMateAdmin/ -│ ├── Models/ 📦 Modèles de données -│ ├── Services/ 🔧 Couche d'accès aux données -│ ├── ViewModels/ 🎭 Logique de présentation -│ ├── Views/ 🎨 Interface utilisateur -│ ├── Converters/ 🔄 Converters XAML -│ └── Configuration/ ⚙️ Configuration app - -Base de Données/ -└── database_setup.sql 🗄️ Script SQL -``` - ---- - -## 🔍 Index par Mots-Clés - -### A -- **Architecture MVVM** → [ARCHITECTURE.md](ARCHITECTURE.md) -- **Ajouter une fonctionnalité** → [ARCHITECTURE.md](ARCHITECTURE.md#extensibilité) - -### B -- **Base de données** → [CONFIGURATION.md](CONFIGURATION.md), [SQL_REFERENCE.md](SQL_REFERENCE.md) -- **Build** → [COMMANDS.md](COMMANDS.md#développement) -- **Backup** → [COMMANDS.md](COMMANDS.md#base-de-données) - -### C -- **Commandes** → [COMMANDS.md](COMMANDS.md) -- **Configuration** → [CONFIGURATION.md](CONFIGURATION.md) -- **Connexion DB** → [CONFIGURATION.md](CONFIGURATION.md) -- **CommunityToolkit.Mvvm** → [ARCHITECTURE.md](ARCHITECTURE.md) - -### D -- **Dashboard** → [PROJECT_SUMMARY.md](PROJECT_SUMMARY.md) -- **DatabaseService** → [ARCHITECTURE.md](ARCHITECTURE.md) -- **Dépannage** → [CONFIGURATION.md](CONFIGURATION.md), [QUICKSTART.md](QUICKSTART.md) - -### F -- **Filtres** → [ARCHITECTURE.md](ARCHITECTURE.md) - -### I -- **Installation** → [QUICKSTART.md](QUICKSTART.md) -- **Injection de dépendances** → [ARCHITECTURE.md](ARCHITECTURE.md) - -### M -- **MariaDB** → [CONFIGURATION.md](CONFIGURATION.md) -- **Messages** → [README.md](README.md) -- **MySQL** → [CONFIGURATION.md](CONFIGURATION.md), [SQL_REFERENCE.md](SQL_REFERENCE.md) -- **MVVM** → [ARCHITECTURE.md](ARCHITECTURE.md) - -### N -- **Navigation** → [ARCHITECTURE.md](ARCHITECTURE.md) -- **NuGet** → [COMMANDS.md](COMMANDS.md) - -### P -- **Performance** → [ARCHITECTURE.md](ARCHITECTURE.md), [SQL_REFERENCE.md](SQL_REFERENCE.md) -- **Problèmes** → [QUICKSTART.md](QUICKSTART.md), [CONFIGURATION.md](CONFIGURATION.md) - -### Q -- **Quick Start** → [QUICKSTART.md](QUICKSTART.md) - -### R -- **Requêtes SQL** → [SQL_REFERENCE.md](SQL_REFERENCE.md) - -### S -- **Sécurité** → [CONFIGURATION.md](CONFIGURATION.md), [ARCHITECTURE.md](ARCHITECTURE.md) -- **Services** → [ARCHITECTURE.md](ARCHITECTURE.md) -- **SQL** → [SQL_REFERENCE.md](SQL_REFERENCE.md) -- **Support** → [PROJECT_SUMMARY.md](PROJECT_SUMMARY.md) - -### T -- **Tests** → [COMMANDS.md](COMMANDS.md), [ARCHITECTURE.md](ARCHITECTURE.md) - -### V -- **ViewModels** → [ARCHITECTURE.md](ARCHITECTURE.md) -- **Views** → [ARCHITECTURE.md](ARCHITECTURE.md) - -### X -- **XAML** → [ARCHITECTURE.md](ARCHITECTURE.md), [README.md](README.md) - ---- - -## 📊 Statistiques de la Documentation - -| Type | Nombre | Lignes Totales | -|------|--------|----------------| -| Fichiers Markdown | 8 | ~1500+ lignes | -| Sections | 100+ | - | -| Exemples de code | 50+ | - | -| Commandes | 100+ | - | -| Requêtes SQL | 60+ | - | - ---- - -## 🆘 Aide Rapide - -**Je ne trouve pas ce que je cherche !** - -1. Utilisez Ctrl+F (Cmd+F sur Mac) dans ce fichier pour chercher un mot-clé -2. Consultez la section "Guides par Scénario" ci-dessus -3. Ouvrez [README.md](README.md) pour une vue d'ensemble -4. Tous les fichiers sont en Markdown, faciles à lire avec n'importe quel éditeur - -**Suggestions de documentation manquante ?** - -N'hésitez pas à créer une issue ou à contribuer ! - ---- - -## 🎓 Ordre de Lecture Recommandé - -### Pour les Débutants -1. [README.md](README.md) - Vue d'ensemble -2. [QUICKSTART.md](QUICKSTART.md) - Installation -3. [PROJECT_SUMMARY.md](PROJECT_SUMMARY.md) - Résumé -4. Lancez l'app et explorez ! - -### Pour les Développeurs -1. [ARCHITECTURE.md](ARCHITECTURE.md) - Comprendre la structure -2. [COMMANDS.md](COMMANDS.md) - Commandes de dev -3. [SQL_REFERENCE.md](SQL_REFERENCE.md) - Opérations DB -4. Code source dans TravelMateAdmin/ - -### Pour les Administrateurs DB -1. [CONFIGURATION.md](CONFIGURATION.md) - Configuration -2. [database_setup.sql](database_setup.sql) - Script d'installation -3. [SQL_REFERENCE.md](SQL_REFERENCE.md) - Référence complète -4. [COMMANDS.md](COMMANDS.md#base-de-données) - Maintenance - ---- - -**Dernière mise à jour** : 12 janvier 2026 - -**Version de la documentation** : 1.0.0 diff --git a/PROJECT_SUMMARY.md b/PROJECT_SUMMARY.md deleted file mode 100644 index 624d89f..0000000 --- a/PROJECT_SUMMARY.md +++ /dev/null @@ -1,233 +0,0 @@ -# ✅ PROJET COMPLÉTÉ - TravelMate Admin - -## 📋 Résumé - -Application desktop .NET MAUI (Mac/Windows) avec architecture MVVM pour gérer les demandes clients depuis une base de données MariaDB/MySQL. - ---- - -## 🎯 Ce qui a été créé - -### 1. Structure MVVM Complète - -#### **Models** (2 fichiers) -- ✅ `Message.cs` - Modèle pour les messages de demande -- ✅ `SupportRequest.cs` - Modèle pour les demandes support - -#### **Services** (2 fichiers) -- ✅ `IDatabaseService.cs` - Interface du service de base de données -- ✅ `DatabaseService.cs` - Implémentation avec MySqlConnector - - Connexion à MariaDB/MySQL - - CRUD operations pour messages et support_requests - - Gestion asynchrone complète - -#### **ViewModels** (3 fichiers) -- ✅ `DashboardViewModel.cs` - Gestion du tableau de bord -- ✅ `MessagesViewModel.cs` - Gestion de la liste des messages -- ✅ `SupportViewModel.cs` - Gestion des demandes support -- Tous utilisent CommunityToolkit.Mvvm (ObservableProperty, RelayCommand) - -#### **Views** (3 paires XAML + Code-behind) -- ✅ `DashboardPage.xaml/.cs` - Tableau de bord avec statistiques -- ✅ `MessagesPage.xaml/.cs` - Liste des messages avec filtres -- ✅ `SupportPage.xaml/.cs` - Liste des demandes support - -#### **Converters** (1 fichier) -- ✅ `BoolConverters.cs` - Conversion bool → texte et couleur pour les boutons - -#### **Configuration** (1 fichier) -- ✅ `AppSettings.cs` - Configuration de la connexion DB - -### 2. Configuration & Infrastructure - -- ✅ `MauiProgram.cs` - Injection de dépendances configurée -- ✅ `AppShell.xaml` - Navigation Shell avec 3 onglets -- ✅ `TravelMateAdmin.csproj` - Packages NuGet ajoutés : - - CommunityToolkit.Mvvm (8.3.2) - - MySqlConnector (2.4.0) - -### 3. Base de Données - -- ✅ `database_setup.sql` - Script SQL complet : - - Création de la base `travelmateadmin` - - Table `messages` (8 colonnes) - - Table `support_requests` (8 colonnes) - - Données de test (4 messages + 4 demandes support) - -### 4. Documentation - -- ✅ `README.md` - Documentation complète du projet -- ✅ `QUICKSTART.md` - Guide de démarrage rapide (5 minutes) -- ✅ `CONFIGURATION.md` - Guide de configuration DB -- ✅ `ARCHITECTURE.md` - Documentation architecture MVVM -- ✅ `COMMANDS.md` - Commandes utiles pour le développement -- ✅ `.gitignore` - Fichiers à ignorer dans Git - ---- - -## 🎨 Fonctionnalités Implémentées - -### ✅ Dashboard -- Affichage des statistiques en temps réel -- 4 cartes : Messages (en attente/traités) + Support (en attente/traités) -- Indicateur de statut de connexion -- Bouton de rafraîchissement -- Navigation vers les pages de détail - -### ✅ Page Messages -- Liste complète des messages avec scroll -- Tri par date (plus récent en haut) -- Filtre : Tout / À faire / Fait -- Affichage : Nom, Prénom, Email, Message, Date, Statut -- Bouton pour changer le statut (fait ↔ en attente) -- Rafraîchissement manuel - -### ✅ Page Support -- Liste des demandes support -- Même système de filtres que Messages -- Affichage : Nom, Prénom, Account Email, Contact Email, Message, Date, Statut -- Bouton pour changer le statut -- Rafraîchissement manuel - -### ✅ Design -- **Dark theme** moderne et professionnel -- Couleurs configurables (Primary, Accent, Success, Warning) -- Cartes avec shadow et coins arrondis -- Layout responsive -- Indicateurs de chargement (ActivityIndicator) - ---- - -## 🛠️ Technologies Utilisées - -| Technologie | Version | Usage | -|-------------|---------|-------| -| .NET | 10.0 | Framework principal | -| .NET MAUI | Dernière | UI multi-plateforme | -| CommunityToolkit.Mvvm | 8.3.2 | Pattern MVVM | -| MySqlConnector | 2.4.0 | Connexion MariaDB/MySQL | -| XAML | - | Interface utilisateur | - ---- - -## 📊 Structure du Projet - -``` -TravelMateAdmin/ -├── TravelMateAdmin/ # Projet principal -│ ├── Configuration/ -│ │ └── AppSettings.cs # Config DB -│ ├── Converters/ -│ │ └── BoolConverters.cs # Converters XAML -│ ├── Models/ -│ │ ├── Message.cs -│ │ └── SupportRequest.cs -│ ├── Services/ -│ │ ├── IDatabaseService.cs -│ │ └── DatabaseService.cs -│ ├── ViewModels/ -│ │ ├── DashboardViewModel.cs -│ │ ├── MessagesViewModel.cs -│ │ └── SupportViewModel.cs -│ ├── Views/ -│ │ ├── DashboardPage.xaml/.cs -│ │ ├── MessagesPage.xaml/.cs -│ │ └── SupportPage.xaml/.cs -│ ├── App.xaml/.cs -│ ├── AppShell.xaml/.cs -│ ├── MauiProgram.cs -│ └── TravelMateAdmin.csproj -├── database_setup.sql # Script SQL -├── README.md # Documentation principale -├── QUICKSTART.md # Guide rapide -├── CONFIGURATION.md # Guide configuration -├── ARCHITECTURE.md # Documentation architecture -├── COMMANDS.md # Commandes utiles -└── .gitignore # Git ignore - -Total: 35+ fichiers créés/modifiés -``` - ---- - -## 🚀 État du Projet - -### ✅ Complété (100%) - -- [x] Architecture MVVM complète -- [x] Modèles de données (Message, SupportRequest) -- [x] Service de base de données avec toutes les méthodes -- [x] ViewModels avec CommunityToolkit.Mvvm -- [x] Vues XAML avec design moderne -- [x] Converters pour l'affichage -- [x] Injection de dépendances -- [x] Navigation Shell -- [x] Script SQL avec données de test -- [x] Documentation complète -- [x] Compilation réussie ✅ - -### ⏭️ Étapes Suivantes (Optionnel) - -- [ ] Ajouter authentification utilisateur -- [ ] Implémenter pagination pour grandes listes -- [ ] Ajouter recherche/filtrage avancé -- [ ] Exporter les données (CSV, PDF) -- [ ] Notifications push -- [ ] Tests unitaires -- [ ] Mode light/dark configurable -- [ ] Statistiques avancées (graphiques) - ---- - -## 📝 Pour Commencer - -### Option 1 : Rapide (5 minutes) -```bash -# 1. Configurer la base de données -mysql -u root -p < database_setup.sql - -# 2. Modifier AppSettings.cs avec vos identifiants MySQL - -# 3. Lancer l'app -dotnet build -t:Run -f net10.0-maccatalyst # Mac -# OU -dotnet build -t:Run -f net10.0-windows10.0.19041.0 # Windows -``` - -### Option 2 : Détaillée -Consultez `QUICKSTART.md` pour un guide pas-à-pas complet. - ---- - -## 🎓 Points Clés de l'Architecture - -1. **Séparation des responsabilités** : MVVM strict -2. **Réactivité** : INotifyPropertyChanged automatique -3. **Asynchrone** : Toutes les opérations DB sont async -4. **Injection de dépendances** : Services injectés automatiquement -5. **Testabilité** : Interface IDatabaseService mockable -6. **Extensibilité** : Facile d'ajouter de nouvelles entités - ---- - -## 📞 Support - -- **README.md** : Documentation générale -- **QUICKSTART.md** : Installation rapide -- **CONFIGURATION.md** : Problèmes de connexion DB -- **ARCHITECTURE.md** : Comprendre le code -- **COMMANDS.md** : Commandes de développement - ---- - -## 🎉 Félicitations ! - -Vous avez maintenant une application d'administration complète et professionnelle avec : -- ✅ Code propre et bien structuré -- ✅ Pattern MVVM moderne -- ✅ Interface utilisateur intuitive -- ✅ Base de données intégrée -- ✅ Documentation exhaustive -- ✅ Prête à être étendue - -**Prochaine étape** : Lancez l'application et explorez les fonctionnalités ! 🚀 diff --git a/QUICKSTART.md b/QUICKSTART.md deleted file mode 100644 index 46bb8e0..0000000 --- a/QUICKSTART.md +++ /dev/null @@ -1,123 +0,0 @@ -# 🚀 Guide de Démarrage Rapide - TravelMate Admin - -## Installation en 5 Minutes - -### Étape 1 : Prérequis ✅ - -Installez si nécessaire : -- [.NET 8+ SDK](https://dotnet.microsoft.com/download) -- [MySQL/MariaDB](https://dev.mysql.com/downloads/) ou [MAMP](https://www.mamp.info/) (Mac) / [XAMPP](https://www.apachefriends.org/) (Windows) - -### Étape 2 : Base de Données 🗄️ - -**Option A - Avec MySQL en ligne de commande :** -```bash -mysql -u root -p < database_setup.sql -``` - -**Option B - Avec phpMyAdmin ou MySQL Workbench :** -1. Créez une base de données nommée `travelmateadmin` -2. Importez le fichier `database_setup.sql` - -**Option C - Manuellement :** -```sql -CREATE DATABASE travelmateadmin; -USE travelmateadmin; --- Puis copiez/collez le contenu de database_setup.sql -``` - -### Étape 3 : Configuration ⚙️ - -Ouvrez `TravelMateAdmin/Configuration/AppSettings.cs` et modifiez : - -```csharp -public const string Server = "localhost"; // ✏️ Votre serveur -public const string Port = "3306"; // ✏️ Votre port -public const string Database = "travelmateadmin"; -public const string User = "root"; // ✏️ Votre utilisateur -public const string Password = "VOTRE_MDP"; // ✏️ IMPORTANT: Changez ici ! -``` - -### Étape 4 : Restaurer les Packages 📦 - -```bash -cd TravelMateAdmin -dotnet restore -``` - -### Étape 5 : Lancer l'Application 🎉 - -**Sur Mac :** -```bash -dotnet build -t:Run -f net10.0-maccatalyst -``` - -**Sur Windows :** -```bash -dotnet build -t:Run -f net10.0-windows10.0.19041.0 -``` - -**Avec Visual Studio :** -1. Ouvrez `TravelMateAdmin.sln` -2. Sélectionnez la plateforme (Mac Catalyst ou Windows) -3. Appuyez sur F5 ou cliquez sur ▶️ Run - ---- - -## ✅ Vérification - -Au lancement, vous devriez voir : -- ✅ Dashboard avec les statistiques -- ✅ "✓ Connecté" en haut à droite -- ✅ 4 messages et 4 demandes support (données de test) - -## ❌ Problèmes ? - -### "✗ Déconnecté" s'affiche -1. Vérifiez que MySQL est démarré -2. Vérifiez vos paramètres dans `AppSettings.cs` -3. Testez la connexion MySQL : `mysql -u root -p` - -### Erreur "Cannot find project" -```bash -cd /Users/dayronvanleemput/Documents/Coding/TravelMateAdmin -dotnet restore -``` - -### Erreur de build -```bash -dotnet clean -dotnet restore -dotnet build -``` - ---- - -## 📚 Prochaines Étapes - -1. **Tester l'application** : Naviguez entre Dashboard, Messages et Support -2. **Changer un statut** : Cliquez sur un bouton "Marquer comme fait" -3. **Filtrer** : Utilisez le menu déroulant pour filtrer les demandes -4. **Personnaliser** : Changez les couleurs dans les fichiers XAML -5. **Ajouter des données** : Ajoutez vos propres demandes dans la base - -## 🎨 Captures d'Écran des Fonctionnalités - -### Dashboard -- Vue d'ensemble des statistiques -- Cartes cliquables pour accéder aux détails -- Statut de connexion en temps réel - -### Messages -- Liste complète des messages -- Filtre : Tout / À faire / Fait -- Action : Marquer comme fait/en attente - -### Support -- Liste des demandes d'assistance -- Affichage des emails (compte et contact) -- Même système de filtres et actions - ---- - -**Besoin d'aide ?** Consultez le [README.md](README.md) complet ou le guide de [CONFIGURATION.md](CONFIGURATION.md) diff --git a/SQL_REFERENCE.md b/SQL_REFERENCE.md deleted file mode 100644 index d4b3a45..0000000 --- a/SQL_REFERENCE.md +++ /dev/null @@ -1,433 +0,0 @@ -# 📊 SQL Queries Reference - TravelMate Admin - -Requêtes SQL utiles pour gérer et interroger la base de données. - -## 🔍 Requêtes de Consultation - -### Messages - -```sql --- Tous les messages -SELECT * FROM messages ORDER BY created_at DESC; - --- Messages en attente uniquement -SELECT * FROM messages WHERE done = FALSE ORDER BY created_at DESC; - --- Messages traités uniquement -SELECT * FROM messages WHERE done = TRUE ORDER BY created_at DESC; - --- Compter les messages par statut -SELECT - COUNT(*) AS total, - SUM(CASE WHEN done = FALSE THEN 1 ELSE 0 END) AS en_attente, - SUM(CASE WHEN done = TRUE THEN 1 ELSE 0 END) AS traites -FROM messages; - --- Messages récents (dernières 24h) -SELECT * FROM messages -WHERE created_at > NOW() - INTERVAL 24 HOUR -ORDER BY created_at DESC; - --- Messages d'un utilisateur spécifique -SELECT * FROM messages -WHERE email = 'jean.dupont@example.com' -ORDER BY created_at DESC; - --- Recherche dans les messages -SELECT * FROM messages -WHERE message LIKE '%RGPD%' - OR nom LIKE '%Dupont%' -ORDER BY created_at DESC; -``` - -### Support Requests - -```sql --- Toutes les demandes support -SELECT * FROM support_requests ORDER BY created_at DESC; - --- Demandes en attente -SELECT * FROM support_requests WHERE done = FALSE ORDER BY created_at DESC; - --- Demandes traitées -SELECT * FROM support_requests WHERE done = TRUE ORDER BY created_at DESC; - --- Compter par statut -SELECT - COUNT(*) AS total, - SUM(CASE WHEN done = FALSE THEN 1 ELSE 0 END) AS en_attente, - SUM(CASE WHEN done = TRUE THEN 1 ELSE 0 END) AS traites -FROM support_requests; - --- Demandes d'un compte spécifique -SELECT * FROM support_requests -WHERE account_email = 'lucas.petit@example.com' -ORDER BY created_at DESC; - --- Recherche par email de contact -SELECT * FROM support_requests -WHERE contact_email = 'lucas.contact@example.com' -ORDER BY created_at DESC; -``` - -### Statistiques Globales - -```sql --- Vue d'ensemble complète -SELECT - 'Messages' AS type, - COUNT(*) AS total, - SUM(CASE WHEN done = FALSE THEN 1 ELSE 0 END) AS en_attente, - SUM(CASE WHEN done = TRUE THEN 1 ELSE 0 END) AS traites -FROM messages -UNION ALL -SELECT - 'Support', - COUNT(*), - SUM(CASE WHEN done = FALSE THEN 1 ELSE 0 END), - SUM(CASE WHEN done = TRUE THEN 1 ELSE 0 END) -FROM support_requests; - --- Activité par jour (7 derniers jours) -SELECT - DATE(created_at) AS date, - COUNT(*) AS messages -FROM messages -WHERE created_at > NOW() - INTERVAL 7 DAY -GROUP BY DATE(created_at) -ORDER BY date DESC; - --- Volume par heure de la journée -SELECT - HOUR(created_at) AS heure, - COUNT(*) AS nombre_messages -FROM messages -GROUP BY HOUR(created_at) -ORDER BY heure; -``` - -## ✏️ Requêtes de Modification - -### Changer le Statut - -```sql --- Marquer un message comme traité -UPDATE messages SET done = TRUE WHERE id = 1; - --- Marquer une demande support comme traitée -UPDATE support_requests SET done = TRUE WHERE id = 1; - --- Marquer comme non traité -UPDATE messages SET done = FALSE WHERE id = 1; - --- Marquer tous les messages en attente -UPDATE messages SET done = FALSE; - --- Marquer tous comme traités -UPDATE messages SET done = TRUE; - --- Marquer les vieux messages comme traités (plus de 30 jours) -UPDATE messages -SET done = TRUE -WHERE created_at < NOW() - INTERVAL 30 DAY AND done = FALSE; -``` - -### Ajouter des Données - -```sql --- Nouveau message -INSERT INTO messages (nom, prenom, email, message, done, created_at) -VALUES ( - 'Nouveau', - 'Test', - 'test@example.com', - 'Ceci est un nouveau message de test', - FALSE, - NOW() -); - --- Nouvelle demande support -INSERT INTO support_requests (nom, prenom, account_email, contact_email, message, done, created_at) -VALUES ( - 'Support', - 'Test', - 'account@example.com', - 'contact@example.com', - 'Problème de connexion', - FALSE, - NOW() -); - --- Ajouter plusieurs messages en une fois -INSERT INTO messages (nom, prenom, email, message, done, created_at) VALUES - ('User1', 'Test', 'user1@test.com', 'Message 1', FALSE, NOW()), - ('User2', 'Test', 'user2@test.com', 'Message 2', FALSE, NOW()), - ('User3', 'Test', 'user3@test.com', 'Message 3', FALSE, NOW()); -``` - -### Supprimer des Données - -```sql --- Supprimer un message spécifique -DELETE FROM messages WHERE id = 1; - --- Supprimer tous les messages traités -DELETE FROM messages WHERE done = TRUE; - --- Supprimer les vieux messages (plus de 90 jours) -DELETE FROM messages WHERE created_at < NOW() - INTERVAL 90 DAY; - --- Attention : Supprimer TOUTES les données --- DELETE FROM messages; --- DELETE FROM support_requests; -``` - -## 🔧 Maintenance - -### Optimisation - -```sql --- Analyser les tables -ANALYZE TABLE messages; -ANALYZE TABLE support_requests; - --- Optimiser les tables -OPTIMIZE TABLE messages; -OPTIMIZE TABLE support_requests; - --- Vérifier l'état de la table -CHECK TABLE messages; -CHECK TABLE support_requests; - --- Réparer une table (si nécessaire) -REPAIR TABLE messages; -``` - -### Index - -```sql --- Voir les index existants -SHOW INDEX FROM messages; -SHOW INDEX FROM support_requests; - --- Créer un index sur l'email (si performance lente) -CREATE INDEX idx_messages_email ON messages(email); -CREATE INDEX idx_support_account_email ON support_requests(account_email); - --- Supprimer un index -DROP INDEX idx_messages_email ON messages; -``` - -### Backup - -```sql --- Exporter les données en SQL (en ligne de commande) --- mysqldump -u root -p travelmateadmin > backup.sql - --- Exporter uniquement les messages --- mysqldump -u root -p travelmateadmin messages > messages_backup.sql - --- Exporter sans données (structure seulement) --- mysqldump -u root -p --no-data travelmateadmin > structure.sql -``` - -## 📊 Rapports et Analytics - -### Analyse des Messages - -```sql --- Messages les plus fréquents par email -SELECT - email, - COUNT(*) AS nombre_messages, - MAX(created_at) AS dernier_message -FROM messages -GROUP BY email -ORDER BY nombre_messages DESC -LIMIT 10; - --- Temps moyen de traitement -SELECT - AVG(TIMESTAMPDIFF(HOUR, created_at, NOW())) AS heures_moyennes -FROM messages -WHERE done = TRUE; - --- Messages par mois -SELECT - DATE_FORMAT(created_at, '%Y-%m') AS mois, - COUNT(*) AS nombre -FROM messages -GROUP BY DATE_FORMAT(created_at, '%Y-%m') -ORDER BY mois DESC; - --- Taux de complétion -SELECT - ROUND(SUM(done) / COUNT(*) * 100, 2) AS taux_completion_pourcent -FROM messages; -``` - -### Analyse du Support - -```sql --- Problèmes les plus fréquents (par mots-clés) -SELECT - CASE - WHEN message LIKE '%connexion%' THEN 'Connexion' - WHEN message LIKE '%mot de passe%' THEN 'Mot de passe' - WHEN message LIKE '%synchronisation%' THEN 'Synchronisation' - WHEN message LIKE '%facturation%' THEN 'Facturation' - ELSE 'Autre' - END AS categorie, - COUNT(*) AS nombre -FROM support_requests -GROUP BY categorie -ORDER BY nombre DESC; - --- Utilisateurs avec plusieurs demandes -SELECT - account_email, - COUNT(*) AS nombre_demandes, - SUM(done) AS traitees, - COUNT(*) - SUM(done) AS en_attente -FROM support_requests -GROUP BY account_email -HAVING nombre_demandes > 1 -ORDER BY nombre_demandes DESC; -``` - -## 🧪 Tests et Développement - -### Générer des Données de Test - -```sql --- Générer 50 messages aléatoires -INSERT INTO messages (nom, prenom, email, message, done, created_at) -SELECT - CONCAT('Nom', n.n), - CONCAT('Prenom', n.n), - CONCAT('test', n.n, '@example.com'), - CONCAT('Message de test numéro ', n.n), - n.n % 3 = 0, -- Un tiers sera "done" - NOW() - INTERVAL FLOOR(RAND() * 30) DAY -FROM ( - SELECT @row := @row + 1 AS n - FROM (SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3) t1, - (SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3) t2, - (SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3) t3, - (SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3) t4, - (SELECT @row := 0) r - LIMIT 50 -) n; -``` - -### Réinitialiser pour les Tests - -```sql --- Vider toutes les tables -TRUNCATE TABLE messages; -TRUNCATE TABLE support_requests; - --- Réinitialiser les auto-increment -ALTER TABLE messages AUTO_INCREMENT = 1; -ALTER TABLE support_requests AUTO_INCREMENT = 1; - --- Recréer les données de test -SOURCE database_setup.sql; -``` - -## 🔐 Sécurité et Utilisateurs - -### Gestion des Utilisateurs - -```sql --- Créer un utilisateur pour l'application -CREATE USER 'travelmateapp'@'localhost' IDENTIFIED BY 'votre_mot_de_passe'; - --- Donner les permissions nécessaires -GRANT SELECT, INSERT, UPDATE ON travelmateadmin.* TO 'travelmateapp'@'localhost'; - --- Ne PAS donner DELETE en production pour la sécurité --- GRANT DELETE ON travelmateadmin.* TO 'travelmateapp'@'localhost'; - --- Appliquer les changements -FLUSH PRIVILEGES; - --- Voir les permissions d'un utilisateur -SHOW GRANTS FOR 'travelmateapp'@'localhost'; - --- Révoquer une permission -REVOKE DELETE ON travelmateadmin.* FROM 'travelmateapp'@'localhost'; - --- Supprimer un utilisateur -DROP USER 'travelmateapp'@'localhost'; -``` - -## 📝 Informations sur la Base - -```sql --- Voir toutes les bases de données -SHOW DATABASES; - --- Utiliser la base TravelMate -USE travelmateadmin; - --- Voir toutes les tables -SHOW TABLES; - --- Voir la structure d'une table -DESCRIBE messages; -DESCRIBE support_requests; - --- Voir le CREATE TABLE original -SHOW CREATE TABLE messages; - --- Taille de la base de données -SELECT - table_schema AS 'Database', - ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS 'Size (MB)' -FROM information_schema.tables -WHERE table_schema = 'travelmateadmin'; - --- Nombre de lignes par table -SELECT - TABLE_NAME, - TABLE_ROWS -FROM information_schema.TABLES -WHERE TABLE_SCHEMA = 'travelmateadmin'; -``` - -## 🚨 Dépannage - -```sql --- Vérifier les connexions actives -SHOW PROCESSLIST; - --- Tuer une connexion bloquée (remplacer X par l'ID) --- KILL X; - --- Voir les variables MySQL -SHOW VARIABLES LIKE 'max_connections'; -SHOW VARIABLES LIKE 'wait_timeout'; - --- Voir le statut du serveur -SHOW STATUS; - --- Voir les erreurs récentes -SHOW WARNINGS; -SHOW ERRORS; -``` - ---- - -## 💡 Tips - -- Toujours tester vos requêtes DELETE/UPDATE avec SELECT d'abord -- Faites des backups avant toute modification importante -- Utilisez LIMIT dans vos requêtes de test -- Les index améliorent les performances SELECT mais ralentissent INSERT/UPDATE -- Utilisez EXPLAIN pour analyser les performances des requêtes - -```sql --- Exemple d'analyse de performance -EXPLAIN SELECT * FROM messages WHERE done = FALSE ORDER BY created_at DESC; -``` diff --git a/TravelMateAdmin/AppShell.xaml b/TravelMateAdmin/AppShell.xaml index d5596fb..a19f31b 100644 --- a/TravelMateAdmin/AppShell.xaml +++ b/TravelMateAdmin/AppShell.xaml @@ -18,27 +18,22 @@ - - + + - + + - + - + diff --git a/TravelMateAdmin/Configuration/AppSettings.cs b/TravelMateAdmin/Configuration/AppSettings.cs index 26d53d9..6d33fbf 100644 --- a/TravelMateAdmin/Configuration/AppSettings.cs +++ b/TravelMateAdmin/Configuration/AppSettings.cs @@ -1,17 +1,65 @@ +using System.Text.Json; + namespace TravelMateAdmin.Configuration; +public class DatabaseConfig +{ + public string Host { get; set; } = "localhost"; + public string Port { get; set; } = "3306"; + public string Name { get; set; } = "travelmateadmin"; + public string User { get; set; } = "root"; + public string Password { get; set; } = ""; +} + +public class AppConfig +{ + public DatabaseConfig Database { get; set; } = new(); +} + public static class AppSettings { - // Configuration de la base de données - // Modifiez ces valeurs selon votre environnement - public const string Server = "localhost"; - public const string Port = "3306"; - public const string Database = "travelmateadmin"; - public const string User = "root"; - public const string Password = "yourpassword"; + private static AppConfig? _config; + + static AppSettings() + { + LoadConfiguration(); + } + + private static void LoadConfiguration() + { + try + { + System.Diagnostics.Debug.WriteLine($"=== CHARGEMENT CONFIG ==="); + + using var stream = FileSystem.OpenAppPackageFileAsync("appsettings.json").Result; + using var reader = new StreamReader(stream); + var json = reader.ReadToEnd(); + + _config = JsonSerializer.Deserialize(json); + System.Diagnostics.Debug.WriteLine("✓ Configuration chargée depuis appsettings.json"); + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine($"❌ Erreur chargement config: {ex.Message}"); + _config = new AppConfig(); + } + } + + public static string Server => _config?.Database.Host ?? "localhost"; + public static string Port => _config?.Database.Port ?? "3306"; + public static string Database => _config?.Database.Name ?? "travelmateadmin"; + public static string User => _config?.Database.User ?? "root"; + public static string Password => _config?.Database.Password ?? ""; public static string GetConnectionString() { - return $"Server={Server};Port={Port};Database={Database};User={User};Password={Password};"; + var connString = $"Server={Server};Port={Port};Database={Database};User={User};Password={Password};"; + System.Diagnostics.Debug.WriteLine("=== CONNECTION STRING ==="); + System.Diagnostics.Debug.WriteLine($"Server: {Server}"); + System.Diagnostics.Debug.WriteLine($"Port: {Port}"); + System.Diagnostics.Debug.WriteLine($"Database: {Database}"); + System.Diagnostics.Debug.WriteLine($"User: {User}"); + System.Diagnostics.Debug.WriteLine($"Password: {(string.IsNullOrEmpty(Password) ? "VIDE" : "***défini***")}"); + return connString; } } diff --git a/TravelMateAdmin/Converters/BoolConverters.cs b/TravelMateAdmin/Converters/BoolConverters.cs index ecd72c7..c51972d 100644 --- a/TravelMateAdmin/Converters/BoolConverters.cs +++ b/TravelMateAdmin/Converters/BoolConverters.cs @@ -35,3 +35,16 @@ public class BoolToColorConverter : IValueConverter throw new NotImplementedException(); } } + +public class StringNotEmptyConverter : IValueConverter +{ + public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) + { + return value is string str && !string.IsNullOrWhiteSpace(str); + } + + public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} diff --git a/TravelMateAdmin/Models/Message.cs b/TravelMateAdmin/Models/Message.cs index 946d807..4d9f196 100644 --- a/TravelMateAdmin/Models/Message.cs +++ b/TravelMateAdmin/Models/Message.cs @@ -1,16 +1,26 @@ +using CommunityToolkit.Mvvm.ComponentModel; + namespace TravelMateAdmin.Models; -public class Message +public partial class Message : ObservableObject { public int Id { get; set; } public string Nom { get; set; } = string.Empty; public string Prenom { get; set; } = string.Empty; public string Email { get; set; } = string.Empty; public string MessageText { get; set; } = string.Empty; - public bool Done { get; set; } + + [ObservableProperty] + private bool done; + public DateTime CreatedAt { get; set; } public string FullName => $"{Prenom} {Nom}"; public string StatusText => Done ? "Traité" : "En attente"; public string CreatedAtFormatted => CreatedAt.ToString("dd/MM/yyyy HH:mm"); + + partial void OnDoneChanged(bool value) + { + OnPropertyChanged(nameof(StatusText)); + } } diff --git a/TravelMateAdmin/Models/SupportRequest.cs b/TravelMateAdmin/Models/SupportRequest.cs index 887eee1..bef05c5 100644 --- a/TravelMateAdmin/Models/SupportRequest.cs +++ b/TravelMateAdmin/Models/SupportRequest.cs @@ -1,6 +1,8 @@ +using CommunityToolkit.Mvvm.ComponentModel; + namespace TravelMateAdmin.Models; -public class SupportRequest +public partial class SupportRequest : ObservableObject { public int Id { get; set; } public string Nom { get; set; } = string.Empty; @@ -8,10 +10,18 @@ public class SupportRequest public string AccountEmail { get; set; } = string.Empty; public string ContactEmail { get; set; } = string.Empty; public string MessageText { get; set; } = string.Empty; - public bool Done { get; set; } + + [ObservableProperty] + private bool done; + public DateTime CreatedAt { get; set; } public string FullName => $"{Prenom} {Nom}"; public string StatusText => Done ? "Traité" : "En attente"; public string CreatedAtFormatted => CreatedAt.ToString("dd/MM/yyyy HH:mm"); + + partial void OnDoneChanged(bool value) + { + OnPropertyChanged(nameof(StatusText)); + } } diff --git a/TravelMateAdmin/Services/DatabaseService.cs b/TravelMateAdmin/Services/DatabaseService.cs index 92fddaa..1330a32 100644 --- a/TravelMateAdmin/Services/DatabaseService.cs +++ b/TravelMateAdmin/Services/DatabaseService.cs @@ -7,6 +7,7 @@ namespace TravelMateAdmin.Services; public class DatabaseService : IDatabaseService { private readonly string _connectionString; + public string LastError { get; private set; } = string.Empty; public DatabaseService() { @@ -25,12 +26,26 @@ public class DatabaseService : IDatabaseService { try { + System.Diagnostics.Debug.WriteLine("=== TEST CONNEXION DB ==="); + System.Diagnostics.Debug.WriteLine($"Connection String complet: {_connectionString}"); + using var connection = new MySqlConnection(_connectionString); await connection.OpenAsync(); + + System.Diagnostics.Debug.WriteLine("✓ Connexion réussie !"); + LastError = string.Empty; return true; } - catch + catch (Exception ex) { + LastError = $"{ex.Message}\n\nConnection: {_connectionString}"; + System.Diagnostics.Debug.WriteLine($"❌ Erreur de connexion: {ex.Message}"); + System.Diagnostics.Debug.WriteLine($"Connection String: {_connectionString}"); + System.Diagnostics.Debug.WriteLine($"Type: {ex.GetType().Name}"); + if (ex.InnerException != null) + { + System.Diagnostics.Debug.WriteLine($"Inner Exception: {ex.InnerException.Message}"); + } return false; } } @@ -48,7 +63,7 @@ public class DatabaseService : IDatabaseService using var connection = new MySqlConnection(_connectionString); await connection.OpenAsync(); - var query = "SELECT id, nom, prenom, email, message, done, created_at FROM messages ORDER BY created_at DESC"; + var query = "SELECT id, nom, prenom, email, message, done, date_envoi FROM messages ORDER BY date_envoi DESC"; using var command = new MySqlCommand(query, connection); using var reader = await command.ExecuteReaderAsync(); @@ -62,7 +77,7 @@ public class DatabaseService : IDatabaseService Email = reader.GetString("email"), MessageText = reader.GetString("message"), Done = reader.GetBoolean("done"), - CreatedAt = reader.GetDateTime("created_at") + CreatedAt = reader.GetDateTime("date_envoi") }); } } @@ -83,10 +98,15 @@ public class DatabaseService : IDatabaseService try { + System.Diagnostics.Debug.WriteLine($"=== GetMessagesFilteredAsync ==="); + System.Diagnostics.Debug.WriteLine($"isDone: {isDone}"); + using var connection = new MySqlConnection(_connectionString); await connection.OpenAsync(); - var query = "SELECT id, nom, prenom, email, message, done, created_at FROM messages WHERE done = @done ORDER BY created_at DESC"; + var query = "SELECT id, nom, prenom, email, message, done, date_envoi FROM messages WHERE done = @done ORDER BY date_envoi DESC"; + System.Diagnostics.Debug.WriteLine($"Query: {query}"); + using var command = new MySqlCommand(query, connection); command.Parameters.AddWithValue("@done", isDone.Value); using var reader = await command.ExecuteReaderAsync(); @@ -101,9 +121,11 @@ public class DatabaseService : IDatabaseService Email = reader.GetString("email"), MessageText = reader.GetString("message"), Done = reader.GetBoolean("done"), - CreatedAt = reader.GetDateTime("created_at") + CreatedAt = reader.GetDateTime("date_envoi") }); } + + System.Diagnostics.Debug.WriteLine($"Messages trouvés: {messages.Count}"); } catch (Exception ex) { diff --git a/TravelMateAdmin/TravelMateAdmin.csproj b/TravelMateAdmin/TravelMateAdmin.csproj index d3973f7..4fd3a7b 100644 --- a/TravelMateAdmin/TravelMateAdmin.csproj +++ b/TravelMateAdmin/TravelMateAdmin.csproj @@ -54,6 +54,7 @@ + @@ -61,6 +62,7 @@ + diff --git a/TravelMateAdmin/ViewModels/DashboardViewModel.cs b/TravelMateAdmin/ViewModels/DashboardViewModel.cs index 1a9aecc..f1e488c 100644 --- a/TravelMateAdmin/ViewModels/DashboardViewModel.cs +++ b/TravelMateAdmin/ViewModels/DashboardViewModel.cs @@ -26,6 +26,9 @@ public partial class DashboardViewModel : ObservableObject [ObservableProperty] private string connectionStatus = "Non connecté"; + [ObservableProperty] + private string connectionError = string.Empty; + public DashboardViewModel(IDatabaseService databaseService) { _databaseService = databaseService; @@ -35,26 +38,39 @@ public partial class DashboardViewModel : ObservableObject public async Task LoadDashboardAsync() { IsLoading = true; + ConnectionError = string.Empty; try { // Test connection var isConnected = await _databaseService.TestConnectionAsync(); - ConnectionStatus = isConnected ? "✓ Connecté" : "✗ Déconnecté"; - + if (isConnected) { + ConnectionStatus = "✓ Connecté"; // Load stats MessagesPending = await _databaseService.GetMessagesPendingCountAsync(); MessagesDone = await _databaseService.GetMessagesDoneCountAsync(); SupportRequestsPending = await _databaseService.GetSupportRequestsPendingCountAsync(); SupportRequestsDone = await _databaseService.GetSupportRequestsDoneCountAsync(); } + else + { + ConnectionStatus = "✗ Déconnecté"; + // Afficher l'erreur si disponible + var dbService = _databaseService as DatabaseService; + if (dbService != null && !string.IsNullOrEmpty(dbService.LastError)) + { + ConnectionError = dbService.LastError; + System.Diagnostics.Debug.WriteLine($"Erreur DB: {dbService.LastError}"); + } + } } catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"Error loading dashboard: {ex.Message}"); ConnectionStatus = "✗ Erreur de connexion"; + ConnectionError = ex.Message; } finally { diff --git a/TravelMateAdmin/ViewModels/MessagesViewModel.cs b/TravelMateAdmin/ViewModels/MessagesViewModel.cs index 196af67..22a96b4 100644 --- a/TravelMateAdmin/ViewModels/MessagesViewModel.cs +++ b/TravelMateAdmin/ViewModels/MessagesViewModel.cs @@ -33,6 +33,9 @@ public partial class MessagesViewModel : ObservableObject try { + System.Diagnostics.Debug.WriteLine($"=== CHARGEMENT MESSAGES ==="); + System.Diagnostics.Debug.WriteLine($"Filtre sélectionné: {SelectedFilter}"); + bool? isDone = SelectedFilter switch { "À faire" => false, @@ -40,16 +43,22 @@ public partial class MessagesViewModel : ObservableObject _ => null }; + System.Diagnostics.Debug.WriteLine($"isDone filter: {isDone}"); var messagesList = await _databaseService.GetMessagesFilteredAsync(isDone); + System.Diagnostics.Debug.WriteLine($"Messages récupérés: {messagesList.Count}"); + Messages.Clear(); foreach (var message in messagesList) { + System.Diagnostics.Debug.WriteLine($"Message: {message.FullName} - {message.Email}"); Messages.Add(message); } + System.Diagnostics.Debug.WriteLine($"Total messages affichés: {Messages.Count}"); } catch (Exception ex) { - System.Diagnostics.Debug.WriteLine($"Error loading messages: {ex.Message}"); + System.Diagnostics.Debug.WriteLine($"❌ Error loading messages: {ex.Message}"); + System.Diagnostics.Debug.WriteLine($"Stack trace: {ex.StackTrace}"); } finally { @@ -57,6 +66,12 @@ public partial class MessagesViewModel : ObservableObject } } + [RelayCommand] + private async Task GoBackAsync() + { + await Shell.Current.GoToAsync(".."); + } + [RelayCommand] private async Task ToggleMessageStatusAsync(Message message) { @@ -66,7 +81,6 @@ public partial class MessagesViewModel : ObservableObject if (success) { message.Done = !message.Done; - OnPropertyChanged(nameof(Messages)); } } diff --git a/TravelMateAdmin/ViewModels/SupportViewModel.cs b/TravelMateAdmin/ViewModels/SupportViewModel.cs index 2b81368..8a4cdcd 100644 --- a/TravelMateAdmin/ViewModels/SupportViewModel.cs +++ b/TravelMateAdmin/ViewModels/SupportViewModel.cs @@ -33,6 +33,9 @@ public partial class SupportViewModel : ObservableObject try { + System.Diagnostics.Debug.WriteLine($"=== CHARGEMENT SUPPORT ==="); + System.Diagnostics.Debug.WriteLine($"Filtre sélectionné: {SelectedFilter}"); + bool? isDone = SelectedFilter switch { "À faire" => false, @@ -40,16 +43,22 @@ public partial class SupportViewModel : ObservableObject _ => null }; + System.Diagnostics.Debug.WriteLine($"isDone filter: {isDone}"); var requestsList = await _databaseService.GetSupportRequestsFilteredAsync(isDone); + System.Diagnostics.Debug.WriteLine($"Support requests récupérés: {requestsList.Count}"); + SupportRequests.Clear(); foreach (var request in requestsList) { + System.Diagnostics.Debug.WriteLine($"Support: {request.FullName} - {request.AccountEmail}"); SupportRequests.Add(request); } + System.Diagnostics.Debug.WriteLine($"Total support affichés: {SupportRequests.Count}"); } catch (Exception ex) { - System.Diagnostics.Debug.WriteLine($"Error loading support requests: {ex.Message}"); + System.Diagnostics.Debug.WriteLine($"❌ Error loading support requests: {ex.Message}"); + System.Diagnostics.Debug.WriteLine($"Stack trace: {ex.StackTrace}"); } finally { @@ -57,6 +66,12 @@ public partial class SupportViewModel : ObservableObject } } + [RelayCommand] + private async Task GoBackAsync() + { + await Shell.Current.GoToAsync(".."); + } + [RelayCommand] private async Task ToggleSupportRequestStatusAsync(SupportRequest request) { @@ -66,7 +81,6 @@ public partial class SupportViewModel : ObservableObject if (success) { request.Done = !request.Done; - OnPropertyChanged(nameof(SupportRequests)); } } diff --git a/TravelMateAdmin/Views/DashboardPage.xaml b/TravelMateAdmin/Views/DashboardPage.xaml index 118544a..8b97427 100644 --- a/TravelMateAdmin/Views/DashboardPage.xaml +++ b/TravelMateAdmin/Views/DashboardPage.xaml @@ -2,6 +2,7 @@ #B0B0B0 #4CAF50 #FFA726 + + @@ -45,6 +48,29 @@ + + + + + +