Coder Social home page Coder Social logo

easytask's Introduction

Easytask

Python application codecov

Este projeto destina-se a solucionar um desafio de programação de um processo de recrutamento e seleção. Para entender os requisitos da aplicação, acesse o arquivo REQUIREMENTS.md.

1. Guia de Instalação

Existem várias opções para instalar e executar esta aplicação, desde a configuração manual até a utilização de contêineres Docker. Escolha a opção que melhor se adapta às suas necessidades e ambiente.

Opção 1: Configuração Manual

  1. Configure manualmente um banco de dados PostgreSQL, MySQL ou outro suportado. Depois, ajuste a variável de ambiente SQLALCHEMY_DATABASE_URI no arquivo .env para a URI do seu banco de dados recém-configurado.
SQLALCHEMY_DATABASE_URI=your_database_uri
  1. Configure o ambiente virtual:
$ python3.10 -m venv .venv
$ source .venv/bin/activate
$ pip install -r requirements.txt
  1. Aplique as migrações:
$ python manage.py db upgrade
  1. Execute a aplicação:
$ python manage.py run

Opção 2: Construção e Execução de uma Imagem Docker da Aplicação

  1. Configure um banco de dados separadamente e ajuste a variável de ambiente SQLALCHEMY_DATABASE_URI no arquivo .env para a URI do seu banco de dados recém-configurado.

  2. Construa a imagem Docker:

$ docker build -t easytask .
  1. Aplique as migrações:
$ docker run --env-file .env easytask python manage.py db upgrade
  1. Execute a aplicação
$ docker run --env-file .env easytask python manage.py run

Opção 3: Composição e Execução da API e Banco de Dados Juntos

  1. Construa e execute a API e o banco de dados com um único comando:
$ docker compose up --build
  1. Aplique as migrações:
$ docker exec CONTAINER_ID python manage.py db upgrade

2. Acessando o Shell no Contêiner

Ocasionalmente, pode ser necessário acessar o shell diretamente dentro do seu contêiner. Veja como você pode fazer isso:

Bash

$ docker exec -it CONTAINER_ID sh

Python shell

$ docker exec -it CONTAINER_ID python3 manage.py shell

3. Criando Migrações

Sempre que você alterar um modelo, você deve criar e aplicar migrações:

python manage.py db migrate -m "Migração inicial."
python manage.py db upgrade

Agora que você já sabe instalar e executar a aplicação, vamos ver o que ela pode fazer.

4. Endpoints Disponíveis

Registro de Usuário

  • URL: /api/v1/auth/register
  • Método HTTP: POST
  • Descrição: Registra um novo usuário no sistema.
  • Corpo da Requisição (JSON):
{
  "name": "<Nome do usuário>",
  "email": "<E-mail do usuário>",
  "password": "<Senha do usuário>"
}
  • Corpo da Resposta (JSON):
{
  "id": "<Id do usuário>",
  "name": "<Nome do usuário>",
  "email": "<E-mail do usuário>"
}

Login de Usuário

  • URL: /api/v1/auth/login
  • Método HTTP: POST
  • Descrição: Autentica um usuário no sistema.
  • Corpo da Requisição (JSON):
{
  "email": "<E-mail do usuário>",
  "password": "<Senha do usuário>"
}
  • Corpo da Resposta (JSON):
{
  "access_token": "<Token de acesso>",
  "refresh_token": "<Token de renovação>"
}

Logout de Usuário

  • URL: /api/v1/auth/logout
  • Método HTTP: DELETE
  • Descrição: Invalida o token de acesso do usuário.
  • Cabeçalho da Requisição:
    • Authorization: Bearer <access_token>
    • ou Authorization: Bearer <refresh_token>
  • Corpo da Resposta (JSON):
{
  "message": "Access revoked."
}

Atualização do Token de Acesso

  • URL: /api/v1/auth/refresh
  • Método HTTP: POST
  • Descrição: Gera um novo token de acesso usando um token de atualização.
  • Cabeçalho da Requisição:
    • Authorization: Bearer <refresh_token>
  • Corpo da Resposta (JSON):
{
  "access_token": "<Token de acesso>"
}

