Skip to content

feat: tirage d'une voie aléatoire par niveau min/max (site + salle) - #241

Open
bouls631 wants to merge 2 commits into
oblyk:masterfrom
bouls631:feat/random-route
Open

bouls631 wants to merge 2 commits into
oblyk:masterfrom
bouls631:feat/random-route

Conversation

@bouls631

@bouls631 bouls631 commented Sep 5, 2026

Copy link
Copy Markdown

Ajoute un bouton « Voie aléatoire » sur la page des voies d'un site extérieur et un bouton dé dans les salles. L'utilisateur choisit un niveau mini/maxi, l'app charge les voies, filtre par grade_gap et propose une voie au hasard (avec bouton « retirer au sort »). Traductions FR/EN incluses

@lucien-chastan

Copy link
Copy Markdown
Contributor

Salut @bouls631

Merci beaucoup pour ta proposition de PR ! Je n'y avais jamais pensé : ) Et je me dis même que ce dès pourrait être plus tard un bouton d'accès à d'autre jeux (surtout pour l'indoor)

Par contre fetcher toutes les routes pour en tirer une au hasard est un peu overkill,
Il faudrait plutôt une route API dédié où tu peux passer des filtres, et c'est l'API qui te donne uniquement une voie / bloc.

Il y a déjà un end point pour l'indoor : https://github.com/oblyk/oblyk-api/blob/master/app/controllers/api/v1/crag_routes_controller.rb#L143 Il faudrait fair évoluer cette méthode pour permettre de lui passer optionnellement une falaise, ou un secteur et une cotation max / min, et faire de même pour l'indoor

Mais j'imagine que si tu as préféré fetcher toutes les voies depuis l'app c'est que tu n'as pas spécialement envie de faire une évolution côté API ?

Merci encore de ta participation : )

@bouls631

bouls631 commented Sep 9, 2026

Copy link
Copy Markdown
Author

Hello !

Tu as complètement raison sur le fetchAllRoutes — c'était clairement overkill, je l'avais fait comme ça au début juste pour valider l'idée côté UI sans toucher à l'API, mais ce n'était pas tenable (jusqu'à 40 pages à 25 voies...).

J'ai retravaillé les deux côtés comme tu le suggérais :

Côté API (oblyk-api) :

  • CragRoutesController#random évolue pour accepter en option crag_id, crag_sector_id, area_id + min_grade_value / max_grade_value et ne renvoie plus qu'une seule voie tirée au sort (ORDER BY RAND()). 404 si rien dans la fourchette.
  • Nouveau GymRoutesController#random sur le même principe pour l'indoor : gym_id obligatoire + gym_space_id / gym_sector_id optionnels + même filtre min/max_grade_value. Ça prépare aussi l'idée du bouton multi-jeux dont tu parlais.
  • Pour la cotation j'ai suivi ta préférence implicite : je passe des int 1..54 (même référentiel que GradeMixin.gradeByValue côté app, 1a = 1 → 9c+ = 54). J'ai commenté le code côté API et côté app pour que ce soit explicite.

Côté App (oblyk-app) :

  • CragRandomRoute.vue et GymRandomRoute.vue n'ont plus aucune pagination côté client, juste un appel CragRouteApi.random({cragId, cragSectorId, minGradeValue, maxGradeValue}) / GymRouteApi.random(gymId, {gymSpaceId, ...}). Un seul call réseau, et le 404 affiche proprement "aucune voie dans cette fourchette".

Au passage, je me suis beaucoup servi d'Oblyk pour un petit outil pour mon asso : Rappel a Riom (63) (https://github.com/bouls631/Rappel) — https://bouls631.github.io/Rappel/ (https://bouls631.github.io/Rappel/)
Ça permet aux membres de se challenger quand on ne sait pas quoi grimper, ou justement pour se forcer à aller dans des profils où on est moins à l'aise. Oblyk nous sert de base de données de référence, donc un grand merci pour tout le travail derrière !

N'hésite pas à me dire si tu préfères que je renomme les params, que je change le serializer indoor (summary_to_json vs detail_to_json) ou que je limite V1 à gym_space sans gym_sector.

Merci pour ton accueil et pour Oblyk : )

Renaud

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants