lumnik. / scénarios Tous les scénarios · English

NestJS: le ticket supprimé pendant la lecture ne fait plus perdre son voisin

Objectif Lire tous les tickets d'un service NestJS par son API, même quand l'équipe support y travaille.

Un service NestJS sur nestjs-paginate et 130 tickets, dont 97 ouverts.

manifests/lab-docker-compose.yml
name: lumnik-scenario-nestjsservices:  tickets:    build: ../lab    ports: ["127.0.0.1:${NESTJS_PORT:-9350}:3000"]
manifests/10-tickets.yaml
apiVersion: connectors.lumnik.io/v1kind: Connectormetadata:  name: scenario-nestjs-a  connector_type: rest-generic  scopes: [support]spec:  base_url: http://host.docker.internal:9350  endpoints:    - id: tickets      path: "/tickets?limit=50"      method: GET      pagination: { kind: nestjs }                    # follows $.links.next, reads $.data      target:        kind: hybrid        table: ext.scenario_nestjs_a        unique_key: $.id        promote:          - { name: subject, path: $.subject, type: text }          - { name: status, path: $.status, type: text }
manifests/20-open-tickets.yaml
apiVersion: connectors.lumnik.io/v1kind: Connectormetadata:  name: scenario-nestjs-open-a  connector_type: rest-generic  scopes: [support]spec:  base_url: http://host.docker.internal:9350  endpoints:    - id: tickets      path: "/tickets?limit=50&filter.status=$eq:open"      method: GET      pagination: { kind: nestjs }                    # the next link keeps the filter      target:        kind: hybrid        table: ext.scenario_nestjs_open_a        unique_key: $.id        promote:          - { name: subject, path: $.subject, type: text }          - { name: status, path: $.status, type: text }
manifests/30-tickets-watched.yaml
apiVersion: connectors.lumnik.io/v1kind: Connectormetadata:  name: scenario-nestjs-watched-a  connector_type: rest-generic  scopes: [support]spec:  base_url: http://host.docker.internal:9350  default_rate_limit: 1/s                              # a gentle reader: thirteen pages take thirteen seconds  endpoints:    - id: tickets      path: "/tickets?limit=10"      method: GET      pagination: { kind: nestjs }                    # checks $.meta.totalItems on every page (#1794)      target:        kind: hybrid        table: ext.scenario_nestjs_watched_a        unique_key: $.id        promote:          - { name: subject, path: $.subject, type: text }          - { name: status, path: $.status, type: text }

Limites

  • Un ticket supprimé reste dans la table du hub: une lecture complète ajoute et met à jour, elle n'efface pas.
  • La relecture compte deux fois les lignes lues deux fois dans IN; l'upsert n'en garde qu'une.
  • 130 tickets fictifs, en mémoire dans le service.

Support · tickets

Les tickets sont dans le service support.

Il faut tous les lire, par l'API.

NestJS 11, nestjs-paginate, 130 tickets

Le problème

L'API rend la liste par pages.

  • Chaque page donne le lien de la suivante.
  • Pendant ce temps, le support travaille.

Ce qui n'est pas modifié

Le service reste tel quel.

  • Son API, telle que l'équipe l'a écrite.
  • Aucun module, aucun réglage.

Le piège

Une suppression décale les pages.

  • Un ticket de la page 1 disparaît.
  • Un autre ne tombe sur aucune page.

Ce qu'il a fallu écrire

pagination: { kind: nestjs }

Une ligne.

  • Le lien next est suivi.
  • Le total de chaque page est vérifié.
  • Un connecteur de 21 lignes.

Un filtre

Les tickets ouverts seulement.

  • Le filtre est écrit dans le path.
  • Chaque lien next le garde: 97 lus.

Ce qui a été corrigé

Un trou trouvé, une correction.

  • Avant: Completed, un ticket manquant.
  • Maintenant: la liste est relue (#1794).

Essayer

Le scénario se rejoue en local.

Chaque étape est publiée avec sa sortie.

Ce scénario tourne sur lumnik Open, gratuit et open source.

Essayer lumnik Open →