From 95bae14726baf471482042144150220aa11566e7 Mon Sep 17 00:00:00 2001 From: Matheus Sanchez Date: Tue, 5 Dec 2023 13:34:37 -0300 Subject: [PATCH] Adding readme --- .env.example | 4 +++ README.md | 92 ++++++++++++++++++++++++++++++++++++++++++++++++ README.pt-br.md | 93 +++++++++++++++++++++++++++++++++++++++++++++++++ src/server.ts | 2 +- 4 files changed, 190 insertions(+), 1 deletion(-) create mode 100644 .env.example create mode 100644 README.md create mode 100644 README.pt-br.md diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..b902900 --- /dev/null +++ b/.env.example @@ -0,0 +1,4 @@ +NODE_ENV=dev +#PORT=3333 ## default port, chage as needed +DATABASE_URL="postgresql://docker:docker@localhost:8080/gym_pass_db?schema=public" +JWT_SECRET="yoursecret" \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..8ecea95 --- /dev/null +++ b/README.md @@ -0,0 +1,92 @@ +# SOLID STUDY + +[![en](https://img.shields.io/badge/lang-en-red.svg)](https://github.com/MatheusSanchez/gym-check-in-api/blob/main/README.md) +[![pt-br](https://img.shields.io/badge/lang-pt--br-green.svg)](https://github.com/MatheusSanchez/gym-check-in-api/blob/main/README.pt-br.md) + +This repository is dedicated to the study of SOLID principles, Design Patterns, unit tests, integration tests, and GitHub Actions. + +The structure of this repository includes the development of an API inspired by the GymPass style. + +# GymPass API + +## How to Execute + +1. Clone this repository to your local machine using the following command: +```bash +$ git clone https://github.com/MatheusSanchez/gym-check-in-api +``` + +2. Navigate to the project directory and install the required dependencies by running: +```bash +$ npm install +``` +3. Create a .env file in the project directory to set the required environment variables. Refer to the provided .env.example file for the necessary variables and their values. [.env.example](./.env.example/) + +4. Use Docker Compose to set up the database container. Run the following command in the terminal: +```bash +$ docker compose up -d +``` + +5. Run Prisma migrations to create the database tables: +```bash +$ npx prisma migrate dev +``` + +6. Launch the API by running the following command: +```bash +$ npm run dev +``` +Check the terminal for the message: 🔥🔥🔥 HTTP Server Running 🔥🔥🔥 + + +# How to Test + +Executing Unit tests is pretty simple; just run the following command: +```bash +$ npm run test +``` + +## E2E tests +There are two scripts in the [package.json](./package.json/) file to set up the E2E tests, as the tests shouldn't add data to the real database. + +You can execute the E2E tests using the following command: +```bash +$ npm run test:e2e +``` + +This script will trigger all the setup, and a new database will be generated to run the tests, which will be deleted after the tests are completed. + +You can also check the tests through a UI and check the coverage, use the following commands: +```bash +$ npm run test:ui +$ npm run test:coverage +``` + +## Functional Requirements (RFs) + +- [x] User registration should be possible; +- [x] User authentication should be possible; +- [x] Retrieving the profile of a logged-in user should be possible; +- [x] Retrieving the number of check-ins performed by the logged-in user should be possible; +- [x] The user should be able to retrieve their check-in history; +- [x] The user should be able to search for nearby gyms (up to 10km); +- [x] The user should be able to search for gyms by name; +- [x] The user should be able to check-in at a gym; +- [x] Validating a user's check-in should be possible; +- [x] Registering a gym should be possible; + +## Business Rules (RNs) + +- [x] Users should not be able to register with a duplicated email; +- [x] A user cannot make 2 check-ins on the same day; +- [x] A user cannot check in if not within 100 meters of the gym; +- [x] Check-in validation can only occur up to 20 minutes after its creation; +- [x] Check-in validation can only be performed by administrators; +- [x] Gym registration can only be done by administrators; + +## Non-Functional Requirements (RNFs) + +- [x] User passwords need to be encrypted; +- [x] Application data must be persisted in a PostgreSQL database; +- [x] All data lists need to be paginated with 20 items per page; +- [x] User identification should be done through a JWT (JSON Web Token); diff --git a/README.pt-br.md b/README.pt-br.md new file mode 100644 index 0000000..fe6db50 --- /dev/null +++ b/README.pt-br.md @@ -0,0 +1,93 @@ +# SOLID STUDY + +[![en](https://img.shields.io/badge/lang-en-red.svg)](https://github.com/MatheusSanchez/gym-check-in-api/blob/main/README.md) +[![pt-br](https://img.shields.io/badge/lang-pt--br-green.svg)](https://github.com/MatheusSanchez/gym-check-in-api/blob/main/README.pt-br.md) + +Este repositório destina-se ao estudo dos princípios SOLID, Design Patterns, testes unitários, testes de integração, e também GitHub Actions. + +A estrutura deste repositório inclui o desenvolvimento de uma API inspirada no estilo do GymPass. + +# GymPass API + +## Como executar + +1. Clone este repositório em sua máquina local usando o seguinte comando: +```bash +$ git clone https://github.com/MatheusSanchez/gym-check-in-api +``` +2. Navegue até o diretório do projeto e instale as dependências necessárias executando: +```bash +$ npm install +``` +3. Crie um arquivo .env no diretório do projeto para definir as variáveis de ambiente necessárias. Consulte o arquivo .env.example fornecido para obter as variáveis necessárias e seus valores. [.env.example](./.env.example/) + +4. Use o Docker Compose para configurar o contêiner do banco de dados. Execute o seguinte comando no terminal: +```bash +$ docker compose up -d +``` + +5. Execute as migrações do Prisma para criar as tabelas do banco de dados: +```bash +$ npx prisma migrate dev +``` + +6. Inicie a API executando o seguinte comando: +```bash +$ npm run dev +``` + +Verifique o terminal para a mensagem: 🔥🔥🔥 HTTP Server Running 🔥🔥🔥 + +# Como testar +Executar testes unitários é bastante simples; basta executar o seguinte comando: +```bash +$ npm run test +``` + +## Testes E2E + +Existem dois scripts no arquivo [package.json](./package.json/) para configurar os testes E2E, já que os testes não devem adicionar dados ao banco de dados real. + +Você pode executar os testes E2E usando o seguinte comando: + +```bash +$ npm run test:e2e +``` + +Este script acionará toda a configuração e um novo banco de dados será gerado para executar os testes, sendo excluído após a conclusão dos testes. + +Você também pode verificar os testes por meio de uma interface gráfica (UI) e conferir a cobertura usando os seguintes comandos: + +```bash +$ npm run test:ui +$ npm run test:coverage +``` + +## RFs (Requisitos funcionais) + +- [x] Deve ser possível se cadastrar; +- [x] Deve ser possível se autenticar; +- [x] Deve ser possível obter o perfil de um usuário logado; +- [x] Deve ser possível obter o número de check-ins realizados pelo usuário logado; +- [x] Deve ser possível o usuário obter o seu histórico de check-ins; +- [x] Deve ser possível o usuário buscar academias próximas (até 10km); +- [x] Deve ser possível o usuário buscar academias pelo nome; +- [x] Deve ser possível o usuário realizar check-in em uma academia; +- [x] Deve ser possível validar o check-in de um usuário; +- [x] Deve ser possível cadastrar uma academia; + +## RNs (Regras de negócio) + +- [x] O usuário não deve poder se cadastrar com um e-mail duplicado; +- [x] O usuário não pode fazer 2 check-ins no mesmo dia; +- [x] O usuário não pode fazer check-in se não estiver perto (100m) da academia; +- [x] O check-in só pode ser validado até 20 minutos após ser criado; +- [x] O check-in só pode ser validado por administradores; +- [x] A academia só pode ser cadastrada por administradores; + +## RNFs (Requisitos não-funcionais) + +- [x] A senha do usuário precisa estar criptografada; +- [x] Os dados da aplicação precisam estar persistidos em um banco PostgreSQL; +- [x] Todas listas de dados precisam estar paginadas com 20 itens por página; +- [x] O usuário deve ser identificado por um JWT (JSON Web Token); diff --git a/src/server.ts b/src/server.ts index b59f377..6bae06f 100644 --- a/src/server.ts +++ b/src/server.ts @@ -7,5 +7,5 @@ app port: env.PORT, }) .then(() => { - console.log('🔥🔥🔥 HTTP Server Running!') + console.log('🔥🔥🔥 HTTP Server Running 🔥🔥🔥') })