L'infrastructure avant les fonctionnalités : construire d'abord les bonnes choses

DEV - 06/02
Dans mon premier article lié à ce projet, je venais de terminer la couche fondamentale : l'authentification,...

Dans mon premier article lié à ce projet, je venais de terminer la couche fondamentale : authentification, mots de passe, 2FA, sessions, facturation et gestion des comptes. J'ai dit que j'étais sur le point de commencer par les fonctionnalités réelles du produit.

Trois semaines et 47 commits plus tard, j'ai construit plus que ce à quoi je m'attendais, mais pas tout à fait ce que j'avais prédit. Je pensais que j'en serais déjà aux genoux pour nourrir des bûches. Au lieu de cela, j'ai fini par créer une partie de l'infrastructure de support dont dépendront les principales fonctionnalités de suivi : un système de contacts, un moteur complet d'importation/exportation de données, un système de tickets d'assistance avec intégration de courrier électronique, un système de notes polymorphes, un panneau d'administration, des préférences utilisateur avec prise en charge des fuseaux horaires et une documentation complète dans l'application. Voici où en sont les choses.

Le modèle de données

Avant de créer une interface utilisateur, j'ai défini les modèles de domaine pour le produit principal. LeAnimalle modèle est la pièce maîtresse. A titre d'idée vous pouvez voir le moulage sur le modèle Animal : (certains moulages ont été omis par souci de concision)

final class Animal extends Model Implements HasNotes { protected $casts = [ // ... 'nickname' => 'string', 'common_name' => 'string', 'genus' => 'string', 'species' => 'string', 'sex' => AnimalSexEnum::class, 'life_stage' => AnimalLifeStageEnum::class, 'status' => AnimalStatusEnum::class, 'born_at' => 'immutable_datetime', 'acquired_at' => 'immutable_datetime', 'acquisition_source' => 'string', 'acquisition_contact_id' => 'string', 'enclosure_id' => 'string', 'location' => 'string', 'is_colony' => 'boolean', 'population_estimate' => 'entier', 'feeding_interval_days' => 'entier', 'is_premolt' => 'boolean', // ... ]; }
Entrer en mode plein écran Quitter le mode plein écran

Remarque : Oui, je convertis toutes les propriétés du modèle, même les chaînes, pour garantir qu'elles sont stockées et gérées correctement quel que soit le type de base de données sous-jacente.

Les champs reflètent ce dont les gardiens amateurs ont réellement besoin. Il existe quatre façons d’identifier un animal :surnom,nom_commun,genreetespèces. Tous les quatre sont nullables car différents gardiens fonctionnent différemment. Certaines personnes donnent un nom à chaque tarentule. Certains ne se soucient que du binôme latin. Certains ont "cette fronde de l'expo" et ne connaîtront l'espèce qu'après la prochaine mue. Le modèle n'impose pas de convention. Vous utilisez la combinaison qui convient à chaque animal.

sexe,étape_de la vieetstatutsont soutenus par des énumérations et sont toujours définis.né_àetacquis_atsont des dates facultatives car vous ne saurez souvent pas exactement quand un animal est né, mais vous vous souviendrez généralement à peu près du moment où vous l'avez acquis.acquisition_sourceest un champ de texte libre pour un contexte tel que "Bristol Reptile Expo 2026", etacquisition_contact_iddes liens vers un enregistrement de contact facultatif pour la personne ou l’entreprise auprès de laquelle vous l’avez obtenu.boîtier_iddes liens vers l'endroit où vit actuellement l'animal, etemplacementest une solution de secours en texte libre pour les animaux qui ne sont pas affectés à un enclos suivi.

Leest_coloniedrapeau avecpopulation_estimategère les colonies d'isopodes et de collemboles où vous ne suivez pas les individus. Vous ne comptez pas les collemboles individuels. Vous savez simplement que vous en avez un pot et que la population est à peu près « nombreuse ».alimentation_intervalle_joursla valeur par défaut est 7 etis_premoltsignale les animaux qui doivent être ignorés au moment du repas, car offrir un grillon à une tarentule en prémue est un gaspillage d'un grillon et un stress pour l'araignée.

Les relations entre le contact d'acquisition et le boîtier ont déterminé l'ordre de construction de l'ensemble de l'application, sur lequel j' reviendrai sous peu.

Étapes de la vie

L’énumération des stades biologiques couvre toute la gamme du développement des invertébrés :

enum AnimalLifeStageEnum : int { case EGG = 1 ; // Cas de départ universel NAUPLIUS = 2; // Cas de la première forme larvaire (crustacés) LARVA = 3; // Cas des premiers stades mobiles (insectes) PUPA = 4 ; // Stade de transformation (suit la larve) cas SLING = 5 ; // Cas post-éclosion précoce (arachnides) NYMPH = 6 ; // Forme immature (métamorphose incomplète) cas JUVENILE = 7 ; // Cas du stade de croissance SUBADULT = 8; // Cas presque mature ADULTE = 9; // Pleine maturité }
Entrer en mode plein écran Quitter le mode plein écran

C’est délibérément large. Tous les animaux ne passeront pas par toutes les étapes, mais couvrir les nauplii pour les isopodes, les frondes pour les tarentules, les nymphes pour les mantes et les pupes pour les coléoptères signifie qu'une seule énumération gère le lot sans avoir besoin de logique par taxon. Une tarentule passe de l'œuf à la fronde, du juvénile au subadulte et à l'adulte. Un coléoptère passe de l'œuf à la larve, puis à la pupe et à l'adulte. L'interface utilisateur guidera les utilisateurs à travers les étapes qui ont du sens pour leur animal plutôt que d'afficher les neuf options à chaque fois.

Événements

Les événements animaliers retracent les moments clés de la vie d'un animal :

enum AnimalEventTypeEnum : int { case MOLTED = 1 ; cas STATUS_CHANGE = 2 ; cas LIFE_STAGE_CHANGE = 3 ; cas SEX_CHANGE = 4 ; }
Entrer en mode plein écran Quitter le mode plein écran

Chaque événement enregistre untaper, facultatifremarques, et unsurvenu_àhorodatage. Un événement de mue est le plus courant. Vous vérifiez votre tarentule et trouvez un exosquelette froissé dans le coin de l'enceinte. Vous voulez enregistrer ce qui s'est produit, à peu près au moment où cela s'est produit (vous ne l'avez peut-être pas remarqué pendant un jour ou deux), et peut-être noter qu'il est passé avec succès du 5e au 6e stade.

Le statut de l'animal couvre les résultats auxquels nous préférons ne pas penser mais que nous devons suivre : actif, décédé, vendu, relogé, évadé, prêté. « S'échapper » peut sembler dramatique, mais quiconque élève des invertébrés sait qu'une tar...
[Courte citation de 8% de l'article original]

Loading...