Dokümantasyon

Veritabanı

Tenant Postgres — satır CRUD, filtre, select, SQL ve GraphQL.

Genel bakış

Servis alias: db. Her proje kendi proj_{uuid8} veritabanında izole.

İki satır modeli: (1) document tablolar — id + data JSONB; (2) ilişkisel tablolar — gerçek kolonlar, API yanıtında data olarak sarılır.

GET /db/schema şema grafiği; POST /db/tables ile tablo oluştur (kolon + FK).

Auth profiles: public.profiles.id = auth user UUID. Scope: data:read / data:write.

MethodPathAçıklama
GET/db/schemaŞema grafiği (tablolar, kolonlar, FK)
POST/db/tablesTablo oluştur { name, columns, foreign_keys }
GET/db/tablesTablo listesi
GET/db/tables/{table}/rowsSatır listesi (document + ilişkisel)
POST/db/tables/{table}/rowsSatır ekle { data }
GET/db/tables/{table}/rows/{id}Tek satır
PATCH/db/tables/{table}/rows/{id}Merge { data }
DELETE/db/tables/{table}/rows/{id}Satır sil (204)
GET/db/tables/{table}/rlsRLS oku
PUT/db/tables/{table}/rlsRLS yaz
POST/db/queryHam SQL
POST/db/rpcJSON-RPC
POST/db/graphqlGraphQL (sınırlı şema)

Şema & tablo oluştur

Node.js
const schema = await fetch(`${EDGE}/db/schema`, {
  headers: { 'X-Liap-Key': API_KEY },
}).then(r => r.json())

await fetch(`${EDGE}/db/tables`, {
  method: 'POST',
  headers: { 'X-Liap-Key': API_KEY, 'Content-Type': 'application/json' },
  body: JSON.stringify({
    name: 'posts',
    columns: [
      { name: 'id', data_type: 'uuid', primary: true, default_value: 'gen_random_uuid()' },
      { name: 'title', data_type: 'text', nullable: false },
      { name: 'author_id', data_type: 'text', nullable: true },
    ],
    foreign_keys: [{ column: 'author_id', ref_table: 'profiles', ref_column: 'id' }],
  }),
})

// Auth profiles satırı
const profiles = await fetch(`${EDGE}/db/tables/profiles/rows`, {
  headers: { 'X-Liap-Key': API_KEY },
}).then(r => r.json())

CRUD örneği

Node.js
const base = EDGE
const headers = { 'X-Liap-Key': API_KEY, 'Content-Type': 'application/json' }

const created = await fetch(`${EDGE}/db/tables/todos/rows`, {
  method: 'POST',
  headers,
  body: JSON.stringify({ data: { title: 'Alışveriş', done: false } }),
}).then(r => r.json())

const open = await fetch(
  `${EDGE}/db/tables/todos/rows?filter=done.eq.false&select=title,done&order=created_at.desc&limit=20`,
  { headers },
).then(r => r.json())

await fetch(`${EDGE}/db/tables/todos/rows/${created.id}`, {
  method: 'PATCH',
  headers,
  body: JSON.stringify({ data: { done: true } }),
})

await fetch(`${EDGE}/db/tables/todos/rows/${created.id}`, {
  method: 'DELETE',
  headers,
})

Filtre & select

filter=alan.op.deger — op: eq, neq, gt, gte, lt, lte, like, ilike, in

select=col1,col2 · order=created_at.desc · limit=N · offset=N

Node.js
const q = new URLSearchParams({
  filter: 'title.like.%acil%',
  select: 'title,done',
  order: 'created_at.desc',
  limit: '10',
})
const rows = await fetch(`${EDGE}/db/tables/todos/rows?${q}`, {
  headers: { 'X-Liap-Key': API_KEY },
}).then(r => r.json())

SDK ile

Node.js
import { createClient } from '@liap-cloud/sdk'
const liap = createClient(EDGE, { apiKey: API_KEY })

await liap.db.from('todos').insert({ title: 'SDK', done: false })
const list = await liap.db.from('todos').select()
console.log(list)

Docs · API