4bb65956e646944115d233ab86ffe6dd9601ac80
Intrasys - Internal Transfers System
Intrasys is an internal financial transfers application built with Rust and Axum, providing HTTP endpoints for account management and transaction processing with PostgreSQL as the backing database.
Features
- Account creation with initial balance
- Account balance queries
- Secure transaction processing between accounts
- Atomic transaction handling with database integrity
- Precise decimal arithmetic for financial amounts
Prerequisites
- Rust (latest stable version)
- Docker (for database provisioning)
- PostgreSQL client (optional)
Quick Start
1. Ensure you have rust installed
Foolow the steps described here if you don't
2. Provision PostgreSQL Database
The easiest way is to run a PostgreSQL container with Docker:
docker run --name intrasys-pg -d -e POSTGRES_PASSWORD=password -p 127.0.0.1:5432:5432 postgres:alpine
2. Run the Application
cargo run
The application will be available at http://localhost:8080
Running unit tests
Make sure you have an available postgres database and edit DATABASE_URL
variable in the .env
file accordingly. If you've used the docker command mentioned in the Quickstart
section you don't need to change anything.
Then run
cargo test
API Endpoints
Account Management
-
Create Account
POST /accounts
{ "account_id": 123, "initial_balance": "100.23344" }
-
Get Account Balance
GET /accounts/{account_id}
Response:{ "account_id": 123, "balance": "100.23344" }
Transactions
- Process Transaction
POST /transactions
{ "source_account_id": 123, "destination_account_id": 456, "amount": "50.12345" }
## Assumptions
- All accounts use the same currency
- No authentication or authorization is implemented
- Decimal precision of 2 decimal places is sufficient for financial amounts, maximum allowed monetary amount is (10^18 -0.01) and the minimum is (-10^18 + 0.01)
- Account IDs are positive integers
- Account creation must NOT be idempotent since it also sets the account balance (creating an account that already exists should fail)
- Transfer money to an account that does not exist should not create a new account, but fail with an error (to prevent users from accidentally locking their money forever)
Description
Languages
Rust
91.6%
Dockerfile
8.4%