userStore->listUsers($this->tenantIdentity->identifier(), $filters); // Remove sensitive data foreach ($users as &$user) { unset($user['settings']); } return $users; } public function fetchByIdentity(string $identifier): User | null { $data = $this->userStore->fetchByIdentity($this->tenantIdentity->identifier(), $identifier); if (!$data) { return null; } $user = new User(); $user->populate($data, 'users'); return $user; } public function fetchByIdentifier(string $identifier): array | null { return $this->userStore->fetchByIdentifier($this->tenantIdentity->identifier(), $identifier); } public function fetchByIdentityRaw(string $identifier): array | null { return $this->userStore->fetchByIdentity($this->tenantIdentity->identifier(), $identifier); } public function fetchByProviderSubject(string $provider, string $subject): ?array { return $this->userStore->fetchByProviderSubject($this->tenantIdentity->identifier(), $provider, $subject); } public function createUser(array $userData): array { return $this->userStore->createUser($this->tenantIdentity->identifier(), $userData); } public function updateUser(string $uid, array $updates): bool { return $this->userStore->updateUser($this->tenantIdentity->identifier(), $uid, $updates); } public function deleteUser(string $uid): bool { return $this->userStore->deleteUser($this->tenantIdentity->identifier(), $uid); } // ========================================================================= // Profile Operations // ========================================================================= public function fetchProfile(string $uid): ?array { return $this->userStore->fetchProfile($this->tenantIdentity->identifier(), $uid); } public function storeProfile(string $uid, array $profileFields): bool { // Get managed fields to filter out read-only fields $user = $this->fetchByIdentifier($uid); if (!$user) { return false; } $managedFields = $user['provider_managed_fields'] ?? []; $editableFields = []; // Only include fields that are not managed by provider foreach ($profileFields as $field => $value) { if (!in_array($field, $managedFields)) { $editableFields[$field] = $value; } } if (empty($editableFields)) { return false; } return $this->userStore->storeProfile($this->tenantIdentity->identifier(), $uid, $editableFields); } // ========================================================================= // Settings Operations // ========================================================================= public function fetchSettings(array $settings = []): array | null { return $this->userStore->fetchSettings($this->tenantIdentity->identifier(), $this->userIdentity->identifier(), $settings); } public function storeSettings(array $settings): bool { return $this->userStore->storeSettings($this->tenantIdentity->identifier(), $this->userIdentity->identifier(), $settings); } // ========================================================================= // Helper Methods // ========================================================================= /** * Check if a profile field is editable by the user * * @param string $uid User identifier * @param string $field Profile field name * @return bool True if field is editable, false if managed by provider */ public function isFieldEditable(string $uid, string $field): bool { $user = $this->fetchByIdentifier($uid); if (!$user) { return false; } $managedFields = $user['provider_managed_fields'] ?? []; return !in_array($field, $managedFields); } /** * Get editable fields for a user * * @param string $uid User identifier * @return array Array with field => ['value' => ..., 'editable' => bool, 'provider' => ...] */ public function getEditableFields(string $uid): array { $user = $this->fetchByIdentifier($uid); if (!$user || !isset($user['profile'])) { return []; } $managedFields = $user['provider_managed_fields'] ?? []; $provider = $user['provider'] ?? null; $editable = []; foreach ($user['profile'] as $field => $value) { $editable[$field] = [ 'value' => $value, 'editable' => !in_array($field, $managedFields), 'provider' => in_array($field, $managedFields) ? $provider : null, ]; } return $editable; } }