API REST PostgreSQL

Endpoints CRUD auto-générés depuis le schéma, filtres et tri via syntaxe URL, relations imbriquées via foreign keys, RPC vers fonctions PostgreSQL, RLS appliquée.

API REST auto-générée

Une API REST PostgreSQL est automatiquement générée depuis le schéma de la base de chaque projet Pool C. Dès qu'une table est créée dans public (ou tout schéma exposé), les endpoints CRUD sont disponibles immédiatement, sans aucune configuration ni code à écrire. Les policies RLS PostgreSQL s'appliquent à chaque requête, garantissant que les utilisateurs n'accèdent qu'aux données autorisées.

Quand l'utiliser — quand non

Idéal pour

  • CRUD direct depuis une SPA / app mobile
  • Filtres et tri complexes via syntaxe URL
  • Relations imbriquées (JOIN automatique via foreign keys)
  • Appels RPC (functions PostgreSQL)

Pas adapté

  • Logique métier complexe — préférer une fonction serverless
  • Agrégations lourdes — préférer une view PostgreSQL ou RPC
  • Requêtes hors RLS — bypass possible uniquement avec service_role (côté serveur)

Endpoints générés

Pour chaque table public.todos du projet wzfbhd :

GET    https://wzfbhd.runtime.di2amp.com/rest/v1/todos          Lister / filtrer
POST   https://wzfbhd.runtime.di2amp.com/rest/v1/todos          Insérer
PATCH  https://wzfbhd.runtime.di2amp.com/rest/v1/todos?id=eq.1  Mettre à jour
DELETE https://wzfbhd.runtime.di2amp.com/rest/v1/todos?id=eq.1  Supprimer
POST   https://wzfbhd.runtime.di2amp.com/rest/v1/rpc/<fn>       Appeler une function

L'API est disponible dès la création de la table — aucun redémarrage, aucune migration. Le schéma est rafraîchi automatiquement.

Authentification

# Requête anonyme (rôle anon)
curl -L "https://wzfbhd.runtime.di2amp.com/rest/v1/todos" -H "apikey: $ANON_KEY"

# Requête authentifiée (JWT user, rôle authenticated)
curl -L "https://wzfbhd.runtime.di2amp.com/rest/v1/todos" \
  -H "apikey: $ANON_KEY" -H "Authorization: Bearer $USER_TOKEN"

# Requête admin (service_role — bypass RLS, côté serveur uniquement)
curl -L "https://wzfbhd.runtime.di2amp.com/rest/v1/todos" \
  -H "apikey: $SERVICE_ROLE_KEY" -H "Authorization: Bearer $SERVICE_ROLE_KEY"

Filtres et opérateurs

# Égalité, comparaison, LIKE, IN, NULL
GET /rest/v1/todos?id=eq.5
GET /rest/v1/todos?priority=gte.3&priority=lt.10
GET /rest/v1/users?email=like.*@example.com
GET /rest/v1/todos?status=in.(pending,in_progress)
GET /rest/v1/todos?completed_at=is.null

# Pagination, tri
GET /rest/v1/todos?order=created_at.desc&limit=20&offset=40

# Sélection de colonnes + relations FK (JOIN automatique)
GET /rest/v1/orders?select=id,amount,customer(name,email)
GET /rest/v1/customers?select=id,name,orders(id,amount,status)

Mutations

# Insertion
curl -L -X POST "https://wzfbhd.runtime.di2amp.com/rest/v1/todos" \
  -H "apikey: $ANON_KEY" -H "Authorization: Bearer $USER_TOKEN" \
  -H "Content-Type: application/json" -H "Prefer: return=representation" \
  -d '{"title":"Acheter du pain","user_id":"550e8400-..."}'

# Mise à jour
curl -L -X PATCH "https://wzfbhd.runtime.di2amp.com/rest/v1/todos?id=eq.42" \
  -H "apikey: $ANON_KEY" -H "Authorization: Bearer $USER_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"done":true}'

# Suppression (204 No Content)
curl -L -X DELETE "https://wzfbhd.runtime.di2amp.com/rest/v1/todos?id=eq.42" \
  -H "apikey: $ANON_KEY" -H "Authorization: Bearer $USER_TOKEN"

Row Level Security

Chaque requête est exécutée sous le rôle PostgreSQL correspondant au JWT (anon, authenticated, service_role). Les policies RLS filtrent les lignes lues / autorisent les écritures.

ALTER TABLE public.todos ENABLE ROW LEVEL SECURITY;

CREATE POLICY "read_own_todos" ON public.todos
  FOR SELECT USING (auth.uid() = user_id);

CREATE POLICY "insert_own_todos" ON public.todos
  FOR INSERT WITH CHECK (auth.uid() = user_id);

CREATE POLICY "update_own_todos" ON public.todos
  FOR UPDATE USING (auth.uid() = user_id);

CREATE POLICY "delete_own_todos" ON public.todos
  FOR DELETE USING (auth.uid() = user_id);

Appel de fonctions PostgreSQL (RPC)

-- Définir une function
CREATE OR REPLACE FUNCTION public.get_nearby_places(lat FLOAT, lng FLOAT, radius_km FLOAT)
RETURNS SETOF places AS $$
  SELECT * FROM places
  WHERE ST_DWithin(location::geography, ST_MakePoint(lng, lat)::geography, radius_km * 1000)
  ORDER BY location <-> ST_MakePoint(lng, lat);
$$ LANGUAGE SQL STABLE;
curl -L -X POST "https://wzfbhd.runtime.di2amp.com/rest/v1/rpc/get_nearby_places" \
  -H "apikey: $ANON_KEY" -H "Content-Type: application/json" \
  -d '{"lat":48.8566,"lng":2.3522,"radius_km":5}'

Spécification OpenAPI

L'API génère automatiquement une spécification OpenAPI depuis le schéma PostgreSQL :

GET https://wzfbhd.runtime.di2amp.com/rest/v1/
Authorization: Bearer $ANON_KEY

Importable dans Postman, Insomnia, ou tout outil compatible OpenAPI.

Sécurité et isolation

RLS PostgreSQL en première ligne. La service_role_key bypass toutes les policies — à n'utiliser que côté serveur, jamais embarquée dans une app cliente.

Pour aller plus loin

Tarification associée

Requêtes API incluses jusqu'au quota du plan. Au-delà : facturation à l'usage. Voir tarifs.