Source code for sagace.core.storage.redis_storage
"""
--------------------------------------------------------------------------------------------------------------------
Descrição:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Este módulo define uma estrutura para gerenciamento de tokens de autenticação dentro do sistema SAGACE.
A classe `RedisTokenStorage` implementa a interface `TokenStorage` para armazenar tokens em um banco Redis,
permitindo recuperação eficiente e persistente dos tokens.
Principais funcionalidades:
- Armazena tokens de autenticação no Redis.
- Recupera tokens armazenados garantindo sua reutilização.
- Implementa a interface `TokenStorage`, garantindo flexibilidade e substituição de implementação.
Princípios de Design Aplicados:
- **Single Responsibility Principle (SRP - SOLID)**: A classe tem a única responsabilidade de armazenar tokens no Redis.
- **Open/Closed Principle (OCP - SOLID)**: `RedisTokenStorage` pode ser estendida sem modificar seu código-fonte.
- **Dependency Inversion Principle (DIP - SOLID)**: `RedisTokenStorage` depende da abstração `TokenStorage`, permitindo flexibilidade.
Classes:
- ``RedisTokenStorage``: Implementação concreta de `TokenStorage` utilizando Redis.
Exemplo de uso:
.. code-block:: python
from sagace.core import Token, RedisTokenStorage
token_storage = RedisTokenStorage("redis://localhost:6379/0")
token = Token(
base_url="https://api.sagace.online",
access_token="abc123",
application_name="Meu App",
description="Token de acesso persistente."
)
token_storage.save_token(token)
retrieved_token = token_storage.get_token()
print(retrieved_token.get_auth_header())
Autor: Diego Yosiura
Última Atualização: 27/02/2025 16:24
Criado em: 27/02/2025 16:24
Copyright: (c) Ampere Consultoria Ltda
Projeto Original: sagace-v2-package
IDE: PyCharm
"""
import redis
from .. import Token
from .. import TokenStorage
[docs]
class RedisTokenStorage(TokenStorage):
"""
Implementação de `TokenStorage` para persistência de tokens no Redis.
Esta classe permite armazenar tokens de autenticação em Redis para garantir recuperação rápida
e persistência, mesmo após a reinicialização do sistema.
Princípios aplicados:
- **Single Responsibility Principle (S - SOLID)**: Responsável apenas por salvar e recuperar tokens no Redis.
- **Dependency Inversion Principle (D - SOLID)**: Depende da abstração `TokenStorage`, garantindo desacoplamento.
:param redis_url: URL de conexão com o servidor Redis.
:type redis_url: str
"""
def __init__(self, redis_url="redis://localhost:6379/0"):
"""
Inicializa a classe `RedisTokenStorage`, conectando ao Redis.
:param redis_url: URL de conexão com o servidor Redis.
:type redis_url: str
"""
self.client = redis.StrictRedis.from_url(redis_url, decode_responses=True)
[docs]
def save_token(self, token: Token):
"""
Armazena o token no Redis.
:param token: Instância do token a ser armazenado.
:type token: Token
"""
self.client.set("base_url", token.base_url)
self.client.set("access_token", token.access_token)
self.client.set("application_name", token.application_name)
self.client.set("description", token.description)
self.client.set("token_type", token.token_type)
[docs]
def get_token(self) -> Token:
"""
Recupera o token armazenado no Redis.
:return: Instância do token armazenado.
:rtype: Token
:raises ValueError: Se o token não for encontrado no Redis.
"""
base_url = self.client.get("base_url")
access_token = self.client.get("access_token")
application_name = self.client.get("application_name")
description = self.client.get("description")
token_type = self.client.get("token_type")
if not access_token or not base_url:
raise ValueError("Token not found in Redis.")
return Token(
base_url=base_url,
access_token=access_token,
application_name=application_name,
description=description,
token_type=token_type
)