Websocket - DirectusApiManager

Bonjour à tous,

J’ai une application Flutter qui fonctionne plutôt bien :fire: avec un webservice Directus , mais pour une nouvelle fonctionnalité, j’aurais besoin de mettre en place des websockets.
En effet, des utilisateurs peuvent s’inscrire à des événements dont les places sont limitées. Il faut donc que le nombre d’inscrits se mette à jour en temps réel pour bloquer l’inscription à l’évènement et ne pas se retrouver avec plus d’inscrits que de places :cold_sweat:.

Mais ça fait une semaine que je regarde et m’arrache les cheveux pour comprendre comment mettre en place ces satanés websockets :triumph: mais sans succès.

Si une âme charitable voulait bien prendre le temps de m’expliquer comment configurer cela dans mon projet Flutter et me dire ce que le grandiose DirectusApiManager() :star_struck: peut faire pour aider dans cette tâche.

En vous remerciant,

Benoit

PS: ma variable d’environnement WEBSOCKETS_ENABLED est déjà à true

C’est vrai que les websockets ne sont pas très simples à mettre en place.
Nous avons une version fonctionnelle sur DirectusApiManager créée par @jmjoary.
Je la trouvais un peu complexe à utiliser côté app flutter et je l’ai largement simplifiée pour mon dernier projet ; je posterai très bientôt une mise à jour sur pub.dev pour intégrer la nouvelle version.

Voici le lien qui ne changera pas et qui contient déjà la version actuelle qui est fonctionnelle :

La version 1.11 est en ligne avec la gestion simplifiée des websockets :tada:

J’ai aussi mis à jour la doc pour t’aider un peu plus à le mettre en place

Merci :pray: @mbritto,
Je vais me pencher là dessus avec attention.

Merci pour ton aide.

1 « J'aime »

Salut Benoît !
J’ai aussi été confronté à des problématiques similaires et en général, même s’il te faut effectivement faire cette vérification dans l’app pour afficher l’info correctement à l’utilisateur, il est préférable de valider ce genre d’opération côté backend.
Je ne sais pas où tu en es dans ton projet et j’enfonce peut-être des portes ouvertes :sweat_smile: mais cela évitera aussi qu’un petit malin se connecte à ton API directus sans passer par ton app et fasse une réservation alors qu’il n’y a plus de place en réalité.
Dans directus tu peux mettre ça en place en ajoutant un filtre pour intercepter la requête entrante et faire les vérifications nécessaires avant de créer ta réservation en base de donnée.
En espérant t’avoir aidé :slightly_smiling_face:

Salut @paul-gbl,
Merci pour ton aide précieuse.
Effectivement, ce serait une super solution de faire intercepter la requête par le serveur pour qu’il puisse ensuite vérifier si la limite de places disponibles est déjà atteinte.
Mais comment faire cela ? Avec Directus Flows par exemple en créant un event Hook filter blocking ?

Si tu as une minute pour aiguiller mes recherches…

En tout cas merci :pray: pour la liste à explorer.

C’est exactement ça :wink:

Je ne suis pas un spécialiste directus mais lorsque tu crées ton flow à partir d’un event hook (de type filter blocking), tu devrais pouvoir dire que tu interceptes les événements visant à créer une réservation : dans les rôles tu devrais pouvoir choisir « items.create » et il te faut sélectionner aussi la collection qui correspond à tes réservations.

Ensuite dans ton flow il te faudra compter les réservations dans ta base de donnée : pour ça tu peux ajouter un bloc pour lire des données en sélectionnant la collection qui t’intéresse et avec une requête du style :

{
    "aggregate": {
        "count": [
            "id"
        ]
    }
}

Derrière il te suffit de mettre un bloc de condition qui vient tester si le nombre de réservations que tu as récupéré est inférieur à un certain seuil (il te faudra peut être passer par un petit script avant car j’ai l’impression que le bloc condition ne gère pas toujours bien le résultat de l’opération précédente s’il y a un tableau dedans selon cette discussion Syntax for Conditions by Flows · directus/directus · Discussion #15568 · GitHub).
Si le résultat de ton bloc de condition retourne vrai la valeur devrait être enregistrée en base de donnée, s’il retourne faux et que ton flow se termine sur ça, alors l’opération devrait être refusée et une erreur devrait être retournée via l’API.

Je ne l’ai jamais testé cela dit et je serais curieux de savoir si tu as pu mettre ça en place !

1 « J'aime »