AdminRepository.php 2.4 KB
<?php

final class AdminRepository
{
    public static function findActiveByLogin(string $login): ?array
    {
        $stmt = Database::pdo()->prepare('SELECT * FROM admins WHERE login = :login AND ativo = 1');
        $stmt->execute(['login' => $login]);
        $row = $stmt->fetch();
        return $row ?: null;
    }

    public static function all(): array
    {
        return Database::pdo()
            ->query('SELECT * FROM admins ORDER BY ativo DESC, login ASC')
            ->fetchAll();
    }

    public static function countActiveAdmins(?int $excludeId = null): int
    {
        $sql = "SELECT COUNT(*) FROM admins WHERE ativo = 1 AND papel = 'admin'";
        $params = [];
        if ($excludeId !== null) {
            $sql .= ' AND id != :id';
            $params['id'] = $excludeId;
        }
        $stmt = Database::pdo()->prepare($sql);
        $stmt->execute($params);
        return (int) $stmt->fetchColumn();
    }

    public static function add(string $login, ?string $nome, string $papel, string $criadoPor): void
    {
        $stmt = Database::pdo()->prepare(
            'INSERT INTO admins (login, nome, papel, criado_por) VALUES (:login, :nome, :papel, :criado_por)
             ON DUPLICATE KEY UPDATE ativo = 1, papel = VALUES(papel), nome = VALUES(nome)'
        );
        $stmt->execute([
            'login'      => $login,
            'nome'       => $nome,
            'papel'      => $papel,
            'criado_por' => $criadoPor,
        ]);
    }

    public static function setActive(int $id, bool $active): void
    {
        $stmt = Database::pdo()->prepare('UPDATE admins SET ativo = :ativo WHERE id = :id');
        $stmt->execute(['ativo' => $active ? 1 : 0, 'id' => $id]);
    }

    public static function setPapel(int $id, string $papel): void
    {
        $stmt = Database::pdo()->prepare('UPDATE admins SET papel = :papel WHERE id = :id');
        $stmt->execute(['papel' => $papel, 'id' => $id]);
    }

    public static function find(int $id): ?array
    {
        $stmt = Database::pdo()->prepare('SELECT * FROM admins WHERE id = :id');
        $stmt->execute(['id' => $id]);
        $row = $stmt->fetch();
        return $row ?: null;
    }

    public static function touchLoginCache(string $login, ?string $nome): void
    {
        $stmt = Database::pdo()->prepare('UPDATE admins SET nome = :nome WHERE login = :login');
        $stmt->execute(['nome' => $nome, 'login' => $login]);
    }
}