Code Monkey home page Code Monkey logo

movies-api's People

Contributors

ghnoob avatar

Watchers

 avatar

movies-api's Issues

Comportamiento inconsistente en los filtros de edad y peso

Comportamiento inconsistente en los filtros de edad y peso

Problema

Cuando se hace un request, por ejemplo, GET /characters?age=text, con query param un string no numérico, devuelve todos los registros cuando no tendría que devolver ninguno.

curl -X 'GET' \
  'http://localhost:5500/characters?limit=1&age=test' \
  -H 'accept: application/json'
{
    "data": [
        {
            "id": 1,
            "name": "Snow White",
            "imageUrl": "https://static.wikia.nocookie.net/disney/images/3/33/Profile_-_Snow_White.jpeg/revision/latest/scale-to-width-down/782?cb=20200916135241"
        }
    ],
    "totalPages": 5,
    "total": 5,
    "next": "/characters?limit=1&page=2"
}

Tambíen, cuando se pasa un string vacio, tanto en la forma directa como la de objeto, la propiedad evalúa a 0 en el dto. Por ejemplo, si se hace una request a characters?age[lt]= el dto es { lt: 0 }

Causa

El problema se da en estas líneas, ya que no se hacen los checkeos suficientes

if (!isNaN(value)) {
return { eq: Number(value) };
}

Solución

Se tiene que:

  1. checkear que el valor sea un string
  2. Si es true, se checkea que sea un string numerico con validator
    2.1. Reemplazar todas la ocurrencias de !isNaN(value) por isNumeric(value) en el archivo
  3. Si esto también es true, retornar { eq: Number(value) }. Si no, { eq: null }
  4. Reemplazar la siguiente línea
    [prop]: { [Op.and]: constraints },

    por
[prop]: { [Op.and]: [{ [Op.not]: null },  ...constraints] }, // también se puede usar `concat`

e2e test movies

test crud with real db. check for db related errors. dont check for validation errors since that is done in integration tests

Búsqueda de Películas o Series

Deberá permitir buscar por título, y filtrar por género. Además, permitir ordenar los resultados
por fecha de creación de forma ascendiente o descendiente.
El término de búsqueda, filtro u ordenación se deberán especificar como parámetros de query:

  • GET /movies?name=nombre
  • GET /movies?genre=idGenero
  • GET /movies?order=ASC | DESC

Simplificar los mensajes de validación

Actualmente los mensajes que se muestran cuando falla la validación son innecesariamente verbosos.
Por ejemplo:

{
   "message" : {
      "description" : "Validation error.",
      "errors" : [
         {
            "children" : [],
            "constraints" : {
               "isEmail" : "email must be an email"
            },
            "property" : "email",
            "target" : {}
         },
         {
            "children" : [],
            "constraints" : {
               "isString" : "password must be a string"
            },
            "property" : "password",
            "target" : {}
         }
      ]
   },
   "name" : "Bad Request",
   "statusCode" : 400
}

cuando simplemente podria ser:

{
   "message" : {
      "description" : "Validation error.",
      "errors" : [
        "email must be an email",
        "password must be a string"
      ]
   },
   "name" : "Bad Request",
   "statusCode" : 400
}

Migraciones y seeders

  • Agregar una instrucción en la imagen de docker que compile las migraciones y seeders antes de arrancar la app
  • Mejorar la documentación del README sobre migraciones y seeders.

Ocultar las propiedades `null`

Actualmente, los campos que no estan seteados en la base de datos se devuelven el el json de la response como null

Por ejemplo GET /characters/2

{
   "age" : null,
   "history" : "Not much is known about the mirror except that his sole purpose is to serve whoever may own him at the time. Whilst he is antagonistic on various occasions, he is not intentionally evil, as he is forced to obey the Evil Queen due to being her slave. He does not hesitate to tell the truth to the Queen when it is revealed that Snow White was still alive.",
   "id" : 2,
   "imageUrl" : "https://static.wikia.nocookie.net/disney/images/f/f9/Snowwhite-disneyscreencaps.com-100.jpg/revision/latest/scale-to-width-down/223?cb=20201125093643",
   "movies" : [
      {
         "id" : 1,
         "imageUrl" : "https://upload.wikimedia.org/wikipedia/commons/b/b0/Snow_white_1937_trailer_screenshot.jpg",
         "title" : "Snow White and the Seven Dwarfs"
      }
   ],
   "name" : "Magic Mirror",
   "weight" : null
}

