Garment.id
🇺🇸 English
  • 🇮🇩 Indonesian
  • 🇺🇸 English
Home
Core APITenant APISupport CenterChangelog
Home
Core APITenant APISupport CenterChangelog
Github
Instagram
|
🇺🇸 English
  • 🇮🇩 Indonesian
  • 🇺🇸 English
🇺🇸 English
  • 🇮🇩 Indonesian
  • 🇺🇸 English
  1. Home
  • Introduction
  • 01 - Project Structure
  • 02 - Context Boundaries
  • 03 - Central Auth Runtime
  • 04 - Central Billing
  • 05 - Tenant Runtime
  • 06 - FE Integration Contracts
  • 07 - Security, Middleware, and RLS
  • 08 - Events, Jobs, Listeners, Notifications, Observers
  • 09 - Testing and Quality Gates
  • 10 - Operations Runbook
  • 11 - Architecture Decisions (ADR Ringkas)
  • 12 - API Endpoint Catalog (v1)
  • 13 - Class Catalog by Context
  • 14 - Feature Development Playbook
  • 15 - Migration and Model Conventions
  • 16 - Service, Support, and Trait Contracts
  • 17 - Auth Business Scenarios and Decision Tree
  • 18 - Config Reference and Impact
  • 19 - Migration and Model Cookbook
  • 20 - Billing and Provisioning Business Flows
  • 21 - FE Error Handling Matrix
  • 22 - Incident Playbooks
  • 23 - Data Ownership Matrix
  • 24 - Documentation Governance and Changelog
  • 25 - Tenant Authorization Backend Guide
Home
Core APITenant APISupport CenterChangelog
Home
Core APITenant APISupport CenterChangelog
Github
Instagram
|
🇺🇸 English
  • 🇮🇩 Indonesian
  • 🇺🇸 English
🇺🇸 English
  • 🇮🇩 Indonesian
  • 🇺🇸 English
  1. Home

11 - Architecture Decisions (ADR Ringkas)

Dokumen ini menyimpan keputusan arsitektur penting agar tidak hilang saat refactor berikutnya.

ADR-001: Context Split (Central vs Tenant vs Shared)#

Status: Accepted
Tanggal: 2026-02-26
Keputusan:
Pisahkan codebase berdasarkan context:
Central untuk auth global, tenant registry, billing platform/public.
Tenant untuk runtime tenant-scoped.
Shared untuk reusable logic lintas context.
Dampak:
navigasi file lebih jelas.
onboarding dev lebih cepat.
risiko mixing responsibility berkurang.

ADR-002: Auth Identity Tetap Central#

Status: Accepted
Tanggal: 2026-02-26
Keputusan:
User identity, token issuance, refresh token, session auth core tetap di central DB.
Alasan:
satu sumber identitas global.
konsisten untuk multi-tenant login flow.
Dampak:
endpoint auth tetap di central route.
tenant context dipilih setelah login via select-tenant.

ADR-003: Authz Resolver Dual Context#

Status: Accepted
Tanggal: 2026-02-26
Keputusan:
AuthorizationResolver resolve authz dari:
tenant RBAC table saat user ada di tenant context.
central RBAC table untuk platform admin.
Alasan:
tenant bisa punya role/permission berbeda per SOP tenant.
platform admin tetap independen.
Dampak:
GET /auth/me memuat authz.roles dan authz.permissions kontekstual.

ADR-004: Tenant Model Connection via Trait#

Status: Accepted
Tanggal: 2026-02-26
Keputusan:
Model tenant menggunakan trait HasTenantClusterConnection.
Resolver koneksi otomatis lewat TenantClusterResolver::resolveConnectionForCurrentTenant().
Alasan:
penggunaan Eloquent tetap natural (Model::query()).
mengurangi boilerplate resolve connection di tiap service/controller.
Dampak:
dev cukup memastikan middleware tenant context aktif.

ADR-005: Tenant Context Middleware as Source of Runtime Context#

