Skip to content

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:

TablePurpose
userData user: id, email, name, image, role
sessionSession cookies: token, userId, expiresAt
accountOAuth accounts: provider, providerAccountId
verificationEmail 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)

TablePurpose
journal_entriesUser journal entries
compatibility_resultsCompatibility analysis results
deep_insights_purchasesOne-time purchase records
audit_logsAudit trail untuk semua data changes

Migrations

Generate Migration

bash
cd packages/db
npx drizzle-kit generate

Apply Migration (Local)

bash
npx wrangler d1 migrations apply soul-map-atlas-db --local

Apply Migration (Production)

bash
npx wrangler d1 migrations apply soul-map-atlas-db --remote

Schema 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 createdAt dan updatedAt di setiap table.
  • Soft delete: tambahin kolom deletedAt (nullable) buat data yang boleh di-restore.
  • Foreign keys: selalu define dengan references dan onDelete rule.

Environment Variables

Tidak ada — D1 binding di-pass via env.DB di Worker context. Local dev pakai .dev.vars atau wrangler dev auto-bind.

References