estos campos debierian ser ocultados con class-transformer

Migrar a umzug

Migrar a Umzug

Problema

Actualmente se está usando sequelize-cli para correr las migraciones y los seeders. Pero la librería no soporta TS, por lo que los archivos se tienen que compilar primero, lo que puede traer side effects.

Solución

migrar los seeders y las migraciones a umzug

Modelado de Base de Datos

  • Personaje: deberá tener,
    • Imagen.
    • Nombre.
    • Edad.
    • Peso.
    • Historia.
    • Películas o series asociadas.
  • Película o Serie: deberá tener,
    • Imagen.
    • Título.
    • Fecha de creación.
    • Calificación (del 1 al 5).
    • Personajes asociados.
  • Género: deberá tener,
    • Nombre.
    • Imagen.
    • Películas o series asociadas
  • Opcional:
    • Seeders
    • Migrations

Autenticación de Usuarios

Para realizar peticiones a los endpoints subsiguientes el usuario deberá contar con un token que
obtendrá al autenticarse. Para ello, deberán desarrollarse los endpoints de registro y login, que
permitan obtener el token.

Los endpoints encargados de la autenticación deberán ser:

  • /auth/login
  • /auth/register

Detalle de Personaje

En el detalle deberán listarse todos los atributos del personaje, como así también sus películas o
series relacionadas.

unit test config & index

Unit test config & index

hacer tests para:

  • los fallbacks en app.config y db.config
  • la lógica de index.ts

Cambiar respuesta incorrecta

Cambiar respuesta incorrecta

Problema

En la documentación de DELETE /characters muestra en su código 200 la respuesta de actualización y no de borrado de un personaje

Solución

Cambiar la línea

* $ref: '#/components/responses/CharacterUpdated'

por $ref: '#/components/responses/CharacterDeleted'

docker no construye la imagen

Docker no construye la imagen

Problema

Docker falla porque no encuentra los archivo yarn.lock y tsconfig.database-only.json

Solución

sacar el lockfile del .dockerignore e intercambiar las líneas 9 y 11 en el dockerignore

Búsqueda de Personajes

Deberá permitir buscar por nombre, y filtrar por edad, peso o películas/series en las que participó.
Para especificar el término de búsqueda o filtros se deberán enviar como parámetros de query:�

  • GET /characters?name=nombre
  • GET /characters?age=edad
  • GET /characters?movies=idMovie

Envío de emails

Al registrarse en el sitio, el usuario deberá recibir un email de bienvenida. Es recomendable, la
utilización de algún servicio de terceros como SendGrid.

Hacer trim a los valores de los dto

Hacer trim a los valores de los dto

Problema

En algunas acciones (por ejemplo, al crear un personaje) no se hace trim a los valores que son strings.
También se tendria que hacer trim a los valores de los dto que se usan para las queries ya que estos vienen como strings.

Solución

Agregar el decorador @Trim() donde sea necesario (revisar carpeta src/models/dto)

error cuando con query string incorrecto

Error con query string incorrecto en GET /characters

Problema

El error sucede cuando se hace una request con un valor que no es un numero, por ejemplo:

$ curlie -j get "http://localhost:5500/characters?movies=1&movies=abc" --pretty
HTTP/1.1 500 Internal Server Error
Access-Control-Allow-Origin: *
Content-Security-Policy: default-src 'self';base-uri 'self';block-all-mixed-content;font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests
Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Resource-Policy: same-origin
X-DNS-Prefetch-Control: off
Expect-CT: max-age=0
X-Frame-Options: SAMEORIGIN
Strict-Transport-Security: max-age=15552000; includeSubDomains
X-Download-Options: noopen
X-Content-Type-Options: nosniff
Origin-Agent-Cluster: ?1
X-Permitted-Cross-Domain-Policies: none
Referrer-Policy: no-referrer
X-XSS-Protection: 0
Content-Type: application/json; charset=utf-8
Content-Length: 111
ETag: W/"6f-TO0HtZLoUVSzSFBuz5HgGGCqhdI"
Date: Wed, 15 Jun 2022 02:18:30 GMT
Connection: keep-alive
Keep-Alive: timeout=5

