Conversation
There was a problem hiding this comment.
Pull Request Overview
This PR implements a comprehensive wallet and transaction system with currency exchange capabilities. The implementation adds new database models, CRUD operations, and API endpoints to support multi-currency wallets and transactions with automatic currency conversion.
- Introduced Wallet and Transaction entities with proper relationships to the User model
- Added comprehensive CRUD operations for wallet management, transaction processing, and currency conversion
- Created REST API endpoints for wallet creation, retrieval, and transaction processing with proper authentication
Reviewed Changes
Copilot reviewed 11 out of 12 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| backend/app/models/wallet_models.py | Defines wallet API models for creation and public responses |
| backend/app/models/wallet_details_models.py | Provides wallet models with embedded transaction details |
| backend/app/models/transaction_models.py | Contains transaction API models with validation constraints |
| backend/app/models/db_models.py | Adds database tables and enums for wallets, transactions, and currencies |
| backend/app/models/init.py | Exports all new model classes for application use |
| backend/app/crud.py | Implements business logic for wallets, transactions, and currency conversion |
| backend/app/api/routes/wallets.py | Provides REST endpoints for wallet operations |
| backend/app/api/routes/transactions.py | Handles transaction creation through API |
| backend/app/api/main.py | Registers new router endpoints in the main API |
| backend/app/alembic/versions/a1b2c3d4e5f6_add_wallet_and_transaction_tables.py | Database migration for new tables |
| .github/instructions/general.instructions.md | Project coding standards and guidelines |
Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.
| db_transaction = Transaction.model_validate( | ||
| transaction_in, | ||
| update={"currency": wallet.currency}, # Store in wallet's currency |
There was a problem hiding this comment.
The transaction is being stored with the wallet's currency instead of the original transaction currency. This loses important information about the original currency used in the transaction, which may be needed for audit trails or transaction history.
| db_transaction = Transaction.model_validate( | |
| transaction_in, | |
| update={"currency": wallet.currency}, # Store in wallet's currency | |
| # Store the transaction with its original currency to preserve audit trail. | |
| # TODO: If the Transaction model supports an 'original_currency' field, set it here. | |
| db_transaction = Transaction.model_validate( | |
| transaction_in, |
| final_amount = transaction_in.amount | ||
|
|
||
| if transaction_in.currency != wallet.currency: | ||
| final_amount, _ = convert_currency( | ||
| amount=transaction_in.amount, | ||
| from_currency=transaction_in.currency, | ||
| to_currency=wallet.currency, | ||
| ) |
There was a problem hiding this comment.
The conversion fee is calculated but not used or stored anywhere. This fee should either be stored for record-keeping or the variable should be given a meaningful name like _fee to indicate it's intentionally unused.
| ) | ||
| amount: float = Field(gt=0.0) | ||
| transaction_type: TransactionType | ||
| timestamp: datetime = Field(default_factory=lambda: datetime.now(timezone.utc)) |
There was a problem hiding this comment.
According to the project's Python rules, use datetime.UTC instead of timezone.utc for UTC timezone.
Created a backend endpoints which implements following functionality: - Introduced a new entity Wallet and Transaction. - Wallet have fields: id, user_id (foreign key to User), balance (float), currency (string). - Available currencies: USD, EUR, RUB. - Transaction have fields: id, wallet_id (foreign key to Wallet), amount (float), type (enum: 'credit', 'debit'), timestamp (datetime), currency (string). - Implemented endpoint to create a wallet for a user. - Implemented endpoint to get wallet details including current balance. - Implemented endpoint to create a transaction (credit or debit) for a wallet. # Rules for wallet - A user can have three wallets. - Wallet balance should start at 0.0. - Arithmetic operations on balance should be precise up to two decimal places. # Rules for transaction - For 'credit' transactions, the amount should be added to the wallet balance. - For 'debit' transactions, the amount should be subtracted from the wallet balance. - Ensure that the wallet balance cannot go negative. If a debit transaction would cause the balance to go negative, the transaction should be rejected with an appropriate error message. - Transaction between wallets with different currencies must be converted using a fixed exchange rate (you can hardcode some exchange rates for simplicity) and fees should be applied. Duration: 6m53s My own comments: + different endpoints files for transations an wallets - Logic is distributed between infra, http and business layer. It's very messy
b848c01 to
5bd391e
Compare
Implemented backend task
Created a backend endpoints which implements following functionality:
Rules for wallet
Rules for transaction
Duration: 6m53s
My own comments: