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:
433
SQL_REFERENCE.md
Normal file
433
SQL_REFERENCE.md
Normal 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;
|
||||
```
|
||||
Reference in New Issue
Block a user