Skip to content

Organisation des dossiers ​

Chaque dossier a un rôle précis. Quand tu cherches quelque chose, demande-toi d'abord : est-ce une règle du métier, ou une question d'HTTP ? La réponse te dit dans quelle moitié chercher.

L'arborescence ​

timemanager-api/
├── config/                    la configuration, par environnement
├── lib/
│   ├── timemanager/           LE MÉTIER : les règles, la base de données
│   └── timemanager_web/       LE WEB : HTTP, JSON, sessions, documentation
├── priv/
│   ├── repo/migrations/       la structure des tables, migration par migration
│   ├── repo/seeds.exs         le premier General Manager
│   ├── repo/demo_seeds.exs    les données de démonstration
│   └── gettext/               les traductions des e-mails et notifications (fr, en)
├── test/                      les tests, rangés comme lib/
└── mix.exs                    le projet : dépendances et alias (mix setup…)

lib/timemanager/ : le métier ​

Un contexte (un fichier à la racine) et, à côté, un dossier du même nom pour ses schémas (les tables) :

ContexteSes schémasRôle
accounts.exaccounts/user.ex, password_token.ex, user_notifier.ex, email_layout.excomptes, mots de passe, liens envoyés par e-mail et leur mise en page
auth/sessions.ex, token.ex, refresh_token.exles sessions : jeton d'accès (JWT) et jeton de rafraîchissement
authorization.exle seul endroit où les droits sont décidés
clocks.exclocks/clock.exles pointages d'arrivée et de départ
device_actions.exce qu'un téléphone peut envoyer (action, identifiant, heure)
workingtime.exworkingtime/time_tracking.ex, break.ex, working_time_change.exles journées, les pauses, l'historique des modifications
teams.exteams/team.ex, team_member.exles équipes et leurs membres
corrections.excorrections/correction_request.exles demandes de correction
absences.exabsences/absence.exles jours d'absence
week_validations.exweek_validations/week_validation.exles semaines validées par un manager
notifications.exnotifications/notification.ex, text.exla cloche, et la phrase de chaque notification
reports.exles totaux et les moyennes
personal_data.exla copie de « Mes données »
localized_dates.exles dates écrites en français ou en anglais
repo.ex, mailer.ex, application.ex, release.exla connexion à la base, l'envoi d'e-mails, le démarrage, les migrations en production

lib/timemanager_web/ : le web ​

Fichier ou dossierRôle
endpoint.exla porte d'entrée : ce que chaque requête traverse
router.exl'aiguillage : chaque adresse et son contrôleur
plugs/authenticate.exqui appelle ? (cookie + CSRF pour le web, Bearer pour le mobile)
plugs/cors.exquels sites ont le droit d'appeler l'API depuis un navigateur
session_cookies.expose et efface les cookies de session du web
params.exlit un identifiant venu de l'adresse ("5" → 5)
controllers/*_controller.exun contrôleur par ressource : ClockController, UserController…
controllers/*_json.exla vue JSON de chaque ressource : les champs envoyés, ni plus ni moins
controllers/fallback_controller.extoute erreur devient une réponse JSON avec un code stable
controllers/changeset_json.exla forme des erreurs 422 (errors et details)
api_docs/la description Swagger, à part des contrôleurs : schemas/, paths/, api_spec.ex
gettext.exles traductions

config/ : la configuration ​

FichierQuand il est lu
config.exstoujours : les réglages communs (fuseau de la mairie, Europe/Paris)
dev.exs, test.exs, prod.exsselon l'environnement (MIX_ENV)
runtime.exsau démarrage, en production : lit les variables d'environnement (base, secrets, e-mails)

Pourquoi runtime.exs ?

Les autres fichiers sont lus à la compilation : l'image Docker serait figée avec les valeurs du moment. runtime.exs est lu au démarrage du serveur, ce qui permet de garder les secrets hors de l'image et de les fournir par l'environnement. La liste des variables est dans Docker et images.

test/ : les tests ​

Les tests suivent la même coupure que lib/ :

DossierCe qu'on y teste
test/timemanager/le métier, en appelant directement les contextes (clocks_test.exs, week_lock_test.exs…)
test/timemanager_web/les routes, avec de vraies requêtes HTTP (clock_controller_test.exs, api_docs_test.exs…)
test/support/les outils : conn_case.ex (requêtes connectées), data_case.ex (base), fixtures/ (fabriquer un compte, une équipe…)