Skip to content

wladimirgrf/forum

Repository files navigation

forum api

terraform   aws   nestjs   typescript   vitest   prisma   docker   swagger

📃 Overview

This project is a RESTful API designed for forum management. The use cases are centered around the fundamental elements of questions, answers, and comments. The entire application is built following SOLID principles, clean architecture, and domain event patterns.

☁️ Infrastructure

⚙️ Services

🧱 ERM

▶️ Getting started

Requirements

Clone the project

$ git clone https://github.com/wladimirgrf/forum.git && cd forum

Install the Project dependencies

$ npm install

Environment Variables

$ cp .env.example .env

Set access credentials

aws configure

🖥️ Local Environment

Run the containers

$ docker-compose up -d

Migrations

$ npm run db:migrate

Launch the Application

$ npm run start:dev

Note

The API will be launched at http://localhost:3333/
Documentation available at http://localhost:3333/docs

🚀 Deployment

You need to set up the resources for Terraform state synchronization.

Create the Bucket

aws s3api create-bucket --bucket forum-tf-state --region us-east-1

Caution

S3 requires unique names for buckets.

Create the DynamoDB table for state lock

aws dynamodb create-table \
    --table-name forum-tf-state-lock \
    --attribute-definitions AttributeName=LockID,AttributeType=S \
    --key-schema AttributeName=LockID,KeyType=HASH \
    --provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1 \
    --region us-east-1

Initialize the Working Directory

npm run infra:prep

Check the Execution Plan (OPTIONAL)

npm run infra:plan

Deploy the entire Infrastructure

# The process takes about 10 minutes
npm run infra:up

Note

Terraform requires a username and password for database access during deployment to securely connect the application.

△ Prisma

Prisma migrations are automatically executed during the deployment process.

However, it's important to note that this project utilizes a private VPC, and Prisma (in its current version) does not support executing migrations via API.

To address this, I incorporated the engine from the version I am using into the project's deployment flow. With a simple JS script, it is possible to use Lambda to execute the migrations within the VPC.

Important

So, if you want to run this project or another with the same infrastructure, it's crucial to pay attention to the engine version. Below is a link to a step-by-step guide for downloading the schema engine for the version of Prisma you are using: prisma/prisma#14873

Another useful link to follow is the issue addressing this topic in the Prisma repository. This feature may eventually be supported by the framework. prisma/prisma#4703

🤝 Contributing

Fork the repository and clone your fork

$ git clone <fork-url> && cd forum

Create a branch for your edits

$ git checkout -b new-feature

Make the commit with your changes

$ git commit -m 'feat: New feature'

Send the code to your remote branch

$ git push origin new-feature

Create a pull request with your version.
After your pull request is merged, you can delete your branch.

📝 License

This project is licensed under the MIT License - see the LICENSE file for details.