schema = $schema ?? GeneralUtility::makeInstance(UserSettingsSchema::class); } public function createFromUserRecord(array $userRecord, array $uc = []): UserSettings { $dbColumnSettings = $this->extractDbColumnSettings($userRecord); $jsonFieldSettings = $this->extractJsonFieldSettings($userRecord, $uc); return new UserSettings(array_merge($dbColumnSettings, $jsonFieldSettings)); } public function createFromUc(array $uc): UserSettings { $settings = []; foreach ($this->schema->getJsonFieldSettingKeys() as $key) { if (array_key_exists($key, $uc)) { $settings[$key] = $uc[$key]; } } return new UserSettings($settings); } private function extractJsonFieldSettings(array $userRecord, array $uc): array { $settings = []; // Primary source: user_settings JSON field if (!empty($userRecord['user_settings'])) { $decoded = is_string($userRecord['user_settings']) ? json_decode($userRecord['user_settings'], true) : $userRecord['user_settings']; if (is_array($decoded)) { $settings = $decoded; } } // Fallback: fill missing values from uc (migration period) foreach ($this->schema->getJsonFieldSettingKeys() as $key) { if (!array_key_exists($key, $settings) && array_key_exists($key, $uc)) { $settings[$key] = $uc[$key]; } } return $settings; } private function extractDbColumnSettings(array $userRecord): array { $settings = []; foreach ($this->schema->getDbColumnSettingKeys() as $key) { if (array_key_exists($key, $userRecord)) { $settings[$key] = $userRecord[$key]; } } return $settings; } }