Skip to content

Latest commit

 

History

History
129 lines (86 loc) · 4.74 KB

README.md

File metadata and controls

129 lines (86 loc) · 4.74 KB

Gymlib UCPA Facilitator

Ce projet a pour but d'automatiser et simplifier les réservations via Gymlib à l'UCPA, en minimisant les étapes manuelles.

Voici les différentes étapes pour pouvoir préparer correctement sa venue :

Les différentes étapes de réservation

Sur ce schéma, on peut voir des tâches sans valeur ajoutée comme remplir le formulaire de contremarque et les deux temps d'attentes de validation.

Pour ces différentes raisons, j'ai automatisé les étapes facilement automatisables jusqu'à la réservation et après la réservation. Ce qui me permet d'avoir juste à faire une demande de code sur Gymlib, et choisir mon créneau horaire sur le site de l'UCPA. L'après-réservation est transparente pour moi, car je n'ai rien à faire pour avoir les réservations dans mon calendrier, et j'ai le QRCode sous la main à mon arrivée.

Plus en détail

Dans le code, les différentes étapes sont lancées par un CRON et sont découpées de cette manière :

1. Vérifier qu'une nouvelle réservation a été demandée sur Gymlib

Le code analyse les e-mails reçus en provenance de Gymlib grâce au paquet imapflow et récupère le code de contremarque dans le contenu dans le mail préalablement parsé par mailparser.

2. Remplir le formulaire de contremarque UCPA

Le formulaire ayant un token CSRF, le plus rapide à mettre en place a été de faire remplir le formulaire en utilisant Puppeteer, presque tous les champs du formulaire peuvent être remplis dynamiquement grâce à la variable d'environnement : FORM_RESPONSE. D'ailleurs, en phase de tests, vous pouvez désactiver l'envoi du formulaire grâce à la variable d'environnement FORM_SUBMIT_ENABLED=false.

3. Recevoir une notification dès que l'UCPA a validé les informations avec des créneaux arrangeants qui sont disponibles

Même principe que pour la première étape, le code détecte un e-mail en provenance de l'UCPA pour valider la contremarque et dire que l'e-billet est disponible sur votre espace personnel. Ensuite, le code cherche les créneaux qui vous arrangent, pour cela, il se base sur la variable d'environnement :

TIME_SLOTS_PREFERENCES='{
    "sun": [
        "17h00",
    ],
    "mon": [
        "19h00",
        "20h00"
    ],
}'

Cette variable d'environnement n'a pas besoin d'avoir tous les jours de la semaine renseignée.

4. Créer des évènements dans un calendrier

Tous les créneaux réservés sont ajoutés à un calendrier en utilisant la librairie ical-generator.

Le calendrier est un lien auquel on s'abonne, il est disponible sous l'url /reservations/calendar/${CALENDAR_ID}, où CALENDAR_ID correspond à ce qu'il y a dans la variable d'environnement.

5. Mettre à jour le pass Apple Wallet pour chaque réservation à venir

La génération du pass est gérée par la librairie passkit-generator, il faut avoir un compte Apple Developer pour générer des pass.

Les prérequis sont :

  • Avoir un compte Apple Developer
  • Générer tous les certificats nécessaires aux pass et les avoir mis dans le dossier certs
  • Fournir les variables d'environnement nécessaire pour le pass et sa mise à jour
CERTIFICATES_SIGNER_KEY_PASSPHRASE=
APPLE_PASS_TYPE_IDENTIFIER=
APPLE_PASS_TEAM_IDENTIFIER=
NOTIFICATIONS_APPLE_URL=

Pour le pass, il faut d'abord en créer un. Pour ça, nous devons récupérer un token :

ACCESS_TOKEN=$(node --input-type=module --eval "console.log(await (await import('./src/infrastructure/jsonWebTokenAdapter.js')).jsonWebTokenAdapter.generateToken({}));")

Après avoir obtenu notre token, nous pouvons faire un curl pour créer et obtenir le pass :

curl -X POST -H "Authorization: Bearer $ACCESS_TOKEN" http://localhost:4000/pass -o "ucpa.pkpass"

A venir :

  1. Me notifier de créneaux qui m'arrangent qui se libèrent

Usage en développement

  1. Copier le sample.env dans un fichier .env
cp sample.env .env
  1. Renseigner les différentes variables d'environnement
  2. Installer les paquets
npm ci
  1. Lancer la base de données
docker compose up -d
  1. Créer la base de données
npm run db:prepare
  1. Lancer le projet
npm start

Voilà votre environnement est prêt !

Contribuer

Les contributions sont les bienvenues ! Que ce soit pour corriger des bugs, ajouter de nouvelles fonctionnalités ou améliorer la documentation, n'hésitez pas à ouvrir une issue ou à proposer une pull request.