This is a backend web service for a bank. It will provide APIs for the frontend to do the following things:
- Create and manage bank accounts, which are composed of owner’s name, balance, and currency.
- Record all balance changes to each of the account. So every time some money is added to or subtracted from the account, an account entry record will be created.
- Perform a money transfer between 2 accounts. This should happen within a transaction, so that either both accounts’ balance are updated successfully or none of them are.
- Design DB schema and generate SQL code with dbdiagram.io
- Use Docker + Postgres + TablePlus to create DB
- Write and run database migration in Golang
- Generate CRUD code in Golang using sqlc
- Write unit tests for database CURD
- Handle deadlock and DB transaction lock
- Setup Github Actions to run automated tests
- Implement RESTful HTTP API in Go using Gin
- Load config frm file & environment variable in Go with Viper
- Mock DB for testing HTTP API in Go and achieve 100% coverage
- Implement transfer money API with a custom params validator
- Add users table with unique & foreign key constraints in PostgreSQL
- Hash password in Go with Bcrypt
- Write and verify JWT and PASETO token
- Implement login user API that returns PASETO or JWT access Token in GO
- Implement authentication middleware and authorization rules in Golang using Gin
- Build a minimal Golang Docker image with a multistage Dockerfile
- Use docker network to connect 2 stand-alone containers
- Auto build & push docker image to AWS ECR with Github Actions
- Create a production DB on AWS RDS
- Store & retrieve production secrets with AWS secrets manager
- Kubernetes architecture & create an EKS cluster on AWS
- Use kubectl & k9s to connect to a kubernetes cluster on AWS EKS
- Deploy a web app to Kubernetes cluster on AWS EKS
- Register a domain name & set up A-record using Route53
- Uuse Ingress to route traffics to different services in Kubernetes
- Automatic issue TLS certificates in Kubernetes with Let's Encrypt
- Automatic deploy to Kubernetes with Github Action