Fix broken suspension cleaner
This commit rewrites the previously broken auto ban cleaner. It's now much more efficient and compact, and it removes bans correctly and on the right date. Fixes #1
This commit is contained in:
@@ -5,16 +5,32 @@ namespace App\Services;
|
||||
|
||||
use App\Ban;
|
||||
use App\User;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
|
||||
class AccountSuspensionService
|
||||
{
|
||||
|
||||
/**
|
||||
* Suspends a user account, with given $reason.
|
||||
*
|
||||
* This method will take the target user and add a suspension to the database,
|
||||
* effectively banning the user from the app. Suspensions may be temporary or permanent.
|
||||
* Suspensions also block registration attempts.
|
||||
*
|
||||
* @param string $reason Suspension reason.
|
||||
* @param string $duration Duration. This is a timestamp.
|
||||
* @param User $target Who to suspend.
|
||||
* @param string $type Permanent or temporary?
|
||||
* @return Ban The ban itself
|
||||
*/
|
||||
public function suspend($reason, $duration, User $target, $type = "on"): Ban {
|
||||
|
||||
Log::debug("AccountSuspensionService: Suspending user account", [
|
||||
'userID' => $target->id
|
||||
Log::alert("An user account has just been suspended.", [
|
||||
'taget_email' => $target->email,
|
||||
'suspended_by' => Auth::user()->email,
|
||||
'reason' => $reason
|
||||
]);
|
||||
|
||||
if ($type == "on") {
|
||||
@@ -32,16 +48,42 @@ class AccountSuspensionService
|
||||
return $ban;
|
||||
}
|
||||
|
||||
/**
|
||||
* Lifts someone's suspension
|
||||
*
|
||||
* @param User $user The user to unsuspend
|
||||
*/
|
||||
public function unsuspend(User $user): void {
|
||||
|
||||
Log::alert("A suspension has just been lifted.", [
|
||||
'target_email' => $user->email,
|
||||
]);
|
||||
|
||||
$user->bans->delete();
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether a user is suspended
|
||||
*
|
||||
* @param User $user The user to check
|
||||
* @return bool Whether the mentioned user is suspended
|
||||
*/
|
||||
public function isSuspended(User $user): bool {
|
||||
return !is_null($user->bans);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Takes a suspension directly and makes it permanent.
|
||||
*
|
||||
* @param Ban $ban The suspension to make permanent
|
||||
*/
|
||||
public function makePermanent(Ban $ban): void {
|
||||
|
||||
Log::alert('A suspension has just been made permanent.', [
|
||||
'target_email' => $ban->user->email
|
||||
]);
|
||||
|
||||
$ban->bannedUntil = null;
|
||||
$ban->isPermanent = true;
|
||||
|
||||
@@ -49,5 +91,16 @@ class AccountSuspensionService
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Purges old, expired suspensions from the database
|
||||
*
|
||||
* @return bool Whether any suspensions were lifted
|
||||
*/
|
||||
public function purgeExpired()
|
||||
{
|
||||
// Unban on the last day, not on the exact time (with Carbon::now()).
|
||||
return (bool) Ban::whereDate('bannedUntil', '=', Carbon::today())->delete();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user