# wildanferdiansyah06-crypto/kelas-pekerja architecture

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

- Interactive diagram: https://gitdiagram.com/wildanferdiansyah06-crypto/kelas-pekerja
- Repository: https://github.com/wildanferdiansyah06-crypto/kelas-pekerja

## Overview

Kelas Pekerja is a headless literary publishing and reading platform. Readers browse published books and posts, open book details, read with adjustable display preferences, and save bookmarks or reading progress; contributors can submit stories and quotes for review. Sanity provides published content and user bookmark state, while the Next.js API layer also connects to a Java backend for submissions and book services. The README documents Supabase relational storage and Google OAuth; source excerpts show Sanity-backed user operations, so those documented integrations are shown separately. Unsampled routes and backend features are included only where the tree or README supports them.

Main entry points: [`src/lib/user.ts`](https://github.com/wildanferdiansyah06-crypto/kelas-pekerja/blob/main/src/lib/user.ts) (User data operations), [`src/components/BookDetailClient.tsx`](https://github.com/wildanferdiansyah06-crypto/kelas-pekerja/blob/main/src/components/BookDetailClient.tsx) (Book details), [`src/lib/api.ts`](https://github.com/wildanferdiansyah06-crypto/kelas-pekerja/blob/main/src/lib/api.ts) (Content API), [`src/app/api/submit-story/route.ts`](https://github.com/wildanferdiansyah06-crypto/kelas-pekerja/blob/main/src/app/api/submit-story/route.ts) (Story submission API)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Reading experience"]
  node_webapp["Next.js routes<br/>[page.tsx]"]
  node_bookdetail["Book details"]
  node_bookcards["Book cards<br/>[BookCard.tsx]"]
  node_readingprefs["Reader preferences<br/>[ReaderContext.tsx]"]
  node_language["Language context"]
end

subgraph group_content["Content services"]
  node_api["Content API<br/>[api.ts]"]
  node_sanityclient["Sanity client<br/>[client.ts]"]
  node_schemas["Content schemas<br/>[book.ts]"]
  node_studio["Sanity Studio<br/>[page.tsx]"]
  node_sanity[("Sanity Content Lake")]
end

subgraph group_identity["Identity and state"]
  node_auth["NextAuth handler<br/>[route.ts]"]
  node_oauth["Google OAuth"]
  node_bookmarks["Bookmarks and progress<br/>[useBookmarks.ts]"]
  node_userstate["User data operations<br/>[user.ts]"]
  node_supabase[("Supabase database")]
end

subgraph group_contribute["Community submissions"]
  node_storyapi["Story submission API<br/>[route.ts]"]
  node_quoteapi["Quote submission API<br/>[route.ts]"]
end

subgraph group_java["Java services"]
  node_javaapi["Java API client<br/>[java-api.ts]"]
  node_storycontroller["Story controller"]
  node_storyrepo["Story repository"]
  node_storymodel["Story model<br/>[Story.java]"]
  node_bookcontroller["Book controller"]
  node_bookrepo["Book repository"]
  node_bookmodel["Book model<br/>[Book.java]"]
end

node_reader(("Reader"))
node_submitter(("Contributor"))
node_discord["Discord webhook"]

node_reader -->|"browses"| node_webapp
node_webapp -.->|"loads content"| node_api
node_api -->|"queries"| node_sanityclient
node_sanityclient -->|"fetches content"| node_sanity
node_studio -->|"edits content"| node_schemas
node_schemas -.->|"defines content"| node_sanity
node_bookdetail -->|"reads preferences"| node_readingprefs
node_bookdetail -->|"renders bookmark control"| node_bookmarks
node_bookcards -->|"reads language"| node_language
node_bookdetail -->|"reads language"| node_language
node_bookcards -->|"renders bookmark control"| node_bookmarks
node_bookmarks -->|"loads and updates"| node_userstate
node_userstate -->|"reads and writes"| node_sanityclient
node_auth -->|"uses user operations"| node_userstate
node_auth -->|"OAuth flow"| node_oauth
node_api -->|"updates view state"| node_supabase
node_userstate -.->|"stores relational state"| node_supabase
node_submitter -->|"submits story"| node_storyapi
node_submitter -->|"submits quote"| node_quoteapi
node_storyapi -->|"saves story"| node_javaapi
node_quoteapi -->|"saves quote"| node_javaapi
node_storyapi -->|"notifies with submission"| node_discord
node_quoteapi -->|"sends notification"| node_discord
node_javaapi -.->|"calls backend"| node_storycontroller
node_storycontroller -->|"queries and saves"| node_storyrepo
node_storycontroller -->|"reads and validates"| node_storymodel
node_bookcontroller -->|"queries books"| node_bookrepo
node_bookrepo -->|"persists"| node_bookmodel

click node_webapp "https://github.com/wildanferdiansyah06-crypto/kelas-pekerja/blob/main/src/app/page.tsx"
click node_bookdetail "https://github.com/wildanferdiansyah06-crypto/kelas-pekerja/blob/main/src/components/BookDetailClient.tsx"
click node_bookcards "https://github.com/wildanferdiansyah06-crypto/kelas-pekerja/blob/main/src/components/BookCard.tsx"
click node_readingprefs "https://github.com/wildanferdiansyah06-crypto/kelas-pekerja/blob/main/src/contexts/ReaderContext.tsx"
click node_language "https://github.com/wildanferdiansyah06-crypto/kelas-pekerja/blob/main/src/contexts/LanguageContext.tsx"
click node_api "https://github.com/wildanferdiansyah06-crypto/kelas-pekerja/blob/main/src/lib/api.ts"
click node_sanityclient "https://github.com/wildanferdiansyah06-crypto/kelas-pekerja/blob/main/src/sanity/lib/client.ts"
click node_schemas "https://github.com/wildanferdiansyah06-crypto/kelas-pekerja/blob/main/src/sanity/schemas/book.ts"
click node_studio "https://github.com/wildanferdiansyah06-crypto/kelas-pekerja/blob/main/src/app/y/%5B%5B...tool%5D%5D/page.tsx"
click node_auth "https://github.com/wildanferdiansyah06-crypto/kelas-pekerja/blob/main/src/app/api/auth/%5B...nextauth%5D/route.ts"
click node_bookmarks "https://github.com/wildanferdiansyah06-crypto/kelas-pekerja/blob/main/src/hooks/useBookmarks.ts"
click node_userstate "https://github.com/wildanferdiansyah06-crypto/kelas-pekerja/blob/main/src/lib/user.ts"
click node_storyapi "https://github.com/wildanferdiansyah06-crypto/kelas-pekerja/blob/main/src/app/api/submit-story/route.ts"
click node_quoteapi "https://github.com/wildanferdiansyah06-crypto/kelas-pekerja/blob/main/src/app/api/submit-quote/route.ts"
click node_javaapi "https://github.com/wildanferdiansyah06-crypto/kelas-pekerja/blob/main/src/lib/java-api.ts"
click node_storycontroller "https://github.com/wildanferdiansyah06-crypto/kelas-pekerja/blob/main/backend/src/main/java/com/kelaspekerja/backend/controller/StoryController.java"
click node_storyrepo "https://github.com/wildanferdiansyah06-crypto/kelas-pekerja/blob/main/backend/src/main/java/com/kelaspekerja/backend/repository/StoryRepository.java"
click node_storymodel "https://github.com/wildanferdiansyah06-crypto/kelas-pekerja/blob/main/backend/src/main/java/com/kelaspekerja/backend/model/Story.java"
click node_bookcontroller "https://github.com/wildanferdiansyah06-crypto/kelas-pekerja/blob/main/backend/src/main/java/com/kelaspekerja/backend/controller/BookController.java"
click node_bookrepo "https://github.com/wildanferdiansyah06-crypto/kelas-pekerja/blob/main/backend/src/main/java/com/kelaspekerja/backend/repository/BookRepository.java"
click node_bookmodel "https://github.com/wildanferdiansyah06-crypto/kelas-pekerja/blob/main/backend/src/main/java/com/kelaspekerja/backend/model/Book.java"

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_webapp,node_bookdetail,node_bookcards,node_readingprefs,node_language toneBlue
class node_api,node_sanityclient,node_schemas,node_studio,node_sanity toneAmber
class node_auth,node_oauth,node_bookmarks,node_userstate,node_supabase,node_discord toneMint
class node_storyapi,node_quoteapi toneRose
class node_javaapi,node_storycontroller,node_storyrepo,node_storymodel,node_bookcontroller,node_bookrepo,node_bookmodel,node_reader,node_submitter toneIndigo
```

## Components

### Reading experience

- [Next.js routes](https://github.com/wildanferdiansyah06-crypto/kelas-pekerja/blob/main/src/app/page.tsx): `src/app/page.tsx`
- [Book details](https://github.com/wildanferdiansyah06-crypto/kelas-pekerja/blob/main/src/components/BookDetailClient.tsx): `src/components/BookDetailClient.tsx`
- [Book cards](https://github.com/wildanferdiansyah06-crypto/kelas-pekerja/blob/main/src/components/BookCard.tsx): `src/components/BookCard.tsx`
- [Reader preferences](https://github.com/wildanferdiansyah06-crypto/kelas-pekerja/blob/main/src/contexts/ReaderContext.tsx): `src/contexts/ReaderContext.tsx`
- [Language context](https://github.com/wildanferdiansyah06-crypto/kelas-pekerja/blob/main/src/contexts/LanguageContext.tsx): `src/contexts/LanguageContext.tsx`

### Content services

- [Content API](https://github.com/wildanferdiansyah06-crypto/kelas-pekerja/blob/main/src/lib/api.ts): `src/lib/api.ts`
- [Sanity client](https://github.com/wildanferdiansyah06-crypto/kelas-pekerja/blob/main/src/sanity/lib/client.ts): `src/sanity/lib/client.ts`
- [Content schemas](https://github.com/wildanferdiansyah06-crypto/kelas-pekerja/blob/main/src/sanity/schemas/book.ts): `src/sanity/schemas/book.ts`
- [Sanity Studio](https://github.com/wildanferdiansyah06-crypto/kelas-pekerja/blob/main/src/app/y/%5B%5B...tool%5D%5D/page.tsx): `src/app/y/[[...tool]]/page.tsx`
- **Sanity Content Lake**

### Identity and state

- [NextAuth handler](https://github.com/wildanferdiansyah06-crypto/kelas-pekerja/blob/main/src/app/api/auth/%5B...nextauth%5D/route.ts): `src/app/api/auth/[...nextauth]/route.ts`
- **Google OAuth**
- [Bookmarks and progress](https://github.com/wildanferdiansyah06-crypto/kelas-pekerja/blob/main/src/hooks/useBookmarks.ts): `src/hooks/useBookmarks.ts`
- [User data operations](https://github.com/wildanferdiansyah06-crypto/kelas-pekerja/blob/main/src/lib/user.ts): `src/lib/user.ts`
- **Supabase database**

### Community submissions

- [Story submission API](https://github.com/wildanferdiansyah06-crypto/kelas-pekerja/blob/main/src/app/api/submit-story/route.ts): `src/app/api/submit-story/route.ts`
- [Quote submission API](https://github.com/wildanferdiansyah06-crypto/kelas-pekerja/blob/main/src/app/api/submit-quote/route.ts): `src/app/api/submit-quote/route.ts`

### Java services

- [Java API client](https://github.com/wildanferdiansyah06-crypto/kelas-pekerja/blob/main/src/lib/java-api.ts): `src/lib/java-api.ts`
- [Story controller](https://github.com/wildanferdiansyah06-crypto/kelas-pekerja/blob/main/backend/src/main/java/com/kelaspekerja/backend/controller/StoryController.java): `backend/src/main/java/com/kelaspekerja/backend/controller/StoryController.java`
- [Story repository](https://github.com/wildanferdiansyah06-crypto/kelas-pekerja/blob/main/backend/src/main/java/com/kelaspekerja/backend/repository/StoryRepository.java): `backend/src/main/java/com/kelaspekerja/backend/repository/StoryRepository.java`
- [Story model](https://github.com/wildanferdiansyah06-crypto/kelas-pekerja/blob/main/backend/src/main/java/com/kelaspekerja/backend/model/Story.java): `backend/src/main/java/com/kelaspekerja/backend/model/Story.java`
- [Book controller](https://github.com/wildanferdiansyah06-crypto/kelas-pekerja/blob/main/backend/src/main/java/com/kelaspekerja/backend/controller/BookController.java): `backend/src/main/java/com/kelaspekerja/backend/controller/BookController.java`
- [Book repository](https://github.com/wildanferdiansyah06-crypto/kelas-pekerja/blob/main/backend/src/main/java/com/kelaspekerja/backend/repository/BookRepository.java): `backend/src/main/java/com/kelaspekerja/backend/repository/BookRepository.java`
- [Book model](https://github.com/wildanferdiansyah06-crypto/kelas-pekerja/blob/main/backend/src/main/java/com/kelaspekerja/backend/model/Book.java): `backend/src/main/java/com/kelaspekerja/backend/model/Book.java`

### Other components

- **Reader**
- **Contributor**
- **Discord webhook**

## Connections

- Reader → Next.js routes: browses (evidence: `README.md`)
- Next.js routes → Content API: loads content
- Content API → Sanity client: queries (evidence: `src/lib/api.ts`)
- Sanity client → Sanity Content Lake: fetches content (evidence: `src/sanity/lib/client.ts`)
- Sanity Studio → Content schemas: edits content (evidence: `README.md`)
- Content schemas → Sanity Content Lake: defines content
- Book details → Reader preferences: reads preferences (evidence: `src/components/BookDetailClient.tsx`)
- Book details → Bookmarks and progress: renders bookmark control (evidence: `src/components/BookDetailClient.tsx`)
- Book cards → Language context: reads language (evidence: `src/components/BookCard.tsx`)
- Book details → Language context: reads language (evidence: `src/components/BookDetailClient.tsx`)
- Book cards → Bookmarks and progress: renders bookmark control (evidence: `src/components/BookCard.tsx`)
- Bookmarks and progress → User data operations: loads and updates (evidence: `src/hooks/useBookmarks.ts`)
- User data operations → Sanity client: reads and writes (evidence: `src/lib/user.ts`)
- NextAuth handler → User data operations: uses user operations (evidence: `src/app/api/auth/[...nextauth]/route.ts`)
- NextAuth handler → Google OAuth: OAuth flow (evidence: `README.md`)
- Content API → Supabase database: updates view state (evidence: `src/lib/api.ts`)
- User data operations → Supabase database: stores relational state
- Contributor → Story submission API: submits story (evidence: `src/app/api/submit-story/route.ts`)
- Contributor → Quote submission API: submits quote (evidence: `src/app/api/submit-quote/route.ts`)
- Story submission API → Java API client: saves story (evidence: `src/app/api/submit-story/route.ts`)
- Quote submission API → Java API client: saves quote (evidence: `src/app/api/submit-quote/route.ts`)
- Story submission API → Discord webhook: notifies with submission (evidence: `src/app/api/submit-story/route.ts`)
- Quote submission API → Discord webhook: sends notification (evidence: `src/app/api/submit-quote/route.ts`)
- Java API client → Story controller: calls backend
- Story controller → Story repository: queries and saves (evidence: `backend/src/main/java/com/kelaspekerja/backend/controller/StoryController.java`)
- Story controller → Story model: reads and validates (evidence: `backend/src/main/java/com/kelaspekerja/backend/controller/StoryController.java`)
- Book controller → Book repository: queries books (evidence: `backend/src/main/java/com/kelaspekerja/backend/controller/BookController.java`)
- Book repository → Book model: persists (evidence: `backend/src/main/java/com/kelaspekerja/backend/repository/BookRepository.java`)
