Este repositorio fue creado con el fin de responder a los requerimientos de la prueba técnica presentada por la empresa Alternova.
El repositorio se puede correr en la maquina local, este ya cuenta con su propia DB poblada para hacer casos de prueba.
Para correr el repositorio localmente, primero se debe clonar el repositorio. Una vez clonado el repositorio, se abre y haciendo uso de cmd se escibe el comando pip install requirements.txt
para instalar las librerias necesarias para el funcionamiento de la aplicación.
Seguido a eso, ejecutar el comando python manage.py makemigrations
y luego python manage.py migrate
para asegurar que las migraciones se corran y estén actualizadas.
Para lanzar el servidor, se usa el comando python manage.py runserver
. Al ejecutar el comando, la aplicación empezará a correr bajo la url: http://127.0.0.1:8000/
La aplicación cuenta con tests que prueban las funcionalidades de los diferentes endpoints creados. Estos tests se pueden correr teniendo el repositorio clonado localmente y siguiendo los pasos proporcionados para el despliegue. Sin embargo, en este caso para correr los tests se hace uso del comando python manage.py test
, lo que ejecuta 24 tests creados para probar los endpoints.
Adicional al repositorio, la aplicación se encuentra alojada en el hosting de pythonanywhere, bajo el link: https://ale1220.pythonanywhere.com/. La aplicación cuenta con su probia DB con datos previamente cargados para hacer pruebas y poder manpular los endpoints con esos datos.
La aplicación cuenta con la documentación de los endpoints. Para acceder a esta, sería bajo la url '/docs', por ejemplo https://ale1220.pythonanywhere.com/docs/. Esta documentación fue generada con Swagger y desde acá también se pueden probar endpoints (por ejemplo endpoints con peticiones diferentes a /GET/).
La aplicación cuenta con Autenticacion y hay endpoints que requieren de esta para su funcionamiento. Se manejaron 2 tipos de autenticacion: Basic authentication (para poder hacer pruebas desde swagger, esta es con inicio de sesión básico) y Token authentication (para hacer pruebas con postman mandando el token de sesión en los headers de las peticiones).
El repositorio cuenta con una colección en postman que prueba los endpoint directamente al servicio de hosting. Hay que tener en cuenta que para este caso, la colección se puede correr una vez únicamente, debido a que hace validaciones que cambian sus valores (por ejemplo el número de visualizaciones) después de que se corra la primera vez.
Si se desea hacer pruebas con un usuario que no es superuser y no se quiere crear una cuenta, puede hacer uso de las credenciales-> username: kiro, password: prueba2023
- GET /api/movies/filter: Este endpoint filtra las películas por nombre, tipo y genero (para el caso del nombre, se buscan peliculas que en el nombre contengan la palabra mandada). Para su funcionamiento se debe pasar por query params los filtros que se desean aplicar, por ejemplo: 'https://ale1220.pythonanywhere.com/api/movies/filter?genre=comedia' o 'https://ale1220.pythonanywhere.com/api/movies/filter?name=t&type=serie', el primero filtra por género y el segundo filtra por nombre de la película y tipo. Este endpoint responde al tercer requerimiento solicitado en la prueba.
- POST /api/movies/login: Este endpoint permite a un usuario iniciar sesión y retorna el Token de sesión de dicho usuario. Este endpoint fue creado principalmente para pruebas en postman, para poder obtener el token de inicio de sesión de un usuario y poderlo mandar en los headers para otros endpoints que requieren autenticación. Este requiere que se mande un cuerpo en la petición con el username y password correspondientes a un usuario que previamente ya fue registrado en la base de datos.
- POST /api/movies/logout: Este endpoint permite a un usuario cerrar sesión, eliminandoo el token de dicho usuario. Este endpoint fue creado principalmente para pruebas en postman, para poder eliminar el token de inicio de sesión de un usuario y eliminar la autenticacion para ese usuario, a menos que vuelva a iniciar sesión. Para su uso, se requiere que el usuario este autenticado.
- GET /api/movies/random: Este endpoint retorna una película aleatoriamente que se encuentre en la base de datos, mostrando todos los datos asociados a la película. Este endpoint NO requiere autenticación para su funcionamiento al ser informativo. Para su uso, basta con usar la url 'https://ale1220.pythonanywhere.com/api/movies/random'. Este endpoint responde al primer requerimiento solicitado en la prueba.
- POST /api/movies/registration: Este endpoint permite registrar a un usuario en la base de datos. Este endpoint fue creado para generar usuarios (sin permisos de superuser) y poder probar la autenticación de la aplicación. Este requiere que se mande un cuerpo en la petición con el username, password y email para crear al usuario y pdoer usar esas credenciales para posteriores inicio de sesión.
- GET /api/movies/sort: Este endpoint ordena las películas por nombre, tipo, genero o puntaje. Para su funcionamiento se debe pasar por query params el parámetro de ordenamiento bajo la palabra 'by', por ejemplo: 'https://ale1220.pythonanywhere.com/api/movies/sort?by=genre' o 'https://ale1220.pythonanywhere.com/api/movies/sort?by=name', el primero ordena por género y el segundo ordena por nombre de la película. Este endpoint responde al segundo requerimiento solicitado en la prueba.
- PATCH /api/movies/{id}/score: Este endpoint permite a un usuario añadir su calificación de una película vista, esta calificación actualiza la calificaión promedio de una película. Para este endpoint SE NECESITA AUTENTICACIÓN DEL USUARIO, ya que se estan cambiando datos sobre la base de datos. Una vez hay un usuario autenticado (inicio de sesion o mandando el token en los headers de la petición), en el cuerpo de la petición se manda la calificación que se desea otorgar, la aplicación la promedia con la calificación promedio que existia previamente y actualiza la calificación promedio. Adicionalmente, para usar este endpoint se valida que el usuario previamente haya marcado una película como vista, para poder calificar solo si ya vio una serie o película. Un ejemplo de url sería: 'https://ale1220.pythonanywhere.com/api/movies/1/score', donde intentaría calificar la pelicula con id = 1. Este endpoint responde al quinto requerimiento solicitado en la prueba.
- PATCH /api/movies/{id}/views: Este endpoint permite a un usuario marcar una película como vista. Para este endpoint SE NECESITA AUTENTICACIÓN DEL USUARIO, ya que se estan cambiando datos sobre la base de datos. Una vez hay un usuario autenticado (inicio de sesion o mandando el token en los headers de la petición), al acceder a este endpoint, la aplicación marca que el usuario ya vio la película y aumenta en 1 la cantidad de visualizaciones que ha tenido dicha serie o película. Un ejemplo de url sería: 'https://ale1220.pythonanywhere.com/api/movies/1/views', donde el usuario marcaria la pelicula con id = 1 como vista. Este endpoint responde al cuarto requerimiento solicitado en la prueba.