Transactions Service¶
The Transactions Service orchestrates all financial transactions between users with event-driven processing.
Overview¶
- Port: 4004
- Database:
mint_txns(MongoDB) - Events Published:
transaction.created,transaction.completed,transaction.failed - Events Consumed:
transaction.created,wallet.transactionFinalized
Features¶
Transaction Types¶
- Top-up: Add funds to wallet
- Transfer: Send money to other users
Transaction Lifecycle¶
- State management: PENDING → PROCESSING → COMPLETED/FAILED
- Event-driven workflow
- Automatic rollback on failures
- Idempotency support
Validation¶
- Balance verification for transfers
- User existence checks
- Amount validation
Technology Stack¶
- Express.js - Web framework
- MongoDB/Mongoose - Database ORM
- RabbitMQ - Event consumption & publishing
- Zod - Request validation
- Jose - JWT verification
Key Endpoints¶
For detailed API documentation, see Transactions API Reference.
| Endpoint | Method | Description | Auth Required |
|---|---|---|---|
/api/v1/transactions |
GET | List all transactions | Yes |
/api/v1/transactions/:id |
GET | Get transaction details | Yes |
/api/v1/transactions/topup |
POST | Add funds to wallet | Yes |
/api/v1/transactions/transfer |
POST | Transfer funds | Yes |
Transaction States¶
| State | Description |
|---|---|
PENDING |
Transaction created, awaiting processing |
PROCESSING |
Transaction is being processed |
COMPLETED |
Transaction successfully completed |
FAILED |
Transaction failed (insufficient balance, errors) |
Event Flow¶
Top-Up Flow¶
sequenceDiagram
participant Client
participant Transactions
participant RabbitMQ
participant Wallet
Client->>Transactions: POST /topup
Transactions->>Transactions: Create PENDING
Transactions->>RabbitMQ: transaction.created
Transactions-->>Client: Return transaction
RabbitMQ->>Transactions: Consume created
Transactions->>Transactions: Update to PROCESSING
Transactions->>RabbitMQ: transaction.completed
RabbitMQ->>Wallet: Consume completed
Wallet->>Wallet: Update balance
Wallet->>RabbitMQ: wallet.transactionFinalized
RabbitMQ->>Transactions: Consume finalized
Transactions->>Transactions: Update to COMPLETED
Transfer Flow¶
sequenceDiagram
participant Client
participant Transactions
participant RabbitMQ
participant Wallet
Client->>Transactions: POST /transfer
Transactions->>Transactions: Create PENDING
Transactions->>RabbitMQ: transaction.created
Transactions-->>Client: Return transaction
RabbitMQ->>Transactions: Consume created
Transactions->>Transactions: Validate balance
alt Sufficient Balance
Transactions->>Transactions: Update to PROCESSING
Transactions->>RabbitMQ: transaction.completed
RabbitMQ->>Wallet: Update balances
Wallet->>RabbitMQ: wallet.transactionFinalized
Transactions->>Transactions: COMPLETED
else Insufficient Balance
Transactions->>RabbitMQ: transaction.failed
Transactions->>Transactions: Update to FAILED
end
Event Publishing¶
transaction.created¶
Published when a transaction is created.
Routing Key: transaction.created
Payload:
{
"transactionId": "507f1f77bcf86cd799439013",
"type": "transfer",
"senderId": "507f1f77bcf86cd799439011",
"recipientId": "507f1f77bcf86cd799439020",
"amount": 50.00
}
transaction.completed¶
Published when a transaction is successfully processed.
Routing Key: transaction.completed
Consumers: - Wallet Service - Updates balances - Notifications Service - Sends success email
transaction.failed¶
Published when a transaction fails.
Routing Key: transaction.failed
Consumers: - Wallet Service - Reverts changes - Notifications Service - Sends failure email
Event Consumption¶
transaction.created¶
Processes the transaction and validates requirements.
Action: Validate and update state to PROCESSING or FAILED
wallet.transactionFinalized¶
Finalizes the transaction after wallet updates.
Action: Update state to COMPLETED
Database Schema¶
Transaction Model¶
{
type: 'topup' | 'transfer',
senderId: ObjectId,
recipientId: ObjectId, // Only for transfers
amount: Number,
description: String,
status: 'pending' | 'processing' | 'completed' | 'failed',
createdAt: Date,
completedAt: Date,
failedAt: Date
}
Indexes:
- senderId
- recipientId
- type
- status
Validation Rules¶
Top-Up¶
- Amount must be positive
- Amount must be a number
Transfer¶
- Amount must be positive
- Sender must have sufficient balance
- Recipient must exist
- Cannot transfer to self
Configuration¶
See Configuration Guide for environment variables.