Status: Accepted
Tanggal: 2026-02-26
Keputusan:
SetTenantContext jadi sumber context runtime tenant/user.
ValidateTenantToken enforce tenant token integrity.
Alasan:
konsisten untuk authz, RLS, dan query isolation.
Dampak:
route tenant wajib middleware stack tenant.

ADR-006: RLS-Driven Isolation#

Status: Accepted
Tanggal: 2026-02-26
Keputusan:
Set postgres session config app.current_tenant_id dan app.current_user_id di central + cluster tenant.
RLS policy menjadi garis pertahanan utama isolasi data.
Alasan:
menurunkan risiko kebocoran karena query lupa filter tenant.
Dampak:
explicit filter tenant di query tidak selalu wajib, tapi tetap boleh untuk clarity.

ADR-007: Event Discovery via bootstrap/app.php#

Status: Accepted
Tanggal: 2026-02-26
Keputusan:
Listener diregister lewat event discovery:
withEvents(discover: [app/Listeners])
Alasan:
kurangi registrasi listener manual yang mudah drift.
Dampak:
listener baru cukup ditempatkan di folder app/Listeners sesuai namespace.

ADR-008: Provisioning Default Data via Domain Event#

Status: Accepted
Tanggal: 2026-02-26
Keputusan:
provisioning default subscription dan taxonomy dijalankan via listener saat TenantCreated.
Alasan:
pisahkan orchestration provisioning dari controller CRUD runtime.
Dampak:
onboarding tenant konsisten.
controller tenant master data tetap fokus ke CRUD lokal tenant.

ADR-009: Route Composition by Context#

Status: Accepted
Tanggal: 2026-02-26
Keputusan:
api-v1.php hanya include central.php dan tenant.php.
detail route dipecah per file domain context.
Alasan:
maintainability route jangka panjang.
Dampak:
perubahan endpoint harus dilakukan di file context yang tepat.

ADR-010: API Envelope Standardized#

Status: Accepted
Tanggal: 2026-02-26
Keputusan:
semua API response memakai ApiResponse envelope standar.
Alasan:
kontrak FE stabil.
observability (request_id) konsisten.
Dampak:
controller wajib gunakan helper trait/ApiResponse.

ADR-011: Tenant Provisioning Centralized via Orchestrator#

Status: Accepted
Tanggal: 2026-02-25
Keputusan:
semua provisioning tenant dijalankan lewat TenantProvisioningOrchestrator.
daftar provisioner berasal dari config/tenancy.php (provisioning.provisioners).
listener provisioning dijalankan asynchronous dan afterCommit agar tidak blocking register flow.
Alasan:
mencegah duplikasi path provisioning antar service/listener.
memudahkan scale provisioning per domain (taxonomy, uom, color, dst) dengan pola seragam.
memastikan transaksi register tenant selesai commit sebelum write ke tenant cluster.
Dampak:
command re-run standar: tenant:provision.
onboarding lebih stabil untuk proses berat.
extension point provisioning terdokumentasi dan testable.

Decision Dependency Map#

Class and File References#

Route composition:
routes/api-v1.php
routes/central.php
routes/tenant.php
Auth + authz:
app/Http/Controllers/Api/V1/Central/Auth/MeController.php
app/Services/Central/Auth/AuthorizationResolver.php
Tenant connection:
app/Traits/HasTenantClusterConnection.php
app/Support/Tenancy/TenantClusterResolver.php
Middleware context:
app/Http/Middleware/Tenant/Context/SetTenantContext.php
app/Http/Middleware/Tenant/Context/ValidateTenantToken.php
app/Http/Middleware/Tenant/Context/RequireTenantContext.php
Event discovery + listeners:
bootstrap/app.php
app/Listeners/Central/*
Provisioning:
app/Services/Central/Tenancy/Provisioning/TenantProvisioningOrchestrator.php
app/Services/Central/Tenancy/Provisioning/TenantProvisioner.php
app/Console/Commands/ProvisionTenantCommand.php
Diubah pada 2026-03-03 22:25:30
Sebelumnya
10 - Operations Runbook
Berikutnya
12 - API Endpoint Catalog (v1)
Built with