|null */ public function findByTenantId(int $tenantId): ?array { if ($tenantId <= 0) { return null; } $result = DB::selectOne( 'SELECT * FROM helpdesk_tenant_settings WHERE tenant_id = ? LIMIT 1', (string) $tenantId ); if (!is_array($result) || $result === []) { return null; } // MintyPHP wraps selectOne results in ['table_name' => [...]] return $result['helpdesk_tenant_settings'] ?? null; } /** * @param array $data */ public function upsert(int $tenantId, array $data): bool { if ($tenantId <= 0) { return false; } $existing = $this->findByTenantId($tenantId); if ($existing !== null) { return $this->update($tenantId, $data); } return $this->insert($tenantId, $data); } public function deleteByTenantId(int $tenantId): bool { if ($tenantId <= 0) { return false; } return (bool) DB::delete( 'DELETE FROM helpdesk_tenant_settings WHERE tenant_id = ?', (string) $tenantId ); } /** * @param array $data */ private function insert(int $tenantId, array $data): bool { $row = $this->buildRow($data); return (bool) DB::insert( 'INSERT INTO helpdesk_tenant_settings (tenant_id, override_enabled, auth_mode, odata_base_url, company_name, basic_user, basic_password_enc, oauth_tenant_id, oauth_client_id, oauth_client_secret_enc, oauth_token_endpoint, system_recommendations_config, controlling_risk_config) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', (string) $tenantId, $row['override_enabled'], $row['auth_mode'], $row['odata_base_url'], $row['company_name'], $row['basic_user'], $row['basic_password_enc'], $row['oauth_tenant_id'], $row['oauth_client_id'], $row['oauth_client_secret_enc'], $row['oauth_token_endpoint'], $row['system_recommendations_config'], $row['controlling_risk_config'] ); } /** * Update only the columns present in $data — leaves other columns untouched. * This prevents overwriting secrets (basic_password_enc, oauth_client_secret_enc) * when they are not explicitly included in the save payload. * * @param array $data */ private function update(int $tenantId, array $data): bool { $allowed = self::allowedColumns(); $setClauses = []; $params = []; foreach ($allowed as $col) { if (!array_key_exists($col, $data)) { continue; } $setClauses[] = "{$col} = ?"; $params[] = (string) ($data[$col] ?? ''); } if ($setClauses === []) { return true; } $params[] = (string) $tenantId; return (bool) DB::update( 'UPDATE helpdesk_tenant_settings SET ' . implode(', ', $setClauses) . ' WHERE tenant_id = ?', ...$params ); } /** * Build a complete row for INSERT, using empty strings for missing columns. * * @param array $data * @return array */ private function buildRow(array $data): array { $row = []; foreach (self::allowedColumns() as $col) { $row[$col] = (string) ($data[$col] ?? ''); } return $row; } /** * @return array */ private static function allowedColumns(): array { return [ 'override_enabled', 'auth_mode', 'odata_base_url', 'company_name', 'basic_user', 'basic_password_enc', 'oauth_tenant_id', 'oauth_client_id', 'oauth_client_secret_enc', 'oauth_token_endpoint', 'system_recommendations_config', 'controlling_risk_config', ]; } }