R.RAFI BAKHTIAR
SOFTWARE ENGINEER
TERBUKA UNTUK KERJA CV ↗
← KEMBALI KE PROYEK

PROYEK 01 · APLIKASI FULL-STACK

Attenda.
Absensi, tertata.

attenda / overview

Overview

EMPLOYEESTeam overview
ATTENDANCEDaily records
MANAGEMENTAccount status
EMPLOYEEDATESTATUS
JENIS PROYEKProyek belajar full-stack
PERANFull-stack developer
STACKReact · Go · Echo · GORM · MySQL

01 / LATAR BELAKANG

Absensi membutuhkan struktur.

Mencatat absensi hanyalah sebagian dari kebutuhan. Karyawan memerlukan cara sederhana untuk mencatat waktu kerja, dan admin memerlukan satu tempat untuk mengelola akses serta meninjau data. Saya membangun Attenda untuk berlatih autentikasi, akses berbasis peran, dan pemisahan yang rapi antara frontend dan backend.

02 / FITUR

Dua peran,
tanggung jawab yang jelas.

01

Clock-in dan clock-out

Karyawan mencatat satu clock-in dan satu clock-out per hari. Status tepat waktu sampai 08.00 WIB dan terlambat sesudahnya ditentukan otomatis.

02

Dashboard pribadi

Persentase tepat waktu, absensi terbaru, dan riwayat absensi yang bisa dicari.

03

Kelola karyawan

Admin membuat akun karyawan dan mengaktifkan atau menonaktifkannya. Akun nonaktif langsung kehilangan akses.

04

Data absensi

Admin melihat ringkasan hari ini dan menelusuri semua data, dengan pencarian nama karyawan dan filter status.

05

Aman sejak awal

Password bcrypt, JWT HS256, middleware peran, validasi input, dan pembatasan laju pada login dan register.

06

Tes dan CI

Tes Go untuk JWT, aturan terlambat, validasi, dan middleware admin. GitHub Actions menjalankan format, vet, test, lint, dan build.

TANGKAPAN LAYAR

Tampilan aplikasi.

Dashboard karyawan Attenda yang menampilkan persentase tepat waktu dan absensi terbaru
Dashboard karyawan: clock-in dan clock-out, persentase tepat waktu, dan absensi terbaru.
Halaman riwayat absensi Attenda dengan total dan kotak pencarian
Riwayat absensi dengan total dan pencarian.
Dashboard admin Attenda dengan ringkasan absensi hari ini
Dashboard admin: ringkasan absensi hari ini.
Halaman kelola karyawan Attenda tempat admin mencari, menambah, dan menonaktifkan akun
Kelola karyawan: mencari, menambah, dan menonaktifkan akun.
Halaman data absensi Attenda yang difilter berdasarkan nama dan status
Semua data absensi, difilter berdasarkan nama dan status.
Halaman login Attenda
Halaman login.

ENDPOINT API

API sekilas.

METHODPATHAKSESCATATAN
GET /health Publik Memeriksa kesehatan API dan database.
POST /register Publik Membuat akun karyawan. Peran tidak bisa dipilih oleh klien.
POST /login Publik Mengembalikan JWT. Dibatasi per IP.
GET /profile Perlu login Pengguna yang sedang login.
POST /clock-in Perlu login Mencatat clock-in hari ini. Status on_time atau late ditentukan oleh server.
POST /clock-out Perlu login Mencatat clock-out hari ini.
GET /attendance/history Perlu login Riwayat absensi milikmu, terbaru lebih dulu.
GET /admin/employees Khusus admin Daftar karyawan.
POST /admin/employees Khusus admin Membuat akun karyawan.
PATCH /admin/employees/:id/status Khusus admin Mengaktifkan atau menonaktifkan karyawan.
GET /admin/attendances Khusus admin Semua data absensi.

KEPUTUSAN DESAIN

Pilihan yang saya ambil, beserta alasannya.

01

Akun diperiksa pada setiap request

Middleware autentikasi memuat pengguna dari database setiap kali. Akun yang dinonaktifkan, atau yang perannya berubah, langsung kehilangan akses dan tidak menunggu JWT kedaluwarsa.

02

Database mencegah clock-in ganda

Unique index pada pengguna dan tanggal menolak clock-in kedua di hari yang sama, bahkan ketika dua request datang bersamaan. Handler mengubah error duplicate-entry MySQL 1062 menjadi respons yang jelas.

03

Peran tidak pernah dipilih oleh klien

Pendaftaran publik selalu membuat karyawan. Akun admin hanya berasal dari perintah seed, dan route admin berada di balik middleware autentikasi sekaligus middleware admin.

04

Terlambat ditentukan server, dengan waktu Jakarta

Clock-in setelah pukul 08.00 WIB dianggap terlambat. Batas waktu dihitung di server dengan zona Asia/Jakarta, jadi tidak bergantung pada jam perangkat, dan aturannya dicakup unit test.

05

Dasar autentikasi dikunci

Password memakai bcrypt. Token harus HS256 dan ditolak jika tidak, server menolak autentikasi tanpa secret JWT, login dan register dibatasi lajunya, dan server memiliki timeout baca, tulis, serta idle.

03 / PERBAIKAN BERIKUTNYA

Yang akan saya kerjakan berikutnya.

Menyimpan JWT di cookie httpOnly dengan refresh token, bukan di localStorage; menambahkan pagination pada daftar admin; memakai migrasi berversi, bukan AutoMigrate; dan menambah tes integrasi yang berjalan di database sungguhan.

DISKUSIKAN PROYEK INI ↗ PROYEK BERIKUTNYA: TASK API ↗