{"id":21959573,"url":"https://github.com/cooptilleuls/rustinelibre","last_synced_at":"2026-04-07T16:32:21.058Z","repository":{"id":240939261,"uuid":"614396452","full_name":"coopTilleuls/rustinelibre","owner":"coopTilleuls","description":"Dépôt monolithique du projet \"La rustine libre\"","archived":false,"fork":false,"pushed_at":"2026-01-15T10:28:41.000Z","size":7533,"stargazers_count":1,"open_issues_count":21,"forks_count":0,"subscribers_count":9,"default_branch":"main","last_synced_at":"2026-01-18T02:13:39.888Z","etag":null,"topics":["api","api-platform","material-ui","nextjs","php","postgis","postgresql","react","symfony"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/coopTilleuls.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-03-15T14:00:30.000Z","updated_at":"2025-08-18T13:03:36.000Z","dependencies_parsed_at":"2024-05-21T15:12:28.595Z","dependency_job_id":"0e58e465-a228-4aa3-9854-7750dd4d23bf","html_url":"https://github.com/coopTilleuls/rustinelibre","commit_stats":null,"previous_names":["cooptilleuls/rustinelibre"],"tags_count":65,"template":false,"template_full_name":null,"purl":"pkg:github/coopTilleuls/rustinelibre","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/coopTilleuls%2Frustinelibre","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/coopTilleuls%2Frustinelibre/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/coopTilleuls%2Frustinelibre/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/coopTilleuls%2Frustinelibre/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/coopTilleuls","download_url":"https://codeload.github.com/coopTilleuls/rustinelibre/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/coopTilleuls%2Frustinelibre/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31520509,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-07T16:28:08.000Z","status":"ssl_error","status_checked_at":"2026-04-07T16:28:06.951Z","response_time":105,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api","api-platform","material-ui","nextjs","php","postgis","postgresql","react","symfony"],"created_at":"2024-11-29T09:29:25.994Z","updated_at":"2026-04-07T16:32:21.038Z","avatar_url":"https://github.com/coopTilleuls.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003e [!WARNING]\n\u003e This repo is out of date, maintained version is here https://github.com/RustineLibre/RustineLibre\n\n# Bikelib\n\nPlateforme de mise en relation avec des réparateurs de vélos\n\n## Liens utiles\n\n- [Dépôt du projet](https://github.com/coopTilleuls/bikelib)\n- [Gestionnaire de tâches](https://github.com/orgs/coopTilleuls/projects/28/views/2?filterQuery=)\n- [Prototype](https://www.figma.com/file/91BAjXJqYT4Ecj12xECtlz/Untitled?node-id=336-484)\n\n## Déploiement en production\n- [via Kubernetes](./DEPLOY.md)\n- [via Docker](./DEPLOY.md#sur-une-machine-virtuelle-en-utilisant-docker)\n\n## URL du projet en local\n\n- [Documentation de l'API (Swagger)](https://localhost/docs)\n- [Frontend](https://localhost/)\n\n## URL du projet déployé via la CD\n\nLa branche main est déployée sur [main.nonprod.bikelib.preprod-tilleuls.ovh](https://main.nonprod.bikelib.preprod-tilleuls.ovh)\n\nLes PR sont déployées sur [pr-NN.nonprod.bikelib.preprod-tilleuls.ovh](https://pr-NN.nonprod.bikelib.preprod-tilleuls.ovh) (uniquement si le label deploy est ajouté sur la PR)\n\nLes tags/releases sont déployées sur [demo.bikelib.preprod-tilleuls.ovh](https://demo.bikelib.preprod-tilleuls.ovh)\n\n## Installation / utilisation du projet\n\n```shell\ngit clone git@github.com:coopTilleuls/bikelib.git   # Clone du projet\ncd bikelib              # Se place dans le dossier du projet\ndocker-compose build    # Installation du projet\ndocker-compose up -d    # Lance les containers\ndocker-compose exec php sh  # \"Entrer\" dans le container PHP\n```\n\nTemporairement, le site est protégé par un mot de passe : \nLogin : Libre\nPassword : Rustine\n\n## Pour générer la base de données\n\n```shell\nbin/console d:d:c           # Créer la BDD\nbin/console d:m:m           # Lance les migrations\nbin/console h:f:l -e dev    # Injecte les fixtures\n```\n\n## Pour exécuter l'intégralité des tests de l'API\n\n```shell\nbin/console d:d:d --env=test --force\nbin/console d:d:c --env=test\nbin/console d:m:m --env=test\nbin/console h:f:l --env=test\nphp -d memory_limit=1024M vendor/bin/phpunit\n```\n\n## Pour lancer un test seul\n\n```shell\nvendor/bin/phpunit  \u003cchemin/vers/votre/test\u003e\n```\n\n## Pour lancer l'intégralité des tests end-to-end\n\n```shell\ncd ./pwa\npnpm playwright install\npnpm playwright test\n\n# Pour avoir une interface graphique\npnpm playwright test --ui\n```\n\n## Pour obtenir un token JWT (JsonWebToken)\n\nFaites une request POST sur cette URL : https://localhost/auth avec ce contenu\n\n```\n{\n    \"email\": \"clement@les-tilleuls.coop\",\n    \"password\": \"Test1passwordOk!\"\n}\n```\n\nPermet d'obtenir le token suivant\n\n```\n{\n    \"token\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpYXQiOjE2Nzk2NTQxOTgsImV4cCI6MTY3OTY1Nzc5OCwicm9sZXMiOlsiUk9MRV9BRE1JTiIsIlJPTEVfVVNFUiJdLCJ1c2VybmFtZSI6ImNsZW1lbnRAbGVzLXRpbGxldWxzLmNvb3AifQ.OmmLYlmeriqt-SSIgseyTDDYcAOFs_ws4p7FmbBbExpPn3JQOyrIQk3zs-NKOIupxT8grB42KPnCa_cm08i6Mu1p4Bm-lBWe2N95rNCTRAhazFirwVCx5Jgkp1QD2ICUElOyw6pid8oroTQ903XhtHJnK8tRADArDZqz64U3p4eHcMbappjyJCQhVeV50oYsqcmR3gPWkO5uNt-9lMz4prOasz4rRPXY3MIVrGX6NJTCGkQjQPD0ibcqofJxoXpWmYvzIMNfRw7Wb0yd7guQxm7rWRVAwjBWFiW1eLou4upuq_KREojGLJwcTHVODeCrJcsQyRPtW1SRvrtP-PJ3tA\"\n}\n```\n\nEnsuite passer le token JWT en header à vos requêtes `Authorization: Bearer {token}`\n\n## Pour l'envoi des emails\n\nPar défaut dans ce projet nous utilisons symfony/mailer et mailgun pour envoyer nos emails.\nVous êtes libre d'implémenter une autre solution pour cette partie.\n\nVous avez juste à changer les variables d'environnement suivantes et installer la librairie\ncompatible avec symfony/mailer (gmail, amazon, mailchimp, mailjet etc...)\n\n```\nMAILER_SENDER\nMAILER_DSN\n```\n\nToute la documentation est disponible ici : https://symfony.com/doc/current/mailer.html\n\n## Pour se connecter\n\nEn tant qu'admin\n\n```\nmail:       clement@les-tilleuls.coop\npassword:   Test1passwordOk!\n```\n\nEn tant que boss d'une solution de réparation\n\n```\nmail:       boss@test.com\npassword:   Test1passwordOk!\n```\n\nOu\n\n```\nmail:       boss2@test.com\npassword:   Test1passwordOk!\n```\n\nPour se connecter en tant que cycliste\n\n```\nmail:       user1@test.com\npassword:   Test1passwordOk!\n```\n\n## Pour modifier le sitemap\n\nLe sitemap.xml est disponible via la route suivante : `/sitemap.xml`\n\nCôté front, dès que vous ajouter une nouvelle route disponible publiquement, c'est à dire sans authentification, il faut modifier le controller `SitemapController` présent côté back, afin que le sitemap soit mis à jour.\n\n## Captcha\n\nLe captcha est celui de Cloudflare : Turnstile.\n\nIl suffit d'aller dans votre pwa/.env.local et d'y ajouter la variable présente dans pwa/.env tout en y mettant la sitekey dédiée présente sur notre compte Cloudflare Tilleuls à cette adresse :\nhttps://dash.cloudflare.com/login\n\n\n## Notifications\nLe système de notifications push utilise [Firebase Cloud Messaging](https://firebase.google.com/), pour les faire fonctionner\nil faut indiquer des credentials valides dans le .env (et fournies par FCM) et lancer la commande suivante\n\n```\nphp bin/console app:firebase:credentials\n```\n\nIl est nécessaire d'utiliser un protocole HTTPS intégral. En environnement local si vous avez des erreurs\nde tunnel SSL dans l'app react il est conseillé d'installer ngrok pour créer un tunnel vers l'application: \n\n```\nngrok http --host-header=\"localhost:443\" localhost:443\n```\n\nL'IP ensuite proposée doit surcharger localhost dans le docker-compose.override :\n\n```\n  php:\n    environment:\n      TRUSTED_HOSTS: ^${SERVER_NAME:-example\\.com|localhost|\u003cvotre ip ngrok\u003e.ngrok-free.app}|caddy$$```\n\n  pwa:\n    environment:\n      NEXT_PUBLIC_ENTRYPOINT: https://\u003cvotre ip ngrok\u003e.ngrok-free.app\n```\n\nEt ajouter dans le .env.local de votre PWA \n\n```\nNEXT_PUBLIC_ENTRYPOINT=https://\u003cvotre ip ngrok\u003e.ngrok-free.app\n```\n\n\n## Usage du site\n\nUne fois les containers lancés, le projet est disponible à l'adresse suivante :\n\n```\nhttps://localhost\n```\n\nIl existe 3 parcours sur le site : \n\n- Le parcours du cycliste \"traditionnel\" disponible à la racine du site\n- Le parcours d'un réparateur de vélo, qui accède à l'URL /sradmin sur laquelle il peut gérer ses clients, rendez-vous, horaires..\n- Le parcours d'un administrateur du site, qui accède à l'URL /admin, sur laquelle il peut accepter les demandes des réparateurs, consulter les messages reçus...\n\nLa gestion du carnet d'entretien d'un vélo peut se faire via l'URL /mes-velos du parcours cycliste, il y est possible\nd'y ajouter des photos ou des factures à différents formats :\n- photos : .png, .jpg, .jpeg\n- factures : .pdf, .doc, .docx, .odt, .xls, .csv, .png, .jpg, .jpeg\n\nLes réparateurs peuvent également accéder à ce carnet et ajouter des interventions dont ils sont à l'origine.\n\n## Rôles\n\nLes utilisateurs du site sont répartis dans 4 rôles différents : \n\n- \u003cb\u003eROLE_USER\u003c/b\u003e, il s'agit des utilisateurs de la plateforme\n- \u003cb\u003eROLE_BOSS\u003c/b\u003e, il s'agit des propriétaires des solutions de réparation\n- \u003cb\u003eROLE_EMPLOYEE\u003c/b\u003e, il s'agit des employés des solutions de réparation\n- \u003cb\u003eROLE_ADMIN\u003c/b\u003e, il s'agit des administrateurs de la plateforme\n\n\n## Mise à jour des créneaux disponibles et des rendez-vous\n\nUne tâche CRON doit être joué toutes les 30min pour mettre à jour le prermier créneau disponible de chaque réparateur (lorsqu'il n'est pas déjà actualisé*)\n\n```\nphp bin/console app:repairer:update-first-slot-available\n```\n\nUne autre commande (facultative) permet de mettre à jour le status des rendez vous lorsque ces derniers n'ont pas obtenu de réponse depuis 72 heures ou que leur date est dépassée. Elle peut également être jouée quotidiennement :\n\n\n```\nphp bin/console app:appointments:cancel-old\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcooptilleuls%2Frustinelibre","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcooptilleuls%2Frustinelibre","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcooptilleuls%2Frustinelibre/lists"}