Skip to content

Conversation

vodkar
Copy link
Owner

@vodkar vodkar commented Sep 16, 2025

Implemented backend task

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

@Copilot Copilot AI review requested due to automatic review settings September 16, 2025 07:42
Copy link

@Copilot Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Comment on lines +216 to +218
db_transaction = Transaction.model_validate(
transaction_in,
update={"currency": wallet.currency}, # Store in wallet's currency
Copy link

Copilot AI Sep 16, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Suggested change
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,

Copilot uses AI. Check for mistakes.

Comment on lines +188 to +195
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,
)
Copy link

Copilot AI Sep 16, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copilot uses AI. Check for mistakes.

)
amount: float = Field(gt=0.0)
transaction_type: TransactionType
timestamp: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
Copy link

Copilot AI Sep 16, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

According to the project's Python rules, use datetime.UTC instead of timezone.utc for UTC timezone.

Copilot uses AI. Check for mistakes.

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
@vodkar vodkar force-pushed the copilot-claude-with-tuning branch from b848c01 to 5bd391e Compare September 16, 2025 10:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant