Skip to content

RafaelCarvalho89/back-end-test

Repository files navigation

Descrição do Projeto.

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.


Tasks

  • 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

Sumário


1 Instalação

1 - Clone o projeto.

git clone https://github.com/RafaelCarvalho89/back-end-test.git

2 - Instale as dependencias.

npm install

3 - 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 1

Sera exibido no terminal

systemd

ou

init

Para systemd (systemctl)

sudo systemctl status mongod

Ou para System V Init (service)

sudo service mongod status

Se o Mongo não estiver inicialidado então inicialize-o

Para systemd (systemctl)

sudo systemctl start mongod

Ou para System V Init (service)

sudo service mongod start

4 - Inicialize o projeto em Desenvolvimento

npm run dev

2 API

Rota de desenvolvimento

http://localhost:5050/api/v1

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"
}

3 Provas

3.1 Adicionar Prova

  • POST /api/v1/exam

    Parâmetros da requisição

    Tipo Nome Descrição Schema
    Body name
    required
    O nome da Prova. string
    Body description
    required
    Descrição da Prova. string
    Body type
    required
    Tipo da Prova. Obs.: "ONLINE" ou "OFFLINE" string
    Body questions
    optional
    Questões da Prova. Obs: Um Array de question. question[]

    Question

    Tipo Nome Descrição Schema
    Body statement
    required
    O enunciado da Questão. string
    Body options
    required
    Opções da Questão. Obs: Um Array de option. option[]

    Option

    Tipo Nome Descrição Schema
    Body key
    required
    A chave da opção. string
    Body value
    required
    O valor da opção. string
    Body correct
    required
    Se a opção é verdadeira ou falsa. Obs.: true ou false boolean

    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 prova COM QUESTÕES. Com SUCESSO.

    {
      "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 prova SEM QUESTÕES. Com SUCESSO.

    {
      "id": "6050f9e222a72e7089ed2021",
      "name": "Prova AZUL",
      "description": "Prova sem questões",
      "type": "ONLINE",
      "questions": []
    }

3.2 Obter Prova

  • GET /api/v1/exam/{id}

    Parâmetros da requisição

    Tipo Nome Descrição Schema
    URL param id
    required
    O id da Prova. string

    Exemplo da requisição obter prova.
    GET https://test-back-end-meritt.herokuapp.com/api/v1/exam/6050f9e222a72e7089ed1988


    200 OK - Exemplo de resposta da requisição obter prova. Com SUCESSO.

    {
      "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"
            }
          ]
        }
      ]
    }

3.3 Listar Provas

  • GET /api/v1/exams

  • Obs.: exams, no plural.


    Exemplo da requisição obter prova.
    GET https://test-back-end-meritt.herokuapp.com/api/v1/exams

    200 OK - Exemplo de resposta da requisição listar provas. Com SUCESSO.

    [
      {
        "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"
      }
    ]

3.4 Atualizar Prova

  • PUT /api/v1/exam/{id}

    Parâmetros da requisição

    Tipo Nome Descrição Schema
    URL param id
    required
    O id da Prova. string
    Body name
    required
    O nome da Prova. string
    Body description
    required
    Descrição da Prova. string
    Body type
    required
    Tipo da Prova. Obs.: "ONLINE" ou "OFFLINE" string
    Body questions
    required
    Questões da Prova. Obs: Um Array de question. question[]

    Question

    Tipo Nome Descrição Schema
    Body id
    required
    O id da Questão. string
    Body statement
    required
    O enunciado da Questão. string
    Body options
    required
    Opções da Questão. Obs: Um Array de option. option[]

    Option

    Tipo Nome Descrição Schema
    Body key
    required
    A chave da opção. string
    Body value
    required
    O valor da opção. string
    Body correct
    required
    Se a opção é verdadeira ou falsa. Obs.: true ou false boolean

    Exemplo da requisição para atualização de prova.
    PUT https://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. Com SUCESSO.

    {
      "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"
            }
          ]
        }
      ]
    }

3.5 Deletar Prova

4 Questões

4.1 Adicionar Questão

  • POST /api/v1/exam/{examId}/question

    Parâmetros da requisição

    Tipo Nome Descrição Schema
    URL param examId
    required
    O id da Prova que a Questão será adicionada. string
    Body statement
    required
    O enunciado da Questão. string
    Body options
    required
    Opções da Questão. Obs: Um Array de option. option[]

    Option

    Tipo Nome Descrição Schema
    Body key
    required
    A chave da opção. string
    Body value
    required
    O valor da opção. string
    Body correct
    required
    Se a opção é verdadeira ou falsa. Obs.: true ou false boolean

    Exemplo da requisição adicionar Questão.
    POST https://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. Com SUCESSO.

    {
      "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"
        }
      ]
    }

4.2 Obter Questão

  • GET /api/v1/exam/question/{id}

    Parâmetros da requisição

    Tipo Nome Descrição Schema
    URL param id
    required
    O id da Questão. string

    Exemplo da requisição obter questão.
    GET https://test-back-end-meritt.herokuapp.com/api/v1/exam/question/605112af2a3daa997ee6bb8f


    200 OK - Exemplo de resposta da requisição obter questão. Com SUCESSO.

    {
      "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"
    }

4.3 Listar Questões da Prova

  • GET /api/v1/exam/{id}/questions

  • Obs.: questions, no plural.

    Parâmetros da requisição

    Tipo Nome Descrição Schema
    URL param id
    required
    O id da Prova das Questões. string

    Exemplo da requisição listar questões da prova.
    GET https://test-back-end-meritt.herokuapp.com/api/v1/exam/60500a71fef08553a78d1948/questions


    200 OK - Exemplo de resposta da requisição listar questões da prova. Com SUCESSO.

    [
      {
        "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"
          }
        ]
      }
    ]

4.4 Atualizar Questão

  • PUT /api/v1/exam/question/{id}

    Parâmetros da requisição

    Tipo Nome Descrição Schema
    URL param id
    required
    O id da Questão. string
    Body statement
    required
    O enunciado da Questão. string
    Body options
    required
    Opções da Questão. Obs: Um Array de option. option[]

    Option

    Tipo Nome Descrição Schema
    Body key
    required
    A chave da opção. string
    Body value
    required
    O valor da opção. string
    Body correct
    required
    Se a opção é verdadeira ou falsa. Obs.: true ou false boolean

    Exemplo da requisição atualizar Questão.
    PUT https://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. Com SUCESSO.

    {
      "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"
        }
      ]
    }

4.5 Deletar Questão

  • DELETE /api/v1/exam/question/delete/{id}

    Parâmetros da requisição

    Tipo Nome Descrição Schema
    URL param id
    required
    O id da Questão. string

    Exemplo da requisição deletar questão.
    DELETE https://test-back-end-meritt.herokuapp.com/api/v1/exam/question/605112af2a3daa997ee6bb8f


    200 OK - Exemplo de resposta da requisição deletar questão. Com SUCESSO.

    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"
            }
          ]
        }
      ]
    }

5 Schema


Retornar ao Topo ^

About

Test for back end developer opportunity.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published