From 4873082147ab36d1fe8a803883c8dbde4b1ce71c Mon Sep 17 00:00:00 2001 From: Yariv Menachem Date: Sun, 5 Jan 2025 17:41:48 +0200 Subject: [PATCH] all data saved to db at the last step, cache works ! --- requirements.txt | Bin 1142 -> 1176 bytes src/config/cache_manager.py | 17 +++++ src/model/User.py | 3 + src/model/user_repository.py | 17 ++--- .../telegram_start_handler.py | 67 +++++++----------- 5 files changed, 53 insertions(+), 51 deletions(-) create mode 100644 src/config/cache_manager.py diff --git a/requirements.txt b/requirements.txt index 5b69741ce820ca9fa1d7da4ab42d1907119a36e5..723ff53c3c492b5d08d647a72972ad63d25e8bc1 100644 GIT binary patch delta 42 scmeyyF@tkM8H*Ax0~bRwLn07oFr+dhG2}B;Fw`;FGMF&vfw3V20MC5~@Bjb+ delta 7 OcmbQi`Hf>k84CamQv%8W diff --git a/src/config/cache_manager.py b/src/config/cache_manager.py new file mode 100644 index 0000000..e65c67f --- /dev/null +++ b/src/config/cache_manager.py @@ -0,0 +1,17 @@ +from cachebox import LRUCache + + +class CacheboxCacheManager: + def __init__(self): + self._cache = LRUCache(50) + + def find(self, cache_id: str): + """Finding cached data by id, else None""" + return self._cache.get(cache_id) + + def save(self, cache_id: str, data): + """Finding cached data by id, else None""" + self._cache.insert(cache_id, data) + + +cache_manager = CacheboxCacheManager() diff --git a/src/model/User.py b/src/model/User.py index 72ebfad..cf5cee7 100644 --- a/src/model/User.py +++ b/src/model/User.py @@ -9,4 +9,7 @@ class User(BaseModel): full_name: str username: str chat_id: Union[int, str] = None + experience: Union[int, str] = None field: Optional[Position] = None + cities: Optional[list[str]] = None + title_filters: Optional[list[str]] = None diff --git a/src/model/user_repository.py b/src/model/user_repository.py index 6003825..f7ca798 100644 --- a/src/model/user_repository.py +++ b/src/model/user_repository.py @@ -4,6 +4,7 @@ from cachebox import LRUCache from dotenv import load_dotenv from pymongo import UpdateOne +from config.cache_manager import cache_manager from jobspy import create_logger from .User import User from .monogo_db import mongo_client @@ -13,7 +14,6 @@ load_dotenv() class UserRepository: def __init__(self): - self._cache = LRUCache(50) self._logger = create_logger("UserRepository") self._collection = mongo_client.get_collection('user') self._collection.create_index('username', unique=True) @@ -29,15 +29,15 @@ class UserRepository: The user document if found, otherwise None. """ user = None - cached_user = self._cache[user_id] + cached_user = cache_manager.find(user_id) if cached_user: - return User(**cached_user) + return cached_user result = self._collection.find_one({"id": user_id}) if result: user = User(**result) - self._cache[user_id] = user + cache_manager.save(user_id, user) return user @@ -52,15 +52,15 @@ class UserRepository: The user document if found, otherwise None. """ user = None - cached_user = self._cache.get(username) + cached_user = cache_manager.find(username) if cached_user: return cached_user - self._logger.info("Find user by username") result = self._collection.find_one({"username": username}) + self._logger.info("find user by usernameeeeeeee") if result: user = User(**result) - self._cache[username] = user + cache_manager.save(username, user) return user @@ -74,7 +74,7 @@ class UserRepository: Returns: True if the update was successful, False otherwise. """ - result = self._collection.update_one({"id": user.id}, {"$set": user.model_dump()}) + result = self._collection.update_one({"username": user.username}, {"$set": user.model_dump()}) return result.modified_count > 0 def insert_user(self, user: User): @@ -88,6 +88,7 @@ class UserRepository: Exception: If an error occurs during insertion. """ self._collection.insert_one(user.model_dump()) + cache_manager.save(user.username, user) self._logger.info(f"Inserted new user with username {user.username}.") def insert_many_if_not_found(self, users: list[User]) -> tuple[list[User], list[User]]: diff --git a/src/telegram_handler/telegram_start_handler.py b/src/telegram_handler/telegram_start_handler.py index 37f76ce..7d60fc9 100644 --- a/src/telegram_handler/telegram_start_handler.py +++ b/src/telegram_handler/telegram_start_handler.py @@ -5,6 +5,7 @@ from telegram.ext import ( ContextTypes, ConversationHandler, CommandHandler, MessageHandler, filters, ) +from config.cache_manager import cache_manager from jobspy.scrapers.utils import create_logger from model.Position import Position from model.User import User @@ -13,7 +14,6 @@ from telegram_bot import TelegramBot from telegram_handler.start_handler_constats import START_MESSAGE, POSITION_MESSAGE, POSITION_NOT_FOUND, \ LOCATION_MESSAGE, EXPERIENCE_MESSAGE, FILTER_TILE_MESSAGE, THANK_YOU_MESSAGE, BYE_MESSAGE, VERIFY_MESSAGE, \ SEARCH_MESSAGE -from telegram_handler.telegram_handler import TelegramHandler class Flow(Enum): @@ -26,14 +26,11 @@ class Flow(Enum): SKIP_FILTERS = 6 -class TelegramStartHandler(TelegramHandler): +class TelegramStartHandler: def __init__(self): - self.filters = None self.telegram_bot = TelegramBot() self.logger = create_logger("TelegramStartHandler") - self.temp_user = None - self.cities = None async def start(self, update: Update, context: ContextTypes.DEFAULT_TYPE) -> int: """Starts the conversation and asks the user about their position.""" @@ -70,18 +67,23 @@ class TelegramStartHandler(TelegramHandler): reply_markup=reply_markup, ) return Flow.POSITION.value - + cached_user: User = cache_manager.find(user.username) + cached_user.field = position + cache_manager.save(cached_user.username, cached_user) await update.message.reply_text(LOCATION_MESSAGE) return Flow.ADDRESS.value async def address(self, update: Update, context: ContextTypes.DEFAULT_TYPE) -> int: """Asks for a location.""" - user = update.message.from_user - self.cities = update.message.text.split(",") + cities = update.message.text.split(",") reply_markup = ReplyKeyboardMarkup([[KeyboardButton("Yes"), KeyboardButton("No")]], one_time_keyboard=True, input_field_placeholder=Flow.VERIFY_ADDRESS.name) - await update.message.reply_text(VERIFY_MESSAGE % self.cities, reply_markup=reply_markup) + await update.message.reply_text(VERIFY_MESSAGE % cities, reply_markup=reply_markup) + + cached_user: User = cache_manager.find(update.message.from_user.username) + cached_user.cities = cities + cache_manager.save(cached_user.username, cached_user) return Flow.VERIFY_ADDRESS.value @@ -103,17 +105,23 @@ class TelegramStartHandler(TelegramHandler): """Asks for a experience.""" user = update.message.from_user self.logger.info("Experience of %s: %s", user.first_name, update.message.text) - + cached_user: User = cache_manager.find(update.message.from_user.username) + cached_user.experience = update.message.text + cache_manager.save(cached_user.username, cached_user) await update.message.reply_text( FILTER_TILE_MESSAGE) return Flow.FILTERS.value async def filters_flow(self, update: Update, context: ContextTypes.DEFAULT_TYPE) -> int: """Asks for a filters_flow.""" - self.filters = update.message.text.split(",") + title_filters = update.message.text.split(",") reply_markup = ReplyKeyboardMarkup([[KeyboardButton("Yes"), KeyboardButton("No")]], one_time_keyboard=True, input_field_placeholder=Flow.VERIFY_FILTERS.name) - await update.message.reply_text(VERIFY_MESSAGE % self.filters, reply_markup=reply_markup) + await update.message.reply_text(VERIFY_MESSAGE % title_filters, reply_markup=reply_markup) + + cached_user: User = cache_manager.find(update.message.from_user.username) + cached_user.title_filters = title_filters + cache_manager.save(cached_user.username, cached_user) return Flow.VERIFY_FILTERS.value @@ -125,7 +133,8 @@ class TelegramStartHandler(TelegramHandler): await update.message.reply_text(THANK_YOU_MESSAGE) await update.message.reply_text(SEARCH_MESSAGE) - + cached_user: User = cache_manager.find(update.message.from_user.username) + user_repository.update(cached_user) return ConversationHandler.END async def skip_filter(self, update: Update, context: ContextTypes.DEFAULT_TYPE) -> int: @@ -144,38 +153,10 @@ class TelegramStartHandler(TelegramHandler): await update.message.reply_text( BYE_MESSAGE, reply_markup=ReplyKeyboardRemove() ) - + cached_user: User = cache_manager.find(user.username) + user_repository.update(cached_user.username, cached_user) return ConversationHandler.END - async def handle(self, update: Update, context: ContextTypes.DEFAULT_TYPE): - self.logger.info("start handling") - # chat: Chat = update.message.chat - # chat.id - 368620919 - # chat.username - 'Qw1zeR' - # chat.full_name - 'Qw1zeR' - # user = User(full_name=chat.full_name, username=chat.username, chat_id=chat.id) - # user_repository.insert_user(user) - # fields = field_repository.find_all() # Get all fields from the database - # buttons = [[KeyboardButton(field.name)] for field in fields] - # reply_markup = ReplyKeyboardMarkup(buttons, one_time_keyboard=True) - # - # await update.message.reply_text("Please select your field:", reply_markup=reply_markup) - # await self.telegram_bot.set_message_reaction( - # update.message.message_id, ReactionEmoji.FIRE) - # site_names = [site.name for site in self.sites_to_scrap] - # site_names_print = ", ".join(site_names) - # await self.telegram_bot.send_text( - # f"Start scarping: {site_names_print}") - # self.logger.info(f"Found {len(jobs)} jobs") - # self.jobRepository.insert_many_if_not_found(filtered_out_jobs) - # old_jobs, new_jobs = self.jobRepository.insert_many_if_not_found(jobs) - # for newJob in new_jobs: - # await self.telegram_bot.send_job(newJob) - # self.logger.info(f"Found {len(old_jobs)} old jobs") - # await self.telegram_bot.send_text( - # f"Finished scarping: {site_names_print}") - self.logger.info("finished handling") - start_handler = TelegramStartHandler() start_conv_handler = ConversationHandler(