Multi-Table Blog
Posts, comments, and tags with relationships, indexes, and cascading behavior.
Config
typescript
// Tables array (users table omitted — use the standard auth scaffold)
{
name: 'posts',
autoSetUid: true,
fields: [
...baseFields,
{ name: 'author_id', type: 'relation', sqlType: 'text', notNull: true,
foreignKey: { table: 'users', column: 'id' } },
{ name: 'title', type: 'text', sqlType: 'text', notNull: true },
{ name: 'slug', type: 'text', sqlType: 'text', notNull: true, unique: true },
{ name: 'body', type: 'editor', sqlType: 'text' },
{ name: 'published', type: 'bool', sqlType: 'boolean', default: sqlValue(false) },
{ name: 'tags', type: 'text', sqlType: 'text' }, // comma-separated or JSON
],
triggers: [createdTrigger, updatedTrigger],
indexes: [
{ fields: 'author_id' },
{ fields: 'slug' },
{ fields: 'published' },
],
extensions: [{
name: 'rules',
listRule: 'published == true | auth.uid == author_id',
viewRule: 'published == true | auth.uid == author_id',
createRule: 'auth.uid != null & author_id == auth.uid',
updateRule: 'auth.uid == author_id',
deleteRule: 'auth.uid == author_id',
} as TableRulesExtensionData],
},
{
name: 'comments',
autoSetUid: true,
fields: [
...baseFields,
{ name: 'post_id', type: 'relation', sqlType: 'text', notNull: true,
foreignKey: { table: 'posts', column: 'id', onDelete: 'CASCADE' } },
{ name: 'author_id', type: 'relation', sqlType: 'text', notNull: true,
foreignKey: { table: 'users', column: 'id' } },
{ name: 'body', type: 'text', sqlType: 'text', notNull: true },
],
triggers: [createdTrigger, updatedTrigger],
indexes: [
{ fields: 'post_id' },
{ fields: 'author_id' },
],
extensions: [{
name: 'rules',
listRule: 'true', // anyone can read comments
viewRule: 'true',
createRule: 'auth.uid != null & author_id == auth.uid',
updateRule: 'auth.uid == author_id',
deleteRule: 'auth.uid == author_id',
} as TableRulesExtensionData],
}API calls
bash
# Create a post
curl -X POST http://localhost:8787/api/v1/table/posts/insert \
-H 'Authorization: Bearer <token>' \
-H 'Content-Type: application/json' \
-d '{"values": {
"author_id": "USER_ID",
"title": "Hello World",
"slug": "hello-world",
"body": "<p>My first post</p>",
"published": true,
"tags": "intro,hello"
}}'
# List published posts (no auth needed)
curl 'http://localhost:8787/api/v1/table/posts/list?order=created%20desc&limit=10'
# Get comments for a post
curl 'http://localhost:8787/api/v1/table/comments/list?where=post_id%3D%22POST_ID%22'
# Delete a post — comments are automatically deleted (CASCADE)
curl -X POST http://localhost:8787/api/v1/table/posts/delete \
-H 'Authorization: Bearer <token>' \
-H 'Content-Type: application/json' \
-d '{"where": "id = \"POST_ID\""}'