over naar uuids, policies, predefined mutations aan kunnen passen
linter / quality (push) Failing after 1m5s
tests / ci (8.4) (push) Failing after 1m7s
tests / ci (8.5) (push) Failing after 1m5s
tests / ci (8.3) (push) Failing after 12m5s

This commit is contained in:
Daan Meijer
2026-06-21 23:09:38 +02:00
parent 06e5600447
commit 1e0782385b
46 changed files with 1287 additions and 160 deletions
+16 -29
View File
@@ -73,25 +73,15 @@ class ActivityService
/**
* Retrieve all activities for a given entity.
*/
public function getActivitiesForEntity($entity): array
public function getActivitiesForDynamic(Dynamic $dynamic): array
{
if ($entity instanceof Dynamic) {
$chatId = $entity->chat->id;
$dynamic = $entity;
} elseif ($entity instanceof Ledger) {
$dynamic = $entity->dynamic;
$chatId = $dynamic->chat->id;
} else {
return [];
}
$participants = $dynamic->participants()->withPivot('display_name')->get();
$participantsMap = $participants->reduce(function ($acc, $p) {
$acc[$p->id] = $p->pivot->display_name ?? $p->name;
return $acc;
}, []);
$messages = Message::where('chat_id', $chatId)
$messages = Message::where('chat_id', $dynamic->chat->id)
->with(['user', 'subject'])
->latest()
->get();
@@ -113,27 +103,25 @@ class ActivityService
/**
* Get unread activities grouped by active entities (Dynamics, Ledgers) for the given user.
*/
public function getUnreadEntitiesGrouped(User $user): array
public function getUnreadDynamicsGrouped(User $user): array
{
$groupedEntities = [];
$groupedDynamics = [];
$participatingDynamics = $user->dynamics()->with('ledgers')->get();
$entities = $participatingDynamics->concat($participatingDynamics->flatMap(fn ($d) => $d->ledgers));
foreach ($participatingDynamics as $dynamic) {
$readAt = $this->getCursorReadAt($user, $dynamic);
$activities = $this->getActivitiesForDynamic($dynamic);
foreach ($entities as $entity) {
$readAt = $this->getCursorReadAt($user, $entity);
$activities = $this->getActivitiesForEntity($entity);
$this->partitionActivities($activities, $readAt, $entity, get_class($entity), $this->getUrlForEntity($entity), $groupedEntities);
$this->partitionAndGroupActivities($activities, $readAt, $dynamic, $groupedDynamics);
}
return $groupedEntities;
return $groupedDynamics;
}
/**
* Partition activities into read and unread, and construct the grouped entity metadata.
*/
private function partitionActivities(array $activities, \Carbon\CarbonInterface $readAt, $entity, string $type, string $url, array &$groupedEntities): void
private function partitionAndGroupActivities(array $activities, \Carbon\CarbonInterface $readAt, Dynamic $dynamic, array &$groupedDynamics): void
{
$alreadyRead = [];
$unread = [];
@@ -149,11 +137,10 @@ class ActivityService
if (!empty($unread)) {
$context = array_slice($alreadyRead, 0, 2);
$groupedEntities[] = [
'id' => $entity->id,
'name' => $entity->name,
'type' => Str::afterLast($type, '\\'),
'url' => $url,
$groupedDynamics[] = [
'id' => $dynamic->id,
'name' => $dynamic->name,
'url' => route('dynamics.show', $dynamic->uuid),
'unread_count' => count($unread),
'context_activities' => $context,
'new_activities' => array_reverse($unread),
@@ -164,11 +151,11 @@ class ActivityService
private function getUrlForEntity($entity): string
{
if ($entity instanceof Dynamic) {
return route('dynamics.show', $entity->id);
return route('dynamics.show', $entity->uuid);
}
if ($entity instanceof Ledger) {
return route('dynamics.ledgers.show', [$entity->dynamic_id, $entity->id]);
return route('dynamics.ledgers.show', [$entity->dynamic->uuid, $entity->uuid]);
}
return '';