Newer
Older
smart-home-server / server / SHServ / Integrations / GAuth / Store / DbTokenStore.php
@Eugene Sukhodolskiy Eugene Sukhodolskiy 22 hours ago 1 KB Phase 0: gnexus-auth integration infrastructure
<?php

declare(strict_types=1);

namespace SHServ\Integrations\GAuth\Store;

use GNexus\GAuth\Contract\TokenStoreInterface;
use GNexus\GAuth\DTO\TokenSet;
use Fury\Modules\ThinBuilder\ThinBuilder;

final class DbTokenStore implements TokenStoreInterface
{
    private ThinBuilder $tb;

    public function __construct(ThinBuilder $tb)
    {
        $this->tb = $tb;
    }

    public function put(string $key, TokenSet $tokenSet): void
    {
        $expiresAt = $tokenSet->expiresAt;
        $data = [
            'session_token' => $key,
            'access_token' => $tokenSet->accessToken,
            'refresh_token' => $tokenSet->refreshToken,
            'expires_at' => $expiresAt ? $expiresAt->format('Y-m-d H:i:s') : null,
            'updated_at' => date('Y-m-d H:i:s'),
        ];

        $existing = $this->tb->select('shserv_sessions', ['id'], [['session_token', '=', $key]]);
        if ($existing) {
            $this->tb->update('shserv_sessions', $data, [['session_token', '=', $key]]);
        } else {
            $this->tb->insert('shserv_sessions', $data);
        }
    }

    public function get(string $key): ?TokenSet
    {
        $result = $this->tb->select('shserv_sessions', ['access_token', 'refresh_token', 'expires_at'], [['session_token', '=', $key]]);

        if (!$result) {
            return null;
        }

        $row = $result[0];
        $expiresAt = $row['expires_at'] ? new \DateTimeImmutable($row['expires_at']) : null;

        return new TokenSet(
            accessToken: (string) $row['access_token'],
            refreshToken: isset($row['refresh_token']) ? (string) $row['refresh_token'] : null,
            tokenType: 'Bearer',
            expiresIn: $expiresAt ? (int) $expiresAt->format('U') - time() : 0,
            expiresAt: $expiresAt,
        );
    }

    public function forget(string $key): void
    {
        $this->tb->delete('shserv_sessions', [['session_token', '=', $key]]);
    }
}