# arikmhm/rekan-tes architecture

> Architecture diagram of the GitHub repository arikmhm/rekan-tes, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-27). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/arikmhm/rekan-tes
- Repository: https://github.com/arikmhm/rekan-tes

## Overview

Rekan Tes is a B2C platform for paid, timed job-entry test simulations, with free sample quizzes, account management, and admin tools for test content and orders. The main participant journey is to find a product, authenticate, pay by QRIS, receive access, complete timed subtests, and review scores and explanations. The graph also includes content administration and a useful persistence layer. Source excerpts are limited, so several documented capabilities use their exact enclosing directories and only documented or clearly supported connections are shown.

Main entry points: [`src/db/index.ts`](https://github.com/arikmhm/rekan-tes/blob/main/src/db/index.ts) (Application database), [`src/lib/order.ts`](https://github.com/arikmhm/rekan-tes/blob/main/src/lib/order.ts) (Order and checkout), [`src/lib/attempt-flow.ts`](https://github.com/arikmhm/rekan-tes/blob/main/src/lib/attempt-flow.ts) (Attempt workflow), [`src/app/admin`](https://github.com/arikmhm/rekan-tes/tree/main/src/app/admin) (Admin workspace)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_participant["Participant experience"]
  node_home["Home and discovery<br/>[page.tsx]"]
  node_catalog["Product catalog<br/>[page.tsx]"]
  node_product["Product details<br/>[page.tsx]"]
  node_authpages["Sign-in and registration<br/>[page.tsx]"]
  node_authform["Account form<br/>[auth-form.tsx]"]
  node_checkout["Order and checkout<br/>[order.ts]"]
  node_orders["Participant orders<br/>[page.tsx]"]
end

subgraph group_assessment["Assessment workflow"]
  node_assessment_pages["Simulation and attempts<br/>[page.tsx]"]
  node_attempt_engine["Attempt workflow<br/>[attempt-flow.ts]"]
  node_attempt_data["Attempt operations<br/>[attempt.ts]"]
  node_results["Attempt results<br/>[page.tsx]"]
  node_free_sample["Free sample quizzes<br/>[data.ts]"]
end

subgraph group_admin["Administration"]
  node_admin_pages["Admin workspace"]
  node_admin_service["Admin operations<br/>[admin.ts]"]
  node_admin_orders["Order management<br/>[admin-order.ts]"]
end

subgraph group_platform["Platform services"]
  node_authclient["Auth client<br/>[auth-client.ts]"]
  node_authapi["Auth API route<br/>[route.ts]"]
  node_authserver["Auth service<br/>[auth.ts]"]
  node_doku["DOKU QRIS<br/>[doku.ts]"]
  node_notify["Payment notification route<br/>[route.ts]"]
  node_activation["Payment activation<br/>[webhook.ts]"]
  node_db[("Application database<br/>[index.ts]")]
  node_schema["Data schema<br/>[schema.ts]"]
  node_email["Verification email<br/>[email.ts]"]
end

node_visitor(("Visitor / participant"))
node_doku_service{{"DOKU payment service"}}
node_neon[("Neon database")]

node_visitor -->|"browses"| node_home
node_visitor -->|"explores products"| node_catalog
node_visitor -->|"registers or signs in"| node_authpages
node_authpages -->|"renders"| node_authform
node_authform -->|"submits credentials"| node_authclient
node_authclient -->|"calls"| node_authapi
node_authapi -->|"dispatches"| node_authserver
node_authserver -->|"reads and writes"| node_db
node_authserver -.->|"sends verification"| node_email
node_catalog -->|"opens product"| node_product
node_visitor -->|"selects product"| node_product
node_product -->|"starts checkout"| node_checkout
node_checkout -->|"creates order and payment"| node_db
node_checkout -->|"requests QRIS"| node_doku
node_doku -->|"creates payment"| node_doku_service
node_doku_service -->|"posts notification"| node_notify
node_notify -->|"verifies signature"| node_doku
node_notify -->|"activates success"| node_activation
node_orders -->|"polls pending payment"| node_activation
node_activation -->|"updates payment and access"| node_db
node_visitor -->|"starts simulation"| node_assessment_pages
node_assessment_pages -->|"runs attempt flow"| node_attempt_engine
node_attempt_engine -->|"manages attempt"| node_attempt_data
node_attempt_data -->|"saves attempt data"| node_db
node_attempt_engine -->|"opens completed result"| node_results
node_visitor -->|"tries free quiz"| node_free_sample
node_visitor -->|"administers content"| node_admin_pages
node_admin_pages -->|"manages platform"| node_admin_service
node_admin_pages -->|"manages orders"| node_admin_orders
node_admin_service -->|"reads and writes"| node_db
node_admin_orders -->|"reads and writes"| node_db
node_db -->|"uses schema"| node_schema
node_db -->|"queries"| node_neon

click node_home "https://github.com/arikmhm/rekan-tes/blob/main/src/app/page.tsx"
click node_catalog "https://github.com/arikmhm/rekan-tes/blob/main/src/app/produk/page.tsx"
click node_product "https://github.com/arikmhm/rekan-tes/blob/main/src/app/produk/%5Bslug%5D/page.tsx"
click node_authpages "https://github.com/arikmhm/rekan-tes/blob/main/src/app/masuk/page.tsx"
click node_authform "https://github.com/arikmhm/rekan-tes/blob/main/src/app/_components/auth-form.tsx"
click node_authclient "https://github.com/arikmhm/rekan-tes/blob/main/src/lib/auth-client.ts"
click node_authapi "https://github.com/arikmhm/rekan-tes/blob/main/src/app/api/auth/%5B...all%5D/route.ts"
click node_authserver "https://github.com/arikmhm/rekan-tes/blob/main/src/lib/auth.ts"
click node_checkout "https://github.com/arikmhm/rekan-tes/blob/main/src/lib/order.ts"
click node_doku "https://github.com/arikmhm/rekan-tes/blob/main/src/lib/doku.ts"
click node_notify "https://github.com/arikmhm/rekan-tes/blob/main/src/app/api/doku/notifications/route.ts"
click node_activation "https://github.com/arikmhm/rekan-tes/blob/main/src/lib/webhook.ts"
click node_orders "https://github.com/arikmhm/rekan-tes/blob/main/src/app/peserta/pesanan/%5Bid%5D/page.tsx"
click node_assessment_pages "https://github.com/arikmhm/rekan-tes/blob/main/src/app/simulasi/%5Bslug%5D/mulai/page.tsx"
click node_attempt_engine "https://github.com/arikmhm/rekan-tes/blob/main/src/lib/attempt-flow.ts"
click node_attempt_data "https://github.com/arikmhm/rekan-tes/blob/main/src/lib/attempt.ts"
click node_results "https://github.com/arikmhm/rekan-tes/blob/main/src/app/peserta/simulasi/%5Bid%5D/hasil/page.tsx"
click node_free_sample "https://github.com/arikmhm/rekan-tes/blob/main/src/app/simulasi/data.ts"
click node_admin_pages "https://github.com/arikmhm/rekan-tes/tree/main/src/app/admin"
click node_admin_service "https://github.com/arikmhm/rekan-tes/blob/main/src/lib/admin.ts"
click node_admin_orders "https://github.com/arikmhm/rekan-tes/blob/main/src/lib/admin-order.ts"
click node_db "https://github.com/arikmhm/rekan-tes/blob/main/src/db/index.ts"
click node_schema "https://github.com/arikmhm/rekan-tes/blob/main/src/db/schema.ts"
click node_email "https://github.com/arikmhm/rekan-tes/blob/main/src/lib/email.ts"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_home,node_catalog,node_product,node_authpages,node_authform,node_checkout,node_orders toneBlue
class node_assessment_pages,node_attempt_engine,node_attempt_data,node_results,node_free_sample,node_neon toneAmber
class node_admin_pages,node_admin_service,node_admin_orders toneMint
class node_authclient,node_authapi,node_authserver,node_doku,node_notify,node_activation,node_db,node_schema,node_email toneRose
class node_visitor,node_doku_service toneIndigo
```

## Components

### Participant experience

- [Home and discovery](https://github.com/arikmhm/rekan-tes/blob/main/src/app/page.tsx): `src/app/page.tsx`
- [Product catalog](https://github.com/arikmhm/rekan-tes/blob/main/src/app/produk/page.tsx): `src/app/produk/page.tsx`
- [Product details](https://github.com/arikmhm/rekan-tes/blob/main/src/app/produk/%5Bslug%5D/page.tsx): `src/app/produk/[slug]/page.tsx`
- [Sign-in and registration](https://github.com/arikmhm/rekan-tes/blob/main/src/app/masuk/page.tsx): `src/app/masuk/page.tsx`
- [Account form](https://github.com/arikmhm/rekan-tes/blob/main/src/app/_components/auth-form.tsx): `src/app/_components/auth-form.tsx`
- [Order and checkout](https://github.com/arikmhm/rekan-tes/blob/main/src/lib/order.ts): `src/lib/order.ts`
- [Participant orders](https://github.com/arikmhm/rekan-tes/blob/main/src/app/peserta/pesanan/%5Bid%5D/page.tsx): `src/app/peserta/pesanan/[id]/page.tsx`

### Assessment workflow

- [Simulation and attempts](https://github.com/arikmhm/rekan-tes/blob/main/src/app/simulasi/%5Bslug%5D/mulai/page.tsx): `src/app/simulasi/[slug]/mulai/page.tsx`
- [Attempt workflow](https://github.com/arikmhm/rekan-tes/blob/main/src/lib/attempt-flow.ts): `src/lib/attempt-flow.ts`
- [Attempt operations](https://github.com/arikmhm/rekan-tes/blob/main/src/lib/attempt.ts): `src/lib/attempt.ts`
- [Attempt results](https://github.com/arikmhm/rekan-tes/blob/main/src/app/peserta/simulasi/%5Bid%5D/hasil/page.tsx): `src/app/peserta/simulasi/[id]/hasil/page.tsx`
- [Free sample quizzes](https://github.com/arikmhm/rekan-tes/blob/main/src/app/simulasi/data.ts): `src/app/simulasi/data.ts`

### Administration

- [Admin workspace](https://github.com/arikmhm/rekan-tes/tree/main/src/app/admin): `src/app/admin`
- [Admin operations](https://github.com/arikmhm/rekan-tes/blob/main/src/lib/admin.ts): `src/lib/admin.ts`
- [Order management](https://github.com/arikmhm/rekan-tes/blob/main/src/lib/admin-order.ts): `src/lib/admin-order.ts`

### Platform services

- [Auth client](https://github.com/arikmhm/rekan-tes/blob/main/src/lib/auth-client.ts): `src/lib/auth-client.ts`
- [Auth API route](https://github.com/arikmhm/rekan-tes/blob/main/src/app/api/auth/%5B...all%5D/route.ts): `src/app/api/auth/[...all]/route.ts`
- [Auth service](https://github.com/arikmhm/rekan-tes/blob/main/src/lib/auth.ts): `src/lib/auth.ts`
- [DOKU QRIS](https://github.com/arikmhm/rekan-tes/blob/main/src/lib/doku.ts): `src/lib/doku.ts`
- [Payment notification route](https://github.com/arikmhm/rekan-tes/blob/main/src/app/api/doku/notifications/route.ts): `src/app/api/doku/notifications/route.ts`
- [Payment activation](https://github.com/arikmhm/rekan-tes/blob/main/src/lib/webhook.ts): `src/lib/webhook.ts`
- [Application database](https://github.com/arikmhm/rekan-tes/blob/main/src/db/index.ts): `src/db/index.ts`
- [Data schema](https://github.com/arikmhm/rekan-tes/blob/main/src/db/schema.ts): `src/db/schema.ts`
- [Verification email](https://github.com/arikmhm/rekan-tes/blob/main/src/lib/email.ts): `src/lib/email.ts`

### Other components

- **Visitor / participant**
- **DOKU payment service**
- **Neon database**

## Connections

- Visitor / participant → Home and discovery: browses
- Visitor / participant → Product catalog: explores products
- Visitor / participant → Sign-in and registration: registers or signs in
- Sign-in and registration → Account form: renders
- Account form → Auth client: submits credentials
- Auth client → Auth API route: calls
- Auth API route → Auth service: dispatches
- Auth service → Application database: reads and writes
- Auth service → Verification email: sends verification
- Product catalog → Product details: opens product
- Visitor / participant → Product details: selects product
- Product details → Order and checkout: starts checkout
- Order and checkout → Application database: creates order and payment
- Order and checkout → DOKU QRIS: requests QRIS
- DOKU QRIS → DOKU payment service: creates payment
- DOKU payment service → Payment notification route: posts notification
- Payment notification route → DOKU QRIS: verifies signature
- Payment notification route → Payment activation: activates success
- Participant orders → Payment activation: polls pending payment
- Payment activation → Application database: updates payment and access
- Visitor / participant → Simulation and attempts: starts simulation
- Simulation and attempts → Attempt workflow: runs attempt flow
- Attempt workflow → Attempt operations: manages attempt
- Attempt operations → Application database: saves attempt data
- Attempt workflow → Attempt results: opens completed result
- Visitor / participant → Free sample quizzes: tries free quiz
- Visitor / participant → Admin workspace: administers content
- Admin workspace → Admin operations: manages platform
- Admin workspace → Order management: manages orders
- Admin operations → Application database: reads and writes
- Order management → Application database: reads and writes
- Application database → Data schema: uses schema
- Application database → Neon database: queries
