Skip to content

Commit 6ef96d5

Browse files
doc: improve README.md
1 parent 09e8a96 commit 6ef96d5

File tree

1 file changed

+87
-14
lines changed

1 file changed

+87
-14
lines changed

README.md

+87-14
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,92 @@
11
# Gymlib UCPA Facilitator
22

3-
Ce projet a pour but de me faire gagner du temps lors de mes réservations UCPA via Gymlib.
3+
Ce projet a pour but d'automatiser et simplifier les réservations via [Gymlib](https://gymlib.com/) à l'[UCPA](https://www.ucpa.com/sport-station/paris-19), en minimisant les étapes manuelles.
44

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

77
![Les différentes étapes de réservation](./docs/étapes-reservation.png)
88

9-
Le projet est composé actuellement de 5 grandes étapes :
9+
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.
1010

11-
1. Vérifier qu'une nouvelle réservation a été demandée sur Gymlib
12-
2. Remplir le formulaire de contremarque UCPA
13-
3. Recevoir une notification dès que l'UCPA a validé les informations avec des créneaux arrangeants qui sont disponibles
14-
4. Créer des évènements dans un calendrier et proposer une url pour s'abonner au calendrier `/reservations/calendar`.
15-
5. Créer un pass Apple Wallet qui se met à jour pour chaque réservation
11+
Pour ces différentes raisons, j'ai automatisé les étapes facilement automatisables jusqu'à la réservation et après la réservation.
12+
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.
13+
L'après-réservation est transparente pour moi, car je n'ai rien à faire pour avoir les réservations dans mon calendrier,
14+
et j'ai le QRCode sous la main à mon arrivée.
1615

17-
A venir :
16+
## Plus en détail
1817

19-
2. Me notifier de créneaux qui m'arrangent qui se libèrent
18+
Dans le code, les différentes étapes sont lancées par un CRON et sont découpées de cette manière :
2019

21-
La réservation du créneau se fait donc toujours manuellement sur le site de l'UCPA, mais toutes les étapes contraignantes
22-
et d'attente sont désormais automatisées.
20+
### 1. Vérifier qu'une nouvelle réservation a été demandée sur Gymlib
2321

24-
## Usage
22+
Le code analyse les e-mails reçus en provenance de Gymlib grâce au paquet [`imapflow`](https://www.npmjs.com/package/imapflow)
23+
et récupère le code de contremarque dans le contenu dans le mail préalablement parsé par [`mailparser`](https://www.npmjs.com/package/mailparser).
24+
25+
### 2. Remplir le formulaire de contremarque UCPA
26+
27+
Le formulaire ayant un token CSRF, le plus rapide à mettre en place a été de faire remplir le formulaire en utilisant [Puppeteer](https://pptr.dev/),
28+
presque tous les champs du formulaire peuvent être remplis dynamiquement grâce à la variable d'environnement : `FORM_RESPONSE`.
29+
D'ailleurs, en phase de tests, vous pouvez désactiver l'envoi du formulaire grâce à la variable d'environnement `FORM_SUBMIT_ENABLED=false`.
30+
31+
### 3. Recevoir une notification dès que l'UCPA a validé les informations avec des créneaux arrangeants qui sont disponibles
32+
33+
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
34+
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 :
35+
36+
```dotenv
37+
TIME_SLOTS_PREFERENCES='{
38+
"sun": [
39+
"17h00",
40+
],
41+
"mon": [
42+
"19h00",
43+
"20h00"
44+
],
45+
}'
46+
```
47+
48+
Cette variable d'environnement n'a pas besoin d'avoir tous les jours de la semaine renseignée.
49+
50+
### 4. Créer des évènements dans un calendrier
51+
52+
Tous les créneaux réservés sont ajoutés à un calendrier en utilisant la librairie [`ical-generator`](https://www.npmjs.com/package/ical-generator).
53+
54+
Le calendrier est un lien auquel on s'abonne, il est disponible sous l'url `/reservations/calendar/${CALENDAR_ID}`,
55+
`CALENDAR_ID` correspond à ce qu'il y a dans la variable d'environnement.
56+
57+
### 5. Mettre à jour le pass Apple Wallet pour chaque réservation à venir
58+
59+
La génération du pass est géré par la librairie [`passkit-generator`](https://www.npmjs.com/package/passkit-generator), il faut avoir un compte Apple Developer pour générer des pass.
60+
61+
Les prérequis sont :
62+
63+
- Avoir un compte Apple Developer
64+
- Générer tous les certificats nécessaires aux pass et les avoir mis dans le dossier `certs`
65+
- Fournir les variables d'environnement nécessaire pour le pass
66+
67+
```dotenv
68+
CERTIFICATES_SIGNER_KEY_PASSPHRASE=
69+
PASS_TYPE_IDENTIFIER=
70+
PASS_TEAM_IDENTIFIER=
71+
```
72+
73+
Pour le pass, il faut d'abord en créer un. Pour ça, nous devons récupérer un token :
74+
75+
```shell
76+
ACCESS_TOKEN=$(node --input-type=module --eval "console.log(await (await import('./src/infrastructure/jsonWebTokenService.js')).jsonWebTokenService.generateToken({}));")
77+
```
78+
79+
Après avoir obtenu notre token, nous pouvons faire un curl pour créer le pass :
80+
81+
```shell
82+
curl -X POST -H "Authorization: Bearer $ACCESS_TOKEN" http://localhost:4000/pass
83+
```
84+
85+
## A venir :
86+
87+
1. Me notifier de créneaux qui m'arrangent qui se libèrent
88+
89+
## Usage en développement
2590

2691
1. Copier le sample.env dans un fichier .env
2792

@@ -36,13 +101,13 @@ cp sample.env .env
36101
npm ci
37102
```
38103

39-
4. Lancer la base de donnée
104+
4. Lancer la base de données
40105

41106
```shell
42107
docker compose up -d
43108
```
44109

45-
5. Créer la base de donnée
110+
5. Créer la base de données
46111

47112
```shell
48113
npm run db:prepare
@@ -53,3 +118,11 @@ npm run db:prepare
53118
```shell
54119
npm start
55120
```
121+
122+
Voilà votre environnement est prêt !
123+
124+
## Contribuer
125+
126+
Les contributions sont les bienvenues !
127+
Que ce soit pour corriger des bugs, ajouter de nouvelles fonctionnalités ou améliorer la documentation,
128+
n'hésitez pas à ouvrir une issue ou à proposer une pull request.

0 commit comments

Comments
 (0)