CodeBiting / onion-cargo-loading-service

Servei per determinar quin contenidor fer servir i com s'han de disposar els elements a dins
MIT License
1 stars 4 forks source link

Posar paginació, filtrat i ordenació a la recuperació d'objectes en la API #30

Closed jordidh closed 1 year ago

jordidh commented 1 year ago

Paginació

Permetre passar en el camp query de la URL de les API dades amb paginació per poder construir una SQL que recuperi només el que es demana. Exemple, en MySql es fa:

URL: http://localhost:8080/v1/container?skip=0&limit=200

select * from `stock` ORDER BY id;
select * from `stock` ORDER BY id LIMIT 0,10;  # Retrieve rows 1-10
select * from `stock` ORDER BY id LIMIT 5,10;  # Retrieve rows 6-15

Filtrat

Permetre passar en el camp query de la URL de les API dades amb filtres per seleccionar quines dades volem.

URL: http://localhost:8080/v1/container?skip=0&limit=200&filter=id:eq:1,code:isnotnull

Ordenació

Permetre passar en el camp query de la URL de les API dades amb l'ordre amb que volem recuperar les dades.

URL: http://localhost:8080/v1/container?skip=0&limit=200&sort=id:asc,code:desc

jordidh commented 1 year ago

Artícle interessant sobre paginació i filtres: https://medium.com/@bhkfazano/how-to-create-paginated-sortable-and-filterable-endpoints-with-nestjs-fde6315c8466

Estudiar fer servir el patró "decorators" per parsejar els res.query en objectes pagination, filter i sort. Veure https://www.sitepoint.com/javascript-decorators-what-they-are/

Idea:

Enlloc de cridar a

containers = await containerService.getClientContainers(req.query.clientId, req.query.skip, req.query.limit);

cridar

containers = await @parsePagSortFilter containerService.getClientContainers(req);

Per això hem de crear un decorator que agafi el req.query i n'extregui objectes de paginació, filtrat i ordenat, ex:

function parsePagSortFilter(target, name, descriptor) {
  const original = descriptor.value;
  if (typeof original === 'function') {
    descriptor.value = function(...args) {
      console.log(`Arguments: ${args}`);
      try {
        // TODO: extract objects from req.query

        // Call the function
        const result = original.apply(this, args);
        console.log(`Result: ${result}`);

        // Return the result
        return result;
      } catch (e) {
        console.log(`Error: ${e}`);
        throw e;
      }
    }
  }
  return descriptor;
}
jordidh commented 1 year ago

Quines url han de poder acceptar?

jordidh commented 1 year ago

Implementar ok