Memoize specialty nav and branch lookups to stop per-request N+1.
Deploy Ladill Care / deploy (push) Successful in 28s
Deploy Ladill Care / deploy (push) Successful in 28s
Sidebar was re-querying practitioners for every specialty module and also calling ensureDefaultModulesProvisioned on each page render, which showed up as multi-second PHP-FPM slow logs on Care. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -15,6 +15,12 @@ use Illuminate\Support\Str;
|
||||
|
||||
class OrganizationResolver
|
||||
{
|
||||
/** @var array<string, list<int>> */
|
||||
protected array $doctorAssignedBranchIdsCache = [];
|
||||
|
||||
/** @var array<string, ?Member> */
|
||||
protected array $membershipCache = [];
|
||||
|
||||
public function resolveForUser(User $user): ?Organization
|
||||
{
|
||||
$member = $this->membershipFor($user);
|
||||
@@ -48,19 +54,24 @@ class OrganizationResolver
|
||||
*/
|
||||
public function membershipFor(User $user): ?Member
|
||||
{
|
||||
$cacheKey = $user->ownerRef();
|
||||
if (array_key_exists($cacheKey, $this->membershipCache)) {
|
||||
return $this->membershipCache[$cacheKey];
|
||||
}
|
||||
|
||||
$member = Member::query()->where('user_ref', $user->ownerRef())->first();
|
||||
if ($member) {
|
||||
return $member;
|
||||
return $this->membershipCache[$cacheKey] = $member;
|
||||
}
|
||||
|
||||
$email = strtolower(trim((string) $user->email));
|
||||
if ($email === '' || $email === $user->ownerRef()) {
|
||||
return null;
|
||||
return $this->membershipCache[$cacheKey] = null;
|
||||
}
|
||||
|
||||
$member = Member::query()->where('user_ref', $email)->first();
|
||||
|
||||
return $member ? $this->remapMemberUserRef($member, $user) : null;
|
||||
return $this->membershipCache[$cacheKey] = ($member ? $this->remapMemberUserRef($member, $user) : null);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -291,6 +302,11 @@ class OrganizationResolver
|
||||
*/
|
||||
public function doctorAssignedBranchIds(Member $member): array
|
||||
{
|
||||
$cacheKey = (string) $member->id;
|
||||
if (isset($this->doctorAssignedBranchIdsCache[$cacheKey])) {
|
||||
return $this->doctorAssignedBranchIdsCache[$cacheKey];
|
||||
}
|
||||
|
||||
$practitioners = Practitioner::query()
|
||||
->where('is_active', true)
|
||||
->where(function ($query) use ($member) {
|
||||
@@ -309,10 +325,10 @@ class OrganizationResolver
|
||||
$ids = array_values(array_unique(array_map('intval', $ids)));
|
||||
|
||||
if ($ids === [] && $member->branch_id) {
|
||||
return [(int) $member->branch_id];
|
||||
$ids = [(int) $member->branch_id];
|
||||
}
|
||||
|
||||
return $ids;
|
||||
return $this->doctorAssignedBranchIdsCache[$cacheKey] = $ids;
|
||||
}
|
||||
|
||||
public function mayAccessBranch(?Member $member, ?int $branchId): bool
|
||||
|
||||
Reference in New Issue
Block a user