Support - Base de données Supabase
Table: support_tickets
Cette table stocke tous les tickets de support créés par les utilisateurs de l'application mobile.
Structure de la table
CREATE TABLE support_tickets (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
user_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
user_email TEXT NOT NULL,
category TEXT NOT NULL CHECK (category IN ('bug', 'feature', 'question', 'technical', 'other')),
subject TEXT NOT NULL,
message TEXT NOT NULL,
status TEXT NOT NULL DEFAULT 'pending' CHECK (status IN ('pending', 'in_progress', 'resolved', 'closed')),
system_info JSONB NOT NULL DEFAULT '{}',
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ,
admin_response TEXT,
responded_at TIMESTAMPTZ,
is_read_by_user BOOLEAN NOT NULL DEFAULT false,
is_read_by_admin BOOLEAN NOT NULL DEFAULT false
);
-- Index pour améliorer les performances
CREATE INDEX idx_support_tickets_user_id ON support_tickets(user_id);
CREATE INDEX idx_support_tickets_status ON support_tickets(status);
CREATE INDEX idx_support_tickets_created_at ON support_tickets(created_at DESC);
CREATE INDEX idx_support_tickets_category ON support_tickets(category);
-- RLS (Row Level Security)
ALTER TABLE support_tickets ENABLE ROW LEVEL SECURITY;
-- Policy: Les utilisateurs peuvent voir uniquement leurs propres tickets
CREATE POLICY "Users can view their own tickets"
ON support_tickets
FOR SELECT
USING (auth.uid() = user_id);
-- Policy: Les utilisateurs peuvent créer leurs propres tickets
CREATE POLICY "Users can create their own tickets"
ON support_tickets
FOR INSERT
WITH CHECK (auth.uid() = user_id);
-- Policy: Les utilisateurs peuvent mettre à jour le champ is_read_by_user
CREATE POLICY "Users can mark tickets as read"
ON support_tickets
FOR UPDATE
USING (auth.uid() = user_id)
WITH CHECK (auth.uid() = user_id);
-- Policy: Les admins peuvent tout voir et tout faire (à configurer selon vos besoins)
-- CREATE POLICY "Admins can do everything"
-- ON support_tickets
-- FOR ALL
-- USING (auth.jwt() ->> 'role' = 'admin');
Champs
| Champ | Type | Description |
|---|---|---|
id | UUID | Identifiant unique du ticket (clé primaire) |
user_id | UUID | ID de l'utilisateur qui a créé le ticket (référence vers auth.users) |
user_email | TEXT | Email de l'utilisateur (pour faciliter la communication) |
category | TEXT | Catégorie du ticket: bug, feature, question, technical, other |
subject | TEXT | Sujet du ticket |
message | TEXT | Message détaillé de l'utilisateur |
status | TEXT | Statut du ticket: pending, in_progress, resolved, closed |
system_info | JSONB | Informations système (version app, OS, etc.) |
created_at | TIMESTAMPTZ | Date de création du ticket |
updated_at | TIMESTAMPTZ | Date de dernière mise à jour |
admin_response | TEXT | Réponse de l'administrateur (optionnel) |
responded_at | TIMESTAMPTZ | Date de réponse de l'admin (optionnel) |
is_read_by_user | BOOLEAN | Le ticket a été lu par l'utilisateur (pour les notifications) |
is_read_by_admin | BOOLEAN | Le ticket a été lu par l'admin (pour le badge de nouveaux tickets) |
Valeurs des énumérations
Catégories (category)
bug: 🐛 Signaler un bugfeature: ✨ Demande de fonctionnalitéquestion: ❓ Question / Aidetechnical: ⚙️ Problème techniqueother: 💬 Autre
Statuts (status)
pending: ⏳ En attente (nouveau ticket)in_progress: 🔄 En cours (ticket pris en charge)resolved: ✅ Résolu (problème résolu)closed: 🔒 Fermé (ticket clos)
Format du champ system_info
Le champ system_info est un JSON qui contient les informations suivantes:
{
"app_version": "1.0.0",
"build_number": "123",
"platform": "android",
"platform_version": "Android 13 (API 33)"
}
Exemples de requêtes
Créer un nouveau ticket
INSERT INTO support_tickets (id, user_id, user_email, category, subject, message, system_info)
VALUES (
'uuid-here',
'user-id',
'user@example.com',
'bug',
'Problème de synchronisation',
'Les données ne se synchronisent pas correctement...',
'{"app_version": "1.0.0", "platform": "ios"}'::jsonb
);
Récupérer tous les tickets d'un utilisateur
SELECT * FROM support_tickets
WHERE user_id = 'user-id'
ORDER BY created_at DESC;
Récupérer les tickets en attente (pour l'admin)
SELECT * FROM support_tickets
WHERE status = 'pending'
ORDER BY created_at ASC;
Mettre à jour un ticket avec une réponse admin
UPDATE support_tickets
SET
status = 'resolved',
admin_response = 'Merci pour votre retour. Le problème a été corrigé dans la version 1.0.1',
responded_at = NOW(),
updated_at = NOW(),
is_read_by_user = false
WHERE id = 'ticket-id';
Compter les tickets par statut
SELECT status, COUNT(*) as count
FROM support_tickets
GROUP BY status;
Notifications
Pour notifier l'utilisateur d'une réponse admin, vous pouvez:
- Envoyer un email via Supabase Edge Functions
- Créer un trigger PostgreSQL qui envoie une notification
- Utiliser Supabase Realtime pour les notifications en temps réel
Exemple de trigger pour les emails
CREATE OR REPLACE FUNCTION notify_user_on_response()
RETURNS TRIGGER AS $$
BEGIN
IF NEW.admin_response IS NOT NULL AND OLD.admin_response IS NULL THEN
-- Appeler une Edge Function pour envoyer un email
PERFORM net.http_post(
url := 'https://your-project.supabase.co/functions/v1/send-support-email',
headers := '{"Content-Type": "application/json", "Authorization": "Bearer YOUR_ANON_KEY"}'::jsonb,
body := json_build_object(
'ticket_id', NEW.id,
'user_email', NEW.user_email,
'subject', NEW.subject
)::jsonb
);
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER on_support_response
AFTER UPDATE ON support_tickets
FOR EACH ROW
EXECUTE FUNCTION notify_user_on_response();
Sécurité
- RLS activé: Les utilisateurs ne peuvent voir que leurs propres tickets
- Validation des données: Les catégories et statuts sont validés au niveau de la base de données
- Cascade DELETE: Si un utilisateur est supprimé, ses tickets sont également supprimés
Intégration avec l'admin dashboard
Pour votre dashboard admin (../admin-kazalendar), vous aurez besoin de:
- Vue d'ensemble : Nombre de tickets par statut
- Liste des tickets : Filtrer par statut, catégorie, date
- Détail d'un ticket : Voir toutes les informations + répondre
- Recherche : Chercher par email, sujet, message
- Statistiques : Temps de réponse moyen, tickets résolus par jour, etc.
Migration SQL complète
Pour créer la table dans votre projet Supabase:
- Allez dans l'éditeur SQL de Supabase
- Copiez-collez le SQL ci-dessus
- Exécutez la requête
- Testez avec l'application mobile
Support des anciennes versions
Si vous avez déjà une table support_tickets, vous pouvez la migrer avec:
-- Ajouter les nouveaux champs si nécessaire
ALTER TABLE support_tickets ADD COLUMN IF NOT EXISTS is_read_by_user BOOLEAN NOT NULL DEFAULT false;
ALTER TABLE support_tickets ADD COLUMN IF NOT EXISTS is_read_by_admin BOOLEAN NOT NULL DEFAULT false;