docs(refactor): complete admin service migration
This commit is contained in:
@@ -12,7 +12,7 @@ Multi-service monorepo for the Darano financial/crypto platform. Each subdirecto
|
||||
| `auth/` | Go (gRPC) | Authorization — OTP, JWT, permissions, identity |
|
||||
| `wallet/` | Go (gRPC) | Wallet — assets, transactions, Stellar blockchain, market |
|
||||
| `ui/` | TypeScript/Next.js | Customer-facing frontend |
|
||||
| `AdminPanel/` | Python/Django | Internal admin panel (bypasses api, hits Postgres directly) |
|
||||
| `AdminPanel/` | Python/Django | Internal admin: direct SQL reads, authenticated service-owned writes |
|
||||
| `proto/` | Protobuf | Central schema definitions shared by all services |
|
||||
| `DevOps/` | Docker Compose | Infrastructure — Postgres, Redis, RabbitMQ, MinIO, Traefik |
|
||||
| `docs/` | MkDocs | Documentation site |
|
||||
@@ -23,7 +23,8 @@ Multi-service monorepo for the Darano financial/crypto platform. Each subdirecto
|
||||
|
||||
```
|
||||
Browser/Client → api (REST/HTTP) → auth, wallet/market/alert (gRPC)
|
||||
AdminPanel ──────────────────────→ Postgres directly (bypasses api)
|
||||
AdminPanel ──reads───────────────→ Postgres
|
||||
AdminPanel ──authenticated gRPC──→ wallet (asset administration)
|
||||
```
|
||||
|
||||
The `api` gateway is the **only** HTTP-facing service. All inter-service communication is gRPC.
|
||||
@@ -198,15 +199,14 @@ All Go services instrumented with Elastic APM and Prometheus metrics. Traefik ha
|
||||
|
||||
## AdminPanel Deep Dive
|
||||
|
||||
- **Architecture**: Django admin panel that bypasses all Go backend services. Connects directly to `core_db` (same Postgres as Go services) for read/write. Uses Django DB routers in `src/adminpanel/db/routers.py` to route `coreLogic` models to `core_db` and other apps to `default`.
|
||||
- **Architecture**: Django admin panel that reads `core_db` directly for fast projections. Unmanaged models are read-only by default; the Assets admin sends authenticated typed commands to Wallet instead of writing the database. Django DB routers route `coreLogic` reads to `core_db` and other apps to `default`.
|
||||
- **Models**: `src/coreLogic/models.py` contains `managed = False` Django models — manual replicas of Go GORM models generated via `inspectdb`. **Not auto-generated from protos.** `make proto` generates betterproto Python stubs separately but Django models are maintained by hand. **Never edit models.py manually** — it drifts from Go services.
|
||||
- **Admin classes**: `src/coreLogic/admin/` — 17 admin files (`asset.py`, `wallets.py`, `market.py`, etc.). All inherit from `MultiDBModelAdmin` in `src/utils/base_admin.py` which handles: multi-database writes (`using="core_db"`), soft deletes via `deleted_at`, asset-level permission filtering, and Jalali date widgets.
|
||||
- **Permission system**: `src/usermapper/user_perm.py` + `src/coreLogic/acl.py` — admin users get asset-level access control. `save_model` checks `user_perm.can_access_asset()` before allowing writes.
|
||||
- **Key gotchas**:
|
||||
- `check_token_policy()` in `admin/asset.py:161` duplicates validation from wallet service. Changes to asset validation must be made in **both** places.
|
||||
- `GENERIC_ASSET_META_VALUE` in `admin/asset.py:31` is a hardcoded JSON blob — if the wallet service changes asset metadata structure, this must be updated too.
|
||||
- The router has a typo: `no_migartion` → should be `no_migration`.
|
||||
- All `coreLogic` models are read via `core_db` directly. **Any admin write bypasses Go services** — no trustline updates, no blockchain operations, no validation from wallet/market services.
|
||||
- Asset policy and default metadata are owned by Wallet's `application/adminasset`; do not recreate them in Django.
|
||||
- The Wallet admin client requires matching AdminPanel `WALLET_ADMIN_GRPC_TOKEN` and internal-wallet `[admin-assets].token` configuration.
|
||||
- All `coreLogic` models are read via `core_db` directly. Adding a mutation requires an explicit typed owning-service workflow; never opt an unmanaged model into direct ORM writes.
|
||||
|
||||
## Ongoing Refactoring: DDD / Clean Architecture
|
||||
|
||||
@@ -214,7 +214,7 @@ This repository is being migrated to a unified Domain-Driven Design / Clean Arch
|
||||
|
||||
**Go services current state**: API, Auth, and Wallet configuration and architecture phases are complete on `feat/refactor-v1`; use the refactoring tracker and audit for the current package boundaries and verification evidence.
|
||||
|
||||
**AdminPanel current state**: Direct DB access to `core_db` with no gRPC layer. Business logic duplicated in Django admin classes (`check_token_policy`, `auto_gen` instead of delegating to Go services). `managed = False` models drift from Go GORM models.
|
||||
**AdminPanel current state**: Direct DB reads remain, while unmanaged projections fail closed for writes. Asset upsert/deactivation uses an authenticated Wallet gRPC adapter; duplicated asset policy and metadata generation have been removed from Django. `managed = False` models can still drift from Go persistence models and must remain projection-only.
|
||||
|
||||
**Target**: All Go services follow `domain/` → `application/` → `infrastructure/` → `interface/` with inward dependencies. AdminPanel routes writes through gRPC to Go services while keeping reads from DB for performance.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user