From ee50111ff3c418e2303cf36089f6c2206efae988 Mon Sep 17 00:00:00 2001 From: Walter Oggioni Date: Fri, 4 Jul 2025 13:05:49 +0800 Subject: [PATCH] added README.md --- README.md | 125 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..c066aaa --- /dev/null +++ b/README.md @@ -0,0 +1,125 @@ +# 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) +![Axum](https://img.shields.io/badge/Tokio-1.46-green?style=for-square) +![Axum](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 + +### 1. Provision PostgreSQL Database + +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 +``` + +### 2. Configure Environment + +Create a `.env` file in the project root: + +```bash +echo "DATABASE_URL=postgres://postgres:password@localhost:5432/postgres" > .env +``` + +### 3. Run the Application + +```bash +cargo run +``` + +The application will be available at `http://localhost:3000` + +## 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" + } + ``` + +## Development Setup + +1. Install Rust toolchain: + ```bash + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + ``` + +2. Clone the repository: + ```bash + git clone https://github.com/yourusername/intrasys.git + cd intrasys + ``` + +3. Run database migrations (optional - the app will create tables if they don't exist): + ```bash + sqlx migrate run + ``` + +## Testing + +Run the test suite with: + +```bash +cargo test +``` + +## Assumptions + +- All accounts use the same currency +- No authentication or authorization is implemented +- Decimal precision of 10 decimal places is sufficient for financial amounts +- Account IDs are positive integers + +## License + +MIT License + +## Contributing + +Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.