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.
| Method | Path | Açıklama |
|---|---|---|
| GET | /db/schema | Şema grafiği (tablolar, kolonlar, FK) |
| POST | /db/tables | Tablo oluştur { name, columns, foreign_keys } |
| GET | /db/tables | Tablo listesi |
| GET | /db/tables/{table}/rows | Satır listesi (document + ilişkisel) |
| POST | /db/tables/{table}/rows | Satı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}/rls | RLS oku |
| PUT | /db/tables/{table}/rls | RLS yaz |
| POST | /db/query | Ham SQL |
| POST | /db/rpc | JSON-RPC |
| POST | /db/graphql | GraphQL (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)