import redis from redis.lock import Lock from spotify_charts_notifications.constants import APP_NAME, REDIS_KEY_TTL, REDIS_LOCK_TTL def get_key(key: str) -> str: """Compose a Redis key. Args: key (str): Key. Returns: str: Complete key constructed by concatenated prefix + key. """ return f'{APP_NAME}/{key}' def get_redis_lock(redis_client: redis.StrictRedis) -> Lock: """Get redis lock""" return redis_client.lock(get_key('lock'), timeout=REDIS_LOCK_TTL) def remove_old_keys( redis_client: redis.Redis, current_date: str, market: str) -> None: """Remove old keys from redis Args: redis_client: Redis Client current_date: Date with %Y-%m-%d format. market: Market short name. """ keys = redis_client.keys(get_key('*')) keys_to_remove = [] for key in keys: try: key_market, key_date = key.decode().split('/')[1:3] except (ValueError, IndexError): continue if key_market == market and key_date != current_date: keys_to_remove.append(key) if keys_to_remove: redis_client.delete(*keys_to_remove) def is_new_track( date: str, label: str, market: str, user_id: str, track_id: str, redis_client: redis.StrictRedis ) -> bool: """Checking is track new or we have already fetched it today Args: date: Date with %Y-%m-%d format. label: One of added, dropped, moves. market: Market short name. user_id: User ID. track_id: Song ID. redis_client: Redis client. Returns: Boolean """ remove_old_keys(redis_client, date, market) redis_key = get_key(f'{market}/{date}/{user_id}/{label}') if redis_client.sismember(redis_key, track_id): return False redis_client.sadd(redis_key, track_id) redis_client.expire(redis_key, REDIS_KEY_TTL) return True