Update: 2026-05-07 02:01:59

This commit is contained in:
Hamza-Ayed
2026-05-07 02:01:59 +03:00
parent e5b70a01ef
commit 57ac6047b8
4 changed files with 143 additions and 37 deletions

View File

@@ -64,10 +64,37 @@ class NotificationService
return $successCount > 0;
}
/**
* Send a data-only (silent) notification to update background state (e.g., progress)
*/
public function sendDataNotification(string $userId, array $data, ?string $deviceId = null): bool
{
$db = Database::getInstance();
if ($deviceId) {
$stmt = $db->prepare("SELECT push_token FROM user_devices WHERE user_id = ? AND device_fingerprint = ? AND push_token IS NOT NULL");
$stmt->execute([$userId, $deviceId]);
} else {
$stmt = $db->prepare("SELECT push_token FROM user_devices WHERE user_id = ? AND push_token IS NOT NULL AND is_active = 1");
$stmt->execute([$userId]);
}
$tokens = $stmt->fetchAll(\PDO::FETCH_COLUMN);
if (empty($tokens)) return false;
$successCount = 0;
foreach ($tokens as $token) {
if ($this->dispatchToFcm($token, null, null, $data)) {
$successCount++;
}
}
return $successCount > 0;
}
/**
* Dispatch notification to Firebase via HTTP v1 API
*/
private function dispatchToFcm(string $token, string $title, string $body, array $data): bool
private function dispatchToFcm(string $token, ?string $title, ?string $body, array $data): bool
{
if (!file_exists($this->serviceAccountPath)) {
error_log("[NotificationService] Firebase service account file missing: {$this->serviceAccountPath}");
@@ -79,30 +106,34 @@ class NotificationService
$url = "https://fcm.googleapis.com/v1/projects/{$this->projectId}/messages:send";
$payload = [
'message' => [
'token' => $token,
$message = [
'token' => $token,
'data' => array_map('strval', $data),
];
if ($title || $body) {
$message['notification'] = [
'title' => $title,
'body' => $body,
];
$message['android'] = [
'priority' => 'high',
'notification' => [
'title' => $title,
'body' => $body,
],
'data' => array_map('strval', $data), // FCM data values must be strings
'android' => [
'priority' => 'high',
'notification' => [
'sound' => 'default',
'channel_id' => 'high_importance_channel'
]
];
$message['apns'] = [
'payload' => [
'aps' => [
'sound' => 'default',
'channel_id' => 'high_importance_channel'
]
],
'apns' => [
'payload' => [
'aps' => [
'sound' => 'default',
],
],
],
],
];
];
}
$payload = ['message' => $message];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);