Backend service for managing users, wallets, balances, and transactions built with Clean Architecture / DDD-lite principles. The project features a strict separation of domain, application, and infrastructure layers, with extensible factories, mappers, and use-case driven design.
๐ช WalletManager
WalletManager is a backend service for managing users, wallets, balances, and transactions. The project is built using Clean Architecture / DDD-lite principles with a clear separation of domain logic, infrastructure, and application use cases.
๐ Key Features
- ๐ค User management (registration, login, blocking)
- ๐ Wallet management (creation, blocking, closing)
- ๐ฐ Balance management:
- ๐ณ Transaction management:
- ๐ญ Factory + Registry pattern for all domain entities
- ๐ Mapper layer (domain โ database)
- ๐ง Domain invariants (DomainInvariant)
- ๐ช Event signaling via blinker
- ๐ SQLAlchemy + PostgreSQL integration
- ๐ฆ Facade layer for use cases
๐ง Project Architecture
The project is structured according to Clean Architecture principles.
๐ Domain Layer
Pure business logic. Does not depend on database, frameworks, or infrastructure.
๐ค Users
UserBase,Client,Admin- domain invariants (email, name, password)
- user status handling
๐ Wallets
DebitWallet,CreditWallet- ownership relation
- blocking / closing logic
๐ฐ Balances
RegularBalanceโ single currencyForeignBalanceโ multiple currencies- stored internally as
dict[currency -> amount]
๐ณ Transactions
DepositTransactionWithdrawTransactionExchangeTransaction
- no ORM
- no SQL
- only business rules and invariants
๐ Infrastructure Layer
Handles persistence and external dependencies.
๐ Database (SQLAlchemy)
UserTableWalletTableBalanceTableTransactionTable
๐ Mappers
Responsible for transforming:
Domain โ ORM (SQLAlchemy models)
UserMapperWalletMapperBalanceMapperTransactionMapper
ForeignBalanceis stored as multiple rows in DB- and reconstructed via grouping
๐ฆ Repositories
Split into:
commandsโ write operations (insert/update/delete)queriesโ read operations
UserCommandsRepositoryWalletQueriesRepositoryBalanceCommandsRepository
โ๏ธ Application / Use-cases Layer
Encapsulates business workflows.
๐ค Users
CreateUserServiceLoginUserServiceBlockUserServiceCloseUserService
๐ Wallets
CreateWalletServiceBlockWalletServiceCloseWalletService
๐ฐ Balances
CreateBalanceServiceFreezeBalanceServiceShowBalanceService
๐ณ Transactions
CreateTransactionServiceShowTransactionServiceSortTransactionService
๐ญ Facade Layer
Provides a simplified interface:
UserServiceFacadeWalletServiceFacadeBalanceServiceFacadeTransactionServiceFacade
๐ญ Factory + Registry
Each domain has:
- Factory โ creates instances
- Registry โ maps type โ class
BalanceTypesEnum.FOREIGN โ ForeignBalance
๐ Benefits:
- extensibility
- no hardcoded conditionals
- easy addition of new types
๐งฉ Core Layer
Shared components:
- ๐ข Enums (User, Wallet, Balance, Transaction)
- โ ๏ธ DomainInvariant (validation rules)
- ๐ช Signals (blinker)
- ๐งฐ utilities / decorators
- ๐ logging
๐ฅ Implementation Highlights
1. Multi-currency balance
Stored in DB as:
wallet_id | currency | amount
In domain:
{ "BTC": 2, "USDT": 3, "TON": 5 }
๐ Reconstructed using:
grouped[obj.balance_id]
2. Domain invariants
Validation happens inside domain models:
DomainInvariant.no_empty(...)
DomainInvariant.is_instance(...)
๐ Ensures consistent object state
3. Signals (blinker)
On state change:
userupgradesignal.send(...)
๐ Enables:
- logging
- auditing
- event-driven extensions
4. Mapper layer
Clear separation:
Database model โ Domain model
๐ Prevents ORM leakage into business logic
๐งฉ Design Patterns Used
- ๐ญ Factory Pattern
- ๐ Registry Pattern
- ๐ญ Facade Pattern
- ๐งฑ Mapper Pattern
- ๐ช Observer Pattern (via signals)
- ๐ง DDD-lite principles
๐ฎ Possible Improvements
๐น Architecture
- Unit of Work pattern
- CQRS (separate read/write models)
- Domain Events (instead of direct signals)
๐น Infrastructure
- Proper Alembic migration setup
- Async SQLAlchemy
- Redis (caching / locks)
๐น Dependency Injection
- Integrate DI container (e.g. Dishka)
๐น API Layer
- FastAPI integration
- Pydantic DTOs for request/response
๐ฏ Project Goal
This project demonstrates:
- strong backend architecture design skills
- separation of concerns
- clean domain modeling
- practical usage of design patterns
- building scalable, production-ready systems