A personal project to create a bank, including the following features and more:
- Core banking functionality
- Transaction history
- Payments to and from other customers using PSD2 inspired API (Payment baskets)
- Scheduled payments
- Recurring payments
- Simulated compliance-based nightly batch uploads to government entities
- Personal Loan applications with fixed-rate interest
- Simulated signing flow for authorizing payments and applying for loans, utilizing asynchronous callbacks when customer has signed
- Simulated credit worthiness checks for loan applications
- Simulated AML and fraud checks for payments and loan applications, triggering reports to government entities
- Know Your Customer (KYC)
- Admin interface for manually processing and approving suspicious payments and loan applications
- Supports multiple languages, countries and currencies
Architecture:
- Backend written in Java, using Spring Webflux
- Reactive microservice architecture
- Client-facing REST-like API (No HATEOAS :) )
- Frontend written in SvelteKit and Typescript
- Well-documented OpenAPI based API
- Largely asynchronous, using scheduled tasks and message queues
- Spring boot starters for common behavior
- Elasticsearch as a central location for logs generated by all services
- Integration tests with simulated external endpoints
What is not included:
- Proper authentication and authorization
- No proper deployment that can be tested. Local testing only
- Mostly intended to show backend skills and banking knowledge, so the front-end is quite barebones and does not use or provide good accessibility, best practices, nice user experiences across devices and browsers etc.
This is a microservice based project, so each microservice is a gradle project that can be launched independently. All the postgres databases, Postgres admin, RabbitMQ broker, RabbitMQ admin etc. can be launched by the docker-compose.yaml file
Core services basically trust anything - keeps the banking core clean and focuses on internal business logic. Assumes that things have already been signed, approved, decided, etc. Core services not reachable from frontend