Memoize specialty nav and branch lookups to stop per-request N+1.
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:
isaacclad
2026-07-19 16:02:16 +00:00
co-authored by Cursor
parent 1d3db4f803
commit b44ed50fe7
4 changed files with 72 additions and 24 deletions
+21 -5
View File
@@ -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