Supabase API
Authentification
Toutes les requêtes nécessitent les headers suivants :
apikey: <SUPABASE_ANON_KEY>
Authorization: Bearer <JWT_TOKEN> # Pour les requêtes authentifiées
Content-Type: application/json
Products (Événements)
Lister les Événements
GET /rest/v1/product?select=*
Réponse :
[
{
"id": 1,
"name": "Anniversaire Marie",
"description": "Tous vos messages pour Marie",
"created_by": "uuid-user",
"date_event": "2024-03-15",
"plan": "basic",
"close": false,
"created_at": "2024-02-01T10:00:00Z"
}
]
Obtenir un Événement avec ses Messages
GET /rest/v1/product?id=eq.1&select=*,product_items(*)
Réponse :
{
"id": 1,
"name": "Anniversaire Marie",
"product_items": [
{
"id": "uuid-item",
"participant_name": "Jean",
"message_media": "<p>Joyeux anniversaire !</p>",
"message_type": "TEXT"
}
]
}
Créer un Événement
POST /rest/v1/product
Content-Type: application/json
Prefer: return=representation
{
"name": "Mon événement",
"description": "Description de l'événement",
"date_event": "2024-06-01",
"created_by": "uuid-user"
}
Réponse : 201 Created
{
"id": 2,
"name": "Mon événement",
"description": "Description de l'événement",
"date_event": "2024-06-01",
"created_by": "uuid-user",
"plan": null,
"close": false,
"created_at": "2024-02-15T14:30:00Z"
}
Mettre à Jour un Événement
PATCH /rest/v1/product?id=eq.1
{
"close": true
}
Réponse : 204 No Content
Supprimer un Événement
DELETE /rest/v1/product?id=eq.1
Réponse : 204 No Content
Product Items (Messages)
Lister les Messages d'un Événement
GET /rest/v1/product_items?product_id=eq.1&select=*&order=created_at.asc
Réponse :
[
{
"id": "uuid-1",
"product_id": 1,
"participant_id": "uuid-participant",
"participant_name": "Jean",
"message_media": "<p>Mon message</p>",
"message_type": "TEXT",
"created_at": "2024-02-10T09:00:00Z"
},
{
"id": "uuid-2",
"product_id": 1,
"participant_name": "Marie",
"message_media": "video_1/dedicaces_uuid.webm",
"message_type": "VIDEO",
"created_at": "2024-02-11T15:30:00Z"
}
]
Créer un Message Texte
POST /rest/v1/product_items
Content-Type: application/json
Prefer: return=representation
{
"product_id": 1,
"participant_id": "uuid-participant",
"participant_name": "Jean",
"message_media": "<p>Joyeux anniversaire !</p>",
"message_type": "TEXT"
}
Créer un Message Vidéo
POST /rest/v1/product_items
Content-Type: application/json
{
"product_id": 1,
"participant_id": "uuid-participant",
"participant_name": "Jean",
"message_media": "video_1/dedicaces_uuid.webm",
"message_type": "VIDEO"
}
Supprimer un Message
DELETE /rest/v1/product_items?id=eq.uuid-item
Storage
Upload Vidéo
POST /storage/v1/object/video_dedicace/video_1/dedicaces_uuid.webm
Content-Type: video/webm
Authorization: Bearer <JWT_TOKEN>
<binary video data>
Réponse : 200 OK
{
"Key": "video_dedicace/video_1/dedicaces_uuid.webm"
}
Obtenir une URL Signée
POST /storage/v1/object/sign/video_dedicace/video_1/dedicaces_uuid.webm
{
"expiresIn": 3600
}
Réponse :
{
"signedURL": "https://xxx.supabase.co/storage/v1/object/sign/video_dedicace/video_1/dedicaces_uuid.webm?token=..."
}
Filtres et Opérateurs
Opérateurs de Comparaison
| Opérateur | Description | Exemple |
|---|---|---|
eq | Égal | ?id=eq.1 |
neq | Différent | ?status=neq.closed |
gt | Supérieur | ?count=gt.10 |
gte | Supérieur ou égal | ?date=gte.2024-01-01 |
lt | Inférieur | ?price=lt.100 |
lte | Inférieur ou égal | ?age=lte.30 |
like | Pattern matching | ?name=like.*marie* |
ilike | Pattern (insensible) | ?name=ilike.*MARIE* |
in | Dans une liste | ?id=in.(1,2,3) |
is | Est null/true/false | ?plan=is.null |
Tri
GET /rest/v1/product?order=created_at.desc
GET /rest/v1/product?order=name.asc,created_at.desc
Pagination
GET /rest/v1/product?limit=10&offset=20
Sélection de Colonnes
GET /rest/v1/product?select=id,name,created_at
Relations
# Inclure les items
GET /rest/v1/product?select=*,product_items(*)
# Filtrer par relation
GET /rest/v1/product?select=*,product_items!inner(*)&product_items.message_type=eq.VIDEO
Codes de Réponse
| Code | Description |
|---|---|
200 | Succès (GET, PATCH) |
201 | Créé (POST avec return=representation) |
204 | Pas de contenu (DELETE, PATCH sans return) |
400 | Requête invalide |
401 | Non authentifié |
403 | Non autorisé (RLS) |
404 | Non trouvé |
409 | Conflit (contrainte unique) |
500 | Erreur serveur |