Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/wspietro/3-nodejs-solid

Aplicação para check-ins em academias, lidando com conceitos do SOLID, Design Patterns, Docker, JWT e diversos outros conceitos
https://github.com/wspietro/3-nodejs-solid

fastify layered-architecture nodejs prisma repository-pattern rest-api solid vitest

Last synced: 13 days ago
JSON representation

Aplicação para check-ins em academias, lidando com conceitos do SOLID, Design Patterns, Docker, JWT e diversos outros conceitos

Awesome Lists containing this project

README

        

API Node.Js com SOLID



Nesse projeto foi desenvolvido uma aplicação para check-ins em academias, utilizando conceitos sobre SOLID, Design Patterns, Docker para iniciar o banco de dados, JWT e Refresh Token, RBAC e diversos outros conceitos.


Tecnologias   |   
Sobre   |   
Como executar


## ✏️ Tecnologias e bibliotecas

Para a construção do projeto, foram utilizadas as seguintes tecnologias:

- [NodeJs](https://nodejs.org/en)
- [TypeScript](https://www.typescriptlang.org/)
- [Docker](https://www.docker.com/)
- [Fastify](https://www.fastify.io/)
- [Prisma](https://www.prisma.io/) (cookie, jwt)
- [Vitest](https://vitest.dev/)
- [Supertest](https://github.com/ladjs/supertest)
- [tsup](https://tsup.egoist.dev/)
- [Docker](https://www.docker.com/)
- [Zod](https://zod.dev/)
- [DayJs](https://day.js.org/)


---

## ✨ Sobre o projeto

O core do sistema se assemelha com o sistema Gympass. Termos então as seguintes entidade: User, Check-in e Gym. O projeto foi construído seguindo os seguintes padrões, princípios e arquitetura:
- Arquitetura em camadas (controllers, use-cases e repositories);
- Repository Pattern (separar a lógica de persistência de dados, proporcionando uma camada de abstração);
- Inversão de dependências - SOLID (abstrair dependência dos repositories na camada de use-cases);
- Factory Pattertn (delegar a reponsabilidade de criar objetos para uma Factory Class);
- In Memory Test Database.

### Requisitos funcionais

- [1] Deve ser possível **se cadastrar**;
- [2] Deve ser possível **se autenticar**;
- [3] Deve ser possível **obter o perfil** de um usuário;
- [8] Deve ser possível **obter o número de check-ins** realizados pelo usuário;
- [7] Deve ser possível o usuário **obter seu histórico** de check-ins;
- [9] Deve ser possível o usuário **buscar academias próximas** (ate 10km);
- [8] Deve ser possível o usuário **buscar academias pelo nome**;
- [4] Deve ser possível o usuário **realizar check-in** em uma academia;
- [9] Deve ser possível **validar o check-in** de um usuário;
- [6] Deve ser possível **cadastrar uma academia**.

### Regras de negócio (fluxos para usuário conseguir executar os RF)

- [1] O usuário **não** deve poder se **cadastrar com um e-mail duplicado**;
- [4] O usuário **não** pode fazer **2 check-ins no mesmo dia**;
- [5] O usuário **não** pode fazer **check-in se não estiver perto** (100m) da academia;
- [10] O check-in **só** pode ser **validado até 20 minutos** após criado;
- [12] O check-in **só** pode ser **validado por administradores**;
- [12] A academia **só** pode ser **cadastrada por administradores**;

### Requisitos não-funcionais

- [1] Os **dados** da aplicação precisam estar **persistidos em um banco PostgreSQL**;
- [1] A **senha** do usuário precisa estar **criptografada**;
- [7] Todas as **listas de dados** precisam estar **paginadas com 20 itens por página**;
- [11] O usuário deve ser **identificado por um JWT** (JSON Web Token);


---

## 📄 Como executar
Para executar o projeto, rode o seguinte código no terminal após clonar o mesmo:

```bash

# Install Dependencies
$ npm install

# run docker compose
$ docker compose up -d

# run prisma
$ npx prisma migrate dev

# Run
$ npm run start:dev
```

---