Este projeto é a implementação da resolução de um teste para uma vaga de Desenvolvedor Back End.
Ele se resume basicamente em uma API de provas, mantendo o gerenciamento de Provas (Exams), e de Questões da Prova (Questions).
A API está hospedada no Heroku, e o endereço para consumi-lá é `https://test-back-end-meritt.herokuapp.com/api/v1`
A seguir, se encontram as instruções de instalação do projeto, e de como consumir a API.
-
feat: write documentation -
fix: delete question broken -
feat: change API to REST pattern -
feat: deploy of API - feat: use Nest.js in API
- refactor: extract fields validation out of the controller
- revision: code and organization
1 - Clone o projeto.
git clone https://github.com/RafaelCarvalho89/back-end-test.git2 - Instale as dependencias.
npm install3 - Verifique se o Mongo está inicializado, e inicialize o serviço caso não esteja.
Para executar e gerenciar seu mongodprocesso, você usará o sistema init integrado de seu sistema operacional.
Se você não tiver certeza de qual sistema init sua plataforma usa, execute o seguinte comando no terminal:
ps --no-headers -o comm 1Sera exibido no terminal
systemdou
initPara systemd (systemctl)
sudo systemctl status mongodOu para System V Init (service)
sudo service mongod statusSe o Mongo não estiver inicialidado então inicialize-o
Para systemd (systemctl)
sudo systemctl start mongodOu para System V Init (service)
sudo service mongod start4 - Inicialize o projeto em Desenvolvimento
npm run devRota de desenvolvimento
Rota de produção
https://test-back-end-meritt.herokuapp.com/api/v1
Alem da resposta 200 OK de sucesso, a API pode retornar mais dois tipos de resposta, 400 Bad request e 500 Server error.
A resposta 400 Bad request é retornada quando formato da requisição está incorreto.
E a resposta 500 Server error é retornada quando ocorre algum erro no serviço da API.
Exemplo de uma requisição adicionar prova faltando o campo name.
{
"description": "Prova sem questões",
"type": "ONLINE",
"questions": []
}400 Bad Request - Exemplo de resposta da requisição adicionar prova faltando o campo name.
{
"name": "MissingParamError",
"message": "Missing param: name"
}Exemplo de uma requisição adicionar prova com o valor do campo type inválido.
{
"name": "Prova VERMELHA",
"description": "Prova sem questões",
"type": "BAZINGA",
"questions": []
}400 Bad Request - Exemplo de resposta de uma requisição adicionar prova com o valor do campo type inválido.
{
"name": "InvalidParamError",
"message": "Invalid param: type"
}500 Server Error - Exemplo de resposta de uma requisição quando occorre algum erro no serviço da API.
{
"name": "ServerError",
"message": "Internal Server Error"
}-
POST/api/v1/examTipo Nome Descrição Schema Body name
requiredO nome da Prova. string Body description
requiredDescrição da Prova. string Body type
requiredTipo da Prova. Obs.: "ONLINE"ou"OFFLINE"string Body questions
optionalQuestões da Prova. Obs: Um Array de question.question[]
Tipo Nome Descrição Schema Body statement
requiredO enunciado da Questão. string Body options
requiredOpções da Questão. Obs: Um Array de option.option[]
Tipo Nome Descrição Schema Body key
requiredA chave da opção. string Body value
requiredO valor da opção. string Body correct
requiredSe a opção é verdadeira ou falsa. Obs.: trueoufalseboolean
Exemplo da requisição passando uma prova
COM QUESTÕES.{ "name": "Prova AMARELA", "description": "Prova completa", "type": "ONLINE", "questions": [ { "statement": "Qual o sentido da vida, do universo e tudo mais?", "options": [ { "key": "a", "value": "viver", "correct": false }, { "key": "b", "value": "beber café", "correct": false }, { "key": "c", "value": "codar", "correct": false }, { "key": "d", "value": "42", "correct": true } ] } ] }
200 OK- Exemplo de resposta da requisição passando uma provaCOM QUESTÕES. ComSUCESSO.{ "id": "6050f9e222a72e7089ed1988", "name": "Prova AMARELA", "description": "Prova completa", "type": "ONLINE", "questions": [ { "id": "6050f9e222a72e7089ed1987", "statement": "Qual o sentido da vida, do universo e tudo mais?", "options": [ { "key": "a", "value": "viver", "correct": false, "id": "6050f9e222a72e7089ed1983" }, { "key": "b", "value": "beber café", "correct": false, "id": "6050f9e222a72e7089ed1984" }, { "key": "c", "value": "codar", "correct": false, "id": "6050f9e222a72e7089ed1985" }, { "key": "d", "value": "42", "correct": true, "id": "6050f9e222a72e7089ed1986" } ] } ] }
Exemplo da requisição passando uma prova
SEM QUESTÕES.{ "name": "Prova AZUL", "description": "Prova sem questões", "type": "ONLINE" }
200 OK- Exemplo de resposta da requisição passando uma provaSEM QUESTÕES. ComSUCESSO.{ "id": "6050f9e222a72e7089ed2021", "name": "Prova AZUL", "description": "Prova sem questões", "type": "ONLINE", "questions": [] }
-
GET/api/v1/exam/{id}Tipo Nome Descrição Schema URL param id
requiredO id da Prova. string
Exemplo da requisição obter prova.
GEThttps://test-back-end-meritt.herokuapp.com/api/v1/exam/6050f9e222a72e7089ed1988
200 OK- Exemplo de resposta da requisição obter prova. ComSUCESSO.{ "id": "6050f9e222a72e7089ed1988", "name": "Prova AMARELA", "description": "Prova completa", "type": "ONLINE", "questions": [ { "id": "6050f9e222a72e7089ed1987", "statement": "Qual o sentido da vida, do universo e tudo mais?", "options": [ { "key": "a", "value": "viver", "correct": false, "id": "6050f9e222a72e7089ed1983" }, { "key": "b", "value": "beber café", "correct": false, "id": "6050f9e222a72e7089ed1984" }, { "key": "c", "value": "codar", "correct": false, "id": "6050f9e222a72e7089ed1985" }, { "key": "d", "value": "42", "correct": true, "id": "6050f9e222a72e7089ed1986" } ] } ] }
-
GET/api/v1/exams -
Obs.:
exams, no plural.
Exemplo da requisição obter prova.
GEThttps://test-back-end-meritt.herokuapp.com/api/v1/exams200 OK- Exemplo de resposta da requisição listar provas. ComSUCESSO.[ { "name": "Prova AMARELA", "description": "Prova sem questões", "type": "OFFLINE", "questions": [], "id": "60500a71fef08553a78d1948" }, { "name": "Prova AZUL", "description": "Prova sem questões", "type": "ONLINE", "questions": [], "id": "605104ab28fda7815af489ae" } ]
-
PUT/api/v1/exam/{id}Tipo Nome Descrição Schema URL param id
requiredO id da Prova. string Body name
requiredO nome da Prova. string Body description
requiredDescrição da Prova. string Body type
requiredTipo da Prova. Obs.: "ONLINE"ou"OFFLINE"string Body questions
requiredQuestões da Prova. Obs: Um Array de question.question[]
Tipo Nome Descrição Schema Body id
requiredO id da Questão. string Body statement
requiredO enunciado da Questão. string Body options
requiredOpções da Questão. Obs: Um Array de option.option[]
Tipo Nome Descrição Schema Body key
requiredA chave da opção. string Body value
requiredO valor da opção. string Body correct
requiredSe a opção é verdadeira ou falsa. Obs.: trueoufalseboolean
Exemplo da requisição para atualização de prova.
PUThttps://test-back-end-meritt.herokuapp.com/api/v1/exam/6050f9e222a72e7089ed1988{ "name": "Prova AMARELA 2021 ATUALIZADA", "description": "Prova completa 2021 ATUALIZADA", "type": "ONLINE", "questions": [ { "statement": "Qual o sentido da vida, do universo e tudo mais? 2021 ATUALIZADO ¯_(ツ)_/¯", "options": [ { "key": "a", "value": "viver", "correct": false }, { "key": "b", "value": "beber café", "correct": false }, { "key": "c", "value": "codar", "correct": false }, { "key": "d", "value": "42", "correct": true } ] } ] }
200 OK- Exemplo de resposta da requisição para atualização de prova. ComSUCESSO.{ "id": "6050f9e222a72e7089ed1988", "name": "Prova AMARELA 2021 ATUALIZADA", "description": "Prova completa 2021 ATUALIZADA", "type": "ONLINE", "questions": [ { "id": "6050f9e222a72e7089ed1987", "statement": "Qual o sentido da vida, do universo e tudo mais? 2021 ATUALIZADO ¯_(ツ)_/¯", "options": [ { "key": "a", "value": "viver", "correct": false, "id": "6050f9e222a72e7089ed1983" }, { "key": "b", "value": "beber café", "correct": false, "id": "6050f9e222a72e7089ed1984" }, { "key": "c", "value": "codar", "correct": false, "id": "6050f9e222a72e7089ed1985" }, { "key": "d", "value": "42", "correct": true, "id": "6050f9e222a72e7089ed1986" } ] } ] }
-
DELETE/api/v1/exam/{id}Tipo Nome Descrição Schema URL param id
requiredO id da Prova. string
Exemplo da requisição deletar prova.
DELETEhttps://test-back-end-meritt.herokuapp.com/api/v1/exam/6050f9e222a72e7089ed1988
200 OK- Exemplo de resposta da requisição deletar prova. ComSUCESSO.{ "delete": "ok" }
-
POST/api/v1/exam/{examId}/questionTipo Nome Descrição Schema URL param examId
requiredO id da Prova que a Questão será adicionada. string Body statement
requiredO enunciado da Questão. string Body options
requiredOpções da Questão. Obs: Um Array de option.option[]
Tipo Nome Descrição Schema Body key
requiredA chave da opção. string Body value
requiredO valor da opção. string Body correct
requiredSe a opção é verdadeira ou falsa. Obs.: trueoufalseboolean
Exemplo da requisição adicionar Questão.
POSThttps://test-back-end-meritt.herokuapp.com/api/v1/exam/60500a71fef08553a78d1948/question{ "statement": "Qual o sentido da vida, do universo e tudo mais?", "options": [ { "key": "a", "value": "viver", "correct": false }, { "key": "b", "value": "beber café", "correct": false }, { "key": "c", "value": "codar", "correct": false }, { "key": "d", "value": "42", "correct": true } ] }
200 OK- Exemplo de resposta da requisição adicionar Questão. ComSUCESSO.{ "id": "605112af2a3daa997ee6bb8f", "statement": "Qual o sentido da vida, do universo e tudo mais?", "options": [ { "key": "a", "value": "viver", "correct": false, "id": "605112af2a3daa997ee6bb90" }, { "key": "b", "value": "beber café", "correct": false, "id": "605112af2a3daa997ee6bb91" }, { "key": "c", "value": "codar", "correct": false, "id": "605112af2a3daa997ee6bb92" }, { "key": "d", "value": "42", "correct": true, "id": "605112af2a3daa997ee6bb93" } ] }
-
GET/api/v1/exam/question/{id}Tipo Nome Descrição Schema URL param id
requiredO id da Questão. string
Exemplo da requisição obter questão.
GEThttps://test-back-end-meritt.herokuapp.com/api/v1/exam/question/605112af2a3daa997ee6bb8f
200 OK- Exemplo de resposta da requisição obter questão. ComSUCESSO.{ "id": "605112af2a3daa997ee6bb8f", "statement": "Qual o sentido da vida, do universo e tudo mais?", "options": [ { "key": "a", "value": "viver", "correct": false, "id": "605112af2a3daa997ee6bb90" }, { "key": "b", "value": "beber café", "correct": false, "id": "605112af2a3daa997ee6bb91" }, { "key": "c", "value": "codar", "correct": false, "id": "605112af2a3daa997ee6bb92" }, { "key": "d", "value": "42", "correct": true, "id": "605112af2a3daa997ee6bb93" } ], "examId": "60500a71fef08553a78d1948", "examName": "Prova AMARELA" }
-
GET/api/v1/exam/{id}/questions -
Obs.:
questions, no plural.Tipo Nome Descrição Schema URL param id
requiredO id da Prova das Questões. string
Exemplo da requisição listar questões da prova.
GEThttps://test-back-end-meritt.herokuapp.com/api/v1/exam/60500a71fef08553a78d1948/questions
200 OK- Exemplo de resposta da requisição listar questões da prova. ComSUCESSO.[ { "id": "605112af2a3daa997ee6bb8f", "statement": "Qual o sentido da vida, do universo e tudo mais?", "options": [ { "key": "a", "value": "viver", "correct": false, "id": "60511cd1b841c7ac42d626e2" }, { "key": "b", "value": "42", "correct": true, "id": "60511cd1b841c7ac42d626e5" }, { "key": "c", "value": "beber café", "correct": false, "id": "60511cd1b841c7ac42d626e3" }, { "key": "d", "value": "codar", "correct": false, "id": "60511cd1b841c7ac42d626e4" } ] }, { "id": "60511cd1b841c7ac42d626e1", "statement": "Qual a ordem mais bacana para assistir os filmes de Star Wars?", "options": [ { "key": "a", "value": "Lançamento dos Filmes", "correct": false, "id": "60511cd1b841c7ac42d626e7" }, { "key": "b", "value": "Machete", "correct": false, "id": "60511cd1b841c7ac42d626e9" }, { "key": "c", "value": "Cronológica dos Fatos", "correct": false, "id": "60511cd1b841c7ac42d626e6" }, { "key": "d", "value": "Ernst Rister", "correct": true, "id": "60511cd1b841c7ac42d626e8" } ] } ]
-
PUT/api/v1/exam/question/{id}Tipo Nome Descrição Schema URL param id
requiredO id da Questão. string Body statement
requiredO enunciado da Questão. string Body options
requiredOpções da Questão. Obs: Um Array de option.option[]
Tipo Nome Descrição Schema Body key
requiredA chave da opção. string Body value
requiredO valor da opção. string Body correct
requiredSe a opção é verdadeira ou falsa. Obs.: trueoufalseboolean
Exemplo da requisição atualizar Questão.
PUThttps://test-back-end-meritt.herokuapp.com/api/v1/exam/question/60511cd1b841c7ac42d626e1{ "statement": "Qual a ordem mais bacana para assistir os filmes de Star Wars? 2021 ATUALIZADO ¯_(ツ)_/¯", "options": [ { "key": "a", "value": "Lançamento dos Filmes", "correct": false }, { "key": "b", "value": "Machete", "correct": false }, { "key": "c", "value": "Cronológica dos Fatos", "correct": false }, { "key": "d", "value": "Ernst Rister ¯_(ツ)_/¯", "correct": true } ] }
200 OK- Exemplo de resposta da requisição atualizar Questão. ComSUCESSO.{ "id": "60511cd1b841c7ac42d626e1", "statement": "Qual a ordem mais bacana para assistir os filmes de Star Wars? 2021 ATUALIZADO ¯_(ツ)_/¯", "options": [ { "key": "a", "value": "Lançamento dos Filmes", "correct": false, "id": "60511cd1b841c7ac42d626e7" }, { "key": "b", "value": "Machete", "correct": false, "id": "60511cd1b841c7ac42d626e9" }, { "key": "c", "value": "Cronológica dos Fatos", "correct": false, "id": "60511cd1b841c7ac42d626e6" }, { "key": "d", "value": "Ernst Rister ¯_(ツ)_/¯", "correct": true, "id": "60511cd1b841c7ac42d626e8" } ] }
-
DELETE/api/v1/exam/question/delete/{id}Tipo Nome Descrição Schema URL param id
requiredO id da Questão. string
Exemplo da requisição deletar questão.
DELETEhttps://test-back-end-meritt.herokuapp.com/api/v1/exam/question/605112af2a3daa997ee6bb8f
200 OK- Exemplo de resposta da requisição deletar questão. ComSUCESSO.Obs.: A resposta retorna a Prova no qual a questão pertencia.
Já sem a questão deletada.{ "id": "60500a71fef08553a78d1948", "name": "Prova AMARELA", "description": "Prova sem questões", "type": "OFFLINE", "questions": [ { "id": "605125a7abd2a8b71f67381e", "statement": "Qual a ordem mais bacana para assistir os filmes de Star Wars?", "options": [ { "key": "a", "value": "Cronológica dos Fatos", "correct": false, "id": "605125a7abd2a8b71f673823" }, { "key": "b", "value": "Lançamento dos Filmes", "correct": false, "id": "605125a7abd2a8b71f673824" }, { "key": "c", "value": "Ernst Rister", "correct": true, "id": "605125a7abd2a8b71f673825" }, { "key": "d", "value": "Machete", "correct": false, "id": "605125a7abd2a8b71f673826" } ] } ] }