Aller au contenu principal

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

ChampTypeDescription
idUUIDIdentifiant unique du ticket (clé primaire)
user_idUUIDID de l'utilisateur qui a créé le ticket (référence vers auth.users)
user_emailTEXTEmail de l'utilisateur (pour faciliter la communication)
categoryTEXTCatégorie du ticket: bug, feature, question, technical, other
subjectTEXTSujet du ticket
messageTEXTMessage détaillé de l'utilisateur
statusTEXTStatut du ticket: pending, in_progress, resolved, closed
system_infoJSONBInformations système (version app, OS, etc.)
created_atTIMESTAMPTZDate de création du ticket
updated_atTIMESTAMPTZDate de dernière mise à jour
admin_responseTEXTRéponse de l'administrateur (optionnel)
responded_atTIMESTAMPTZDate de réponse de l'admin (optionnel)
is_read_by_userBOOLEANLe ticket a été lu par l'utilisateur (pour les notifications)
is_read_by_adminBOOLEANLe ticket a été lu par l'admin (pour le badge de nouveaux tickets)

Valeurs des énumérations

Catégories (category)

  • bug: 🐛 Signaler un bug
  • feature: ✨ Demande de fonctionnalité
  • question: ❓ Question / Aide
  • technical: ⚙️ Problème technique
  • other: 💬 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:

  1. Envoyer un email via Supabase Edge Functions
  2. Créer un trigger PostgreSQL qui envoie une notification
  3. 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:

  1. Vue d'ensemble : Nombre de tickets par statut
  2. Liste des tickets : Filtrer par statut, catégorie, date
  3. Détail d'un ticket : Voir toutes les informations + répondre
  4. Recherche : Chercher par email, sujet, message
  5. 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:

  1. Allez dans l'éditeur SQL de Supabase
  2. Copiez-collez le SQL ci-dessus
  3. Exécutez la requête
  4. 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;