Job application tracking demo app made mostly to:
- Familiarise with OAuth authentication flows on Spring Boot.
- AWS practice (ECS, ECR, IAM, S3, S3 presigning, RDS, SSM Parameter store)
- Try my hands at browser drag-drop APIs
- Authentication flows (APIs / frontend)
- Basic auth (login, registrartion, forgot password, change password, email validation)
- Oauth/OIDC (Google login/registration)
- Federated identity (associating Google account to validated basic auth accounts)
- Frontend
- Layout scaffolding
- Authentication related things
- Drag-and-drop kanban board for applications and APIs
- Presigned urls S3 uploads for PDF resumes
- Daily application report emails, user validation emails, reset password emails with AWS SES
- AWS SSM Parameter Store integration for OAuth/RDS secrets
- Containerize the backend for easier development, and ECS deployment
- Setup ECS task defs, cluster, S3 bucket policies, IAM for GH actions
- Build and deploy image to ECS, and frontend to S3 automatically with GH actions
- ($$) (Maybe) HTTPs and domains for S3 frontend and ALB to front ECS (instead of dynamic public IP)
- (Maybe) CloudFormation-ify everything AWS related
- The core backend REST API is built with Spring Boot & Hibernate.
- Spring Security abstractions are heavily for Authentication. Both basic + oauth flows ultimately result in the issuing of a JWT used for endpoint authentication and authorization. Federated identity is done on the basis of user emails, verified via OIDC.
- Registration/forgot password emails are sent using AWS SES, and user resume uploads using S3.
- RDS/OAuth secrets are retrieved from AWS SSM parameter store.
The frontend is a simple Vue app built on Vuetify + Vite.
All resources have been taken down to save $$.
- A S3 bucket hosts the frontend.
- Another S3 bucket hosts user uploaded resumes. Authentication (GET/PUT) is done via presigned URLs generated on the backend.
- The backend is contanerized, supporting docker compose for easy development with a postgres container.
Production deployment utilises AWS ECS (Fargate launch type) and RDS for the database.- Fargate tasks also have the option of generating dynamic public IPs, which is what's used to connect the frontend to backend.
- For simplicity, everything uses the default VPC and subnet.
- There is no HTTPs and/or custom domains setup to save on $$ since this a demo project.
- There is also a Github Actions workflow to:
./gradlew build
and containerize the backend image, and upload it into AWS ECR.- Build and frontend app and upload it into AWS S3