Prueba para candidatos a desarrollador backend en TDP S.A.
Se recomienda trabajar en un entorno virtual, ejemplo :
python -m venv env
La instalación es bastante sencilla:
- Clonar (o descargar) el repositorio.
- Abrir el directorio/archivo.
- Instalar las dependencias encontradas en el archivo requirements.txt. Puede instalarlo ejecutando en la consola:
pip install -r requirements.txt
- Desplazarse al directorio pizzaProject:
cd pizzaProject
- Ejecutar en la consola el servidor a través del siguiente comando:
python manage.py runserver
. Esto ejecutará la aplicación por defecto en http://127.0.0.1:8000/ - Con el servidor ejecutandose, ya podemos realizar consultas a los endpoints (siempre y cuando este se mantenga en ejecución). Para ello puede utilizar Postman junto con el archivo de prueba disponible. Más información sobre Postman y el archivo de prueba a continuación.
Si no cuenta con Postman instalado puede descargarlo desde su página oficial.
Lo primero que se debe hacer para poder probar los endpoints es importar el archivo Pizzeria.postman_collection.json a su Postman:
- Abrir/Ejecutar Postman
- Seleccionar el botón de Importar ubicado en la esquina superior izquierda.
- Seleccionar el archivo Pizzeria.postman_collection.json
Para más detalles puede ver este video guía.
Luego debemos asignar algunas variables globales. Esto es debido a que utilizamos estas variables para almacenar los tokens de autenticación (token básico de django y JWT) ya que son necesarios para acceder a ciertos endpoints.
Los pasos son:
- Click en el botón con forma de ojo en la esquina superior derecha.
- Click en Agregar (el que se encuentra al lado de Globales)
- Agregamos en la columna Variables la palabra
jwt_access
y en la columna del Valor Actual escribimos, por ejemplo:Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNjQwOTUyMjcwLCJpYXQiOjE2NDA5MzA2NzAsImp0aSI6IjVkNjQ3NDU1MzNkNjRkODI4YWUwOGJiZTc2YWRlYTRhIiwidXNlcl9pZCI6Mn0.5PwScJSQ3NhI0SnIgpMKP95T_iroNGNRT-ApmUyJK_g
un token JWT válido. - Ahora hacemos lo misma para el token básico de Django. Agregamos en la columna Variables la palabra
basic_token
y en la columna del Valor Actual escribimos, por ejemplo:Token c257a92dac54640a7048e215f78dd36205c7a954
un token válido.
Debe quedar de la siguiente manera:
Si esos tokens ya no son válidos, usted puede obtener los nuevos tokens por medio de las consultas POST Get JWT for user
(el access token) y Get Django basic token for user
respectivamente. Aquí debe proveer el nombre de usuario y la contraseña en los campos del cuerpo de la consulta.
Recuerde agregar las palabras Bearer y Token respectivamente antes del propio token.
Si tiene alguna duda sobre los pasos a realizar para configurar las variables, puede consultar nuestro video guía de tutorial.
Una vez que cuente con los tokens ya puede empezar a realizar las diferentes consultas a los endpoints!!✨
Para activar, desactivar o alternar un token (es decir si quiere usarlo o no) simplemente puede desmarcarlo en el apartado de Cabeceras de una consulta en Postman. Ahí podrá ver los tokens que recién fueron mencionados pero OJO, solo puede tener activado uno u otro, no ambos al mismo tiempo o no se reconocerá la autenticación.
Observación: la base URL por defecto es 127.0.0.1:8000
Endpoint | Verbo HTTP | Parametros | Descripción |
---|---|---|---|
/basic-token-auth/ | POST | username :: tipo String password :: tipo String |
Login. Devuelve el token Django de autenticación del usuario cuyas credenciales fueron proveidas (en caso de que sean correctas). |
/api/token/ | POST | username :: tipo String password :: tipo String |
Login. Devuelve el JWT de autenticación del usuario cuyas credenciales fueron proveidas (en caso de que sean correctas). |
/api/pizza/ | POST | id :: tipo String nombre :: tipo String precio :: tipo Int activo:: tipo Boolean |
Crea una nueva pizza. Se necesita ser usuario staff o superuser. |
/api/pizza/<id> |
PATCH | nombre :: tipo String precio :: tipo Int activo :: tipo Boolean |
Modifica la pizza cuyo id es <id> . Se necesita ser usuario staff o superuser. |
/api/pizza/ | GET | - | Devuelve todas las pizzas activas. Si el usuario es staff o superuser, también devuelve las no activas. |
/api/ingrediente/ | POST | id :: tipo String nombre :: tipo String categoria :: tipo String (Dos opciones disponibles: BASISCO y PREMIUM) |
Agrega un nuevo ingrediente. Se necesita ser usuario staff o superuser. |
/api/ingrediente/<id> |
DEL | - | Elimina un ingrediente si no hay ninguna pizza que lo utilice. Se necesita ser usuario staff o superuser. |
/api/ingrediente/<id> |
PATCH | categoria :: tipo String (Dos opciones disponibles: BASISCO y PREMIUM) nombre :: tipo String |
Modifica el ingrediente cuyo id es <id> . Se necesita ser usuario staff o superuser. |
/api/ingrediente/ | GET | - | Devuelve la lista de ingredientes. |
/api/ingrediente-x-pizza/ | POST | pizza :: tipo String ingrediente :: tipo String |
Permite agregar un ingrediente a una pizza. El parametro pizza representa el id de esta, y el parametro ingrediente el ingrediente para agregarle. |
/api/ingrediente-x-pizza/<pizza_id> /<ingrediente_id> |
DEL | - | Permite quitar el ingrediente (con id igual a <ingrediente_id> ) de la pizza (con id igual a <pizza_id> ). |
/api/pizza-detalle/<id> |
GET | - | Permite ver el "detalle" (id, nombre, precio, activo, ingredientes) de la pizza con id igual a <id> |
Se consideraron dos enfoques posibles:
- Eliminar todos los ingredientes que coincidan con
<ingrediente_id>
para una pizza. Es decir, si una pizza tiene 4 ingredientes "Queso Azul", los cuatro serían eliminados de la pizza. - Eliminar solo una ocurrencia del ingrediente
<ingrediente_id>
de una pizza. Es decir, si una pizza tiene 4 ingredientes "Queso Azul", solo se elimina uno de ellos qudándose así con 3 "Queso Azul".
El enfoque decidido fue el segundo. Ya que esto permite poder agregar ingredientes "extra a la pizza". Entonces si el usuario quiere una pizza que contiene 4 de "Queso Cheddar", pero este solo quiere 3 de "Queso Cheddar", entonces puede quitarle solo uno y tener la pizza a su medida.
Otra manera de lograr este efecto utilizando el primer enfoque sería agregando un campo "Cantidad" al modelo Ingrediente.
username: admin
password: pizza
username: worker
password: pizzaWorker123