1
0
Files
breadcrumb-the-shire/modules/helpdesk/lib/Module/Helpdesk/Service/HelpdeskTenantSettingsRepository.php

161 lines
4.4 KiB
PHP
Raw Normal View History

<?php
namespace MintyPHP\Module\Helpdesk\Service;
use MintyPHP\DB;
/**
* Repository for per-tenant helpdesk BC connection overrides (helpdesk_tenant_settings table).
*
* All queries are scoped by tenant_id. No cross-tenant access is possible.
*/
class HelpdeskTenantSettingsRepository
{
/**
* @return array<string, mixed>|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<string, mixed> $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<string, mixed> $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<string, mixed> $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<string, mixed> $data
* @return array<string, string>
*/
private function buildRow(array $data): array
{
$row = [];
foreach (self::allowedColumns() as $col) {
$row[$col] = (string) ($data[$col] ?? '');
}
return $row;
}
/**
* @return array<int, string>
*/
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',
];
}
}