Aller au contenu

tilttek/activity-bundle

✅ publié

L'activité des membres d'une application Symfony, enregistrée une seule fois dans la base de données, pour que chaque récompense la lise.

tilttek/activity-bundle intègre tilttek/activity à Symfony. Il garde le journal et les points de reprise des projections dans deux tables sur une connexion Doctrine DBAL. Il les ajoute au schéma que génère l'ORM, pour que les migrations de l'application les créent. Il écrit chaque activité une seule fois par clé d'idempotence, même quand deux processus l'enregistrent au même moment. Il construit le Journal avec l'horloge et les verbes déclarés de l'application, et trouve les projections et les observateurs par les interfaces qu'ils implémentent. Il tient les projections à jour à mesure que le journal s'écrit — dans la requête, ou hors de celle-ci par Symfony Messenger — ou par une commande. Il reconstruit une projection après le changement d'une règle, et répond aux demandes d'export et d'effacement de phil/privacy-bundle pour l'activité d'un membre. Il n'attribue rien de lui-même : les paquets qui récompensent les gestes, et les projections propres à l'application, lisent le journal.

Il s'adresse à une application Symfony qui enregistre ce que font ses membres et le récompense par des points, des badges, des niveaux, des quêtes ou des classements, à partir d'un seul registre que l'on peut rejouer.

Il exige DependencyInjection et Config de Symfony, Doctrine DBAL, tilttek/activity, phil/resource et psr/clock. L'ORM, la Console, Messenger et phil/privacy-bundle sont facultatifs : l'écouteur du schéma, les commandes, les messages des projections et le module de vie privée ne sont enregistrés que s'ils sont installés.

La conception suit celle des autres bundles du monodépôt : un AbstractBundle avec sa configuration, des services déclarés par ActivityServices, un stockage DBAL et un stockage en mémoire pour les tests, des tables ajoutées par un écouteur du schéma.

État

PartieÉtat
Configuration tilttek_activity : stockage, connexion, verbes, taille des lots, façon dont les projections suivent le journal, sorte de membreImplémenté et testé
DbalActivityLog et DbalCheckpoints, avec les tables tilttek_activity_entry et tilttek_activity_checkpointImplémenté et testé
Les tables dans le schéma que génère l'ORM, pour les migrationsImplémenté et testé
Projections et observateurs configurés automatiquement ; projections en directImplémenté et testé
Projections par Messenger : un message par projection et par entrée, le journal comme boîte d'envoi, les points de reprise comme boîte de réceptionImplémenté et testé
Commandes tilttek:activity:catch-up, tilttek:activity:rebuild, tilttek:activity:statusImplémenté et testé
Export et effacement d'un membre pour phil/privacy-bundleImplémenté et testé

Documentation

DocumentCe qu'il couvre
InstallationLes prérequis, l'activation du bundle, la migration.
ConfigurationChaque clé de tilttek_activity, avec sa valeur par défaut.
Le journal dans la base de donnéesLes deux tables, l'insertion idempotente selon la plateforme, les dates, les positions.
Enregistrer l'activitéEnregistrer depuis un écouteur ou un handler, annuler, déclarer les verbes.
Projections et commandesÉcrire une projection, les projections en direct, les projections par Messenger, le rattrapage, la reconstruction et l'état.
Vie privéeL'export et l'effacement de l'activité d'un membre.
Points d'extensionLes interfaces et les étiquettes qu'implémente l'application.
ExceptionsCe que lève le bundle.
TestsLes tests du bundle, et comment tester une application qui enregistre de l'activité.
RéférenceChaque classe du bundle, avec son rôle.

Démarrage rapide

composer require tilttek/activity-bundle
# config/packages/tilttek_activity.yaml
tilttek_activity:
    verbs: ['news.commented', 'game.*', 'order.paid']
use Tilttek\Activity\Activity;
use Tilttek\Activity\Journal;

final readonly class OnCommentPosted
{
    public function __construct(private Journal $journal) {}

    public function __invoke(CommentPosted $event): void
    {
        $this->journal->record(Activity::of('comment:'.$event->id, 'member:'.$event->authorId, 'news.commented', $event->postedAt, 'news:'.$event->newsId));
    }
}

Ensuite, bin/console doctrine:migrations:diff écrit la migration des deux tables.

Prérequis

PHP 8.5 ou plus récent, Symfony 8.2, Doctrine DBAL 4.5.

Contribuer

Les contributions sont les bienvenues sur le monodépôt de PHIL : lisez le guide de contribution et le code de conduite. Signalez une vulnérabilité en privé, comme l'explique la politique de sécurité, jamais dans un ticket public.

Licence

MIT, © Philippe Gamache, doing business as Le Gnome Archiviste; a Tilttek project. Voir LICENSE.