src/EventsSubscriber/Analytics/PostHogEventSubscriber.php line 234

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\EventsSubscriber\Analytics;
  4. use App\Event\Activity\AcceptedEvent;
  5. use App\Event\Activity\ActivityActivatedEvent;
  6. use App\Event\Activity\ActivityBoostCodeReceived;
  7. use App\Event\Activity\ActivityBoostCodeRequested;
  8. use App\Event\Activity\ActivityDeclinedEvent;
  9. use App\Event\Activity\CreatorCampaignAppliedEvent;
  10. use App\Event\Activity\CreatorVideoSubmittedEvent;
  11. use App\Event\Activity\ApproveAllReviewEvent;
  12. use App\Event\Activity\DeclineAllReviewEvent;
  13. use App\Event\Activity\PersonalBonusAddedEvent;
  14. use App\Event\Activity\ReviewEvent;
  15. use App\Event\Campaign\ActivatedEvent;
  16. use App\Event\Campaign\CampaignBudgetIncreasedEvent;
  17. use App\Event\Campaign\CampaignCompletionStartedEvent;
  18. use App\Event\Campaign\CampaignDraftCreatedEvent;
  19. use App\Event\Campaign\CampaignPendingEvent;
  20. use App\Event\Campaign\RenewedCampaignEvent;
  21. use App\Entity\Administrator;
  22. use App\Entity\Creator;
  23. use App\Entity\Manager;
  24. use App\Entity\Sponsor;
  25. use App\Event\Creator\BannedEvent;
  26. use App\Event\Creator\CreatorReAuthRequiredEvent;
  27. use App\Event\Creator\CreatorTokenRefreshedEvent;
  28. use App\Event\Payment\CreatorPayoutFailedEvent;
  29. use App\Event\Payment\CreatorPayoutSucceededEvent;
  30. use App\Entity\Activity;
  31. use App\Messenger\Analytics\PostHogCaptureMessage;
  32. use App\Services\Analytics\PostHog\PostHogDistinctIdResolver;
  33. use App\Services\Analytics\PostHog\PostHogEventMapper;
  34. use App\Services\Analytics\PostHog\PostHogSessionResolver;
  35. use App\Services\Administrator\Event\AdministratorCreatedEvent;
  36. use App\Services\Manager\Event\ManagerCreatedEvent;
  37. use App\Services\Sponsor\Event\SponsorCreatedEvent;
  38. use App\Services\Sponsor\Event\SponsorLoggedInEvent;
  39. use App\Services\Sponsor\Event\SponsorLoggedOutEvent;
  40. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  41. use Symfony\Component\Messenger\MessageBusInterface;
  42. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  43. use Symfony\Component\Security\Http\Event\LoginSuccessEvent;
  44. use Symfony\Component\Security\Http\Event\LogoutEvent;
  45. final class PostHogEventSubscriber implements EventSubscriberInterface
  46. {
  47.     public function __construct(
  48.         private readonly MessageBusInterface $bus,
  49.         private readonly PostHogEventMapper $mapper,
  50.         private readonly PostHogDistinctIdResolver $distinctIdResolver,
  51.         private readonly PostHogSessionResolver $sessionResolver,
  52.     ) {
  53.     }
  54.     public static function getSubscribedEvents(): array
  55.     {
  56.         return [
  57.             AdministratorCreatedEvent::class => 'onAdministratorCreated',
  58.             ManagerCreatedEvent::class => 'onManagerCreated',
  59.             SponsorCreatedEvent::class => 'onSponsorCreated',
  60.             SponsorLoggedInEvent::class => 'onSponsorLoggedIn',
  61.             SponsorLoggedOutEvent::class => 'onSponsorLoggedOut',
  62.             LoginSuccessEvent::class => 'onLoginSuccess',
  63.             LogoutEvent::class => 'onLogout',
  64.             CampaignDraftCreatedEvent::class => 'onCampaignDraftCreated',
  65.             ActivatedEvent::class => 'onCampaignActivated',
  66.             CampaignPendingEvent::class => 'onCampaignPending',
  67.             AcceptedEvent::class => 'onSubmissionApproved',
  68.             ReviewEvent::class => 'onReview',
  69.             ApproveAllReviewEvent::class => 'onApproveAllReview',
  70.             DeclineAllReviewEvent::class => 'onDeclineAllReview',
  71.             ActivityActivatedEvent::class => 'onVideoApproved',
  72.             ActivityDeclinedEvent::class => 'onActivityDeclined',
  73.             BannedEvent::class => 'onCreatorBlocked',
  74.             ActivityBoostCodeRequested::class => 'onBoostRequested',
  75.             ActivityBoostCodeReceived::class => 'onCreatorBoostCodeAdded',
  76.             CreatorCampaignAppliedEvent::class => 'onCreatorCampaignApplied',
  77.             CreatorVideoSubmittedEvent::class => 'onCreatorVideoSubmitted',
  78.             CreatorPayoutSucceededEvent::class => 'onCreatorCashOutSucceeded',
  79.             CreatorPayoutFailedEvent::class => 'onCreatorCashOutFailed',
  80.             PersonalBonusAddedEvent::class => 'onBonusAdded',
  81.             CampaignCompletionStartedEvent::class => 'onCampaignCompletionStarted',
  82.             RenewedCampaignEvent::class => 'onCampaignRestarted',
  83.             CampaignBudgetIncreasedEvent::class => 'onCampaignBudgetIncreased',
  84.             CreatorReAuthRequiredEvent::class => 'onCreatorReAuthRequired',
  85.             CreatorTokenRefreshedEvent::class => 'onCreatorTokenRefreshed',
  86.         ];
  87.     }
  88.     public function onAdministratorCreated(AdministratorCreatedEvent $event): void
  89.     {
  90.         $administrator $event->getAdministrator();
  91.         $administratorId $administrator->getId();
  92.         if ($administratorId === null) {
  93.             return;
  94.         }
  95.         $this->dispatch($this->mapper->administratorCreated(
  96.             $administrator,
  97.             $this->distinctIdResolver->userDistinctId($administratorId),
  98.         ));
  99.     }
  100.     public function onManagerCreated(ManagerCreatedEvent $event): void
  101.     {
  102.         $manager $event->getManager();
  103.         $managerId $manager->getId();
  104.         if ($managerId === null) {
  105.             return;
  106.         }
  107.         $this->dispatch($this->mapper->managerCreated(
  108.             $manager,
  109.             $this->distinctIdResolver->userDistinctId($managerId),
  110.         ));
  111.     }
  112.     public function onSponsorCreated(SponsorCreatedEvent $event): void
  113.     {
  114.         $sponsor $event->getSponsor();
  115.         $sponsorId $sponsor->getId();
  116.         if ($sponsorId === null) {
  117.             return;
  118.         }
  119.         $this->dispatch($this->mapper->sponsorSignedUp(
  120.             $sponsor,
  121.             $this->distinctIdResolver->userDistinctId($sponsorId),
  122.             $event->getRegistrationChannel(),
  123.         ));
  124.     }
  125.     public function onSponsorLoggedIn(SponsorLoggedInEvent $event): void
  126.     {
  127.         $this->dispatchSponsorLoggedIn($event->getSponsor(), $event->getLoginChannel());
  128.     }
  129.     public function onSponsorLoggedOut(SponsorLoggedOutEvent $event): void
  130.     {
  131.         $this->dispatchSponsorLoggedOut($event->getSponsor(), $event->getLogoutChannel());
  132.     }
  133.     public function onLogout(LogoutEvent $event): void
  134.     {
  135.         $token $event->getToken();
  136.         $user $token?->getUser();
  137.         if ($user instanceof Sponsor) {
  138.             $this->dispatchSponsorLoggedOut($user$this->resolveLogoutChannel($token));
  139.             return;
  140.         }
  141.         if ($user instanceof Manager) {
  142.             $this->dispatchManagerLoggedOut($user$this->resolveLogoutChannel($token));
  143.             return;
  144.         }
  145.         if ($user instanceof Administrator) {
  146.             $this->dispatchAdministratorLoggedOut($user$this->resolveLogoutChannel($token));
  147.             return;
  148.         }
  149.         if ($user instanceof Creator) {
  150.             $this->dispatchCreatorLoggedOut($user$this->resolveLogoutChannel($token));
  151.         }
  152.     }
  153.     public function onLoginSuccess(LoginSuccessEvent $event): void
  154.     {
  155.         $user $event->getUser();
  156.         if ($user instanceof Sponsor) {
  157.             $loginChannel = match ($event->getFirewallName()) {
  158.                 'sponsor' => 'web',
  159.                 'sponsor_authentication' => 'api_legacy',
  160.                 'api_sponsor' => 'api',
  161.                 default => $event->getFirewallName(),
  162.             };
  163.             $this->dispatchSponsorLoggedIn($user$loginChannel);
  164.             return;
  165.         }
  166.         if ($user instanceof Manager) {
  167.             $loginChannel = match ($event->getFirewallName()) {
  168.                 'manager' => 'web',
  169.                 default => $event->getFirewallName(),
  170.             };
  171.             $this->dispatchManagerLoggedIn($user$loginChannel);
  172.             return;
  173.         }
  174.         if ($user instanceof Administrator) {
  175.             $loginChannel = match ($event->getFirewallName()) {
  176.                 'backend' => 'web',
  177.                 default => $event->getFirewallName(),
  178.             };
  179.             $this->dispatchAdministratorLoggedIn($user$loginChannel);
  180.             return;
  181.         }
  182.         if ($user instanceof Creator) {
  183.             $loginChannel = match ($event->getFirewallName()) {
  184.                 'creator' => 'web',
  185.                 'api_creator''api_creator_front' => 'api',
  186.                 default => $event->getFirewallName(),
  187.             };
  188.             $this->dispatchCreatorLoggedIn($user$loginChannel);
  189.         }
  190.     }
  191.     public function onCampaignDraftCreated(CampaignDraftCreatedEvent $event): void
  192.     {
  193.         $campaign $event->getCampaign();
  194.         $this->dispatch($this->mapper->campaignDraftCreated(
  195.             $campaign,
  196.             $event->hasFullAccess(),
  197.             $event->getManagerId(),
  198.             $this->distinctIdResolver->forActor($campaign->getSponsor()->getId()),
  199.         ));
  200.     }
  201.     public function onCampaignActivated(ActivatedEvent $event): void
  202.     {
  203.         $campaign $event->getCampaign();
  204.         $this->dispatch($this->mapper->campaignLaunched(
  205.             $campaign,
  206.             'active',
  207.             $this->distinctIdResolver->forActor($campaign->getSponsor()->getId()),
  208.         ));
  209.     }
  210.     public function onCampaignPending(CampaignPendingEvent $event): void
  211.     {
  212.         $campaign $event->getCampaign();
  213.         $this->dispatch($this->mapper->campaignLaunched(
  214.             $campaign,
  215.             'pending',
  216.             $this->distinctIdResolver->forActor($campaign->getSponsor()->getId()),
  217.         ));
  218.     }
  219.     public function onSubmissionApproved(AcceptedEvent $event): void
  220.     {
  221.         $activity $event->getActivity();
  222.         $this->dispatch($this->mapper->submissionApproved(
  223.             $activity,
  224.             $this->distinctIdResolver->forActor($activity->getCampaign()->getSponsor()->getId()),
  225.         ));
  226.     }
  227.     public function onReview(ReviewEvent $event): void
  228.     {
  229.         $activity $event->getActivity();
  230.         if (!$this->mapper->isSubmissionDeclineReviewEvent($activity)) {
  231.             return;
  232.         }
  233.         $this->dispatch($this->mapper->submissionDeclined(
  234.             $activity,
  235.             $this->distinctIdResolver->forActor($activity->getCampaign()->getSponsor()->getId()),
  236.         ));
  237.     }
  238.     public function onApproveAllReview(ApproveAllReviewEvent $event): void
  239.     {
  240.         $campaign $event->getCampaign();
  241.         $this->dispatch($this->mapper->submissionApprovedAll(
  242.             $campaign,
  243.             $this->distinctIdResolver->systemDistinctId((int) $campaign->getSponsor()->getId()),
  244.         ));
  245.     }
  246.     public function onDeclineAllReview(DeclineAllReviewEvent $event): void
  247.     {
  248.         $campaign $event->getCampaign();
  249.         $this->dispatch($this->mapper->submissionDeclinedAll(
  250.             $campaign,
  251.             $event->getReason(),
  252.             $this->distinctIdResolver->systemDistinctId((int) $campaign->getSponsor()->getId()),
  253.         ));
  254.     }
  255.     public function onVideoApproved(ActivityActivatedEvent $event): void
  256.     {
  257.         $activity $event->getActivity();
  258.         $this->dispatch($this->mapper->videoApproved(
  259.             $activity,
  260.             $this->distinctIdResolver->forActor($activity->getCampaign()->getSponsor()->getId()),
  261.         ));
  262.     }
  263.     public function onActivityDeclined(ActivityDeclinedEvent $event): void
  264.     {
  265.         $activity $event->getActivity();
  266.         $distinctId $this->distinctIdResolver->forActor($activity->getCampaign()->getSponsor()->getId());
  267.         if ($event->getDeclineContext() === ActivityDeclinedEvent::CONTEXT_VIDEO) {
  268.             $this->dispatch($this->mapper->videoDeclined($activity$distinctId));
  269.             return;
  270.         }
  271.         $this->dispatch($this->mapper->submissionDeclined($activity$distinctId));
  272.     }
  273.     public function onCreatorBlocked(BannedEvent $event): void
  274.     {
  275.         $creator $event->getCreator();
  276.         $sponsorId $this->resolveSponsorIdForBlock();
  277.         if ($sponsorId === null) {
  278.             return;
  279.         }
  280.         $this->dispatch($this->mapper->creatorBlocked(
  281.             $creator,
  282.             $sponsorId,
  283.             $this->distinctIdResolver->forActor($sponsorId),
  284.             $creator->getBlockedUntil(),
  285.         ));
  286.     }
  287.     public function onBoostRequested(ActivityBoostCodeRequested $event): void
  288.     {
  289.         $activity $event->getActivity();
  290.         $this->dispatch($this->mapper->creatorBoostRequested(
  291.             $activity,
  292.             $this->distinctIdResolver->forActor($activity->getCampaign()->getSponsor()->getId()),
  293.         ));
  294.     }
  295.     public function onCreatorBoostCodeAdded(ActivityBoostCodeReceived $event): void
  296.     {
  297.         $activity $event->getActivity();
  298.         $this->dispatchCreatorActivityEvent($activity, fn (string $distinctId, ?Creator $identifyCreator) => $this->mapper->creatorBoostCodeAdded(
  299.             $activity,
  300.             $distinctId,
  301.             $identifyCreator,
  302.         ));
  303.     }
  304.     public function onCreatorCampaignApplied(CreatorCampaignAppliedEvent $event): void
  305.     {
  306.         $activity $event->getActivity();
  307.         $this->dispatchCreatorActivityEvent($activity, fn (string $distinctId, ?Creator $identifyCreator) => $this->mapper->creatorCampaignApplied(
  308.             $activity,
  309.             $event->isAutoAccepted(),
  310.             $distinctId,
  311.             $identifyCreator,
  312.         ));
  313.     }
  314.     public function onCreatorVideoSubmitted(CreatorVideoSubmittedEvent $event): void
  315.     {
  316.         $activity $event->getActivity();
  317.         $this->dispatchCreatorActivityEvent($activity, fn (string $distinctId, ?Creator $identifyCreator) => $this->mapper->creatorVideoSubmitted(
  318.             $activity,
  319.             $event->getSubmissionPath(),
  320.             $distinctId,
  321.             $identifyCreator,
  322.         ));
  323.     }
  324.     public function onCreatorCashOutSucceeded(CreatorPayoutSucceededEvent $event): void
  325.     {
  326.         $creator $event->getCreator();
  327.         if ($creator->getId() === null) {
  328.             return;
  329.         }
  330.         $identifyCreator $this->distinctIdResolver->resolveCreatorForCurrentActor($creator);
  331.         $distinctId $this->distinctIdResolver->resolveCreatorDistinctIdForCurrentActor($creator);
  332.         if ($distinctId === null) {
  333.             return;
  334.         }
  335.         $this->dispatch($this->mapper->creatorCashOutSucceeded(
  336.             $creator,
  337.             $event->getAmount(),
  338.             $event->getPaymentSystem(),
  339.             $event->getChannel(),
  340.             $distinctId,
  341.             $identifyCreator,
  342.         ));
  343.     }
  344.     public function onCreatorCashOutFailed(CreatorPayoutFailedEvent $event): void
  345.     {
  346.         $creator $event->getCreator();
  347.         if ($creator->getId() === null) {
  348.             return;
  349.         }
  350.         $identifyCreator $this->distinctIdResolver->resolveCreatorForCurrentActor($creator);
  351.         $distinctId $this->distinctIdResolver->resolveCreatorDistinctIdForCurrentActor($creator);
  352.         if ($distinctId === null) {
  353.             return;
  354.         }
  355.         $this->dispatch($this->mapper->creatorCashOutFailed(
  356.             $creator,
  357.             $event->getPaymentSystem(),
  358.             $event->getChannel(),
  359.             $event->getFailureReason(),
  360.             $distinctId,
  361.             $event->getAmount(),
  362.             $identifyCreator,
  363.         ));
  364.     }
  365.     public function onBonusAdded(PersonalBonusAddedEvent $event): void
  366.     {
  367.         $activity $event->getActivity();
  368.         $this->dispatch($this->mapper->bonusAdded(
  369.             $activity,
  370.             $event->getAmount(),
  371.             $this->distinctIdResolver->forActor($activity->getCampaign()->getSponsor()->getId()),
  372.         ));
  373.     }
  374.     public function onCampaignCompletionStarted(CampaignCompletionStartedEvent $event): void
  375.     {
  376.         $campaign $event->getCampaign();
  377.         $this->dispatch($this->mapper->campaignCompletionStarted(
  378.             $campaign,
  379.             $event->shouldNotifySponsor(),
  380.             $this->distinctIdResolver->forActor($campaign->getSponsor()->getId()),
  381.         ));
  382.     }
  383.     public function onCampaignRestarted(RenewedCampaignEvent $event): void
  384.     {
  385.         $campaign $event->getCampaign();
  386.         $this->dispatch($this->mapper->campaignRestarted(
  387.             $campaign,
  388.             $this->distinctIdResolver->forActor($campaign->getSponsor()->getId()),
  389.             $campaign->getAmount(),
  390.             $campaign->getDeadlineAt(),
  391.         ));
  392.     }
  393.     public function onCampaignBudgetIncreased(CampaignBudgetIncreasedEvent $event): void
  394.     {
  395.         $campaign $event->getCampaign();
  396.         $this->dispatch($this->mapper->campaignBudgetIncreased(
  397.             $campaign,
  398.             $event->getAmount(),
  399.             $this->distinctIdResolver->forActor($campaign->getSponsor()->getId()),
  400.         ));
  401.     }
  402.     public function onCreatorReAuthRequired(CreatorReAuthRequiredEvent $event): void
  403.     {
  404.         $this->dispatchCreatorProfileEvent(
  405.             $event->getCreator(),
  406.             fn (string $distinctIdCreator $creator) => $this->mapper->creatorReAuthRequired(
  407.                 $creator,
  408.                 $distinctId,
  409.                 $event->getPlatform(),
  410.             ),
  411.         );
  412.     }
  413.     public function onCreatorTokenRefreshed(CreatorTokenRefreshedEvent $event): void
  414.     {
  415.         $this->dispatchCreatorProfileEvent(
  416.             $event->getCreator(),
  417.             fn (string $distinctIdCreator $creator) => $this->mapper->creatorTokenRefreshed(
  418.                 $creator,
  419.                 $distinctId,
  420.                 $event->getPlatform(),
  421.             ),
  422.         );
  423.     }
  424.     private function dispatch(PostHogCaptureMessage $message): void
  425.     {
  426.         $this->bus->dispatch(new PostHogCaptureMessage(
  427.             event$message->getEvent(),
  428.             distinctId$message->getDistinctId(),
  429.             properties$message->getProperties(),
  430.             identifyProperties$message->getIdentifyProperties(),
  431.             sessionId$this->sessionResolver->resolveSessionId(),
  432.         ));
  433.     }
  434.     private function dispatchSponsorLoggedIn(Sponsor $sponsorstring $loginChannel): void
  435.     {
  436.         $sponsorId $sponsor->getId();
  437.         if ($sponsorId === null) {
  438.             return;
  439.         }
  440.         $this->dispatch($this->mapper->sponsorLoggedIn(
  441.             $sponsor,
  442.             $this->distinctIdResolver->userDistinctId($sponsorId),
  443.             $loginChannel,
  444.         ));
  445.     }
  446.     private function dispatchSponsorLoggedOut(Sponsor $sponsorstring $logoutChannel): void
  447.     {
  448.         $sponsorId $sponsor->getId();
  449.         if ($sponsorId === null) {
  450.             return;
  451.         }
  452.         $this->dispatch($this->mapper->sponsorLoggedOut(
  453.             $sponsor,
  454.             $this->distinctIdResolver->userDistinctId($sponsorId),
  455.             $logoutChannel,
  456.         ));
  457.     }
  458.     private function dispatchManagerLoggedIn(Manager $managerstring $loginChannel): void
  459.     {
  460.         $managerId $manager->getId();
  461.         if ($managerId === null) {
  462.             return;
  463.         }
  464.         $this->dispatch($this->mapper->managerLoggedIn(
  465.             $manager,
  466.             $this->distinctIdResolver->userDistinctId($managerId),
  467.             $loginChannel,
  468.         ));
  469.     }
  470.     private function dispatchManagerLoggedOut(Manager $managerstring $logoutChannel): void
  471.     {
  472.         $managerId $manager->getId();
  473.         if ($managerId === null) {
  474.             return;
  475.         }
  476.         $this->dispatch($this->mapper->managerLoggedOut(
  477.             $manager,
  478.             $this->distinctIdResolver->userDistinctId($managerId),
  479.             $logoutChannel,
  480.         ));
  481.     }
  482.     private function dispatchAdministratorLoggedIn(Administrator $administratorstring $loginChannel): void
  483.     {
  484.         $administratorId $administrator->getId();
  485.         if ($administratorId === null) {
  486.             return;
  487.         }
  488.         $this->dispatch($this->mapper->administratorLoggedIn(
  489.             $administrator,
  490.             $this->distinctIdResolver->userDistinctId($administratorId),
  491.             $loginChannel,
  492.         ));
  493.     }
  494.     private function dispatchAdministratorLoggedOut(Administrator $administratorstring $logoutChannel): void
  495.     {
  496.         $administratorId $administrator->getId();
  497.         if ($administratorId === null) {
  498.             return;
  499.         }
  500.         $this->dispatch($this->mapper->administratorLoggedOut(
  501.             $administrator,
  502.             $this->distinctIdResolver->userDistinctId($administratorId),
  503.             $logoutChannel,
  504.         ));
  505.     }
  506.     private function dispatchCreatorLoggedIn(Creator $creatorstring $loginChannel): void
  507.     {
  508.         $distinctId $this->distinctIdResolver->resolveCreatorDistinctIdForCurrentActor($creator);
  509.         if ($distinctId === null) {
  510.             return;
  511.         }
  512.         $this->dispatch($this->mapper->creatorLoggedIn(
  513.             $creator,
  514.             $distinctId,
  515.             $loginChannel,
  516.         ));
  517.     }
  518.     private function dispatchCreatorLoggedOut(Creator $creatorstring $logoutChannel): void
  519.     {
  520.         $distinctId $this->distinctIdResolver->resolveCreatorDistinctIdForCurrentActor($creator);
  521.         if ($distinctId === null) {
  522.             return;
  523.         }
  524.         $this->dispatch($this->mapper->creatorLoggedOut(
  525.             $creator,
  526.             $distinctId,
  527.             $logoutChannel,
  528.         ));
  529.     }
  530.     private function resolveLogoutChannel(?TokenInterface $token): string
  531.     {
  532.         if ($token === null || !method_exists($token'getFirewallName')) {
  533.             return 'unknown';
  534.         }
  535.         return match ($token->getFirewallName()) {
  536.             'sponsor' => 'web',
  537.             'sponsor_authentication' => 'api_legacy',
  538.             'api_sponsor' => 'api',
  539.             'manager' => 'web',
  540.             'backend' => 'web',
  541.             'creator' => 'web',
  542.             default => $token->getFirewallName(),
  543.         };
  544.     }
  545.     private function resolveSponsorIdForBlock(): ?int
  546.     {
  547.         return $this->distinctIdResolver->resolveSponsorIdForCurrentActor();
  548.     }
  549.     /**
  550.      * @param callable(string, Creator): PostHogCaptureMessage $buildMessage
  551.      */
  552.     private function dispatchCreatorProfileEvent(Creator $profileCreator, callable $buildMessage): void
  553.     {
  554.         if ($profileCreator->getId() === null) {
  555.             return;
  556.         }
  557.         $this->dispatch($buildMessage(
  558.             $this->distinctIdResolver->creatorDistinctId($profileCreator),
  559.             $profileCreator,
  560.         ));
  561.     }
  562.     /**
  563.      * @param callable(string, ?Creator): PostHogCaptureMessage $buildMessage
  564.      */
  565.     private function dispatchCreatorActivityEvent(Activity $activity, callable $buildMessage): bool
  566.     {
  567.         $profileCreator $activity->getCreator();
  568.         $distinctId $this->distinctIdResolver->resolveCreatorDistinctIdForCurrentActor($profileCreator);
  569.         if ($distinctId === null) {
  570.             return false;
  571.         }
  572.         $identifyCreator $this->distinctIdResolver->resolveCreatorForCurrentActor($profileCreator);
  573.         $this->dispatch($buildMessage($distinctId$identifyCreator));
  574.         return true;
  575.     }
  576. }