Appearance
Database
Database kita pakai Cloudflare D1 — SQLite-compatible edge database yang terintegrasi langsung dengan Workers. ORM-nya pakai Drizzle ORM + drizzle-kit untuk schema definition dan migrations.
D1 Setup
D1 database di-bind ke Workers via wrangler.jsonc:
json
{
"d1_databases": [
{
"binding": "DB",
"database_name": "soul-map-atlas-db",
"database_id": "your-database-id"
}
]
}Binding name DB ini akan muncul sebagai env.DB di Worker fetch handler.
Drizzle Configuration
Drizzle Kit Config
packages/db/drizzle.config.ts:
ts
import { defineConfig } from "drizzle-kit";
export default defineConfig({
dialect: "sqlite",
schema: "./src/schema",
out: "./migrations",
});Database Client Factory
packages/db/src/index.ts:
ts
import { drizzle } from "drizzle-orm/d1";
import * as schema from "./schema";
export function createDb(d1: D1Database) {
return drizzle(d1, { schema });
}
export type DbClient = ReturnType<typeof createDb>;Client dibuat per-request di apps/api/src/index.ts — tidak boleh di-share antar request.
Schema Structure
Auth Tables
Auth schema ada di packages/db/src/schema/auth.ts, di-generate oleh better-auth:
| Table | Purpose |
|---|---|
user | Data user: id, email, name, image, role |
session | Session cookies: token, userId, expiresAt |
account | OAuth accounts: provider, providerAccountId |
verification | Email verification tokens |
Role Column
Kolom role di tabel user di-manage oleh better-auth via additionalFields:
ts
additionalFields: {
role: {
type: "string",
defaultValue: "member",
required: false,
},
}Valid values: member, admin, owner.
Business Tables (To Be Implemented)
| Table | Purpose |
|---|---|
journal_entries | User journal entries |
compatibility_results | Compatibility analysis results |
deep_insights_purchases | One-time purchase records |
audit_logs | Audit trail untuk semua data changes |
Migrations
Generate Migration
bash
cd packages/db
npx drizzle-kit generateApply Migration (Local)
bash
npx wrangler d1 migrations apply soul-map-atlas-db --localApply Migration (Production)
bash
npx wrangler d1 migrations apply soul-map-atlas-db --remoteSchema Conventions
- Table names: snake_case, plural (e.g.,
journal_entries). - Column names: camelCase di schema definition, Drizzle akan map ke snake_case di SQLite.
- Timestamps: pakai
createdAtdanupdatedAtdi setiap table. - Soft delete: tambahin kolom
deletedAt(nullable) buat data yang boleh di-restore. - Foreign keys: selalu define dengan
referencesdanonDeleterule.
Environment Variables
Tidak ada — D1 binding di-pass via env.DB di Worker context. Local dev pakai .dev.vars atau wrangler dev auto-bind.