Files
intrasys/README.md
Walter Oggioni 1217e92301
All checks were successful
CI / build (push) Successful in 3m5s
initial commit
2025-07-04 20:12:28 +08:00

3.4 KiB

Intrasys - Internal Transfers System

Rust PostgreSQL Tokio Sqlx Axum

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

docker compose up

Build locally

Ensure you have rust installed

Follow the steps described here if you don't

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

Run the Application

cargo run

The application will be available at http://localhost:8080

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"
    }
    

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 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

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)