# Intrasys - Internal Transfers System ![Rust](https://img.shields.io/badge/rust-%23000000.svg?logo=rust&logoColor=white) ![PostgreSQL](https://img.shields.io/badge/PostgreSQL-316192?style=for-square&logo=postgresql&logoColor=white) ![Tokio](https://img.shields.io/badge/Tokio-1.46-green?style=for-square) ![Sqlx](https://img.shields.io/badge/Sqlx-0.8-green?style=for-square) ![Axum](https://img.shields.io/badge/Axum-0.8-green?style=for-square) 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 ### Using docker compose Just run ```bash docker compose up ``` ### Build locally #### Ensure you have rust installed Follow the steps described [here](https://www.rust-lang.org/tools/install) if you don't #### Provision PostgreSQL Database The easiest way is to run a PostgreSQL container with Docker: ```bash docker run --name intrasys-pg -d -e POSTGRES_PASSWORD=password -p 127.0.0.1:5432:5432 postgres:alpine ``` #### Run the Application ```bash cargo run ``` The application will be available at `http://localhost:8080` ## API Endpoints ### Account Management - **Create Account** `POST /accounts` ```json { "account_id": 123, "initial_balance": "100.23344" } ``` - **Get Account Balance** `GET /accounts/{account_id}` Response: ```json { "account_id": 123, "balance": "100.23344" } ``` ### Transactions - **Process Transaction** `POST /transactions` ```json { "source_account_id": 123, "destination_account_id": 456, "amount": "50.12345" } ``` ## Configuration The app can be configured using environmental variable that can also be provided through a `.dotenv` file. The following variables affect the application behavior: - `INTRASYS_LOG` changes the logging level, can be set to one of `trace`, `debug`, `info`, `warn`, `error` - `INTRASYS_HOST` is the address the HTTP server will bind to - `INTRASYS_PORT` is the port the HTTP server will listen to - any of the environmental variables mentioned [here](https://docs.rs/sqlx/latest/sqlx/postgres/struct.PgConnectOptions.html#method.options) affects the postgres database connection ## Running 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 ```bash cargo test ``` ## 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)