Orbit API
Guides d’intégration

Supabase Edge Functions

Protéger une clé Orbit dans les secrets d’une Edge Function Supabase.

Installez les valeurs dans le coffre de secrets du projet consommateur :

supabase secrets set \
  ORBIT_BASE_URL="https://anvhjdjxovzjnvpmjtkl.supabase.co/functions/v1/api" \
  ORBIT_API_KEY="votre-cle-orbit-dev"

La commande ci-dessus est illustrative : évitez de laisser une vraie clé dans l’historique du terminal. Préférez une saisie sécurisée ou l’outil de secrets de votre CI.

const categories = new Set(["games", "movies", "anime", "series", "music", "books"]);

Deno.serve(async (request) => {
  const input = await request.json();
  const query = typeof input.q === "string" ? input.q.trim() : "";
  const category = typeof input.category === "string" ? input.category : null;

  if (!query || query.length > 100 || (category && !categories.has(category))) {
    return Response.json({ error: "invalid_request" }, { status: 400 });
  }

  const baseUrl = Deno.env.get("ORBIT_BASE_URL");
  const apiKey = Deno.env.get("ORBIT_API_KEY");
  if (!baseUrl || !apiKey) {
    return Response.json({ error: "not_configured" }, { status: 503 });
  }

  const url = new URL(`${baseUrl}/v1/interests/search`);
  url.searchParams.set("q", query);
  if (category) url.searchParams.set("category", category);

  const response = await fetch(url, {
    headers: { Authorization: `Bearer ${apiKey}` },
    signal: AbortSignal.timeout(5_000),
  });

  const headers = new Headers({
    "content-type": "application/json",
    "cache-control": "private, no-store",
  });
  for (const name of [
    "x-request-id",
    "x-ratelimit-limit",
    "x-ratelimit-remaining",
    "x-ratelimit-reset",
    "x-orbit-daily-ratelimit-limit",
    "x-orbit-daily-ratelimit-remaining",
    "x-orbit-daily-ratelimit-reset",
    "retry-after",
  ]) {
    const value = response.headers.get(name);
    if (value) headers.set(name, value);
  }

  return new Response(response.body, {
    status: response.status,
    headers,
  });
});

Validez l’utilisateur ou l’appel entrant selon les règles de votre produit. Une clé Supabase publiable du projet consommateur n’est ni une clé Orbit ni un remplacement de votre authentification applicative.