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 |