Skip to content

gwuah/accounts

Folders and files

NameName
Last commit message
Last commit date

Latest commit

761f228 · Sep 17, 2024

History

12 Commits
Sep 5, 2024
Sep 6, 2024
Sep 5, 2024
Sep 5, 2024
Sep 5, 2024
Sep 6, 2024
Sep 17, 2024
Sep 5, 2024
Sep 6, 2024
Sep 6, 2024

Repository files navigation

accounts

core banking service

features

  • accounts
  • add money to account
  • transfer money between accounts

considerations

  • Disable updates & deletes on transaction_lines table
  • Every transaction results in a debit and credit
  • We store lowest form of values (cents)
  • We perform balance checks before transacting between accounts
  • Deposits debit genesis account, whose balance represents total risk
  • We assume currency USD with 2 decimal places of precision
  • We use transaction references to prevent duplicate transactions (idempotency key)

improvements

  • async processing of transactions
  • support for multiple currencies
  • robust user authn & authz

setup

using docker (easier)

  1. In the root of the project, run docker compose up
  2. This should boot up a local postgresql instance & an instance of the accounts service.
  3. Accounts service should be running on port 8080.

barebones (doable)

  1. Ensure you have a postgres db setup with the right dbname, user, password and sslmode.
  2. Modify the Makefile in the project root, and set your DB_URL and PORT
  3. To run, make run
  4. To build make build
  5. To test make test

interactions

curl --location 'localhost:8080/users' \
--header 'Content-Type: application/json' \
--data-raw '{
    "email": "[email protected]"
}'

curl --location 'localhost:8080/accounts' \
--header 'Content-Type: application/json' \
--data '{
    "user_id": 5
}'

curl --location 'localhost:8080/transactions' \
--header 'Content-Type: application/json' \
--data '{
    "to": "985270462",
    "type": "deposit",
    "amount": 100,
    "reference": "ok"
}'

curl --location 'localhost:8080/transactions' \
--header 'Content-Type: application/json' \
--data '{
    "from": "810093581",
    "to": "985270462",
    "type": "transfer",
    "amount": 100,
    "reference": "lekkero"
}'

curl --location 'localhost:8080/accounts/715733003'

notes

This is an improvement on cashapp, which I wrote 4 years ago. Code is much cleaner to follow & easier to extend. It also has quite good test coverage.

About

core banking service

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages