# Cardverse API Cardverse adalah backend API RESTful berkinerja tinggi untuk aplikasi trading card / Pokemon TCG, dibangun menggunakan **Go + Gin Framework**, PostgreSQL (GORM), JWT Authentication, Refresh Token Rotation, Google OAuth, serta manajemen aset media statis. Disusun dengan arsitektur **per-module** (*modular monolith*) sehingga bersih, teruji (*testable*), dan mudah dikembangkan secara berkelanjutan. > Aturan penulisan kode, konvensi penamaan, dan clean code best practice ada di [`CONVENTION.md`](./CONVENTION.md). --- ## ๐Ÿ“ Struktur Folder Project ``` cardverse/ โ”œโ”€โ”€ cmd/ โ”‚ โ”œโ”€โ”€ api/ โ”‚ โ”‚ โ””โ”€โ”€ main.go # Entry point server HTTP API โ”‚ โ””โ”€โ”€ seed/ โ”‚ โ””โ”€โ”€ main.go # Entry point seeder data master โ”œโ”€โ”€ config/ โ”‚ โ””โ”€โ”€ config.go # Memuat environment variables (.env) โ”œโ”€โ”€ internal/ โ”‚ โ”œโ”€โ”€ database/ โ”‚ โ”‚ โ”œโ”€โ”€ database.go # Koneksi DB PostgreSQL + AutoMigrate GORM โ”‚ โ”‚ โ””โ”€โ”€ seeder.go # Seed data master (Series, Sets, Cards, Admin) โ”‚ โ”œโ”€โ”€ middleware/ โ”‚ โ”‚ โ”œโ”€โ”€ auth.go # Auth middleware (JWT + RequireRoles) โ”‚ โ”‚ โ”œโ”€โ”€ cors.go # CORS middleware โ”‚ โ”‚ โ”œโ”€โ”€ logger.go # Request logger dengan auto-redact data sensitif โ”‚ โ”‚ โ””โ”€โ”€ rate_limiter.go # Rate limiter per-IP (Token Bucket) โ”‚ โ”œโ”€โ”€ modules/ # Modular domain features โ”‚ โ”‚ โ”œโ”€โ”€ auth/ # Login, Register, Google OAuth, Refresh Token, Reset Password โ”‚ โ”‚ โ”œโ”€โ”€ user/ # Profile, Avatar Upload, Admin User Management โ”‚ โ”‚ โ”œโ”€โ”€ seriessetmaster/ # Data Master Series & Set Expansion โ”‚ โ”‚ โ””โ”€โ”€ cardmaster/ # Data Master Kartu TCG (HP, Attacks, Battle, Element) โ”‚ โ”œโ”€โ”€ router/ โ”‚ โ”‚ โ””โ”€โ”€ router.go # Pendaftaran route module & static file serving โ”‚ โ””โ”€โ”€ pkg/ # Utility & Helper generik โ”‚ โ”œโ”€โ”€ response/ # Format JSON response standar + pagination โ”‚ โ”œโ”€โ”€ logger/ # Logger terpusat โ”‚ โ”œโ”€โ”€ validator/ # Error translator validasi DTO per-field โ”‚ โ””โ”€โ”€ utils/ # JWT, Hash Password, String Slug/Underscore, Image/File utils โ”œโ”€โ”€ public/ # Penyimpanan Aset Gambar & Media Statis โ”‚ โ”œโ”€โ”€ images/ โ”‚ โ”‚ โ”œโ”€โ”€ avatars/ # Foto profil user โ”‚ โ”‚ โ”œโ”€โ”€ series/ # Banner/gambar Series โ”‚ โ”‚ โ”œโ”€โ”€ elements/ # Ikon elemen kartu (Grass, Fire, Water, dst) โ”‚ โ”‚ โ”œโ”€โ”€ evolusi-mega/ # Gambar kartu seri Evolusi Mega โ”‚ โ”‚ โ”œโ”€โ”€ matahari-bulan/ # Gambar kartu seri Matahari & Bulan โ”‚ โ”‚ โ”œโ”€โ”€ pedang-perisai/ # Gambar kartu seri Pedang & Perisai โ”‚ โ”‚ โ””โ”€โ”€ scarlet-violet/ # Gambar kartu seri Scarlet & Violet โ”œโ”€โ”€ .env.example โ”œโ”€โ”€ CONVENTION.md # Aturan penulisan kode & standar proyek โ”œโ”€โ”€ Makefile # Command shortcuts (dev, test, build, seed) โ”œโ”€โ”€ go.mod โ””โ”€โ”€ README.md ``` --- ## โšก Cara Menjalankan ### 1. Prasyarat - Go 1.22+ - PostgreSQL ### 2. Install Dependency ```bash go mod tidy ``` ### 3. Setup Environment Variables ```bash cp .env.example .env # Sesuaikan kredensial PostgreSQL (DB_NAME=cardverse), JWT Secret, dan GOOGLE_CLIENT_ID di file .env ``` ### 4. Buat Database PostgreSQL Buat database PostgreSQL baru dengan nama **`cardverse`**: ```bash psql -U postgres -c "CREATE DATABASE cardverse;" ``` ### 5. Jalankan Seeder Data Master (Opsional) ```bash go run ./cmd/seed # atau make seed ``` ### 6. Jalankan Server Development ```bash go run ./cmd/api # atau dengan Hot-Reload (Air): make dev ``` Server akan berjalan di `http://localhost:8080`. --- ## ๐Ÿ› ๏ธ Daftar Endpoint API ### Server Health Check (`/health`) | Method | Endpoint | Auth | Deskripsi | | ------ | --------- | :-------: | --------------------------- | | GET | `/health` | โŒ Public | Cek status kesehatan server | ### 1. Authentication Module (`/api/v1/auth`) | Method | Endpoint | Auth | Deskripsi | | ------ | ------------------------------- | :---------: | ----------------------------------------------------------- | | POST | `/api/v1/auth/register` | โŒ Public | Registrasi akun baru (Kirim email konfirmasi) | | POST | `/api/v1/auth/login` | โŒ Public | Login via email & password (mengembalikan Access & Refresh) | | POST | `/api/v1/auth/google` | โŒ Public | Login / Auto-Register via Google OAuth (ID Token) | | POST | `/api/v1/auth/refresh-token` | โŒ Public | Minta Access Token baru & rotate Refresh Token | | POST | `/api/v1/auth/logout` | โŒ Public | Logout & mencabut Refresh Token | | POST | `/api/v1/auth/verify-email` | โŒ Public | Verifikasi email user via token OTP | | POST | `/api/v1/auth/forgot-password` | โŒ Public | Minta token/OTP reset password | | POST | `/api/v1/auth/reset-password` | โŒ Public | Reset password akun | ### 2. User Module (`/api/v1/users`) | Method | Endpoint | Auth | Deskripsi | | ------ | --------------------------- | :-------------------: | ----------------------------------------------------- | | GET | `/api/v1/users/me` | โœ… Logged In | Ambil profil user yang sedang login | | PUT | `/api/v1/users/me` | โœ… Logged In | Update nama profil user | | POST | `/api/v1/users/me/avatar` | โœ… Logged In | Upload file gambar avatar (`multipart/form-data`) | | GET | `/api/v1/users` | ๐Ÿ”’ Admin/Superadmin | Get daftar semua user (Paginasi & Search) | | POST | `/api/v1/users` | ๐Ÿ”’ Admin/Superadmin | Buat user baru | | GET | `/api/v1/users/:id` | ๐Ÿ”’ Admin/Superadmin | Ambil detail user berdasarkan ID | | PUT | `/api/v1/users/:id` | ๐Ÿ”’ Admin/Superadmin | Update data user | | PUT | `/api/v1/users/:id/suspend` | ๐Ÿ”’ Admin/Superadmin | Suspensikan akun user | | PUT | `/api/v1/users/:id/unsuspend`| ๐Ÿ”’ Admin/Superadmin | Cabut suspensi akun user | | DELETE | `/api/v1/users/:id` | ๐Ÿ”’ Admin/Superadmin | Hapus user | ### 3. Series & Set Master Module (`/api/v1/series`, `/api/v1/sets`, `/api/v1/series-set-masters`) | Method | Endpoint | Auth | Deskripsi | | ------ | ------------------------------- | :-------------------: | ----------------------------------------------------- | | GET | `/api/v1/series` | โŒ Public | Get semua Series TCG | | POST | `/api/v1/series` | ๐Ÿ”’ Admin/Superadmin | Buat Series TCG baru | | PUT | `/api/v1/series/:id` | ๐Ÿ”’ Admin/Superadmin | Update Series TCG & gambar | | GET | `/api/v1/sets` | โŒ Public | Get semua Expansion Set (Filter by search/parent_id) | | GET | `/api/v1/sets/code/:code` | โŒ Public | Get detail Set berdasarkan `set_code` (misal `M-P`) | | POST | `/api/v1/sets` | ๐Ÿ”’ Admin/Superadmin | Buat Expansion Set baru | | PUT | `/api/v1/sets/:id` | ๐Ÿ”’ Admin/Superadmin | Update Expansion Set & gambar | | GET | `/api/v1/series-set-masters/:id`| โŒ Public | Get detail Series/Set Master berdasarkan ID | | DELETE | `/api/v1/series-set-masters/:id`| ๐Ÿ”’ Admin/Superadmin | Hapus Series/Set Master berdasarkan ID | ### 4. Card Master Module (`/api/v1/cards`) | Method | Endpoint | Auth | Deskripsi | | ------ | ----------------------- | :-------------------: | ----------------------------------------------------- | | GET | `/api/v1/cards` | โŒ Public | Get daftar kartu TCG (Paginasi, Filter & Search) | | GET | `/api/v1/cards/elements`| โŒ Public | Get daftar tipe elemen kartu (Fire, Water, Grass, dll)| | GET | `/api/v1/cards/:id` | โŒ Public | Get detail kartu TCG berdasarkan ID | | POST | `/api/v1/cards` | ๐Ÿ”’ Admin/Superadmin | Buat data kartu master baru | | PUT | `/api/v1/cards/:id` | ๐Ÿ”’ Admin/Superadmin | Update data kartu master | | DELETE | `/api/v1/cards/:id` | ๐Ÿ”’ Admin/Superadmin | Hapus data kartu master | --- ## ๐Ÿ”’ Otentikasi & Header Untuk endpoint yang memerlukan otentikasi (`Auth Required`), sertakan Access Token pada HTTP Header: ```http Authorization: Bearer ``` --- ## ๐Ÿงช Menjalankan Unit Test Proyek ini dilengkapi dengan unit test menyeluruh (menggunakan *mock repository* tanpa memerlukan database asli saat testing): ```bash # Jalankan semua unit test go test ./... # Jalankan test dengan detail & coverage go test ./... -v -cover # Shortcut Makefile make test ``` --- ## ๐Ÿ“„ Lisensi ยฉ Cardverse Development Team. Hak Cipta Dilindungi Undang-Undang.