Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/luigiminardi/alurachallenge-backend
Backend do obeflix usando python com django-rest-framework
https://github.com/luigiminardi/alurachallenge-backend
alura alurachallengeback alurachallenges aluraflix django-rest-framework djangorestframework python python3 rest-api test-automation
Last synced: 4 days ago
JSON representation
Backend do obeflix usando python com django-rest-framework
- Host: GitHub
- URL: https://github.com/luigiminardi/alurachallenge-backend
- Owner: luigiMinardi
- License: mit
- Created: 2021-07-21T16:18:25.000Z (over 3 years ago)
- Default Branch: main
- Last Pushed: 2022-02-10T14:12:25.000Z (almost 3 years ago)
- Last Synced: 2023-03-05T10:07:33.330Z (over 1 year ago)
- Topics: alura, alurachallengeback, alurachallenges, aluraflix, django-rest-framework, djangorestframework, python, python3, rest-api, test-automation
- Language: Python
- Homepage:
- Size: 71.3 KB
- Stars: 2
- Watchers: 1
- Forks: 0
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
In English:
Installing |
Using |
Testing |
Routes—↴—————↴
Em Português:
Videos |
Categorias
Instalando |
Usando |
Testes |
Rotas—↴—————↴
Videos |
Categorias
# English
## DISCLAIMER
Although the README has the english and the portuguese version I did not translated the api exceptions or the database columns to english so feel free to ask me if you didn't know what something mean.## Installing
* First things first, clone the repository:
```bash
git clone https://github.com/luigiMinardi/alurachallenge-backend
```* Then create a [Virtual Enviroment](https://outline.com/HaJ3zA) for you:
```bash
python -m venv .venv
```
* Activate Your `venv`:Mac/Linux:
```bash
source .venv/bin/activate
```
Windows:
```cmd
.venv\Scripts\activate.bat
```* Install all the requirements:
```bash
pip install -r requirements.txt
```* Make the Migrations:
```bash
python manage.py makemigrations
```* Run the DataBase Migration:
```bash
python manage.py migrate
```* Create a Super User:
```bash
python manage.py createsuperuser
```* Run your server:
```bash
python manage.py runserver
```Now you are ready to use it.
# Using the API
## Running Tests
For run our automated tests do:
```bash
python manage.py test
```## Routes
### Routes to Videos
#### /videos/ Query Params
#### Search
You can search videos using the query param `search`.
##### Example 1:
> *Searching something that some of the videos in the database has in the title.*
Searching "Max" doing `/videos/?search=Max`
##### Return:
> *Returns all of the videos that match in the search.*
```json
[
{
"id": 2,
"titulo": "You already know my max length",
"descricao": "You already know my max length",
"url": "http://must-be-a-valid-url-with-max-length-of-200.com",
"categoriaId": 1
},
{
"id": 3,
"titulo": "Max length is 30",
"descricao": "Max length is 300",
"url": "http://must-be-a-valid-url-with-max-length-of-200.page",
"categoriaId": 2
}
]
```##### Example 2:
> *Searching something that none of the videos in the database has in the title.*
Searching "any" doing `/videos/?search=any`
##### Return:
> *Returns an empty list of videos because we didn't have any video that match in the database.*
```json
[]
```#### POST /videos/
###### The response code must be `201`.Add a new video in the database.
##### Request Body:
```json
{
"titulo": "Max length is 30",
"descricao": "Max length is 300",
"url": "http://must-be-a-valid-url-with-max-length-of-200.page"
}
```##### Response Body:
```json
{
"id": 1,
"titulo": "Max length is 30",
"descricao": "Max length is 300",
"url": "http://must-be-a-valid-url-with-max-length-of-200.page",
"categoriaId": 1
}
```#### PUT /videos/:id/
###### The response code must be `200`.Change all values in specified video in the database.
##### Request Body:
> *Changing the video we've **POST** earlier, at url `/videos/1/`*
```json
{
"titulo": "You already know my max length",
"descricao": "You already know my max length",
"url": "http://must-be-a-valid-url-with-max-length-of-200.com",
"categoriaId": 2
}
```##### Response Body:
```json
{
"id": 1,
"titulo": "You already know my max length",
"descricao": "You already know my max length",
"url": "http://must-be-a-valid-url-with-max-length-of-200.com",
"categoriaId": 2
}
```#### PATCH /videos/:id/
###### The response code must be `200`.Change some value in specified video in the database.
##### Request Body:
> *Changing the video with id 1 at `/videos/1/`*
```json
{
"url": "http://you-know-my-max-length-and-im-valid.com"
}
```##### Response Body:
```json
{
"id": 1,
"titulo": "You already know my max length",
"descricao": "You already know my max length",
"url": "http://you-know-my-max-length-and-im-valid.com",
"categoriaId": 2
}
```#### DELETE /videos/:id/
###### The response code must be `200`.Delete the specified video in the database.
##### Request:
> *Delete the video we've **POST** earlier, at `/videos/1/`*
##### Response Body:```json
{
"detail": "Vídeo deletado com sucesso!"
}
```#### GET /videos/
###### The response code must be `200`.Getting all the videos of the database.
##### Response Body:
```json
[
{
"id": 2,
"titulo": "You already know my max length",
"descricao": "You already know my max length",
"url": "http://must-be-a-valid-url-with-max-length-of-200.com",
"categoriaId": 1
},
{
"id": 3,
"titulo": "Max length is 30",
"descricao": "Max length is 300",
"url": "http://must-be-a-valid-url-with-max-length-of-200.page",
"categoriaId": 2
}
]
```#### GET /videos/:id
###### The response code must be `200`.Getting one specified video in the database.
##### Request:
> *Getting the video with id 2 at `/videos/2/`*
##### Response Body:
```json
{
"id": 2,
"titulo": "You already know my max length",
"descricao": "You already know my max length",
"url": "http://must-be-a-valid-url-with-max-length-of-200.com",
"categoriaId": 1
}
```### Routes to Categorias
#### GET /categorias/:id/videos/
###### The response code must be `200`.Getting all videos inside some "categoria".
##### Response:
```json
[
{
"id": 2,
"titulo": "You already know my max length",
"descricao": "You already know my max length",
"url": "http://must-be-a-valid-url-with-max-length-of-200.com",
"categoriaId": 1
}
]
```#### /categorias/:id/videos/ Query Params:
##### Search
Search videos inside some "categoria"
##### Request:
> Works at the same way as the [Videos Search Query Param](#videos-query-params)`/categorias/2/videos/?search=30`
#### Response:
```json
[
{
"id": 3,
"titulo": "Max length is 30",
"descricao": "Max length is 300",
"url": "http://must-be-a-valid-url-with-max-length-of-200.page",
"categoriaId": 2
},
{
"id": 7,
"titulo": "30 days to do an API",
"descricao": "Yes, in this video you will learn how you can do this or that...",
"url": "https://blank.page",
"categoriaId": 2
}
]
```#### POST /categorias/
###### The response code must be `201`.Add a new "categoria" in the database.
##### Request Body:
```json
{
"titulo": "Max length is 30",
"cor": "#AFaf09"
}
```##### Response Body:
```json
{
"id": 2,
"titulo": "Max length is 30",
"cor": "#AFaf09"
}
```#### PUT /categorias/:id/
###### The response code must be `200`.Change all values in specified "categoria" in the database.
##### Request Body:
> *Changing the "categoria" we've **POST** earlier, at url `/categorias/2/`*
```json
{
"titulo": "You already know my max length",
"cor": "#AFaf09"
}
```##### Response Body:
```json
{
"id": 2,
"titulo": "You already know my max length",
"cor": "#AFaf09"
}
```#### PATCH /categorias/:id/
###### The response code must be `200`.Change some value in specified "categoria" in the database.
##### Request Body:
> *Changing the "categoria" with id 2 at `/categorias/2/`*
```json
{
"cor": "#0ff"
}
```##### Response Body:
```json
{
"id": 2,
"titulo": "You already know my max length",
"cor": "#0ff"
}
```#### DELETE /categorias/:id/
###### The response code must be `200`.Delete the specified "categoria" in the database.
##### Request:
> *Delete the "categoria" we've **POST** earlier, at `/categorias/2/`*
##### Response Body:```json
{
"detail": "Categoria deletada com sucesso!"
}
```#### DELETE /categorias/1/
###### The response code must be `405`.Delete the first "categoria" in the database.
##### Request:
> *Delete the first "categoria", at `/categorias/1/`*
##### Response Body:```json
{
"detail": "Você não pode deletar a categoria 1."
}
```#### GET /categorias/
###### The response code must be `200`.Getting all the "categoria"'s of the database.
##### Response Body:
```json
[
{
"id": 1,
"titulo": "LIVRE",
"cor": "#000"
},
{
"id": 3,
"titulo": "Max length is 30",
"cor": "#AFaf09"
},
{
"id": 4,
"titulo": "You already know my max length",
"cor": "#0ff"
}
]
```#### GET /categorias/:id
###### The response code must be `200`.Getting one specified "categoria" in the database.
##### Request:
> *Getting the "categoria" with id 3 at `/categorias/3/`*
##### Response Body:
```json
{
"id": 3,
"titulo": "Max length is 30",
"cor": "#AFaf09"
}
```# Português
## Instalando
* Primeiramente, clone o repositório:
```bash
git clone https://github.com/luigiMinardi/alurachallenge-backend
```* Então crie seu [Ambiente Virtual](https://pythonacademy.com.br/blog/python-e-virtualenv-como-programar-em-ambientes-virtuais):
```bash
python -m venv .venv
```
Mac/Linux:
```bash
source .venv/bin/activate
```
Windows:
```cmd
.venv\Scripts\activate.bat
```* Instale todos os requerimentos:
```bash
pip install -r requirements.txt
```* Crie as migrações no banco de dados:
```bash
python manage.py makemigrations
```* Rode as migrações do banco de dados:
```bash
python manage.py migrate
```* Crie um Super Usuário:
```bash
python manage.py createsuperuser
```* Rode seu servidor:
```bash
python manage.py runserver
```Prontinho! Agora já pode usar a API.
# Usando a API
## Rodando os testes
Para rodar nossos testes automatizados basta rodar esse comando:
```bash
python manage.py test
```## Rotas
### Rotas dos Videos
#### /videos/ Parâmetros de Consulta (Query Params)
#### Search
Você pode pesquisar videos usando o parâmetro `search`.
##### Example 1:
> *Pesquisar algo que algum dos videos no banco de dados tem no título.*
Pesquisando "máximo", fazendo `/videos/?search=máximo`
##### Return:
> *Retorna todos os videos que conferem com a pesquisa.*
```json
[
{
"id": 2,
"titulo": "Vc já sabe meu tamanho máximo.",
"descricao": "Vc já sabe meu tamanho máximo.",
"url": "http://deve-ser-um-url-valido-com-comprimento-maximo-de-200.com",
"categoriaId": 1
},
{
"id": 3,
"titulo": "Comprimento máximo é 30",
"descricao": "Comprimento máximo é 300",
"url": "http://deve-ser-um-url-valido-com-comprimento-maximo-de-200.page",
"categoriaId": 2
}
]
```##### Example 2:
> *Pesquisando algo que nenhum dos videos no banco de dados tem no título.*
Pesquisando "qualquer", fazendo `/videos/?search=qualquer`
##### Return:
> *Retorna uma lista vazia de videos porque não tinha nada que inferisse a pesquisa.*
```json
[]
```#### POST /videos/
###### O código de resposta deve ser `201`.Adicionando um novo video no banco de dados.
##### Request Body:
```json
{
"titulo": "Comprimento máximo é 30",
"descricao": "Comprimento máximo é 300",
"url": "http://deve-ser-um-url-valido-com-comprimento-maximo-de-200.page"
}
```##### Response Body:
```json
{
"id": 1,
"titulo": "Comprimento máximo é 30",
"descricao": "Comprimento máximo é 300",
"url": "http://deve-ser-um-url-valido-com-comprimento-maximo-de-200.page",
"categoriaId": 1
}
```#### PUT /videos/:id/
###### O código de resposta deve ser `200`.Mudando todos os valores em um video específico no banco de dados.
##### Request Body:
> *Trocando os valores do video que demos **POST** mais cedo, usando a url `/videos/1/`*
```json
{
"titulo": "Vc já sabe meu tamanho máximo.",
"descricao": "Vc já sabe meu tamanho máximo.",
"url": "http://deve-ser-um-url-valido-com-comprimento-maximo-de-200.com",
"categoriaId": 2
}
```##### Response Body:
```json
{
"id": 1,
"titulo": "Vc já sabe meu tamanho máximo.",
"descricao": "Vc já sabe meu tamanho máximo.",
"url": "http://deve-ser-um-url-valido-com-comprimento-maximo-de-200.com",
"categoriaId": 2
}
```#### PATCH /videos/:id/
###### O código de resposta deve ser `200`.Mudando um valor em um video específico no banco de dados.
##### Request Body:
> *Mudando o video com o id 1 em `/videos/1/`*
```json
{
"url": "http://voce-sabe-meu-tamanho-maximo-e-eu-sou-um-url-valido.com"
}
```##### Response Body:
```json
{
"id": 1,
"titulo": "Vc já sabe meu tamanho máximo.",
"descricao": "Vc já sabe meu tamanho máximo.",
"url": "http://voce-sabe-meu-tamanho-maximo-e-eu-sou-um-url-valido.com",
"categoriaId": 2
}
```#### DELETE /videos/:id/
###### O código de resposta deve ser `200`.Deletando um video específico no banco de dados.
##### Request:
> *Deletando o video que demos **POST** anteriormente, usando `/videos/1/`*
##### Response Body:```json
{
"detail": "Vídeo deletado com sucesso!"
}
```#### GET /videos/
###### O código de resposta deve ser `200`.Pegando todos os videos do banco de dados.
##### Response Body:
```json
[
{
"id": 2,
"titulo": "Vc já sabe meu tamanho máximo.",
"descricao": "Vc já sabe meu tamanho máximo.",
"url": "http://deve-ser-um-url-valido-com-comprimento-maximo-de-200.com",
"categoriaId": 1
},
{
"id": 3,
"titulo": "Comprimento máximo é 30",
"descricao": "Comprimento máximo é 300",
"url": "http://deve-ser-um-url-valido-com-comprimento-maximo-de-200.page",
"categoriaId": 2
}
]
```#### GET /videos/:id
###### O código de resposta deve ser `200`.Pegando um video específico no banco de dados.
##### Request:
> *Pegando o video em `/videos/2/`*
##### Response Body:
```json
{
"id": 2,
"titulo": "Vc já sabe meu tamanho máximo.",
"descricao": "Vc já sabe meu tamanho máximo.",
"url": "http://deve-ser-um-url-valido-com-comprimento-maximo-de-200.com",
"categoriaId": 1
}
```### Rotas das Categorias
#### GET /categorias/:id/videos/
###### O código de resposta deve ser `200`.Pegando todos os videos de dentro de uma categoria.
##### Response:
```json
[
{
"id": 2,
"titulo": "Vc já sabe meu tamanho máximo.",
"descricao": "Vc já sabe meu tamanho máximo.",
"url": "http://deve-ser-um-url-valido-com-comprimento-maximo-de-200.com",
"categoriaId": 1
}
]
```#### /categorias/:id/videos/ Parâmetros de Consulta (Query Params)
##### Search
Pesquisando videos dentro de uma categoria
##### Request:
> O search funciona da mesma maneira que o [Query Param de Search dos Videos](#videos-parâmetros-de-consulta-query-params)`/categorias/2/videos/?search=30`
#### Response:
```json
[
{
"id": 3,
"titulo": "Comprimento máximo é 30",
"descricao": "Comprimento máximo é 300",
"url": "http://deve-ser-um-url-valido-com-comprimento-maximo-de-200.page",
"categoriaId": 2
},
{
"id": 7,
"titulo": "30 dias pra fazer uma API",
"descricao": "Sim, nesse video você vai aprender como você pode fazer isso ou aquilo...",
"url": "https://blank.page",
"categoriaId": 2
}
]
```#### POST /categorias/
###### O código de resposta deve ser `201`.Adicionando uma nova categoria no banco de dados.
##### Request Body:
```json
{
"titulo": "Comprimento máximo é 30",
"cor": "#AFaf09"
}
```##### Response Body:
```json
{
"id": 2,
"titulo": "Comprimento máximo é 30",
"cor": "#AFaf09"
}
```#### PUT /categorias/:id/
###### O código de resposta deve ser `200`.Mudando todos os valores em uma categoria específica no banco de dados.
##### Request Body:
> *Trocando os valores da categoria que demos **POST** mais cedo, usando a url `/categorias/2/`*
```json
{
"titulo": "Vc já sabe meu tamanho máximo.",
"cor": "#AFaf09"
}
```##### Response Body:
```json
{
"id": 2,
"titulo": "Vc já sabe meu tamanho máximo.",
"cor": "#AFaf09"
}
```#### PATCH /categorias/:id/
###### O código de resposta deve ser `200`.Mudando um valor em uma categoria específica no banco de dados.
##### Request Body:
> *Mudando a categoria com o id 2 em `/categorias/2/`*
```json
{
"cor": "#0ff"
}
```##### Response Body:
```json
{
"id": 2,
"titulo": "Vc já sabe meu tamanho máximo.",
"cor": "#0ff"
}
```#### DELETE /categorias/:id/
###### O código de resposta deve ser `200`.Deletando uma categoria específica no banco de dados.
##### Request:
> *Deletando a categoria que demos **POST** anteriormente, usando `/categorias/2/`*
##### Response Body:
```json
{
"detail": "Categoria deletada com sucesso!"
}
```#### DELETE /categorias/1/
###### O código de resposta deve ser `405`.Deletando a primeira categoria do banco de dados.
##### Request:
> *Deletando a primeira categoria, usando `/categorias/1/`*
##### Response Body:
```json
{
"detail": "Você não pode deletar a categoria 1."
}
```#### GET /categorias/
###### O código de resposta deve ser `200`.Pegando todas as categorias do banco de dados.
##### Response Body:
```json
[
{
"id": 1,
"titulo": "LIVRE",
"cor": "#000"
},
{
"id": 3,
"titulo": "Comprimento máximo é 30",
"cor": "#AFaf09"
},
{
"id": 4,
"titulo": "Vc já sabe meu tamanho máximo.",
"cor": "#0ff"
}
]
```#### GET /categorias/:id
###### O código de resposta deve ser `200`.Pegando uma categoria específica no banco de dados.
##### Request:
> *Pegando a categoria em `/categorias/3/`*
##### Response Body:
```json
{
"id": 3,
"titulo": "Comprimento máximo é 30",
"cor": "#AFaf09"
}
```