Go Attendance API
Multi-tenant HR and attendance backend built with Go, Gin, GORM, PostgreSQL, and Redis.
On this page
- ๐ Table of Contents
- โจ Main Features
- ๐๏ธ Architecture Overview
- ๐ Project Structure
- โ๏ธ System Requirements
- ๐ Environment Variables
- ๐ Running the Project
- ๐๏ธ Database, Migration, and Seeder
- ๐ Swagger
- ๐ Authentication and Security Headers
- ๐ Main Endpoints
- ๐งช Testing and Development Tools
- ๐ ๏ธ Troubleshooting
- ๐ License
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
- Architecture Overview
- Project Structure
- System Requirements
- Environment Variables
- Running the Project
- Database, Migration, and Seeder
- Swagger
- Authentication and Security Headers
- Main Endpoints
- Testing and Development Tools
- Troubleshooting
โจ 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
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
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:
cp .env.example .env
| Variable | Example | Description |
|---|---|---|
APP_PORT | 8085 | Port HTTP yang digunakan API. |
APP_ENV | development | Jika development, anti-replay dan internal secret checks dilewati. |
DB_HOST | 127.0.0.1 | Host PostgreSQL. Gunakan db di Docker Compose. |
DB_PORT | 5432 | Port PostgreSQL. |
DB_USER | postgres | Username PostgreSQL. |
DB_PASSWORD | 1234 | Password PostgreSQL. |
DB_NAME | attendance-db | Nama database PostgreSQL. |
REDIS_ADDR | 127.0.0.1:6379 | Alamat Redis. Gunakan redis:6379 di Docker Compose. |
JWT_SECRET | change-me | Secret untuk tanda tangan token JWT. |
RUN_MIGRATION | true | Menjalankan GORM AutoMigrate saat startup. |
RUN_SEEDER | false | Menjalankan seeder saat startup. |
๐ Running the Project
Option 1: Local Development ๐ป
- Pastikan PostgreSQL dan Redis menyala.
- Atur
.env(lihat bagian sebelumnya). - Jalankan:
bash
go mod download go run ./cmd/api/main.go - Dengan Hot Reload:
bash
air
Option 2: Docker Compose ๐ณ
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:
- Membuat ekstensi
uuid-osspdi PostgreSQL. - Menjalankan migrasi bertahap berdasarkan dependensi model.
- Seed paket langganan dasar.
- Backfill tenant dan payroll profil yang belum ada.
- 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:
swag init -g cmd/api/main.go
๐ Authentication and Security Headers
Public Routes:
POST /api/v1/auth/loginGET /api/v1/ping
Protected Routes: memerlukan cookie:
Cookie: access_token=<jwt>
Jika APP_ENV bukan development, memerlukan header tambahan:
X-Timestamp: Unix millisecondsX-Request-ID: Unique request IDX-Internal-Secret:<INTERNAL_SECRET>X-Signature: HMAC SHA256 (Request body + timestamp + request ID)
๐ Main Endpoints
| Module | Prefix | Description |
|---|---|---|
| Auth | /auth | Login, Logout, Sessions, Password flows. |
| Attendance | /attendance | Clock in/out, history, summary. |
| Users | /users, /employees | Profile, employee list, user creation. |
| Dashboard | /dashboards | Admin, HR, finance, heatmap. |
| Leave | /leaves | Requests, balances, approval. |
| Payroll | /payroll | Calculation, generation, slips. |
| Superadmin | /superadmin | Platform-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_SECRETdi.env. - Protected route returns "Missing Session": Pastikan cookie
access_tokenterkirim. - Swagger tidak muncul di Docker?: Docker menggunakan
GIN_MODE=release, ubah jika ingin melihat Swagger. - Redis/PostgreSQL Connection Error? Cek
REDIS_ADDRdanDB_HOST. Di Docker, gunakan nama service (redis,db).
๐ License
Proyek ini dilisensikan di bawah MIT License.