Consigne : scheduling, rendez-vous
Vous construisez la moitié du contexte délimité scheduling (le cœur). Nom du worker :
scheduling-appointment. Un autre worker, scheduling-calendar, construit l'autre moitié dans
le même dossier au même moment.
Périmètre
- Vous possédez : l'agrégat
Appointmentavec ses objets-valeurs, son repository, son builder et sa table ; le service du domaineScheduler; les deux politiques du préavis du patient ; les commandes, requêtes et routes des lignes 22 à 27 et 30 ; la projection de l'agenda ; la gateway vers l'annuaire des personnes ; l'implémentation d'AppointmentExportContract; la méthode des rendez-vous du portSchedulingRelationships(ligne 21 :scheduling-calendarcrée le port et son adaptateur, vous ajoutez la vôtre ; s'il n'existe pas encore quand vous en avez besoin, créez-le avec le générateur et ne leur dites rien : ils le liront). - Vous ne touchez pas :
Calendar,Waitlist, leurs objets-valeurs, la projection des praticiens. Fichiers partagés du contexte (scheduling.permissions.ts,create-scheduling-tables.schema.ts,scheduling.schema.ts,scheduling.routes.ts,CONTEXT.md) : les générateurs les écrivent ; quand vous en modifiez un à la main, relisez-le juste avant et ne changez que vos lignes. - Générateurs que vous pouvez lancer : value-object, entity, domain-event, error, domain-service, command, query, route, port, adapter, event-handler, builder, e2e.
La jonction avec scheduling-calendar, fixée : générez l'objet-valeur Slot EN PREMIER
(Slot.between(startsAt, endsAt, heldUntil) : début, fin du rendez-vous, fin de ce qu'il occupe
avec le battement ; overlaps(other) compare ce qui est occupé). Ils fournissent sur Calendar :
slotFor(appointmentTypeId, startsAt, now): Slot (lève les erreurs de disponibilité de la règle
22), confirmationDeadlineFor(appointmentTypeId, now): Date | undefined, et les accesseurs
practiceId, practitionerId, limit, timeZone.dayOf(instant). Construisez d'abord la vie d'un
rendez-vous (elle n'a besoin que de Slot), puis la réservation et le déplacement une fois que
Calendar.slotFor existe. Ils ont besoin de vous, pour la liste d'attente : une fabrique (factory)
qui donne un rendez-vous demandé avec une échéance.
Tranches, dans cet ordre : l'agrégat avec toute sa vie (lignes 22, 24, 25 au niveau du domaine),
22, 23, 21 (partie rendez-vous), 24, 25, 26, 27, 30. La ligne 23 est tout l'intérêt de l'exemple :
une contrainte d'exclusion de PostgreSQL sur le calendrier et l'intervalle occupé des rendez-vous
actifs (l'extension btree_gist ; le worker de la plateforme la charge dans le PostgreSQL en
processus des tests), l'adaptateur qui traduit cette violation en l'erreur du domaine
SLOT_TAKEN, la route qui répond 409, et une spec d'intégration qui envoie deux réservations
d'un même créneau à la fois et en voit exactement une gagner. Avec DATABASE_URL défini, les
specs tournent sur un vrai serveur, où les deux transactions sont vraiment concurrentes ; en
processus, elles sont sérialisées par la session unique : écrivez la spec de sorte qu'elle soit
vraie dans les deux cas. Lisez /home/gbourgeat/ddd-ts-kit/packages/redis/README.md sur la raison
pour laquelle le verrou n'est pas la garde, et dites-le dans un commentaire là où la contrainte est
déclarée. Les projections n'ont pas de générateur : écrivez
application/projections/<name>.projection.ts d'après le README de @ddd-ts-kit/kernel
(« Projections », « Criteria », « Hydration ») et de @ddd-ts-kit/knex (« Read models »,
« Criteria »), et rapportez ce qu'en dit le checker. Les listes prennent les critères du kit
(filter[...], sort) et le périmètre d'accès, comme le montrent ces README ;
generate query --search écrit une forme plus simple : adaptez-la et rapportez ce que vous avez dû
changer.
Terminé quand : vos lignes sont construites et testées, aucun marqueur ne reste dans vos fichiers,
eslint, vitest et check sont propres sur vos fichiers. Suivez docs/architecture/briefings/README.md
pour les règles communes et le rapport.