This project was built to practice cloud computing concepts using AWS services. It follows object-oriented programming principles and applies software development best practices, focusing on scalability and code quality.
- Node.js
- TypeScript
- AWS SDK
- EC2
- S3
- Redis
- Docker
- Express
- Git
- GitHub Actions
- Husky
- Prettier
- ESLint
- Zod
- Jest
- Supertest
- Upload a single file
- Upload multiple files at once
- Delete files
- Get file metadata (name, size, etc.)
- List all files
- Filter files by type (e.g., PDF, JPEG)
-
POST /api/v1/files/upload
Upload a single file to S3. -
POST /api/v1/files/multi-upload
Upload multiple files at once to S3. -
GET /api/v1/files/:id
Get file metadata by ID. -
GET /api/v1/files
List all uploaded files. -
DELETE /api/v1/files/:id
Delete a file by ID.
- Make sure you have Node.js and Docker installed.
- Clone the repository:
git clone https://github.com/hebertsanto/upload-s3.git - Install the dependencies:
npm install - Create a
.envfile with your AWS S3 credentials.
You can use.env.exempleas a reference. - Start the server:
npm run dev
- Build the image:
npm run docker:build - The application Docker image will be created automatically.
-
Run integration tests:
npm run tests:integration -
Run unit tests:
npm run tests:unit
This pipeline ensures code style consistency and quality using ESLint and Prettier.
Transpiles TypeScript to JavaScript and builds the Docker image of the project.
This project has room for improvement and evolution. Some next steps include:
- Decouple external services (e.g., AWS SDK, Redis) using dependency inversion.
- Add a domain layer following Domain-Driven Design (DDD) principles.
- Refactor to a cleaner, layered architecture.
- Improve unit and integration test coverage.
Through this project, I gained hands-on experience with Docker, deepened my understanding of cloud computing, and explored application deployment with AWS. To simulate a real-world high-traffic scenario, I also implemented caching with Redis. This is a project I plan to keep improving as I learn more.


