Back
API DocumentationMay 15, 2026

Go Attendance API

Multi-tenant HR and attendance backend built with Go, Gin, GORM, PostgreSQL, and Redis.

Go Attendance API ๐Ÿš€

Go Attendance API adalah backend HR dan absensi multi-tenant yang tangguh, dibangun menggunakan Go. Sistem ini mencakup autentikasi, manajemen karyawan, absensi, cuti, lembur, payroll, dashboard, timesheet, keuangan, performa, langganan, workflow support desk, dan administrasi platform.

Dibangun dengan Gin, GORM, PostgreSQL, dan Redis. Data tenant diisolasi melalui request context, sementara akses fitur dikontrol melalui role, permissions, dan fitur paket langganan.


๐Ÿ“‹ Table of Contents


โœจ Main Features

๐Ÿข

Multi-tenant HR System

Isolasi data tingkat tenant yang aman untuk manajemen HR skala besar.

๐Ÿ”

JWT Auth

Autentikasi melalui HTTP-only session cookie untuk keamanan maksimal.

โฑ๏ธ

Attendance Tracking

Pelacakan presisi dengan Redis locking, cache invalidation, dan validasi GPS/waktu.

๐Ÿ’ฐ

Payroll Engine

Perhitungan gaji otomatis, profil payroll, payslip, dan sinkronisasi absensi.

๐Ÿ“Š

Comprehensive Dashboards

Admin, HR, Finance, Heatmap, Daily Pulse, dan Employee DNA dashboards.

๐Ÿ—บ๏ธ

Org Management

Organization chart, positions, tenant roles, dan role hierarchy management.

Detailed Capabilities:

  • HR Operations: Shifts, roster, holiday calendar, dan employee lifecycle.
  • Timesheets: Projects, tasks, dan laporan kerja karyawan.
  • Finance: Expense management dan quota management.
  • Performance: Goals, cycles, appraisals, dan self-reviews.
  • Subscriptions: Plans, reminders, suspension, dan upgrades.
  • Support Desk: Trial requests dan tenant provisioning.
  • Media: Upload melalui ImgBB.
  • Email: Transactional email melalui Resend.

๐Ÿ—๏ธ Architecture Overview

Request Lifecycle

mermaid
flowchart LR
    Client[Client / Frontend] --> Gin[Gin Router]
    Gin --> RateLimiter[Redis Rate Limiter]
    RateLimiter --> Auth[SecureAuth Middleware]
    Auth --> Handler[Handler]
    Handler --> Service[Service]
    Service --> Repo[Repository]
    Repo --> DB[(PostgreSQL)]
    Service --> Redis[(Redis)]

Main layers:

  • handler: parses HTTP requests, binds payloads, dan mengembalikan response.
  • service: berisi logika bisnis, orkestrasi, pengecekan keamanan, dan workflow.
  • repository: menangani akses database dan query.
  • model: berisi entitas GORM dan request/response models.
  • middleware: menangani autentikasi, permissions, tenant context, anti-replay checks, dan rate limiting.
  • seeder: menyediakan data awal untuk tenant, roles, demo users, plans, dan sample data.

Multi-Tenant Flow ๐ŸŒŠ

Setelah login, API mengembalikan session cookie bernama access_token. Pada rute yang dilindungi, middleware mengambil user dari token, mengecek status tenant, role, permissions, dan fitur plan. Tenant ID kemudian disuntikkan ke dalam request context agar query GORM dapat dibatasi sesuai tenant saat ini.

Superadmin dapat melewati pembatasan tenant dengan tenant_id = 0, memungkinkan akses tingkat platform di seluruh tenant.

Attendance Flow โฑ๏ธ

Absensi menggunakan Redis untuk mencegah request duplikat dan race conditions. Service melakukan validasi cepat, menyimpan data absensi, mencatat aktivitas terbaru, dan melakukan invalidasi cache absensi/dashboard yang terkait.


๐Ÿ“ Project Structure

text
go-attendance-api/
โ”œโ”€โ”€ cmd/
โ”‚   โ””โ”€โ”€ api/
โ”‚       โ””โ”€โ”€ main.go                  # Application entry point
โ”œโ”€โ”€ docs/                            # Generated Swagger files
โ”œโ”€โ”€ internal/
โ”‚   โ”œโ”€โ”€ config/                      # Database, Redis, tenant plugin
โ”‚   โ”œโ”€โ”€ dto/                         # Module-specific DTOs
โ”‚   โ”œโ”€โ”€ handler/                     # HTTP handlers
โ”‚   โ”œโ”€โ”€ middleware/                  # Auth, RBAC, tenant, rate limit
โ”‚   โ”œโ”€โ”€ model/                       # GORM models and request models
โ”‚   โ”œโ”€โ”€ repository/                  # Database access layer
โ”‚   โ”œโ”€โ”€ routes/                      # Route registration per module
โ”‚   โ”œโ”€โ”€ seeder/                      # Initial data for development/demo
โ”‚   โ”œโ”€โ”€ service/                     # Business logic
โ”‚   โ””โ”€โ”€ utils/                       # Response helpers, email, logger, preload
โ”œโ”€โ”€ .air.toml                        # Hot reload config
โ”œโ”€โ”€ docker-compose.yaml              # App, PostgreSQL, Redis
โ”œโ”€โ”€ Dockerfile                       # Multi-stage Docker build
โ”œโ”€โ”€ go.mod
โ”œโ”€โ”€ go.sum
โ””โ”€โ”€ readme.md

