Initial commit

This commit is contained in:
Ronald Huynen
2026-03-23 21:37:59 +01:00
commit 2547717edb
2193 changed files with 972171 additions and 0 deletions

View File

@@ -0,0 +1,115 @@
<?php
namespace App\Console\Commands;
use App\Services\PresenceService;
use Illuminate\Console\Command;
use Spatie\Activitylog\Models\Activity;
class ClearPresenceCommand extends Command
{
protected $signature = 'presence:clear {profile_id?} {guard?}';
protected $description = 'Clear presence cache and set profile offline';
public function handle()
{
$profileId = $this->argument('profile_id');
$guard = $this->argument('guard');
if ($profileId && $guard) {
// Clear specific profile
$this->clearSpecificProfile($profileId, $guard);
} else {
// Clear all presence data
$this->clearAllPresence();
}
return 0;
}
protected function clearSpecificProfile($profileId, $guard)
{
$this->info("Clearing presence for Profile ID: {$profileId}, Guard: {$guard}");
$modelClass = $this->getModelClass($guard);
$profile = $modelClass::find($profileId);
if (!$profile) {
$this->error("Profile not found!");
return;
}
// Set offline
$presenceService = app(PresenceService::class);
$presenceService->setUserOffline($profile, $guard);
// Clear caches
\Cache::forget("presence_{$guard}_{$profileId}");
\Cache::forget("presence_last_update_{$guard}_{$profileId}");
\Cache::forget("online_users_{$guard}_" . PresenceService::ONLINE_THRESHOLD_MINUTES);
$this->info("✓ Presence cleared for {$profile->name}");
}
protected function clearAllPresence()
{
$this->info("Clearing ALL presence data...");
$guards = ['web', 'admin', 'bank', 'organization'];
foreach ($guards as $guard) {
// Clear online users cache
\Cache::forget("online_users_{$guard}_" . PresenceService::ONLINE_THRESHOLD_MINUTES);
$this->line("✓ Cleared online users cache for {$guard} guard");
}
// Clear all presence cache keys
$cacheKeys = \Cache::getRedis()->keys('*presence_*');
foreach ($cacheKeys as $key) {
// Remove the Redis prefix from the key
$cleanKey = str_replace(\Cache::getRedis()->getOptions()->prefix, '', $key);
\Cache::forget($cleanKey);
}
$this->info("✓ Cleared all presence cache keys");
// Optionally mark all users as offline in activity log
if ($this->confirm('Do you want to mark all users as offline in the activity log?', false)) {
$presenceService = app(PresenceService::class);
// Get all recent online activities
$recentActivities = Activity::where('log_name', PresenceService::PRESENCE_ACTIVITY)
->where('properties->status', 'online')
->where('created_at', '>=', now()->subMinutes(60))
->with('subject')
->get();
foreach ($recentActivities as $activity) {
if ($activity->subject) {
$props = is_string($activity->properties)
? json_decode($activity->properties, true)
: $activity->properties;
$guard = $props['guard'] ?? 'web';
$presenceService->setUserOffline($activity->subject, $guard);
$this->line(" - Set {$activity->subject->name} offline ({$guard})");
}
}
$this->info("✓ Marked all users as offline");
}
$this->info("Done!");
}
protected function getModelClass($guard)
{
$map = [
'web' => \App\Models\User::class,
'admin' => \App\Models\Admin::class,
'bank' => \App\Models\Bank::class,
'organization' => \App\Models\Organization::class,
];
return $map[$guard] ?? \App\Models\User::class;
}
}