- Instale as dependências do projeto:
yarn
||npm i
- Crie o seguinte banco de dados via docker:
docker run --name code_challenge_nave -e POSTGRES_PASSWORD=nave -p 5432:5432 -d postgres
- Execute as migrations para criação das tabelas no banco:
yarn typeorm migration:run
||npm run typeorm migration:run
- Para iniciar o servidor de desenvolvimento:
yarn dev
||npm run dev
- Para executar os testes (não é preciso ter o banco criado):
yarn test
||npm run test
Baixe o arquivo Insomnia_2020-08-09.json
para realizar a importação ou importe diretamente via URL https://github.com/miguelsoliv/code-challenge-naveteam-nodejs/blob/master/Insomnia_2020-08-09.json
O projeto foi organizado com base no Package by Feature (pasta useCases
) e com princípios do SOLID adaptados
Para facilitar a execução dos testes foram criadas imitações dos repositórios de acesso ao Postgres (fake repositories). A cada execução dos testes o "banco" é zerado, pois os dados estão sendo salvos somente em memória.
[POST] /users
Title | Get Scenario |
---|---|
URL | /users |
Method | POST |
URL Params | None |
Data Params | Required: name=[string] email=[string] password=[string] |
Success Response | Code: 201 CREATED Content: { "name": "User", "email": "user@example.com", "id": 1 } |
Error Response | Code: 409 CONFLICT Content: { "status": "error", "message": "Email already in use" } |
Sample Request | { "name": "User", "email": "user@example.com", "password": "123456" } |
[POST] /session
Title | Get Scenario |
---|---|
URL | /session |
Method | POST |
URL Params | None |
Data Params | Required: email=[string] password=[string] |
Success Response | Code: 200 OK Content: { "user": { "id": 1, "name": "User", "email": "user@example.com" }, "token": "JWT here" } |
Error Response | Code: 406 NOT ACCEPTABLE Content: { "status": "error", "message": "Email or password invalid" } |
Sample Request | { "email": "user@example.com", "password": "123456" } |
[POST] /projects
Title | Get Scenario |
---|---|
URL | /projects |
Method | POST |
URL Params | None |
Data Params | Required: name=[string] navers=[number[]] |
Success Response | Code: 201 CREATED Content: { "name": "Cool Project", "id": 1 } |
Error Response | Code: 404 NOT FOUND Content: { "status": "error", "message": "Invalid user" } or { "status": "error", "message": "Naver with ID 1 not found" } |
Sample Request | { "name": "Cool Project", "navers": [] } |
Notes | Authentication required |
[GET] /projects
Title | Get Scenario |
---|---|
URL | /projects |
Method | GET |
URL Params | None |
Data Params | None |
Success Response | Code: 200 OK Content: [{ "name": "Cool Project", "id": 1 }] |
Error Response | Code: 404 NOT FOUND Content: { "status": "error", "message": "Invalid user" } |
Sample Request | /projects |
Notes | Authentication required |
[PUT] /projects/:id
Title | Get Scenario |
---|---|
URL | /projects/:id |
Method | PUT |
URL Params | Required: id=[number] |
Data Params | Required: name=[string] navers=[number[]] |
Success Response | Code: 200 OK Content: { "id": 1, "name": "Awesome Project" } |
Error Response | Code: 401 UNAUTHORIZED Content: { "status": "error", "message": "This project is not related to you" } Code: 404 NOT FOUND Content: { "status": "error", "message": "Invalid user" } , { "status": "error", "message": "Project not found" } or { "status": "error", "message": "Naver with ID 1 not found" } |
Sample Request | { "name": "Awesome Project", "navers": [1] } |
Notes | Authentication required |
[GET] /projects/:id
Title | Get Scenario |
---|---|
URL | /projects/:id |
Method | GET |
URL Params | Required: id=[number] |
Data Params | None |
Success Response | Code: 200 OK Content: { "id": 1, "name": "Awesome Project", "navers": [{ "id": 1, "name": "John Doe", "birthdate": "2000-10-10", "admission_date": "2020-10-02", "job_role": "Dev" }] } |
Error Response | Code: 404 NOT FOUND Content: { "status": "error", "message": "Project not found" } |
Sample Request | /projects/1 |
Notes | Authentication required |
[DELETE] /projects/:id
Title | Get Scenario |
---|---|
URL | /projects/:id |
Method | DELETE |
URL Params | Required: id=[number] |
Data Params | None |
Success Response | Code: 204 NO CONTENT Content: None |
Error Response | Code: 401 UNAUTHORIZED Content: { "status": "error", "message": "This project is not related to you" } Code: 404 NOT FOUND Content: { "status": "error", "message": "Invalid user" } or { "status": "error", "message": "Project not found" } |
Sample Request | /projects/1 |
Notes | Authentication required |
[POST] /navers
Title | Get Scenario |
---|---|
URL | /navers |
Method | POST |
URL Params | None |
Data Params | Required: name=[string] admission_date=[Date] birthdate=[Date] job_role=[string] projects=[number[]] |
Success Response | Code: 201 CREATED Content: { "name": "John Doe", "birthdate": "2000-08-08", "admission_date": "2020-08-08", "job_role": "Desenvolvedor", "id": 1 } |
Error Response | Code: 404 NOT FOUND Content: { "status": "error", "message": "Invalid user" } or { "status": "error", "message": "Project with ID 1 not found" } |
Sample Request | { "name": "John Doe", "admission_date": "2020-08-08", "birthdate": "2000-08-08", "job_role": "Desenvolvedor", "projects": [] } |
Notes | Authentication required |
[GET] /navers
Title | Get Scenario |
---|---|
URL | /navers |
Method | GET |
URL Params | None |
Data Params | None |
Success Response | Code: 200 OK Content: [{ "name": "John Doe", "birthdate": "2000-08-08", "admission_date": "2020-08-08", "job_role": "Desenvolvedor", "id": 1 }] |
Error Response | Code: 404 NOT FOUND Content: { "status": "error", "message": "Invalid user" } |
Sample Request | /navers |
Notes | Authentication required |
[PUT] /navers/:id
Title | Get Scenario |
---|---|
URL | /navers/:id |
Method | PUT |
URL Params | Required: id=[number] |
Data Params | Required: name=[string] admission_date=[Date] birthdate=[Date] job_role=[string] projects=[number[]] |
Success Response | Code: 200 OK Content: { "id": 1, "name": "John Doe!", "birthdate": "2000-10-10", "admission_date": "2020-10-02", "job_role": "Dev" } |
Error Response | Code: 401 UNAUTHORIZED Content: { "status": "error", "message": "This project is not related to you" } Code: 404 NOT FOUND Content: { "status": "error", "message": "Invalid user" } , { "status": "error", "message": "Naver not found" } or { "status": "error", "message": "Project with ID 1 not found" } |
Sample Request | { "name": "John Doe!", "admission_date": "2020-10-02", "birthdate": "2000-10-10", "job_role": "Dev", "projects": [1] } |
Notes | Authentication required |
[GET] /navers/:id
Title | Get Scenario |
---|---|
URL | /navers/:id |
Method | GET |
URL Params | Required: id=[number] |
Data Params | None |
Success Response | Code: 200 OK Content: { "id": 1, "name": "John Doe!", "admission_date": "2020-10-02", "birthdate": "2000-10-10", "job_role": "Dev", "projects": [{ "id": 1, "name": "Awesome Project" }] } |
Error Response | Code: 404 NOT FOUND Content: { "status": "error", "message": "Naver not found" } |
Sample Request | /navers/1 |
Notes | Authentication required |
[DELETE] /navers/:id
Title | Get Scenario |
---|---|
URL | /navers/:id |
Method | DELETE |
URL Params | Required: id=[number] |
Data Params | None |
Success Response | Code: 204 NO CONTENT Content: None |
Error Response | Code: 401 UNAUTHORIZED Content: { "status": "error", "message": "This naver is not related to you" } Code: 404 NOT FOUND Content: { "status": "error", "message": "Invalid user" } or { "status": "error", "message": "Naver not found" } |
Sample Request | /navers/1 |
Notes | Authentication required |