Skip to content

Uniformiser les routes

Ces derniers temps, divers sujets à traiter (authentification, dialogue de confirmation, vue de modération...) nous ont conduit avec @f00wl à questionner un certain nombre de routes, qui ne nous semblaient pas toujours cohérentes ou pratiques à manipuler. En dézoomant un peu, j'ai remarqué qu'il n'y avait pas de convention de routage unique, et que plusieurs logiques se sont chevauchées avec le temps. Parmi les « problèmes » qu'on peut identifier dans l'état actuel :

  • les collections sont au singulier (profile, user, service)
  • les uuid sont très souvent en bout de route, mais pas systématiquement, là où une syntaxe <collection>/<uuid>/<...> (où est-on / sur quoi lit-on ou fait-on quelque chose) serait envisageable

Une unification systématique avec des conventions de routage ne répondrait pas seulement à un enjeu esthétique, mais permettrait de se rapprocher des bonnes pratiques de type REST, et de rendre plus compréhensive l'exploration du code autant que de l'interface web lors du développement.

Un autre sujet, peut-être moins consensuel, concerne les profiles. Plus je me plonge et replonge dans le code de Hiboo, plus je me convainc qu'en termes de pure logique, profiles est une sous-collection de services, dans la mesure où un profile ne peut pas exister en dehors d'un service, tandis qu'il peut exister en dehors d'un user (UNCLAIMED). Par exemple, je trouve qu'une route /services/<service_uuid>/profiles informe mieux que /profile/list/service/<service_uuid>.

J'ai bossé dans une branche sur un PoC de ce à quoi pourrait ressembler une alternative (basée sur la branche de !79 (merged) histoire de résoudre une limitation de ma proposition pour les profiles) :

Endpoint Before After
account.contact /account/contact /account/settings/contact
account.home /account/home /account/home
account.password /account/auth/password /account/settings/auth/password
account.password_reset /account/auth/password/reset /account/auth/password/reset
account.profiles /account/profiles /account/profiles
account.signin_password /account/signin/password /account/auth/password
account.signin_totp /account/signin/totp /account/auth/totp
account.signout /account/signout /account/auth/signout
account.signup /account/signup /account/auth/signup
account.totp /account/auth/totp /account/settings/auth/totp
account.totp_disable /account/auth/totp/disable /account/settings/auth/totp/disable
account.totp_enable /account/auth/totp/enable /account/settings/auth/totp/enable
account.totp_reset /account/auth/totp/reset /account/auth/totp/reset
api.profile_email /api/profile/<profile_uuid>/email /api/profiles/<profile_uuid>/email
index / /
moderation.board /moderation/ /moderation/
profile.action /profile/action/<profile_uuid>/<action> /services/<service_uuid>/profiles/<profile_uuid>/<action>
profile.assign /profile/assign/<profile_uuid> /services/<service_uuid>/profiles/<profile_uuid>/assign
profile.cancel_transition /profile/transition/<profile_uuid>/cancel /services/<service_uuid>/profiles/<profile_uuid>/transition/cancel
profile.claim /profile/claim/<service_uuid> /services/<service_uuid>/profiles/claim
profile.complete_transition /profile/transition/<profile_uuid>/complete /services/<service_uuid>/profiles/<profile_uuid>/transition/complete
profile.create /profile/create/<service_uuid> /services/<service_uuid>/profiles/create
profile.create_for /profile/create_for/<service_uuid> /services/<service_uuid>/profiles/create-for
profile.create_quick /profile/create_quick/<service_uuid> /services/<service_uuid>/profiles/create-quick
profile.details /profile/details/<profile_uuid> /services/<service_uuid>/profiles/<profile_uuid>
profile.list_for_service /profile/list/service/<service_uuid> /services/<service_uuid>/profiles/
profile.pick /profile/pick/<service_uuid> /services/<service_uuid>/profiles/pick
profile.start_transition /profile/transition/<profile_uuid>/<transition_id> /services/<service_uuid>/profiles/<profile_uuid>/transition/<transition_id>
profile.unclaimed_export_for_service /profile/unclaimedexport/service/<service_uuid>.csv /services/<service_uuid>/profiles/unclaimed.csv
service.action /service/action/<service_uuid>/<action> /services/<service_uuid>/<action>
service.create /service/create/<application_id> /services/<application_id>/create
service.create_select /service/create /services/create
service.delete /service/delete/<service_uuid> /services/<service_uuid>/delete
service.details /service/details/<service_uuid> /services/<service_uuid>
service.edit /service/edit/<service_uuid> /services/<service_uuid>/edit
service.edit /service/edit /services/edit
service.list /service/list /services/
service.setapp /service/setapp/<service_uuid>/<application_id> /services/setapp/<service_uuid>/<application_id>
service.setapp_select /service/setapp/<service_uuid> /services/<service_uuid>/setapp
sso.oidc_authorize /sso/oidc/<service_uuid>/authorize /sso/oidc/<service_uuid>/authorize
sso.oidc_authorize /sso/oidc/authorize/<service_uuid> /sso/oidc/authorize/<service_uuid>
sso.oidc_discovery /sso/oidc/<service_uuid>/.well-known/openid-configuration /sso/oidc/<service_uuid>/.well-known/openid-configuration
sso.oidc_issuer /sso/oidc/<service_uuid> /sso/oidc/<service_uuid>
sso.oidc_jwks /sso/oidc/<service_uuid>/jwks /sso/oidc/<service_uuid>/jwks
sso.oidc_token /sso/oidc/<service_uuid>/token /sso/oidc/<service_uuid>/token
sso.oidc_token /sso/oidc/token/<service_uuid> /sso/oidc/token/<service_uuid>
sso.oidc_userinfo /sso/oidc/<service_uuid>/userinfo /sso/oidc/<service_uuid>/userinfo
sso.oidc_userinfo /sso/oidc/userinfo/<service_uuid> /sso/oidc/userinfo/<service_uuid>
sso.saml_metadata /sso/saml/metadata/<service_uuid>.xml /sso/saml/metadata/<service_uuid>.xml
sso.saml_redirect /sso/saml/redirect/<service_uuid> /sso/saml/redirect/<service_uuid>
static /static/path:filename /static/path:filename
user.contact_check /user/contact/check/<user_uuid> /users/<user_uuid>/contact-checking
user.details /user/details/<user_uuid> /users/<user_uuid>
user.invite /user/invite /users/invitation
user.list /user/list /users/
user.password_reset /user/auth/password/reset/<user_uuid> /users/<user_uuid>/auth/password/reset
user.pick /user/pick /users/pick
user.totp_reset /user/auth/totp/reset/<user_uuid> /users/<user_uuid>/auth/totp/reset
Edited by ornanovitch
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information