yxy
This commit is contained in:
@@ -26,6 +26,7 @@ class ApiKernel
|
||||
private string $action;
|
||||
private array $tableMap;
|
||||
private AuthService $authService;
|
||||
private array $tableExistsCache = [];
|
||||
|
||||
// --- Initialisierung & Konstruktor (Optimiert) ---
|
||||
|
||||
@@ -184,6 +185,21 @@ class ApiKernel
|
||||
foreach ($stmt->fetchAll() as $r) $cols[] = $r['Field'];
|
||||
return $cols;
|
||||
}
|
||||
|
||||
private function tableExists(string $table): bool
|
||||
{
|
||||
if ($table === '') return false;
|
||||
if (array_key_exists($table, $this->tableExistsCache)) {
|
||||
return $this->tableExistsCache[$table];
|
||||
}
|
||||
try {
|
||||
$this->pdo->query("SELECT 1 FROM `$table` LIMIT 1");
|
||||
$this->tableExistsCache[$table] = true;
|
||||
} catch (Throwable $e) {
|
||||
$this->tableExistsCache[$table] = false;
|
||||
}
|
||||
return $this->tableExistsCache[$table];
|
||||
}
|
||||
private function primaryKey(string $table): ?string { /* ... Logik bleibt unverändert ... */
|
||||
$stmt = $this->pdo->prepare("SHOW KEYS FROM `$table` WHERE Key_name = 'PRIMARY'");
|
||||
$stmt->execute();
|
||||
@@ -907,6 +923,114 @@ class ApiKernel
|
||||
}
|
||||
}
|
||||
|
||||
private function fetchResourceCounts(int $customerId): array
|
||||
{
|
||||
$counts = [
|
||||
'templates' => 0,
|
||||
'sections' => 0,
|
||||
'blocks' => 0,
|
||||
'snippets' => 0,
|
||||
'renders_total' => 0,
|
||||
];
|
||||
|
||||
$map = $this->tableMap ?? [];
|
||||
foreach (['templates', 'sections', 'blocks', 'snippets'] as $kind) {
|
||||
$table = $map[$kind] ?? null;
|
||||
if (!$table || !$this->tableExists($table)) continue;
|
||||
$stmt = $this->pdo->prepare("SELECT COUNT(*) FROM `$table` WHERE `customer_id` = :cid");
|
||||
$stmt->execute([':cid' => $customerId]);
|
||||
$counts[$kind] = (int)($stmt->fetchColumn() ?: 0);
|
||||
}
|
||||
|
||||
$usageTable = $this->lookupTableName('template_usage', 'emailtemplate_template_usage');
|
||||
if ($this->tableExists($usageTable)) {
|
||||
$stmt = $this->pdo->prepare("SELECT SUM(`render_count`) FROM `$usageTable` WHERE `customer_id` = :cid");
|
||||
$stmt->execute([':cid' => $customerId]);
|
||||
$counts['renders_total'] = (int)($stmt->fetchColumn() ?: 0);
|
||||
}
|
||||
|
||||
return $counts;
|
||||
}
|
||||
|
||||
private function listTemplateUsage(int $customerId): array
|
||||
{
|
||||
$table = $this->tableMap['templates'] ?? null;
|
||||
if (!$table || !$this->tableExists($table)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$usageTable = $this->lookupTableName('template_usage', 'emailtemplate_template_usage');
|
||||
if ($this->tableExists($usageTable)) {
|
||||
$sql = "SELECT t.id, t.name, t.updated_at, COALESCE(u.render_count, 0) AS render_count, u.last_rendered_at
|
||||
FROM `$table` t
|
||||
LEFT JOIN `$usageTable` u ON u.template_id = t.id
|
||||
WHERE t.customer_id = :cid
|
||||
ORDER BY render_count DESC, t.updated_at DESC";
|
||||
$stmt = $this->pdo->prepare($sql);
|
||||
$stmt->execute([':cid' => $customerId]);
|
||||
$rows = $stmt->fetchAll() ?: [];
|
||||
} else {
|
||||
$sql = "SELECT t.id, t.name, t.updated_at FROM `$table` t WHERE t.customer_id = :cid ORDER BY t.updated_at DESC";
|
||||
$stmt = $this->pdo->prepare($sql);
|
||||
$stmt->execute([':cid' => $customerId]);
|
||||
$rows = $stmt->fetchAll() ?: [];
|
||||
foreach ($rows as &$row) {
|
||||
$row['render_count'] = 0;
|
||||
$row['last_rendered_at'] = null;
|
||||
}
|
||||
}
|
||||
|
||||
return array_map(static function ($row) {
|
||||
return [
|
||||
'template_id' => (int)($row['id'] ?? 0),
|
||||
'name' => $row['name'] ?? '',
|
||||
'render_count' => (int)($row['render_count'] ?? 0),
|
||||
'last_rendered_at' => $row['last_rendered_at'] ?? null,
|
||||
'updated_at' => $row['updated_at'] ?? null,
|
||||
];
|
||||
}, $rows);
|
||||
}
|
||||
|
||||
private function resetTemplateUsage(int $customerId, array $templateIds): void
|
||||
{
|
||||
$usageTable = $this->lookupTableName('template_usage', 'emailtemplate_template_usage');
|
||||
if (!$templateIds || !$this->tableExists($usageTable)) {
|
||||
return;
|
||||
}
|
||||
$templateIds = array_values(array_unique(array_filter(array_map('intval', $templateIds), static fn ($v) => $v > 0)));
|
||||
if (!$templateIds) return;
|
||||
|
||||
$placeholders = implode(',', array_fill(0, count($templateIds), '?'));
|
||||
$sql = "DELETE FROM `$usageTable` WHERE `customer_id` = ? AND `template_id` IN ($placeholders)";
|
||||
$stmt = $this->pdo->prepare($sql);
|
||||
$stmt->execute(array_merge([$customerId], $templateIds));
|
||||
}
|
||||
|
||||
private function extractIdList($raw): array
|
||||
{
|
||||
if ($raw === null) return [];
|
||||
if (is_numeric($raw)) {
|
||||
$raw = [(int)$raw];
|
||||
} elseif (is_string($raw)) {
|
||||
$raw = preg_split('/[\s,]+/', $raw);
|
||||
} elseif (!is_array($raw)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$ids = [];
|
||||
foreach ($raw as $value) {
|
||||
if (is_array($value)) {
|
||||
$ids = array_merge($ids, $this->extractIdList($value));
|
||||
continue;
|
||||
}
|
||||
if ($value === '' || $value === null) continue;
|
||||
$ids[] = (int)$value;
|
||||
}
|
||||
|
||||
$ids = array_values(array_unique(array_filter($ids, static fn ($v) => $v > 0)));
|
||||
return $ids;
|
||||
}
|
||||
|
||||
private function calculateUsage(string $kind, int $id, array $auth): array
|
||||
{
|
||||
if ($id <= 0) return ['total' => 0];
|
||||
|
||||
Reference in New Issue
Block a user