Add Session model

This commit is contained in:
Igor Scheller 2023-09-17 14:55:02 +02:00 committed by Michael Weimann
parent ee7d30b339
commit 67d5950926
5 changed files with 112 additions and 40 deletions

View File

@ -0,0 +1,22 @@
<?php
declare(strict_types=1);
namespace Database\Factories\Engelsystem\Models;
use Engelsystem\Models\Session;
use Illuminate\Database\Eloquent\Factories\Factory;
class SessionFactory extends Factory
{
/** @var string */
protected $model = Session::class; // phpcs:ignore
public function definition(): array
{
return [
'id' => $this->faker->lexify('??????????'),
'payload' => $this->faker->text(100),
];
}
}

View File

@ -6,7 +6,7 @@ namespace Engelsystem\Http\SessionHandlers;
use Engelsystem\Database\Database; use Engelsystem\Database\Database;
use Engelsystem\Helpers\Carbon; use Engelsystem\Helpers\Carbon;
use Illuminate\Database\Query\Builder as QueryBuilder; use Engelsystem\Models\Session;
class DatabaseHandler extends AbstractHandler class DatabaseHandler extends AbstractHandler
{ {
@ -19,9 +19,7 @@ class DatabaseHandler extends AbstractHandler
*/ */
public function read(string $id): string public function read(string $id): string
{ {
$session = $this->getQuery() $session = Session::whereId($id)->first();
->where('id', '=', $id)
->first();
return $session ? $session->payload : ''; return $session ? $session->payload : '';
} }
@ -31,27 +29,13 @@ class DatabaseHandler extends AbstractHandler
*/ */
public function write(string $id, string $data): bool public function write(string $id, string $data): bool
{ {
$values = [ $session = Session::findOrNew($id);
'payload' => $data, $session->id = $id;
'last_activity' => Carbon::now(), $session->payload = $data;
]; $session->last_activity = Carbon::now();
$session->save();
$session = $this->getQuery() // The save return can't be used directly as it won't change if the second call is in the same second
->where('id', '=', $id)
->first();
if (!$session) {
return $this->getQuery()
->insert($values + [
'id' => $id,
]);
}
$this->getQuery()
->where('id', '=', $id)
->update($values);
// The update return can't be used directly because it won't change if the second call is in the same second
return true; return true;
} }
@ -60,9 +44,7 @@ class DatabaseHandler extends AbstractHandler
*/ */
public function destroy(string $id): bool public function destroy(string $id): bool
{ {
$this->getQuery() Session::whereId($id)->delete();
->where('id', '=', $id)
->delete();
return true; return true;
} }
@ -75,15 +57,7 @@ class DatabaseHandler extends AbstractHandler
$sessionDays = config('session')['lifetime']; $sessionDays = config('session')['lifetime'];
$deleteBefore = Carbon::now()->subDays($sessionDays); $deleteBefore = Carbon::now()->subDays($sessionDays);
return $this->getQuery() return Session::where('last_activity', '<', $deleteBefore)
->where('last_activity', '<', $deleteBefore)
->delete(); ->delete();
} }
protected function getQuery(): QueryBuilder
{
return $this->database
->getConnection()
->table('sessions');
}
} }

43
src/Models/Session.php Normal file
View File

@ -0,0 +1,43 @@
<?php
declare(strict_types=1);
namespace Engelsystem\Models;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Factories\HasFactory;
/**
* @property string $id
* @property string $payload
* @property Carbon $last_activity
*
* @method static Builder|Session whereId($value)
* @method static Builder|Session wherePayload($value)
* @method static Builder|Session whereLastActivity($value)
*/
class Session extends BaseModel
{
use HasFactory;
public $incrementing = false; // phpcs:ignore
protected $keyType = 'string'; // phpcs:ignore
/** @var array<string, string|null> default attributes */
protected $attributes = [ // phpcs:ignore
'payload' => '',
];
/** @var array<string> */
protected $dates = [ // phpcs:ignore
'last_activity',
];
/** @var array<string> */
protected $fillable = [ // phpcs:ignore
'id',
'payload',
];
}

View File

@ -16,7 +16,6 @@ class DatabaseHandlerTest extends TestCase
/** /**
* @covers \Engelsystem\Http\SessionHandlers\DatabaseHandler::__construct * @covers \Engelsystem\Http\SessionHandlers\DatabaseHandler::__construct
* @covers \Engelsystem\Http\SessionHandlers\DatabaseHandler::getQuery
* @covers \Engelsystem\Http\SessionHandlers\DatabaseHandler::read * @covers \Engelsystem\Http\SessionHandlers\DatabaseHandler::read
*/ */
public function testRead(): void public function testRead(): void
@ -42,9 +41,7 @@ class DatabaseHandlerTest extends TestCase
foreach (['Lorem Ipsum', 'Dolor Sit!'] as $data) { foreach (['Lorem Ipsum', 'Dolor Sit!'] as $data) {
$this->assertTrue($handler->write('id-foo', $data)); $this->assertTrue($handler->write('id-foo', $data));
$return = $this->database->getConnection()->table('sessions') $return = Session::whereId('id-foo')->get();
->where('id', 'id-foo')
->get();
$this->assertCount(1, $return); $this->assertCount(1, $return);
$return = $return->first(); $return = $return->first();

View File

@ -0,0 +1,36 @@
<?php
declare(strict_types=1);
namespace Engelsystem\Test\Unit\Models;
use Engelsystem\Helpers\Carbon;
use Engelsystem\Models\Session;
/**
* This class provides tests for the Session model
*/
class SessionTest extends ModelTest
{
/**
* Tests that a Session can be created and loaded
*
* @covers \Engelsystem\Models\Session
*/
public function testCreate(): void
{
Session::create([
'id' => 'foo',
'payload' => 'lorem ipsum',
'last_activity' => Carbon::now(),
]);
Session::create([
'id' => 'bar',
'last_activity' => Carbon::now(),
]);
$session = Session::find('foo');
$this->assertNotNull($session);
$this->assertEquals('lorem ipsum', $session->payload);
}
}