fix: remove duplicate clean-code.md — only keep the symlink to kana-best-practice-engineering
This commit is contained in:
@@ -1,58 +0,0 @@
|
|||||||
---
|
|
||||||
name: clean-code
|
|
||||||
description: Clean Code, Clean Architecture, SOLID principles untuk proyek Asepharyana Hub
|
|
||||||
---
|
|
||||||
|
|
||||||
# Clean Code — Asepharyana Hub
|
|
||||||
|
|
||||||
## Prinsip Dasar
|
|
||||||
|
|
||||||
### 1. Naming
|
|
||||||
- **Gunakan nama yang mengungkapkan intensi**: `calculateTotal`, `fetchAnimeData`, `ImageCacheRepository` — bukan `calc`, `getData`, `Repo`.
|
|
||||||
- **Boolean prefix** dengan `is`, `has`, `should`: `isHealthy`, `hasPoster`, `shouldRetry`.
|
|
||||||
- **Hindari singkatan** kecuali sangat umum (`config`, `url`, `db`).
|
|
||||||
|
|
||||||
### 2. Fungsi
|
|
||||||
- **Satu fungsi = satu tanggung jawab**. Max 20 baris.
|
|
||||||
- **Nama fungsi sebagai kata kerja**: `validateToken()`, `cacheImage()`.
|
|
||||||
- **Parameter minimal**: max 3 parameter. Lebih dari itu bungkus jadi struct/object.
|
|
||||||
|
|
||||||
### 3. Clean Architecture Layers
|
|
||||||
|
|
||||||
```
|
|
||||||
Domain → Entities, Repository traits, Error enums
|
|
||||||
Application → Use cases
|
|
||||||
Infrastructure → Implementasi konkret (SeaORM, Redis, HTTP clients)
|
|
||||||
Presentation → Axum handlers, DTOs, middleware
|
|
||||||
```
|
|
||||||
|
|
||||||
Dependency rule: **kode layer dalam tidak tahu tentang layer luar**. Domain gak import framework.
|
|
||||||
|
|
||||||
### 4. Error Handling
|
|
||||||
- **Gunakan `thiserror`** untuk domain errors, bukan `anyhow` untuk library code.
|
|
||||||
- **`anyhow` hanya untuk** binary/app entry point dan test.
|
|
||||||
- **Convert domain errors ke HTTP** di presentation layer, bukan di use case.
|
|
||||||
|
|
||||||
### 5. Testing
|
|
||||||
- **TDD mindset**: tulis test sebelum implementasi untuk logic bisnis.
|
|
||||||
- **Unit test untuk use case + domain** (tanpa infra).
|
|
||||||
- **Integration test untuk repository** (dengan test container).
|
|
||||||
- **Mock trait**, bukan struct konkret.
|
|
||||||
|
|
||||||
## Untuk Proyek Ini
|
|
||||||
|
|
||||||
### Scraper Service (Rust)
|
|
||||||
- `src/domain/` — tipe data murni, trait, error — **tanpa framework**
|
|
||||||
- `src/application/` — use cases, orchestrasi, **tanpa HTTP**
|
|
||||||
- `src/infrastructure/` — implementasi repository, cache, HTTP client
|
|
||||||
- `src/presentation/` — handler Axum, routing, middleware
|
|
||||||
|
|
||||||
### Event-Driven (Dapr + NATS)
|
|
||||||
- Event schema pake CloudEvents format
|
|
||||||
- Topic naming: `hub.<domain>.<action>` (e.g. `hub.image.cached`)
|
|
||||||
- Handler hanya untuk satu tipe event, pisah file per domain
|
|
||||||
|
|
||||||
### Infra Config (YAML)
|
|
||||||
- Satu compose file per service
|
|
||||||
- Networking via `app-shared-net`
|
|
||||||
- Image tag selalu `sha-<short-sha>`, bukan `latest` di production
|
|
||||||
Reference in New Issue
Block a user