. */ declare(strict_types=1); namespace SP\Core; use RuntimeException; use SP\Domain\Common\Adapters\Serde; use SP\Domain\Core\Exceptions\SPException; use SP\Domain\Core\Ports\AppLockHandler; use SP\Infrastructure\File\FileException; use SP\Infrastructure\File\FileHandler; use function SP\logger; /** * Class AppLock */ final readonly class AppLock implements AppLockHandler { public function __construct(private string $lockFile) { } /** * Comprueba si la aplicación está bloqueada * * @throws SPException */ public function getLock(): bool|int { try { $file = new FileHandler($this->lockFile); return (int)Serde::deserializeJson($file->readToString())->userId; } catch (FileException|RuntimeException) { return false; } } /** * @throws FileException * @throws SPException */ public function lock(int $userId, string $subject): void { $data = ['time' => time(), 'userId' => $userId, 'subject' => $subject]; $file = new FileHandler($this->lockFile); $file->save(Serde::serializeJson($data)); logger('Application locked out'); } public function unlock(): void { @unlink($this->lockFile); } }