Obtenção da Lista de Tarefas

  • URL: /api/v1/tasks/
  • Método HTTP: GET
  • Cabeçalho da Requisição:
    • Authorization: Bearer <access_token>
  • Parâmetros de Consulta:
    • start (int): Índice inicial da lista (padrão: 0)
    • end (int, opcional): Índice final da lista
    • limit (int): Número máximo de resultados a serem retornados (padrão: 5)
  • Corpo da Resposta (JSON):
[
  {
    "id": "<Id da tarefa>",
    "title": "<Título da tarefa>"
  },
  {
    "id": "<Id da tarefa>",
    "title": "<Título da tarefa>"
  },
  {
    "id": "<Id da tarefa>",
    "title": "<Título da tarefa>"
  },
  {
    "id": "<Id da tarefa>",
    "title": "<Título da tarefa>"
  },
  {
    "id": "<Id da tarefa>",
    "title": "<Título da tarefa>"
  },
]

É possível interagir com esses endpoints via Postman carregando a coleção de requisições.

5. Mensagens de Erro

A seguir estão os status HTTP de erros que podem ser retornados pela aplicação:

  • BAD_REQUEST (400): Solicitação inválida.

  • UNAUTHORIZED (401): Sem autorização para acessar o recurso.

  • FORBIDDEN (403): Acesso proibido ao recurso.

  • NOT_FOUND (404): Recurso não encontrado.

  • UNPROCESSABLE_ENTITY (422): Recurso em situação improcessável.

  • INTERNAL_SERVER_ERROR (500): Erro interno do servidor.

  • SERVICE_UNAVAILABLE (503): Serviço temporariamente indisponível.

  • BAD_GATEWAY (502): Serviço externo retornou uma resposta inválida ou malformada.

  • GATEWAY_TIMEOUT (504): Tempo limite de resposta do serviço externo excedido.

Formato de Retorno

Todas as mensagens de erro seguem o mesmo formato:

{
    "error": {
        "reason": "<Descrição do erro>"
    }
}

Os erros de validação (status HTTP 400) contêm uma chave adicional de contexto para auxiliar na resolução do problema. Eles podem ser classificados em diferentes tipos de erros, dependendo da origem do problema:

  • Erro de Formulário (form_error): Indica problemas relacionados aos dados enviados via formulário.
  • Erro no Corpo da Requisição (body_error): Refere-se a erros identificados no corpo da requisição.
  • Erro no Caminho do Recurso (path_error): Sinaliza problemas relacionados ao caminho do recurso requisitado.
  • Erro nos Parâmetros de Consulta (query_error): Indica erros encontrados nos parâmetros de consulta da requisição.

Aqui está um exemplo do formato de retorno com o contexto:

{
    "error": {
        "reason": "Erro de validação",
        "context": {
            "body_params": [
                {
                    "type": "value_error",
                    "loc": ["email"],
                    "msg": "E-mail já existe",
                    "input": "[email protected]"
                }
            ]
        }
    }
}

Neste exemplo, o erro específico é indicado como um erro no corpo da requisição (body_error), e detalhes adicionais são fornecidos no contexto (context), como o tipo de erro (type), o local onde ocorreu (loc), a mensagem de erro (msg) e o valor de entrada que causou o erro (input).

6. Exemplo de Uso

Aqui está um exemplo de como usar a API com o Python usando a biblioteca requests:

import requests

# URL base da API
base_url = "http://localhost:5000"

# Dados para registro de usuário
register_data = {
    "name": "John Doe",
    "email": "[email protected]",
    "password": "supersecret"
}

# Dados para login de usuário
login_data = {
    "email": "[email protected]",
    "password": "supersecret"
}

# Registrar usuário
register_response = requests.post(f"{base_url}/api/v1/auth/register", json=register_data)
print(register_response.json())

# Fazer login
login_response = requests.post(f"{base_url}/api/v1/auth/login", json=login_data)
print(login_response.json())

# Extrair o token de acesso
access_token = login_response.json()["access_token"]

# Usar o token de acesso para obter a lista de tarefas
headers = {"Authorization": f"Bearer {access_token}"}
tasks_response = requests.get(f"{base_url}/api/v1/tasks", headers=headers)
print(tasks_response.json())

# Fazer logout
logout_response = requests.delete(f"{base_url}/api/v1/auth/logout", headers=headers)
print(logout_response.json())

Lembre-se de substituir "http://localhost:5000" com a URL real da sua API.

easytask's People

Contributors

felipediel avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.