trak Svelte Themes

Trak

A modern ticketing and reporting platform

trak

Ticketing & reporting platform with Telegram bot integration.

Stack

Arsitektur

graph TB
  subgraph User
    A["šŸ‘¤ Agent (Web)"]
    B["šŸ“± Pelapor (Telegram)"]
  end

  subgraph Apps
    C["🌐 apps/web<br/>SvelteKit Portal"]
    D["šŸ¤– apps/bot<br/>Telegram Bot"]
  end

  subgraph Packages
    E["šŸ“¦ @trak/services<br/>Domain Logic"]
    F["šŸ—„ļø @trak/database<br/>Schema + Client"]
    G["šŸ”· @trak/shared<br/>Types"]
  end

  subgraph Infrastructure
    H["🐘 PostgreSQL"]
    I["šŸ“ .bot-sessions/<br/>File Session"]
  end

  A -->|"HTTPS"| C
  B -->|"Telegram API"| D

  C --> E
  D --> E
  E --> F
  F --> H
  D --> I

  C --> G
  E --> G

  H -.->|"LISTEN/NOTIFY"| D

  linkStyle 0,1 stroke:#666

Alur Data:

sequenceDiagram
    actor P as Pelapor (Telegram)
    participant B as apps/bot
    participant S as @trak/services
    participant D as PostgreSQL
    participant W as apps/web

    Note over P,W: Registrasi
    P->>B: /start
    B->>S: validateInviteCode(code)
    S->>D: cek invite_codes
    D-->>S: valid
    S-->>B: { valid, inviteCodeId }
    B->>S: createReporter(telegramId, inviteCodeId)
    S->>D: insert reporters
    B-->>P: āœ… Selamat datang

    Note over P,W: Laporan
    P->>B: /report → title → body → kategori → lampiran
    B->>S: createReport(reporterId, title, body, categoryId)
    S->>D: insert reports
    B->>S: addReportAttachment(fileId, storageUrl)
    S->>D: insert report_attachments
    B-->>P: āœ… Laporan terkirim (TKT-XXXX)

    Note over P,W: Update Status + Notifikasi
    W->>S: updateTicketStatus(id, newStatus, userId)
    S->>D: update reports + insert status_histories
    W->>S: createNotification(reporterTelegramId, message)
    S->>D: insert notifications
    Note over S: pg_notify('notifications', payload)
    S-->>D: SELECT pg_notify(...)
    D-->>B: šŸ”” LISTEN notifications
    B->>S: markNotificationRead(notificationId)
    S->>D: update notifications set is_read = true
    B-->>P: šŸ”„ Status tiket diperbarui

Struktur

trak/
ā”œā”€ā”€ apps/
│   ā”œā”€ā”€ web/          # SvelteKit portal (agent dashboard)
│   └── bot/          # Telegram bot (pelapor)
ā”œā”€ā”€ packages/
│   ā”œā”€ā”€ database/     # Drizzle schema, migrations, client
│   ā”œā”€ā”€ services/     # Domain logic layer (shared across apps)
│   └── shared/       # Types, constants
ā”œā”€ā”€ .env              # Global DATABASE_URL
ā”œā”€ā”€ docs/decisions/   # Architecture Decision Records
└── ...

Prasyarat

  • Node.js >= 22
  • pnpm 11
  • PostgreSQL (via Docker atau lokal)

Setup

# Install dependencies
pnpm install

# Setup environment
cp .env.example .env
cp apps/bot/.env.example apps/bot/.env

# Push database schema
pnpm db:push

# (Opsional) Seed data
pnpm db:seed

# Start development (web + bot)
pnpm dev

Scripts

Script Description
pnpm dev Start semua workspace di dev mode
pnpm build Build semua workspace
pnpm preview Preview production build (web)
pnpm lint Lint semua workspace via turbo
pnpm check Type check semua workspace (svelte-check)
pnpm test:unit Unit test (vitest)
pnpm test:e2e E2E test (Playwright)
pnpm format Format semua file dengan prettier
pnpm db:push Push schema ke database
pnpm db:generate Generate migration files
pnpm db:migrate Apply migration
pnpm db:studio Buka Drizzle Studio
pnpm db:seed Seed database

Environment Variables

Root .env (dibaca oleh semua apps):

DATABASE_URL="postgres://root:mysecretpassword@localhost:5432/local"

apps/web/.env:

ORIGIN=http://localhost:5173
BETTER_AUTH_SECRET=<your-secret>

apps/bot/.env:

TELEGRAM_BOT_TOKEN=<your-bot-token>

Keputusan Arsitektur

Lihat docs/decisions/monorepo.md untuk penjelasan kenapa pake monorepo + turborepo.

Top categories

Loading Svelte Themes