İlk temizlik tamamlandı bir önceki projeden
This commit is contained in:
@@ -0,0 +1,150 @@
|
||||
<?php
|
||||
|
||||
use App\Models\Notification;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Carbon\Carbon;
|
||||
|
||||
/**
|
||||
* Get last notification time for a notification code
|
||||
* Returns null if never sent (first time)
|
||||
*/
|
||||
function getLastNotificationTime(string $notificationCode): ?Carbon
|
||||
{
|
||||
$lastNotification = Notification::where('notification_code', $notificationCode)
|
||||
->orderBy('created_at', 'DESC')
|
||||
->first();
|
||||
|
||||
return $lastNotification ? $lastNotification->created_at : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if we should run the check
|
||||
* Returns true if last notification was more than 5 minutes ago (or never sent)
|
||||
*/
|
||||
function shouldCheckNotification(string $notificationCode, int $minMinutes = 5): bool
|
||||
{
|
||||
$lastNotification = getLastNotificationTime($notificationCode);
|
||||
|
||||
// If never sent, should check
|
||||
if (!$lastNotification) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// If last notification was more than 5 minutes ago, should check
|
||||
return $lastNotification->diffInMinutes(now()) >= $minMinutes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get records created/updated after last notification
|
||||
* Returns null if first run (should check all records)
|
||||
*/
|
||||
function getLastCheckTimestamp(string $notificationCode): ?Carbon
|
||||
{
|
||||
$lastNotification = getLastNotificationTime($notificationCode);
|
||||
|
||||
// If never sent, return null (will check all records on first run)
|
||||
if (!$lastNotification) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Check records after last notification
|
||||
return $lastNotification;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if notification already sent for same issue (duplicate prevention)
|
||||
* Compares filter_params to detect same issue
|
||||
*
|
||||
* @param string $notificationCode
|
||||
* @param array|null $filterParams
|
||||
* @return bool True if duplicate exists
|
||||
*/
|
||||
function isNotificationDuplicate(string $notificationCode, ?array $filterParams = null): bool
|
||||
{
|
||||
// If no filter params, can't check for duplicates
|
||||
if (empty($filterParams)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Get last notification with same code and filter params
|
||||
$lastNotification = Notification::where('notification_code', $notificationCode)
|
||||
->whereNotNull('filter_params')
|
||||
->orderBy('created_at', 'DESC')
|
||||
->first();
|
||||
|
||||
if (!$lastNotification || !$lastNotification->filter_params) {
|
||||
return false; // No previous notification
|
||||
}
|
||||
|
||||
// Compare filter_params (normalize arrays for comparison)
|
||||
$lastParams = is_array($lastNotification->filter_params)
|
||||
? $lastNotification->filter_params
|
||||
: json_decode($lastNotification->filter_params, true);
|
||||
|
||||
// Check if same table and same conditions
|
||||
if (isset($lastParams['table']) && isset($filterParams['table'])) {
|
||||
if ($lastParams['table'] !== $filterParams['table']) {
|
||||
return false; // Different tables, not duplicate
|
||||
}
|
||||
}
|
||||
|
||||
// Compare conditions (simplified - check if same IDs or same conditions)
|
||||
if (isset($lastParams['conditions']) && isset($filterParams['conditions'])) {
|
||||
// If both have 'id' conditions, check if they overlap
|
||||
if (isset($lastParams['conditions']['id']) && isset($filterParams['conditions']['id'])) {
|
||||
$lastIds = is_array($lastParams['conditions']['id'])
|
||||
? $lastParams['conditions']['id']
|
||||
: [$lastParams['conditions']['id']];
|
||||
$newIds = is_array($filterParams['conditions']['id'])
|
||||
? $filterParams['conditions']['id']
|
||||
: [$filterParams['conditions']['id']];
|
||||
|
||||
// If all new IDs are already in last notification, it's duplicate
|
||||
$newUniqueIds = array_diff($newIds, $lastIds);
|
||||
if (empty($newUniqueIds)) {
|
||||
return true; // All IDs already notified
|
||||
}
|
||||
}
|
||||
|
||||
// For other conditions, do simple comparison
|
||||
// If conditions are exactly same, it's duplicate
|
||||
$lastConditions = json_encode($lastParams['conditions'], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||
$newConditions = json_encode($filterParams['conditions'], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||
|
||||
if ($lastConditions === $newConditions) {
|
||||
return true; // Exact same conditions
|
||||
}
|
||||
}
|
||||
|
||||
return false; // Not duplicate
|
||||
}
|
||||
|
||||
/**
|
||||
* Get already notified IDs from last notification
|
||||
* Used to filter out already notified records
|
||||
*
|
||||
* @param string $notificationCode
|
||||
* @return array Array of already notified IDs
|
||||
*/
|
||||
function getAlreadyNotifiedIds(string $notificationCode): array
|
||||
{
|
||||
$lastNotification = Notification::where('notification_code', $notificationCode)
|
||||
->whereNotNull('filter_params')
|
||||
->orderBy('created_at', 'DESC')
|
||||
->first();
|
||||
|
||||
if (!$lastNotification || !$lastNotification->filter_params) {
|
||||
return []; // No previous notification
|
||||
}
|
||||
|
||||
$filterParams = is_array($lastNotification->filter_params)
|
||||
? $lastNotification->filter_params
|
||||
: json_decode($lastNotification->filter_params, true);
|
||||
|
||||
if (isset($filterParams['conditions']['id'])) {
|
||||
$ids = $filterParams['conditions']['id'];
|
||||
return is_array($ids) ? $ids : [$ids];
|
||||
}
|
||||
|
||||
return [];
|
||||
}
|
||||
Reference in New Issue
Block a user