- Django
- python-dotenv
- djangorestframework
Caso queira fazer uma clonagem e rodar o processo na sua máquina siga as seguintes instruções:
1 - Inicie um ambiente virtual (venv
) no seu projeto (usamos o poetry
como gerenciador de pacotes):
$ pip install poetry
2 - Instale as dependências presentes no arquivo pyproject.toml
com o seguinte comando no terminal:
$ poetry install # instala todos os pacotes
$ # poetry install --only main # instala os pacotes usados em produção
4 - Verifique as variáveis de ambientes de configuração necessárias no arquivo .env.example
, crie uma cópia desse arquivo preencha as chaves necessárias e nomeie-o .env
3 - Em seguida, inicie a aplicação django rodando o seguinte comando no terminal:
$ task run
1 - Para rodar os testes execute o comando:
$ task test
2 - para visualizar a cobertura dos testes abra o arquivo htmlcov/index.html
em qualquer navegador.
POST /api/accounts/
Qualquer pessoa pode criar qualquer usuário:
{
"first_name": "John",
"last_name": "Doe",
"email": "[email protected]",
"password": "1234",
"is_admin": false
}
Dessa requisição é esperado um retorno com os dados do usuário cadastrado, como mostrado a seguir:
{
"uuid": "37c65691-d4fc-47e0-aef4-afe7b09c261f",
"first_name": "John",
"last_name": "Doe",
"email": "[email protected]",
"is_admin": false
}
POST /api/login/
Esta API utiliza verificação por Token de autenticação, na grande maioria das próximas rotas será necessário o uso destes tokens.
{
"email": "[email protected]",
"password": "1234"
}
Dessa requisição é esperado um retorno com o token de acesso do usuário, como mostrado a seguir:
{
"token": "76a6683c3a38c40caee04af738d279753e2c4d8d"
}
GET /api/accounts/
Esse endpoint servirá para fazermos a listagem de usuários no curso: Requer token de instrutor
// REQUEST
// Header -> Authorization: Token 'token-do-instrutor'
[
{
"uuid": "61039ae4-7016-48d3-b90e-95a78b39e427",
"first_name": "Maria",
"last_name": "Joaquina",
"email": "[email protected]",
"is_admin": true
},
{
"uuid": "af8af8b1-7d19-4032-b93d-04c84c66f8e1",
"first_name": "João",
"last_name": "Souza",
"email": "[email protected]",
"is_admin": true
},
{
"uuid": "5fef85a3-61e3-4e03-b6bd-ee544cd9bcdd",
"first_name": "Joaquim",
"last_name": "Ferreira",
"email": "[email protected]",
"is_admin": false
},
{
"uuid": "5f2747f3-8899-49d9-b7f9-4ade850db837",
"first_name": "Marcelo",
"last_name": "Soares",
"email": "[email protected]",
"is_admin": false
},
{
"uuid": "f09c6c88-6cd3-4ed9-b818-432e9f8df11c",
"first_name": "Pedro",
"last_name": "Martins",
"email": "[email protected]",
"is_admin": false
}
]
PUT /api/address/
Esse endpoint deverá fazer a criação do endereço, caso ele não exista e associá-lo ao usuário logado:
// REQUEST
// Header -> Authorization: Token 'token-do-instrutor'
{
"zip_code": "123456789",
"street": "Rua das Flores",
"house_number": "123",
"city": "Curitiba",
"state": "Paraná",
"country": "Brasil"
}
Exemplo de resposta dessa rota:
{
"uuid": "7bf9d19a-2c22-4daa-b7dc-30be78bf1047",
"street": "Rua das Flores",
"city": "Curitiba",
"state": "Paraná",
"zip_code": "123456789",
"country": "Brasil",
"users": [
{
"uuid": "38f8b8b7-8edc-4685-9369-643bb85169d2",
"first_name": "John",
"last_name": "Doe",
"email": "[email protected]",
"is_admin": false
}
]
}
POST /api/courses/
Esse endpoint servirá para realizar a criação de cursos na plataforma Kanvas, somente instrutores poderão criar, atualizar, deletar e matricular estudantes nos cursos:
// REQUEST
// Header -> Authorization: Token 'token-do-instrutor'
{
"name": "Django",
"demo_time": "9:00",
"link_repo": "https://gitlab.com/turma_django/"
}
Dessa requisição é esperado um retorno com os dados do curso cadastrado, como mostrado a seguir:
{
"uuid": "7c32c787-83c3-4994-8f45-b6ef113cde5e",
"name": "Django",
"demo_time": "09:00:00",
"created_at": "2022-02-15T19:12:44.914032Z",
"link_repo": "https://gitlab.com/turma_django/",
"instructor": null,
"students": []
}
GET /api/courses/
Este endpoint pode ser acessado por qualquer client (mesmo sem autenticação). A resposta do servidor deve trazer uma lista de cursos, mostrando cada aluno inscrito, no seguinte formato:
[
{
"uuid": "87556b7e-ac9a-4a8d-9b9f-c2ea7e956a94",
"name": "Django",
"demo_time": "09:00:00",
"created_at": "2022-02-15T19:08:15.927682Z",
"link_repo": "https://gitlab.com/turma_django/",
"instructor": null,
"students": [
{
"uuid": "5fef85a3-61e3-4e03-b6bd-ee544cd9bcdd",
"first_name": "Joaquim",
"last_name": "Ferreira",
"email": "[email protected]",
"is_admin": false
}
]
},
{
"uuid": "696e31d3-2dd4-42b5-9d2d-4f92035a13fb",
"name": "Node",
"demo_time": "09:00:00",
"created_at": "2022-02-15T19:09:29.898611Z",
"link_repo": "https://gitlab.com/turma_node/",
"instructor": null,
"students": [
{
"uuid": "5f2747f3-8899-49d9-b7f9-4ade850db837",
"first_name": "Marcelo",
"last_name": "Soares",
"email": "[email protected]",
"is_admin": false
}
]
},
{
"uuid": "787673a7-fa4e-4bb8-9ec1-eabbba02fca5",
"name": "React",
"demo_time": "09:00:00",
"created_at": "2022-02-15T19:10:43.883684Z",
"link_repo": "https://gitlab.com/turma_django/",
"instructor": {
"uuid": "61039ae4-7016-48d3-b90e-95a78b39e427",
"first_name": "Maria",
"last_name": "Joaquina",
"email": "[email protected]",
"is_admin": true
},
"students": [
{
"uuid": "5f2747f3-8899-49d9-b7f9-4ade850db837",
"first_name": "Marcelo",
"last_name": "Soares",
"email": "[email protected]",
"is_admin": false
},
{
"uuid": "f09c6c88-6cd3-4ed9-b818-432e9f8df11c",
"first_name": "Pedro",
"last_name": "Martins",
"email": "[email protected]",
"is_admin": false
}
]
}
]
GET /api/courses/<id>/
Este endpoint pode ser acessado por qualquer client (mesmo sem autenticação). A resposta do servidor deve trazer o elemento filtrado pelo id do curso informado na url, e deverá ter o seguinte formato:
{
"uuid": "87556b7e-ac9a-4a8d-9b9f-c2ea7e956a94",
"name": "Django",
"demo_time": "09:00:00",
"created_at": "2022-02-15T19:08:15.927682Z",
"link_repo": "https://gitlab.com/turma_django/",
"instructor": null,
"students": [
{
"uuid": "5fef85a3-61e3-4e03-b6bd-ee544cd9bcdd",
"first_name": "Joaquim",
"last_name": "Ferreira",
"email": "[email protected]",
"is_admin": false
}
]
}
PATCH /api/courses/<id>/
Esse endpoint servirá para fazermos atualizações dos curso,
A aplicação permite a atualização parcial sem perca de dados existentes:
{
"name": "Node", // Campo opcional
"demo_time": "8:00", // Campo opcional
"link_repo": "https://gitlab.com/turma_node/" // Campo opcional
}
Exemplo de resposta dessa rota:
{
"uuid": "7c32c787-83c3-4994-8f45-b6ef113cde5e",
"name": "Node",
"demo_time": "08:00:00",
"created_at": "2022-02-15T19:12:44.914032Z",
"link_repo": "https://gitlab.com/turma_node/",
"instructor": null,
"students": []
}
PUT /api/courses//registrations/instructor/
Esse endpoint será responsável pela inserção de um Instrutor no curso.
Essa rota sempre atualizará o instrutor no curso:
// REQUEST
// Header -> Authorization: Token 'token-do-instrutor'
{
"instructor_id": "61039ae4-7016-48d3-b90e-95a78b39e427"
}
Resposta:
{
"uuid": "87556b7e-ac9a-4a8d-9b9f-c2ea7e956a94",
"name": "Django",
"demo_time": "09:00:00",
"created_at": "2022-02-15T19:08:15.927682Z",
"link_repo": "https://gitlab.com/turma_django/",
"instructor": {
"uuid": "61039ae4-7016-48d3-b90e-95a78b39e427",
"first_name": "Maria",
"last_name": "Joaquina",
"email": "[email protected]",
"is_admin": true
},
"students": [
{
"uuid": "5fef85a3-61e3-4e03-b6bd-ee544cd9bcdd",
"first_name": "Joaquim",
"last_name": "Ferreira",
"email": "[email protected]",
"is_admin": false
}
]
}
PUT /api/courses//registrations/students/
Esse endpoint será responsável pela matrícula de estudantes no curso.
A lista de estudantes matriculados no curso sempre será atualizada, conforme as informações são enviadas:
// REQUEST
// Header -> Authorization: Token 'token-do-instrutor'
{
"students_id": [
"5fef85a3-61e3-4e03-b6bd-ee544cd9bcdd",
"5f2747f3-8899-49d9-b7f9-4ade850db837",
"f09c6c88-6cd3-4ed9-b818-432e9f8df11c"
]
}
Resposta:
{
"uuid": "87556b7e-ac9a-4a8d-9b9f-c2ea7e956a94",
"name": "Django",
"demo_time": "09:00:00",
"created_at": "2022-02-15T19:08:15.927682Z",
"link_repo": "https://gitlab.com/turma_django/",
"instructor": {
"uuid": "61039ae4-7016-48d3-b90e-95a78b39e427",
"first_name": "Maria",
"last_name": "Joaquina",
"email": "[email protected]",
"is_admin": true
},
"students": [
{
"uuid": "5fef85a3-61e3-4e03-b6bd-ee544cd9bcdd",
"first_name": "Joaquim",
"last_name": "Ferreira",
"email": "[email protected]",
"is_admin": false
},
{
"uuid": "5f2747f3-8899-49d9-b7f9-4ade850db837",
"first_name": "Marcelo",
"last_name": "Soares",
"email": "[email protected]",
"is_admin": false
},
{
"uuid": "f09c6c88-6cd3-4ed9-b818-432e9f8df11c",
"first_name": "Pedro",
"last_name": "Martins",
"email": "[email protected]",
"is_admin": false
}
]
}
PUT DELETE /api/courses/<course_id>/
Este endpoint somente poderá ser acessado por um instrutor e ele realizará a exclusão do curso no sistema.
// REQUEST
// Header -> Authorization: Token 'token-do-instrutor'
Resposta:
// RESPONSE STATUS -> HTTP 204 NO CONTENT