diff --git a/backend/app/Console/Kernel.php b/backend/app/Console/Kernel.php index c43d22d..1482174 100644 --- a/backend/app/Console/Kernel.php +++ b/backend/app/Console/Kernel.php @@ -4,7 +4,6 @@ namespace App\Console; use Illuminate\Console\Scheduling\Schedule; use Illuminate\Foundation\Console\Kernel as ConsoleKernel; -use App\Jobs\IncrementAvailabilityMinutesJob; use App\Jobs\UpdateAvailabilityWithSchedulesJob; class Kernel extends ConsoleKernel @@ -14,7 +13,6 @@ class Kernel extends ConsoleKernel */ protected function schedule(Schedule $schedule): void { - $schedule->job(new IncrementAvailabilityMinutesJob)->everyMinute(); $schedule->job(new UpdateAvailabilityWithSchedulesJob)->everyThirtyMinutes(); } diff --git a/backend/app/Http/Controllers/AvailabilityController.php b/backend/app/Http/Controllers/AvailabilityController.php index d24bdf1..c21fbc7 100644 --- a/backend/app/Http/Controllers/AvailabilityController.php +++ b/backend/app/Http/Controllers/AvailabilityController.php @@ -4,6 +4,7 @@ namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\User; +use App\Utils\Availability; class AvailabilityController extends Controller { @@ -24,22 +25,11 @@ class AvailabilityController extends Controller $user = $request->user(); } - $user->available = $request->input("available", false); - $user->availability_manual_mode = true; - $user->save(); - - return [ - "updated_user_id" => $user->id, - "updated_user_name" => $user->name - ]; + return Availability::updateAvailability($user, $request->input("available", false)); } public function updateAvailabilityManualMode(Request $request) { - $user = $request->user(); - $user->availability_manual_mode = $request->input("manual_mode", false); - $user->save(); - - return; + return Availability::updateAvailabilityManualMode($request->user(), $request->input("manual_mode", false)); } } diff --git a/backend/app/Jobs/IncrementAvailabilityMinutesJob.php b/backend/app/Jobs/IncrementAvailabilityMinutesJob.php deleted file mode 100644 index 356c772..0000000 --- a/backend/app/Jobs/IncrementAvailabilityMinutesJob.php +++ /dev/null @@ -1,34 +0,0 @@ -where('available', 1) - ->where('banned', 0) - ->increment('availability_minutes'); - } -} diff --git a/backend/app/Models/User.php b/backend/app/Models/User.php index c10f7a7..3f9e4be 100644 --- a/backend/app/Models/User.php +++ b/backend/app/Models/User.php @@ -56,6 +56,7 @@ class User extends Authenticatable protected $casts = [ 'email_verified_at' => 'datetime', 'last_access' => 'datetime', + 'last_availability_change' => 'datetime', ]; /** diff --git a/backend/app/Telegram/WebhookController.php b/backend/app/Telegram/WebhookController.php index df22752..f5c5e81 100644 --- a/backend/app/Telegram/WebhookController.php +++ b/backend/app/Telegram/WebhookController.php @@ -5,6 +5,8 @@ namespace App\Telegram; use App\Models\TelegramBotLogins; use App\Models\User; +use App\Utils\Availability; + class WebhookController extends \DefStudio\Telegraph\Handlers\WebhookHandler { @@ -118,9 +120,8 @@ class WebhookController extends $this->reply("⚠️ Il tuo account Allerta non è collegato con Telegram.\nPer favore, eseguire il comando /start."); return; } - $user->available = true; - $user->availability_manual_mode = true; - $user->save(); + + Availability::updateAvailability($user, true); $this->reply("Disponibilità aggiornata con successo.\nOra sei operativo."); } @@ -130,9 +131,8 @@ class WebhookController extends $this->reply("⚠️ Il tuo account Allerta non è collegato con Telegram.\nPer favore, eseguire il comando /start."); return; } - $user->available = false; - $user->availability_manual_mode = true; - $user->save(); + + Availability::updateAvailability($user, false); $this->reply("Disponibilità aggiornata con successo.\nOra sei non operativo."); } @@ -142,8 +142,8 @@ class WebhookController extends $this->reply("⚠️ Il tuo account Allerta non è collegato con Telegram.\nPer favore, eseguire il comando /start."); return; } - $user->availability_manual_mode = false; - $user->save(); + + Availability::updateAvailabilityManualMode($user, false); $this->reply("Programmazione oraria abilitata.\nPer disabilitarla (e tornare in modalità manuale), cambiare la disponbilità usando i comandi \"/attiva\" e \"/disattiva\""); } diff --git a/backend/app/Utils/Availability.php b/backend/app/Utils/Availability.php new file mode 100644 index 0000000..c01ca14 --- /dev/null +++ b/backend/app/Utils/Availability.php @@ -0,0 +1,49 @@ +available; + $last_availability_change = $user->last_availability_change; + $new_last_availability_change = now(); + + //Increment only if the user was available and now is not + if(!is_null($last_availability_change) && $last_availability && !$available) { + $diff = $new_last_availability_change->diffInMinutes($last_availability_change); + if($diff > 0) $user->availability_minutes += $diff; + } + + $user->available = $available; + $user->availability_manual_mode = true; + $user->last_availability_change = $new_last_availability_change; + $user->save(); + + return [ + "updated_user_id" => $user->id, + "updated_user_name" => $user->name + ]; + } + + public static function updateAvailabilityManualMode(User|int $id, bool $manual_mode) + { + if(is_int($id)) { + $user = User::find($id); + } else { + $user = $id; + } + $user->availability_manual_mode = $manual_mode; + $user->save(); + + return; + } +} \ No newline at end of file diff --git a/backend/database/migrations/2023_08_29_163731_add_last_availability_change_column.php b/backend/database/migrations/2023_08_29_163731_add_last_availability_change_column.php new file mode 100644 index 0000000..d935340 --- /dev/null +++ b/backend/database/migrations/2023_08_29_163731_add_last_availability_change_column.php @@ -0,0 +1,28 @@ +timestamp('last_availability_change')->nullable()->after('availability_manual_mode'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn('last_availability_change'); + }); + } +};