2022-12-26 17:20:58 -03:00

113 lines
3.5 KiB
Python

from redis import asyncio as aioredis
import app.utils.Logger as Logger
from app.models.MirrorModels import MirrorModel, MirrorStoreModel
from app.utils.RedisConnector import RedisConnector
from app.dependencies import load_config
config: dict = load_config()
class Mirrors:
"""Implements the Mirror class for the ReVanced API"""
redis = RedisConnector.connect(config['mirrors']['database'])
MirrorsLogger = Logger.MirrorsLogger()
async def assemble_key(self, org: str, repo: str, version: str) -> str:
"""Assemble the Redis key for the cdn
Returns:
str: The Redis key
"""
return f"{org}/{repo}/{version}"
async def store(self, org: str, repo: str, version: str, mirror: MirrorStoreModel) -> bool:
"""Store mirrors in the database
Args:
mirror (MirrorStoreModel): Pydantic model of the mirror information
Returns:
bool: True if data was stored successfully, False otherwise
"""
key = await self.assemble_key(org, repo, version)
mirror_payload: dict[str, str | list[str]] = {}
mirror_payload['cid'] = mirror.cid
mirror_payload['filenames'] = mirror.filenames
try:
await self.redis.json().set(key, '$', mirror_payload)
await self.MirrorsLogger.log("SET", None, key)
except aioredis.RedisError as e:
await self.MirrorsLogger.log("SET", e)
raise e
return True
async def exists(self, org: str, repo: str, version: str) -> bool:
"""Check if a cdn exists in the database
Returns:
bool: True if the cdn exists, False otherwise
"""
key = await self.assemble_key(org, repo, version)
try:
if await self.redis.exists(key):
await self.MirrorsLogger.log("EXISTS", None, key)
return True
else:
return False
except aioredis.RedisError as e:
await self.MirrorsLogger.log("EXISTS", e)
raise e
async def get(self, org: str, repo: str, version: str) -> MirrorModel:
"""Get the mirror information from the database
Returns:
dict[str, str | int]: The mirror information
"""
key = await self.assemble_key(org, repo, version)
try:
payload: dict[str, str | list[str]] = await self.redis.json().get(key)
mirror = MirrorModel(
repository=f"{org}/{repo}",
version=version,
cid=payload['cid'],
filenames=payload['filenames']
)
await self.MirrorsLogger.log("GET", None, key)
return mirror
except aioredis.RedisError as e:
await self.MirrorsLogger.log("GET", e)
raise e
async def delete(self, org: str, repo: str, version: str) -> bool:
"""Delete the cdn from the database
Returns:
bool: True if the cdn was deleted successfully, False otherwise
"""
key = await self.assemble_key(org, repo, version)
try:
await self.redis.delete(key)
await self.MirrorsLogger.log("DELETE", None, key)
return True
except aioredis.RedisError as e:
await self.MirrorsLogger.log("DELETE", e)
raise e