โš™๏ธ System Requirements

  • Go 1.26.1 (atau versi yang ditentukan di go.mod).
  • PostgreSQL 16 atau kompatibel.
  • Redis 7 atau kompatibel.
  • Docker & Docker Compose untuk menjalankan dengan container.
  • swag CLI untuk regenerasi Swagger docs secara lokal.
  • Air untuk hot reload selama pengembangan.

๐Ÿ”‘ Environment Variables

Salin file contoh environment:

bash
cp .env.example .env
VariableExampleDescription
APP_PORT8085Port HTTP yang digunakan API.
APP_ENVdevelopmentJika development, anti-replay dan internal secret checks dilewati.
DB_HOST127.0.0.1Host PostgreSQL. Gunakan db di Docker Compose.
DB_PORT5432Port PostgreSQL.
DB_USERpostgresUsername PostgreSQL.
DB_PASSWORD1234Password PostgreSQL.
DB_NAMEattendance-dbNama database PostgreSQL.
REDIS_ADDR127.0.0.1:6379Alamat Redis. Gunakan redis:6379 di Docker Compose.
JWT_SECRETchange-meSecret untuk tanda tangan token JWT.
RUN_MIGRATIONtrueMenjalankan GORM AutoMigrate saat startup.
RUN_SEEDERfalseMenjalankan seeder saat startup.

๐Ÿš€ Running the Project

Option 1: Local Development ๐Ÿ’ป

  1. Pastikan PostgreSQL dan Redis menyala.
  2. Atur .env (lihat bagian sebelumnya).
  3. Jalankan:
    bash
    go mod download
    go run ./cmd/api/main.go
    
  4. Dengan Hot Reload:
    bash
    air
    

Option 2: Docker Compose ๐Ÿณ

bash
docker compose up -d --build

Services:

  • App: attendance-api (Port 8085)
  • PostgreSQL: attendance-db (Port 5433 host -> 5432 container)
  • Redis: attendance-redis (Port 6380 host -> 6379 container)

๐Ÿ—„๏ธ Database, Migration, and Seeder

Migrasi menggunakan db.AutoMigrate di internal/config/database.go.

Ketika RUN_MIGRATION=true, aplikasi akan:

  1. Membuat ekstensi uuid-ossp di PostgreSQL.
  2. Menjalankan migrasi bertahap berdasarkan dependensi model.
  3. Seed paket langganan dasar.
  4. Backfill tenant dan payroll profil yang belum ada.
  5. Mengaktifkan GORM tenant plugin.

Ketika RUN_SEEDER=true, aplikasi akan membuat Demo Data:

  • System tenant & Sample tenants.
  • Roles, Permissions, & Hierarchy.
  • Demo users (Superadmin, Admin, HR, Finance, Employee).
  • Attendance history, Payroll profiles, Projects, & Support messages.

Demo Accounts:

  • Super Admin: superadmin@yopmail.com | 123456
  • Tenant Admin: admin@friendship.com | 123456

๐Ÿ“– Swagger

Swagger tersedia di: http://localhost:<APP_PORT>/swagger/index.html

Rute Swagger hanya terdaftar jika Gin tidak berjalan dalam mode release.

Regenerasi Swagger:

bash
swag init -g cmd/api/main.go

๐Ÿ”’ Authentication and Security Headers

Public Routes:

  • POST /api/v1/auth/login
  • GET /api/v1/ping

Protected Routes: memerlukan cookie: Cookie: access_token=<jwt>

Jika APP_ENV bukan development, memerlukan header tambahan:

  • X-Timestamp: Unix milliseconds
  • X-Request-ID: Unique request ID
  • X-Internal-Secret: <INTERNAL_SECRET>
  • X-Signature: HMAC SHA256 (Request body + timestamp + request ID)

๐Ÿ”Œ Main Endpoints

ModulePrefixDescription
Auth/authLogin, Logout, Sessions, Password flows.
Attendance/attendanceClock in/out, history, summary.
Users/users, /employeesProfile, employee list, user creation.
Dashboard/dashboardsAdmin, HR, finance, heatmap.
Leave/leavesRequests, balances, approval.
Payroll/payrollCalculation, generation, slips.
Superadmin/superadminPlatform-wide analytics & management.

๐Ÿงช Testing and Development Tools

  • Run Tests: go test ./...
  • Build Binary: go build -o ./tmp/main.exe ./cmd/api/main.go
  • Format Code: gofmt -w ./cmd ./internal

๐Ÿ› ๏ธ Troubleshooting

  • Login fails with "JWT secret not configured": Isi JWT_SECRET di .env.
  • Protected route returns "Missing Session": Pastikan cookie access_token terkirim.
  • Swagger tidak muncul di Docker?: Docker menggunakan GIN_MODE=release, ubah jika ingin melihat Swagger.
  • Redis/PostgreSQL Connection Error? Cek REDIS_ADDR dan DB_HOST. Di Docker, gunakan nama service (redis, db).

๐Ÿ“„ License

Proyek ini dilisensikan di bawah MIT License.

Mahardika

Crafting digital experiences with clean code and modern aesthetics. Let's build something amazing together.

LinkedInGitHubEmail

Services

  • Web Development
  • Mobile App Development
  • UI/UX Design
  • System Architecture

Get in Touch

Jakarta, Indonesia

hello@mahardika.dev

ยฉ 2026 Mahardika Kessuma Denie. All rights reserved.

Privacy PolicyTerms of Service