1
0
mirror of git://f0xx.org/ac/ac-ms-devices synced 2026-07-29 08:38:22 +03:00
This commit is contained in:
Anton Afanasyeu
2026-06-23 12:29:31 +02:00
commit 9edcbec782
8 changed files with 299 additions and 0 deletions

103
src/DeviceRepository.php Normal file
View File

@@ -0,0 +1,103 @@
<?php
declare(strict_types=1);
/** Phase 1 device registry — auto-register on crash upload. */
final class DeviceRepository {
public static function externalKey(array $device): string {
$parts = array_filter([
(string) ($device['manufacturer'] ?? ''),
(string) ($device['brand'] ?? ''),
(string) ($device['model'] ?? ''),
(string) ($device['product'] ?? ''),
(string) ($device['device'] ?? ''),
(string) ($device['serial'] ?? ''),
(string) ($device['android_id'] ?? ''),
], static fn ($v) => $v !== '');
if ($parts === []) {
return 'unknown';
}
return substr(hash('sha256', implode('|', $parts)), 0, 32);
}
public static function upsertFromPayload(int $companyId, array $device, string $source = 'auto'): int {
$companyId = max(1, $companyId);
$externalId = self::externalKey($device);
$now = (int) round(microtime(true) * 1000);
$manufacturer = trim((string) ($device['manufacturer'] ?? ''));
$model = trim((string) ($device['model'] ?? ''));
$display = trim($manufacturer . ' ' . $model);
$meta = json_encode($device, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
if ($meta === false) {
$meta = '{}';
}
$pdo = Database::pdo();
if (Database::isMysql()) {
$stmt = $pdo->prepare(
'INSERT INTO devices (company_id, external_id, display_name, manufacturer, model, source,
registered_at_ms, last_seen_at_ms, meta_json)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
ON DUPLICATE KEY UPDATE
display_name = VALUES(display_name),
manufacturer = VALUES(manufacturer),
model = VALUES(model),
last_seen_at_ms = VALUES(last_seen_at_ms),
meta_json = VALUES(meta_json)'
);
$stmt->execute([
$companyId,
$externalId,
$display !== '' ? $display : null,
$manufacturer !== '' ? $manufacturer : null,
$model !== '' ? $model : null,
$source,
$now,
$now,
$meta,
]);
$sel = $pdo->prepare(
'SELECT id FROM devices WHERE company_id = ? AND external_id = ? LIMIT 1'
);
$sel->execute([$companyId, $externalId]);
return (int) $sel->fetchColumn();
}
$stmt = $pdo->prepare(
'SELECT id FROM devices WHERE company_id = ? AND external_id = ? LIMIT 1'
);
$stmt->execute([$companyId, $externalId]);
$existing = $stmt->fetchColumn();
if ($existing !== false) {
$upd = $pdo->prepare(
'UPDATE devices SET display_name = ?, manufacturer = ?, model = ?,
last_seen_at_ms = ?, meta_json = ? WHERE id = ?'
);
$upd->execute([
$display !== '' ? $display : null,
$manufacturer !== '' ? $manufacturer : null,
$model !== '' ? $model : null,
$now,
$meta,
(int) $existing,
]);
return (int) $existing;
}
$ins = $pdo->prepare(
'INSERT INTO devices (company_id, external_id, display_name, manufacturer, model, source,
registered_at_ms, last_seen_at_ms, meta_json)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)'
);
$ins->execute([
$companyId,
$externalId,
$display !== '' ? $display : null,
$manufacturer !== '' ? $manufacturer : null,
$model !== '' ? $model : null,
$source,
$now,
$now,
$meta,
]);
return (int) $pdo->lastInsertId();
}
}