Architecture TournoiPro - Vue d'ensemble
ποΈ SchΓ©ma de l'architecture
text
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β FRONTEND β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
β β Hotwire β β Stimulus β β Tailwind β β
β β (Turbo) β β JS β β CSS β β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β RAILS CONTROLLERS β
β ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββββ β
β β Clubs β β Courts β βTournamentsβ β Matches β β
β ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β AUTHORIZATION (Pundit) β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β ACL (Access Control Lists) β β
β β - Per-Tournament permissions β β
β β - Role-based access control β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β BUSINESS LOGIC β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β’ Tournament bracket generation β β
β β β’ Seed placement & BYE calculation β β
β β β’ Match scheduling β β
β β β’ Score validation workflow β β
β β β’ Point calculation (FFT rules) β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β MODELS (ActiveRecord) β
β βββββββ ββββββββ ββββββββ ββββββββββββ βββββββββ β
β βUser β β Club β βCourt β βTournamentβ β Match β β
β βββββββ ββββββββ ββββββββ ββββββββββββ βββββββββ β
β β β β β β β
β ββββββββββββββββ ββββββββ ββββββββββββββββββββββ β
β β Tournament β β Team β β ScoreProposal β β
β β Permission β ββββββββ ββββββββββββββββββββββ β
β ββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β DATABASE (PostgreSQL) β
β β
β Tables: users, clubs, courts, tournaments, β
β tournament_permissions, teams, matches, β
β match_teams, score_proposals β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
π Diagramme de relations des entitΓ©s (ERD)
text
βββββββββββββββ
β User β
βββββββββββββββ
β β’ email β
β β’ role βββββββββββββββ
β β’ niveau_japβ β
β β’ classementβ β
βββββββββββββββ β
β β
β manages β juge_arbitre_principal
βΌ β
βββββββββββββββ β
β Club β β
βββββββββββββββ β
β β’ nom β β
β β’ adresse β β
βββββββββββββββ β
β β
β has_many β
βΌ β
βββββββββββββββ β
β Court β β
βββββββββββββββ β
β β’ nom β β
β β’ homologue β β
β β’ hauteur β β
βββββββββββββββ β
β β
β used_by β
βΌ β
βββββββββββββββ β
β Match β β
βββββββββββββββ β
β β’ round β β
β β’ heure β β
βββββββββββββββ β
β β
β belongs_to β
βΌ β
ββββββββββββββββ β
β Tournament ββββββββββββββ
ββββββββββββββββ
β β’ type β
β β’ format β
β β’ dates β
ββββββββββββββββ
β
β has_many
βΌ
ββββββββββββββββββββ
βTournament β
βPermission (ACL) β
ββββββββββββββββββββ
β β’ user_id β
β β’ permission_typeβ
β β’ granted_by β
ββββββββββββββββββββ
β
β grants_access_to
βΌ
βββββββββββββββ
β User β (autorized users)
βββββββββββββββ
ββββββββββββββββ βββββββββββββββ
β Tournament ββββββββββββ Team β
ββββββββββββββββ has_many βββββββββββββββ
β β
joueur1_id β β joueur2_id
βΌ βΌ
βββββββββββββββ
β User β
βββββββββββββββ
βββββββββββββββ ββββββββββββββββ
β Match ββββββββββββ MatchTeam β
βββββββββββββββ has_many ββββββββββββββββ
β
β belongs_to
βΌ
βββββββββββββββ
β Team β
βββββββββββββββ
βββββββββββββββ ββββββββββββββββββββ
β Match ββββββββββββ ScoreProposal β
βββββββββββββββ has_many ββββββββββββββββββββ
β β’ scores β
β β’ validated? β
ββββββββββββββββββββ
π Flux d'autorisation (ACL)
text
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β USER ROLES β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β ββββββββ ββββββββββββββββ βββββββ ββββββββββ β
β βAdmin β βJuge-Arbitre β βGest.β β Joueur β β
β β β β (JAP) β βClub β β β β
β ββββββββ ββββββββββββββββ βββββββ ββββββββββ β
β β β β β β
β β β β β β
β βΌ βΌ βΌ βΌ β
β [ALL] [Create Tourn.] [Manage Club] [Register] β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β TOURNAMENT CREATION β
β JAP creates tournament β Gets ADMIN permission β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β ACL PERMISSION GRANTS β
β β
β JAP (admin) can grant: β
β β’ Other JAP β READ or WRITE β
β β’ Club Manager β READ or WRITE β
β β’ Players β READ (auto on registration) β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β PERMISSION CHECKS (Pundit) β
β β
β Before action: β
β β’ Check user role β
β β’ Check tournament permission β
β β’ Allow or deny action β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
π― Flux de dΓ©claration et crΓ©ation de tournoi
Workflow de dΓ©claration bidirectionnel (nouveau)
text
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β DΓCLARATION AVEC VALIDATION β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β JAP propose βββββΊ Gestionnaire valide βββββΊ Créé β
β β
β Gestionnaire βββββΊ JAP valide βββββΊ Créé β
β dΓ©clare β
β β
β Admin βββββΊ (pas de validation) βββββΊ Créé β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Flux complet de crΓ©ation
text
βββββββββββ
β JAP β
ββββββ¬βββββ
β
β 1. Propose tournament (status: declaration)
βΌ
ββββββββββββββββββ
β Tournament β
β (brouillon) β
ββββββ¬ββββββββββββ
β
β 2. Configure
βΌ
ββββββββββββββββββββββββββββββββββ
β β’ Type (P25-P2000) β
β β’ Dates β
β β’ Format match β
β β’ Club & courts β
β β’ Min/max teams β
ββββββ¬ββββββββββββββββββββββββββββ
β
β 3. Grant permissions
βΌ
ββββββββββββββββββββββββββββββββββ
β TournamentPermission β
β β’ Other JAP (write) β
β β’ Club manager (read) β
ββββββ¬ββββββββββββββββββββββββββββ
β
β 4. Open registrations
βΌ
ββββββββββββββββββ
β Tournament β
β (ouvert) β
ββββββ¬ββββββββββββ
β
β 5. Teams register
βΌ
ββββββββββββββββββββββββββββββββββ
β Team validation: β
β β’ Check classement constraint β
β β’ Check poids paire β
β β’ Check licence FFT β
ββββββ¬ββββββββββββββββββββββββββββ
β
β 6. Close registrations
βΌ
ββββββββββββββββββββββββββββββββββ
β Generate bracket: β
β β’ Sort by classement β
β β’ Place seeds β
β β’ Calculate BYE β
β β’ Create matches β
ββββββ¬ββββββββββββββββββββββββββββ
β
β 7. Generate schedule
βΌ
ββββββββββββββββββββββββββββββββββ
β Match planning: β
β β’ Assign courts β
β β’ Assign times β
β β’ Respect rest periods β
β β’ Notify players β
ββββββ¬ββββββββββββββββββββββββββββ
β
β 8. Tournament starts
βΌ
ββββββββββββββββββ
β Tournament β
β (en_cours) β
ββββββββββββββββββ
π Flux de saisie de score
text
ββββββββββββββββ
β Match starts β
ββββββββ¬ββββββββ
β
βΌ
ββββββββββββββββββββββββββββββββββββ
β Team 1 plays vs Team 2 β
ββββββββ¬ββββββββββββββββββββββββββββ
β
β Match ends
βΌ
ββββββββββββββββββββββββββββββββββββ
β Team 1 player proposes score β
β (via mobile/web interface) β
ββββββββ¬ββββββββββββββββββββββββββββ
β
β Creates ScoreProposal
βΌ
ββββββββββββββββββββββββββββββββββββ
β System notifies Team 2 β
β "Please validate score" β
ββββββββ¬ββββββββββββββββββββββββββββ
β
ββββββββββββ YES βββββββββββββ
β β
β βΌ
β ββββββββββββββββββ
β β Team 2 accepts β
β ββββββββββ¬ββββββββ
β β
β β
β βΌ
β ββββββββββββββββββββ
β β Notify JAP β
β β for validation β
β ββββββββββ¬ββββββββββ
β β
β βΌ
β ββββββββββββββββββββ
β β JAP validates β
β ββββββββββ¬ββββββββββ
β β
β βΌ
β ββββββββββββββββββββ
β β Score confirmed β
β β β’ Update match β
β β β’ Progress winnerβ
β β β’ Calculate pts β
β ββββββββββββββββββββ
β
ββββββββββββ NO ββββββββββββββ
β
βΌ
ββββββββββββββββββ
β Team 2 contestsβ
ββββββββββ¬ββββββββ
β
βΌ
ββββββββββββββββββββ
β Alert JAP β
β (dispute) β
ββββββββββ¬ββββββββββ
β
βΌ
ββββββββββββββββββββ
β JAP investigates β
β & decides β
ββββββββββ¬ββββββββββ
β
βΌ
ββββββββββββββββββββ
β JAP enters β
β correct score β
ββββββββββ¬ββββββββββ
β
βΌ
ββββββββββββββββββββ
β Score confirmed β
β (with audit log) β
ββββββββββββββββββββ
π Cycle de vie d'un tournoi
text
βββββββββββββββ
β DΓCLARATION β β JAP/Gestionnaire propose (nouveau)
ββββββββ¬βββββββ
β
β Validation
βΌ
βββββββββββββββ
β BROUILLON β β AprΓ¨s validation ou crΓ©ation directe (admin)
ββββββββ¬βββββββ
β
β Configure
βΌ
βββββββββββββββββββββββ
β OUVERT_INSCRIPTIONS β
ββββββββ¬βββββββββββββββ
β
β Teams register
βΌ
βββββββββββββββββββββββ
β CLOTURE_INSCRIPTIONSβ
ββββββββ¬βββββββββββββββ
β
β Generate bracket & schedule
βΌ
βββββββββββββββ
β EN_COURS β
ββββββββ¬βββββββ
β
β Play matches
βΌ
βββββββββββββββ
β TERMINE β
ββββββββ¬βββββββ
β
β Calculate final points
βΌ
βββββββββββββββ
β ARCHIVED β
βββββββββββββββ
βββββββββββββ
β ANNULE β β Can happen anytime
βββββββββββββ
π± Interfaces utilisateur (MVP)
Pour les JAP (Juge-Arbitre)
text
ββββββββββββββββββββββββββββββββββββββ
β Dashboard JAP β
ββββββββββββββββββββββββββββββββββββββ€
β β’ Mes tournois β
β β’ CrΓ©er un nouveau tournoi β
β β’ Tournois en cours β
β β’ Matches Γ valider β
β β’ Statistiques β
ββββββββββββββββββββββββββββββββββββββ
Pour les Gestionnaires de club
text
ββββββββββββββββββββββββββββββββββββββ
β Dashboard Gestionnaire β
ββββββββββββββββββββββββββββββββββββββ€
β β’ Mon club β
β β’ Mes terrains β
β β’ Tournois hΓ©bergΓ©s β
β β’ Planning des terrains β
β β’ Statistiques d'utilisation β
ββββββββββββββββββββββββββββββββββββββ
Pour les Joueurs
text
ββββββββββββββββββββββββββββββββββββββ
β Dashboard Joueur β
ββββββββββββββββββββββββββββββββββββββ€
β β’ Mes inscriptions β
β β’ Mes prochains matchs β
β β’ Saisir un score β
β β’ Mon classement β
β β’ Historique de performances β
ββββββββββββββββββββββββββββββββββββββ
π§© Technologies et outils
Backend Stack
text
Ruby 3.3.6
βββ Rails 8.0
βββ PostgreSQL 16
βββ Devise (auth)
βββ Pundit (authorization)
βββ Sidekiq (background jobs)
βββ ActiveStorage (file uploads)
Frontend Stack
text
Hotwire
βββ Turbo (SPA-like experience)
βββ Stimulus (JS sprinkles)
βββ Tailwind CSS (styling)
Testing Stack
text
RSpec
βββ FactoryBot (fixtures)
βββ Faker (test data)
βββ Capybara (system tests)
βββ Shoulda Matchers (validation tests)
Development Tools
text
βββ Rubocop (linting)
βββ Bullet (N+1 query detection)
βββ Brakeman (security scan)
βββ SimpleCov (code coverage)
TournoiPro Architecture - Designed for scalability and maintainability ποΈ
Retour Γ la documentation
Une question ? Contactez le support