# oktasatwika87/sikons architecture

> Architecture diagram of the GitHub repository oktasatwika87/sikons, 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/oktasatwika87/sikons
- Repository: https://github.com/oktasatwika87/sikons

## Overview

SIKONS is a lecturer-consultation reservation system. Its main workflow is browsing lecturers and available slots, authenticating, then creating and managing bookings; lecturers configure availability, which is reconciled into slots. The Go API serves these workflows, while a Next.js frontend calls it. Separate runtime branches generate slots and poll/send booking reminders. The README is explicitly a skeleton, so several product capabilities are evident from the source index and router but their deeper implementation relationships are not shown in the excerpts.

Main entry points: [`cmd/api/main.go`](https://github.com/oktasatwika87/sikons/blob/main/cmd/api/main.go) (API process), [`internal/server/server.go`](https://github.com/oktasatwika87/sikons/blob/main/internal/server/server.go) (HTTP router), [`internal/db/db.go`](https://github.com/oktasatwika87/sikons/blob/main/internal/db/db.go) (Postgres connection), [`cmd/worker/main.go`](https://github.com/oktasatwika87/sikons/blob/main/cmd/worker/main.go) (Reminder worker)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Web application"]
  node_webpages["App pages"]
  node_webcomponents["UI components"]
  node_webhooks["Data hooks"]
  node_apiclient["API client<br/>[client.ts]"]
  node_apierror["API errors<br/>[errors.ts]"]
end

subgraph group_api["HTTP API"]
  node_apientry["API process<br/>[main.go]"]
  node_router["HTTP router<br/>[server.go]"]
  node_authhandlers["Auth handlers<br/>[auth_handlers.go]"]
  node_availabilityhandlers["Availability handlers"]
  node_bookinghandlers["Booking handlers"]
  node_lecturerhandlers["Lecturer handlers"]
end

subgraph group_domain["Reservation domain"]
  node_authservice["Authentication<br/>[service.go]"]
  node_availability["Availability rules<br/>[service.go]"]
  node_booking["Booking lifecycle<br/>[service.go]"]
  node_lecturers["Lecturer profiles<br/>[service.go]"]
  node_slotgen["Slot reconciliation<br/>[service.go]"]
end

subgraph group_background["Background services"]
  node_slotcommand["Slot generator command<br/>[main.go]"]
  node_worker["Reminder worker<br/>[main.go]"]
  node_reminder["Reminder polling<br/>[reminder.go]"]
  node_notifier["Email sender<br/>[notifier.go]"]
end

subgraph group_infrastructure["Runtime infrastructure"]
  node_db[("Postgres connection<br/>[db.go]")]
  node_config["Runtime config<br/>[config.go]"]
end

node_user(("Student or lecturer"))
node_postgres[("Postgres")]
node_resend["Resend email service"]

node_user -->|"uses"| node_webpages
node_webpages -.->|"renders"| node_webcomponents
node_webhooks -.->|"requests"| node_apiclient
node_apiclient -->|"raises"| node_apierror
node_apiclient -->|"calls API"| node_router
node_apientry -->|"loads"| node_config
node_apientry -->|"connects"| node_db
node_apientry -->|"starts"| node_router
node_router -->|"routes"| node_authhandlers
node_router -->|"routes"| node_availabilityhandlers
node_router -->|"routes"| node_bookinghandlers
node_router -->|"routes"| node_lecturerhandlers
node_authhandlers -->|"calls"| node_authservice
node_availabilityhandlers -->|"calls"| node_availability
node_availabilityhandlers -->|"reconciles"| node_slotgen
node_bookinghandlers -->|"calls"| node_booking
node_apientry -->|"wires"| node_availability
node_apientry -->|"wires"| node_booking
node_apientry -->|"wires"| node_slotgen
node_apientry -->|"wires"| node_lecturers
node_slotcommand -->|"reconciles"| node_slotgen
node_slotcommand -->|"connects"| node_db
node_worker -->|"loads"| node_config
node_worker -->|"connects"| node_db
node_worker -->|"runs"| node_reminder
node_reminder -->|"sends email"| node_notifier
node_notifier -.->|"delivers"| node_resend
node_db -.->|"connects"| node_postgres

click node_webpages "https://github.com/oktasatwika87/sikons/tree/main/web/app"
click node_webcomponents "https://github.com/oktasatwika87/sikons/tree/main/web/components"
click node_webhooks "https://github.com/oktasatwika87/sikons/tree/main/web/hooks"
click node_apiclient "https://github.com/oktasatwika87/sikons/blob/main/web/lib/api/client.ts"
click node_apierror "https://github.com/oktasatwika87/sikons/blob/main/web/lib/api/errors.ts"
click node_apientry "https://github.com/oktasatwika87/sikons/blob/main/cmd/api/main.go"
click node_router "https://github.com/oktasatwika87/sikons/blob/main/internal/server/server.go"
click node_authhandlers "https://github.com/oktasatwika87/sikons/blob/main/internal/server/auth_handlers.go"
click node_availabilityhandlers "https://github.com/oktasatwika87/sikons/blob/main/internal/server/availability_handlers.go"
click node_bookinghandlers "https://github.com/oktasatwika87/sikons/blob/main/internal/server/booking_handlers.go"
click node_lecturerhandlers "https://github.com/oktasatwika87/sikons/blob/main/internal/server/lecturer_handlers.go"
click node_authservice "https://github.com/oktasatwika87/sikons/blob/main/internal/auth/service.go"
click node_availability "https://github.com/oktasatwika87/sikons/blob/main/internal/availability/service.go"
click node_booking "https://github.com/oktasatwika87/sikons/blob/main/internal/booking/service.go"
click node_lecturers "https://github.com/oktasatwika87/sikons/blob/main/internal/lecturer/service.go"
click node_slotgen "https://github.com/oktasatwika87/sikons/blob/main/internal/slotgen/service.go"
click node_slotcommand "https://github.com/oktasatwika87/sikons/blob/main/cmd/generate-slots/main.go"
click node_worker "https://github.com/oktasatwika87/sikons/blob/main/cmd/worker/main.go"
click node_reminder "https://github.com/oktasatwika87/sikons/blob/main/internal/reminder/reminder.go"
click node_notifier "https://github.com/oktasatwika87/sikons/blob/main/internal/notifier/notifier.go"
click node_db "https://github.com/oktasatwika87/sikons/blob/main/internal/db/db.go"
click node_config "https://github.com/oktasatwika87/sikons/blob/main/internal/config/config.go"

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_webpages,node_webcomponents,node_webhooks,node_apiclient,node_apierror toneBlue
class node_apientry,node_router,node_authhandlers,node_availabilityhandlers,node_bookinghandlers,node_lecturerhandlers,node_postgres toneAmber
class node_authservice,node_availability,node_booking,node_lecturers,node_slotgen toneMint
class node_slotcommand,node_worker,node_reminder,node_notifier toneRose
class node_db,node_config,node_user,node_resend toneIndigo
```

## Components

### Web application

- [App pages](https://github.com/oktasatwika87/sikons/tree/main/web/app): `web/app`
- [UI components](https://github.com/oktasatwika87/sikons/tree/main/web/components): `web/components`
- [Data hooks](https://github.com/oktasatwika87/sikons/tree/main/web/hooks): `web/hooks`
- [API client](https://github.com/oktasatwika87/sikons/blob/main/web/lib/api/client.ts): `web/lib/api/client.ts`
- [API errors](https://github.com/oktasatwika87/sikons/blob/main/web/lib/api/errors.ts): `web/lib/api/errors.ts`

### HTTP API

- [API process](https://github.com/oktasatwika87/sikons/blob/main/cmd/api/main.go): `cmd/api/main.go`
- [HTTP router](https://github.com/oktasatwika87/sikons/blob/main/internal/server/server.go): `internal/server/server.go`
- [Auth handlers](https://github.com/oktasatwika87/sikons/blob/main/internal/server/auth_handlers.go): `internal/server/auth_handlers.go`
- [Availability handlers](https://github.com/oktasatwika87/sikons/blob/main/internal/server/availability_handlers.go): `internal/server/availability_handlers.go`
- [Booking handlers](https://github.com/oktasatwika87/sikons/blob/main/internal/server/booking_handlers.go): `internal/server/booking_handlers.go`
- [Lecturer handlers](https://github.com/oktasatwika87/sikons/blob/main/internal/server/lecturer_handlers.go): `internal/server/lecturer_handlers.go`

### Reservation domain

- [Authentication](https://github.com/oktasatwika87/sikons/blob/main/internal/auth/service.go): `internal/auth/service.go`
- [Availability rules](https://github.com/oktasatwika87/sikons/blob/main/internal/availability/service.go): `internal/availability/service.go`
- [Booking lifecycle](https://github.com/oktasatwika87/sikons/blob/main/internal/booking/service.go): `internal/booking/service.go`
- [Lecturer profiles](https://github.com/oktasatwika87/sikons/blob/main/internal/lecturer/service.go): `internal/lecturer/service.go`
- [Slot reconciliation](https://github.com/oktasatwika87/sikons/blob/main/internal/slotgen/service.go): `internal/slotgen/service.go`

### Background services

- [Slot generator command](https://github.com/oktasatwika87/sikons/blob/main/cmd/generate-slots/main.go): `cmd/generate-slots/main.go`
- [Reminder worker](https://github.com/oktasatwika87/sikons/blob/main/cmd/worker/main.go): `cmd/worker/main.go`
- [Reminder polling](https://github.com/oktasatwika87/sikons/blob/main/internal/reminder/reminder.go): `internal/reminder/reminder.go`
- [Email sender](https://github.com/oktasatwika87/sikons/blob/main/internal/notifier/notifier.go): `internal/notifier/notifier.go`

### Runtime infrastructure

- [Postgres connection](https://github.com/oktasatwika87/sikons/blob/main/internal/db/db.go): `internal/db/db.go`
- [Runtime config](https://github.com/oktasatwika87/sikons/blob/main/internal/config/config.go): `internal/config/config.go`

### Other components

- **Student or lecturer**
- **Postgres**
- **Resend email service**

## Connections

- Student or lecturer → App pages: uses
- App pages → UI components: renders
- Data hooks → API client: requests
- API client → API errors: raises (evidence: `web/lib/api/client.ts`)
- API client → HTTP router: calls API
- API process → Runtime config: loads (evidence: `cmd/api/main.go`)
- API process → Postgres connection: connects (evidence: `cmd/api/main.go`)
- API process → HTTP router: starts (evidence: `cmd/api/main.go`)
- HTTP router → Auth handlers: routes (evidence: `internal/server/server.go`)
- HTTP router → Availability handlers: routes (evidence: `internal/server/server.go`)
- HTTP router → Booking handlers: routes (evidence: `internal/server/server.go`)
- HTTP router → Lecturer handlers: routes (evidence: `internal/server/server.go`)
- Auth handlers → Authentication: calls (evidence: `internal/server/auth_handlers.go`)
- Availability handlers → Availability rules: calls (evidence: `internal/server/availability_handlers.go`)
- Availability handlers → Slot reconciliation: reconciles (evidence: `internal/server/availability_handlers.go`)
- Booking handlers → Booking lifecycle: calls (evidence: `internal/server/booking_handlers.go`)
- API process → Availability rules: wires (evidence: `cmd/api/main.go`)
- API process → Booking lifecycle: wires (evidence: `cmd/api/main.go`)
- API process → Slot reconciliation: wires (evidence: `cmd/api/main.go`)
- API process → Lecturer profiles: wires (evidence: `cmd/api/main.go`)
- Slot generator command → Slot reconciliation: reconciles (evidence: `cmd/generate-slots/main.go`)
- Slot generator command → Postgres connection: connects (evidence: `cmd/generate-slots/main.go`)
- Reminder worker → Runtime config: loads (evidence: `cmd/worker/main.go`)
- Reminder worker → Postgres connection: connects (evidence: `cmd/worker/main.go`)
- Reminder worker → Reminder polling: runs (evidence: `cmd/worker/main.go`)
- Reminder polling → Email sender: sends email (evidence: `internal/reminder/reminder.go`)
- Email sender → Resend email service: delivers
- Postgres connection → Postgres: connects
