10
API Spec dan Daftar Endpoint
Spesifikasi API repository ini berada di satu berkas, api/api-spec.json:1-121. Berkas itu memakai openapi 3.0.3, info.title "Golang Clean Architecture", info.version "1.0.0", dan satu servers ke http://localhost:3000. Blok paths mendeklarasikan lima belas operasi pada lima path, terbagi rata ke tiga tag: User API, Contact API, dan Address API (api/api-spec.json:13-10602).
Pemetaan tag ke handler
Satu tag di api/api-spec.json berpasangan dengan satu controller di internal/delivery/http. Tag User API berisi lima operasi yang dilayani UserController, tag Contact API lima operasi ContactController, dan tag Address API lima operasi AddressController (internal/delivery/http/route/route.go:17-433).
graph LR
TU["tag: User API"] --> UC["UserController"]
TC["tag: Contact API"] --> CC["ContactController"]
TA["tag: Address API"] --> AC["AddressController"]
TU --> RM["model.RegisterUserRequest"]
TC --> SM["model.SearchContactRequest"]
TA --> DM["model.CreateAddressRequest"]
UC --> UM["model.UserResponse"]
CC --> CM["model.ContactResponse"]
AC --> AM["model.AddressResponse"]
style TU fill:#f59e0b,color:#000
style TC fill:#f59e0b,color:#000
style TA fill:#f59e0b,color:#000
style UC fill:#2d7d46,color:#fff
style CC fill:#2d7d46,color:#fff
style AC fill:#2d7d46,color:#fff
style RM fill:#8b5cf6,color:#fff
style SM fill:#8b5cf6,color:#fff
style DM fill:#8b5cf6,color:#fff
style UM fill:#8b5cf6,color:#fff
style CM fill:#8b5cf6,color:#fff
style AM fill:#8b5cf6,color:#fff
%% fig: Tag API ke controller dan schema model
%% desc: Tiga tag OpenAPI memetakan ke tiga controller Fiber, dan tiap controller memakai satu pasangan schema request serta response dari package model.Schema yang dipakai controller bisa dilacak ke package model. RegisterUserRequest mewajibkan id, name, dan password dengan batas max=100 (internal/model/user_model.go:15-194), sama dengan daftar required di spesifikasi (api/api-spec.json:14-445). UserResponse punya field token (internal/model/user_model.go:3-96); field itu hanya muncul di response login (api/api-spec.json:146-1587). SearchContactRequest memuat Name, Email, Phone, Page, dan Size (internal/model/contact_model.go:31-388), yang datang dari query parameter name, phone, email, page dengan default 1, dan size dengan default 10 (api/api-spec.json:369-4119). Untuk address, CreateAddressRequest memakai street, city, province, postal_code, dan country (internal/model/address_model.go:19-2710), persis seperti request body di spesifikasi (api/api-spec.json:668-69111).
Daftar endpoint
| Method | Path | Tag | Handler | Request | data pada response |
|---|---|---|---|---|---|
| POST | /api/users | User API | UserController.Register | RegisterUserRequest | UserResponse |
| POST | /api/users/_login | User API | UserController.Login | LoginUserRequest | UserResponse berisi token |
| DELETE | /api/users | User API | UserController.Logout | – | boolean |
| GET | /api/users/_current | User API | UserController.Current | – | UserResponse |
| PATCH | /api/users/_current | User API | UserController.Update | UpdateUserRequest | UserResponse |
| GET | /api/contacts | Contact API | ContactController.List | query name, phone, email, page, size | []ContactResponse + paging |
| POST | /api/contacts | Contact API | ContactController.Create | CreateContactRequest | ContactResponse |
| GET | /api/contacts/{contactId} | Contact API | ContactController.Get | – | ContactResponse |
| PUT | /api/contacts/{contactId} | Contact API | ContactController.Update | UpdateContactRequest | ContactResponse |
| DELETE | /api/contacts/{contactId} | Contact API | ContactController.Delete | – | boolean |
| GET | /api/contacts/{contactId}/addresses | Address API | AddressController.List | – | []AddressResponse |
| POST | /api/contacts/{contactId}/addresses | Address API | AddressController.Create | CreateAddressRequest | AddressResponse |
| GET | /api/contacts/{contactId}/addresses/{addressId} | Address API | AddressController.Get | – | AddressResponse |
| PUT | /api/contacts/{contactId}/addresses/{addressId} | Address API | AddressController.Update | UpdateAddressRequest | AddressResponse |
| DELETE | /api/contacts/{contactId}/addresses/{addressId} | Address API | AddressController.Delete | – | boolean |
Seluruh pasangan path dan handler di tabel di atas berasal dari route.go (internal/delivery/http/route/route.go:17-433). Spesifikasi menulis path parameter dengan kurung kurawal, misalnya {contactId} dan {addressId} (api/api-spec.json:474-49712), sedangkan route.go memakai sintaks Fiber :contactId dan :addressId (internal/delivery/http/route/route.go:27-4313). Operasi address yang menyentuh satu alamat membawa dua path parameter sekaligus (api/api-spec.json:833-86314).
Operasi publik dan operasi bertoken
graph TD
R["request HTTP"] --> S["RouteConfig.Setup"]
S --> G["SetupGuestRoute"]
S --> A["SetupAuthRoute"]
G --> G1["POST /api/users"]
G --> G2["POST /api/users/_login"]
A --> MW["middleware.NewAuth"]
MW --> OK["ctx.Locals auth"]
MW --> NO["fiber.ErrUnauthorized"]
OK --> H["13 route terproteksi"]
style S fill:#f59e0b,color:#000
style MW fill:#f59e0b,color:#000
style G1 fill:#2d7d46,color:#fff
style G2 fill:#2d7d46,color:#fff
style OK fill:#2d7d46,color:#fff
style H fill:#2d7d46,color:#fff
style NO fill:#dc2626,color:#fff
%% fig: Pembagian route publik dan route bertoken
%% desc: Dua route didaftarkan sebelum middleware auth dipasang, sedangkan tiga belas route lain baru aktif setelah middleware memverifikasi header Authorization.SetupGuestRoute mendaftarkan POST /api/users dan POST /api/users/_login sebelum c.App.Use(c.AuthMiddleware) dipasang, sehingga keduanya terbuka (internal/delivery/http/route/route.go:17-2515). Tiga belas route sisanya baru didaftarkan setelah middleware (internal/delivery/http/route/route.go:27-4313). Middleware membaca header lewat ctx.Get("Authorization", "NOT_FOUND") dan mengembalikan fiber.ErrUnauthorized ketika Verify gagal (internal/delivery/http/middleware/auth_middleware.go:10-2416).
Spesifikasi mengikuti pembagian itu dengan mengulang parameter header Authorization bertipe in: header dan required: true pada setiap operasi terproteksi, misalnya logout (api/api-spec.json:77-10917) dan get current user (api/api-spec.json:162-17718). Operasi register tidak punya blok parameters sama sekali (api/api-spec.json:14-445).
Amplop response
Response sukses memakai model.WebResponse[T] dengan field data, paging (opsional), dan errors (opsional) (internal/model/model.go:3-1919). paging hanya dideklarasikan pada GET /api/contacts, dengan page, size, total_item, dan total_page (api/api-spec.json:449-46520); bentuk itu sama dengan model.PageMetadata di berkas model yang sama (internal/model/model.go:3-1919).
⚠️ api/api-spec.json hanya mendeklarasikan
responses200, tanpa schema error, dan berkas ditutup tanpa blokcomponents(api/api-spec.json:1059-106121). Bentuk error sebenarnya ditentukanNewErrorHandler, yang mengembalikan body{"errors": ...}dengan status diambil dari*fiber.Errorbila error itu bertipe demikian (internal/config/fiber.go:18-2822). Beberapadescriptionjuga sisa salin-tempel:GET /api/users/_currentmasih tertulis "Success register new user" (api/api-spec.json:178-20823).