{
    "statusCode": 500,
    "name": "Internal Server Error",
    "message": "Unknown error. Contact the system administrators."
}

Causa

El problema se da en esta línea de código:

WHERE "movieId" IN ( ${dto.movies.join(',')} )

en el ejemplo anterior, se llama a [1, null].join(','), lo que da como resultado WHERE "movieId" IN ( 1, ), lo cual es una sintaxis inválida.

Solución

Usar los replacements de Sequelize, que justamente están diseñados para prevenir situaciones como esta.

Creación, Edición y Eliminación de Película / Serie

  • Deberán existir las operaciones básicas de creación, edición y eliminación de películas o series.
  • Endpoint POST /movies/:id/characters para agregar personajes a una película
  • Endpoint DELETE /movies/:idMovie/characters/:idCharacter para borrar personajes de una película

test: remove auth from imports

Remove auth from imports

Problema

En el test de authenticateMiddleware no se está mockeando el import de src/auth/jwt.strategy

ver que la carpeta auth sale en el code coverage

...

  87 passing (950ms)

--------------------------------------------|---------|----------|---------|---------|-------------------
File                                        | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
--------------------------------------------|---------|----------|---------|---------|-------------------
All files                                   |   96.05 |    92.68 |   84.41 |   96.26 |                   
 auth                                       |   57.14 |      100 |       0 |   57.14 |                   
  jwt.strategy.ts                           |   57.14 |      100 |       0 |   57.14 | 12-15             
 config                                     |     100 |       90 |     100 |     100 |                   
  app.config.ts                             |     100 |       90 |     100 |     100 | 6  

...

Solución

mockear ese import del middleware en el test usando proxyquire

Listado de Películas

Deberá mostrar solamente los campos imagen, título y fecha de creación.
El endpoint deberá ser: GET /movies

login fixes

Login fixes

async login(
req: Request,
res: Response,
next: NextFunction,
): Promise<Response | void> {
try {
const token = await sign({ user: req.user }, appConfig.JWT_SECRET_KEY);

  • quitar el async/await ya que no es necesario

passwordConfirmation!: string;

  • agregar el decorador @IsString() para que se entiendan mejor los errores de validación

if (!user) {
return next(
new HttpError(HttpStatus.UNAUTHORIZED, 'Invalid authentication token'),
);
}
/**
* Checks if user exists in the database.
* In case of the token of a deleted user being used.
*/
if (!(await User.findByPk(user.id, { attributes: ['id'] }))) {
return next(new HttpError(HttpStatus.NOT_FOUND, 'User not found.'));
}

  • el segundo if tiene que estar como && de la primera condición (+ simple, + seguro)
  • remover la respuesta UserNotFound de la documentación

La aplicación no arranca cuando se usa la configuración `debug`

La aplicación no arranca cuando se usa la configuración debug

Problema

Sequelize logea todas las operaciones de los seeders en la consola. lo que excede el tamaño máximo del buffer de stdout cuando se usa childProcess.exec (error ERR_CHILD_PROCESS_STDIO_MAXBUFFER)

Solución

Reemplazar

await promisify(exec)('npx sequelize db:seed:all');

por

import { spawn } from 'child-process';

spawn('npx sequelize db:seed:all', { shell: true });

esto hace que el seeder se ejectute en un proceso aparte, por lo que no llena la consola.

Listado de Personajes

  • El listado deberá mostrar:
    • Imagen.
    • Nombre.
  • El endpoint deberá ser: /characters
  • Opcional: paginacion

Documentar DTOs

Se debera agregar documentación con swagger para los DTOs que se usen para crear y editar peliculas y personajes

e2e test characters

test crud with real db. check for db related errors. dont check for validation errors since that is done in integration tests

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.