180 lines
5.6 KiB
PHP
180 lines
5.6 KiB
PHP
<?php
|
|
|
|
namespace KTXC\Service;
|
|
|
|
use KTXC\Models\Identity\User;
|
|
use KTXC\SessionIdentity;
|
|
use KTXC\SessionTenant;
|
|
use KTXC\Stores\UserAccountsStore;
|
|
|
|
class UserAccountsService
|
|
{
|
|
|
|
public function __construct(
|
|
private readonly SessionTenant $tenantIdentity,
|
|
private readonly SessionIdentity $userIdentity,
|
|
private readonly UserAccountsStore $userStore
|
|
) {
|
|
}
|
|
|
|
// =========================================================================
|
|
// User Operations
|
|
// =========================================================================
|
|
|
|
/**
|
|
* List all users with optional filters
|
|
*/
|
|
public function listUsers(array $filters = []): array
|
|
{
|
|
$users = $this->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;
|
|
}
|
|
|
|
}
|