refractor redis service

This commit is contained in:
2026-01-06 23:42:12 +03:00
parent 2e14a7f364
commit 423ce8bc62
5 changed files with 109 additions and 27 deletions
+1 -1
View File
@@ -16,7 +16,7 @@ class EmailService:
template_path="confirm_email.html",
username=username,
url=url,
expire_minutes=60,
expire_minutes=settings.EMAIL_TOKEN_EXPIRE_MINUTES,
company_name=settings.COMPANY_NAME
)
body = EmailClient.render(
+72
View File
@@ -0,0 +1,72 @@
import logging
import uuid
from app.utils.redis import get_redis
log = logging.getLogger(__name__)
class RefreshTokenStorage:
PREFIX: str = "refresh"
@classmethod
async def save_token(cls, token: uuid.UUID, user_id: int, ttl: int):
redis_client = await get_redis()
await redis_client.setex(f"{cls.PREFIX}:{token}", ttl, user_id)
await redis_client.sadd(f"user:{user_id}:{cls.PREFIX}", str(token))
await redis_client.expire(f"user:{user_id}:{cls.PREFIX}", ttl+3600)
log.info("Save new refresh token from redis", extra={"user_id": user_id, "token": token})
@classmethod
async def getdel_token(cls, token: uuid.UUID) -> int:
redis_client = await get_redis()
user_id = await redis_client.getdel(f"{cls.PREFIX}:{token}")
await redis_client.srem(f"user:{user_id}:{cls.PREFIX}", str(token))
log.info("Remove token", extra={"user_id": user_id, "token": token})
return user_id
@classmethod
async def get_token(cls, token: uuid.UUID) -> int:
redis_client = await get_redis()
user_id = await redis_client.get(f"{cls.PREFIX}:{token}")
log.debug("User_id fetched from refresh token", extra={"user_id": user_id, "token": token})
return user_id
@classmethod
async def abort_all_tokens(cls, user_id: int):
redis_client = await get_redis()
log.debug("Start abort all tokens", extra={"user_id": user_id})
tokens = await redis_client.smembers(f"user:{user_id}:{cls.PREFIX}")
for token in tokens:
await redis_client.delete(f"{cls.PREFIX}:{token}")
await redis_client.delete(f"user:{user_id}:{cls.PREFIX}")
log.info("Successfully abort all tokens", extra={"user_id": user_id})
class EmailTokenStorage:
PREFIX: str = "email"
@classmethod
async def save_token(cls, token: uuid.UUID, user_id: int, ttl: int):
redis_client = await get_redis()
await redis_client.setex(f"{cls.PREFIX}:{token}", ttl, user_id)
log.info("Save new refresh token from redis", extra={"user_id": user_id, "token": token})
@classmethod
async def getdel_token(cls, token: uuid.UUID) -> int:
redis_client = await get_redis()
log.debug("User_id fetched from email token", extra={"token": token})
return await redis_client.getdel(f"{cls.PREFIX}:{token}")