feat: Implement Database Service and ViewModels for Messages and Support Requests

- Added DatabaseService to handle database operations for messages and support requests.
- Created IDatabaseService interface to define the contract for database operations.
- Developed ViewModels for Dashboard, Messages, and Support pages to manage data and commands.
- Implemented XAML views for Dashboard, Messages, and Support, including data binding and UI elements.
- Created SQL script for setting up the database schema and inserting test data.
This commit is contained in:
Van Leemput Dayron
2026-01-12 18:04:10 +01:00
parent 74586c20ba
commit f9690045ea
60 changed files with 4325 additions and 0 deletions

433
SQL_REFERENCE.md Normal file
View File

@@ -0,0 +1,433 @@
# 📊 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;
```