Skip to content

Commit de936c0

Browse files
committed
* now set $authorExpGrades & $forumModerators for each user per forum
* `$users` and its value in the returned array now has been keyed by its uid * fix `$uids` doesn't contain uid of latest repliers whose fields `name` & `displayName` is not null @ `App\Controller\PostsController::query()` * replace prop `$currentForumModerator` & `$currentAuthorExpGrade` and its g/setter with `$forumSpecific` to contains multiple of both them @ `App\DTO\User\User` @ be
1 parent 90c2128 commit de936c0

2 files changed

Lines changed: 36 additions & 31 deletions

File tree

be/src/Controller/PostsController.php

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use App\DTO\User\AuthorExpGrade;
66
use App\DTO\User\ForumModerator;
77
use App\DTO\User\User;
8+
use App\Entity\LatestReplier;
89
use App\Entity\Post\Post;
910
use App\Entity\Post\Thread;
1011
use App\PostsQuery\ParamsValidator;
@@ -65,26 +66,41 @@ public function query(Request $request): array
6566
$latestRepliers = $this->latestReplierRepository->getLatestRepliersWithoutNameWhenHasUid(
6667
$this->query->postsTree->threads->map(fn(Thread $thread) => $thread->getLatestReplierId()),
6768
);
68-
$uids = collect([$this->query->postsTree->threads, $this->query->postsTree->replies, $this->query->postsTree->subReplies])
69-
->flatMap(static fn(Collection $posts) =>
70-
$posts->map(fn(Post $post) => $post->getAuthorUid()))
71-
->concat($latestRepliers->pluck('uid')
72-
->filter(static fn(?int $uid) => $uid !== null))
69+
$posts = collect([
70+
$this->query->postsTree->threads,
71+
$this->query->postsTree->replies,
72+
$this->query->postsTree->subReplies
73+
])->flatten();
74+
$latestRepliersUidKeyById = $latestRepliers
75+
->mapWithKeys(fn(array|LatestReplier $latestReplier) => [
76+
is_array($latestReplier) ? $latestReplier['id'] : $latestReplier->getId() =>
77+
is_array($latestReplier) ? $latestReplier['uid'] : $latestReplier->getUid()
78+
])
79+
->filter(static fn(?int $uid) => $uid !== null);
80+
$uids = $posts
81+
->map(fn(Post $post) => $post->getAuthorUid())
82+
->concat($latestRepliersUidKeyById)
7383
->unique();
7484
$users = collect($this->userRepository->getUsers($uids))
75-
->map(fn(\App\Entity\User $entity) => User::fromEntity($entity));
85+
->mapWithKeys(fn(\App\Entity\User $entity) => [$entity->getUid() => User::fromEntity($entity)]);
7686
$this->stopwatch->stop('queryUsers');
7787

7888
$this->stopwatch->start('queryUserRelated');
79-
$fid = $this->query->queryResult->fid;
80-
$authorExpGrades = collect($this->authorExpGradeRepository->getLatestOfUsers($fid, $uids))
89+
$authorsUidKeyByFid = $posts
90+
->map(fn(Post $post) => ['fid' => $post->getFid(), 'authorUid' => $post->getAuthorUid()])
91+
->groupBy(fn(array $fidAndAuthorId) => $fidAndAuthorId['fid'])
92+
->map(fn(Collection $fidAndAuthorsUid) => $fidAndAuthorsUid->pluck('authorUid'));
93+
$authorExpGrades = collect($this->authorExpGradeRepository->getLatestOfUsers($authorsUidKeyByFid))
8194
->keyBy(fn(AuthorExpGrade $authorExpGrade) => $authorExpGrade->uid);
82-
$users->each(fn(User $user) => $user->setCurrentAuthorExpGrade($authorExpGrades[$user->getUid()] ?? null));
83-
84-
$forumModerators = collect($this->forumModeratorRepository
85-
->getLatestOfUsers($fid, $users->map(fn(User $user) => $user->getPortrait())))
86-
->keyBy(fn(ForumModerator $forumModerator) => $forumModerator->portrait);
87-
$users->each(fn(User $user) => $user->setCurrentForumModerator($forumModerators->get($user->getPortrait())));
95+
$forumModerators = collect($this->forumModeratorRepository->getLatestOfUsers($authorsUidKeyByFid
96+
->map(fn(Collection $authorsUid) => $authorsUid
97+
->map(fn(int $authorUid) => $users->get($authorUid)?->getPortrait())
98+
->filter(fn(?string $portrait) => $portrait !== null))
99+
))->keyBy(fn(ForumModerator $forumModerator) => $forumModerator->portrait);
100+
$users = $users->each(fn(User $user) => $user->setForumSpecific([
101+
'authorExpGrades' => $authorExpGrades->get($user->getUid()),
102+
'forumModerators' => $forumModerators->get($user->getPortrait())
103+
]));
88104
$this->stopwatch->stop('queryUserRelated');
89105

90106
return [

be/src/DTO/User/User.php

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,28 +9,17 @@ class User extends UserEntity
99
{
1010
use TimestampedDTO { fromEntity as private fromTimestampedEntity; }
1111

12-
private ?ForumModerator $currentForumModerator;
13-
private ?AuthorExpGrade $currentAuthorExpGrade;
12+
/** @var array{int, array{forumModerator: ForumModerator, authorExpGrade: AuthorExpGrade}} */
13+
private array $forumSpecific;
1414

15-
public function getCurrentForumModerator(): ?ForumModerator
15+
public function getForumSpecific(): array
1616
{
17-
return $this->currentForumModerator;
17+
return $this->forumSpecific;
1818
}
1919

20-
public function setCurrentForumModerator(?ForumModerator $value): self
20+
public function setForumSpecific(array $forumSpecific): User
2121
{
22-
$this->currentForumModerator = $value;
23-
return $this;
24-
}
25-
26-
public function getCurrentAuthorExpGrade(): ?AuthorExpGrade
27-
{
28-
return $this->currentAuthorExpGrade;
29-
}
30-
31-
public function setCurrentAuthorExpGrade(?AuthorExpGrade $value): self
32-
{
33-
$this->currentAuthorExpGrade = $value;
22+
$this->forumSpecific = $forumSpecific;
3423
return $this;
3524
}
3625

0 commit comments

Comments
 (0)