bugbounty_gpt/db/db_handler.py (44 lines of code) (raw):

from bugbounty_gpt.db.models import Submission from sqlalchemy import select import logging logger = logging.getLogger(__name__) async def _find_submission_by_id(session, submission_id): """ Fetches a submission from the database by its ID. :param session: Database session object. :param submission_id: ID of the submission to be fetched. :return: Submission object if found, None otherwise. """ logger.info(f"Fetching submission {submission_id} from database.") stmt = select(Submission).filter(Submission.submission_id == submission_id) result = await session.execute(stmt) return result.scalar_one_or_none() async def insert_submission(session, submission_data): """ Inserts a new submission into the database if it does not exist. :param session: Database session object. :param submission_data: Dictionary containing the submission data. """ submission_id = submission_data['submission_id'] logger.info(f"Checking if submission {submission_id} already exists.") existing_submission = await _find_submission_by_id(session, submission_id) if existing_submission: logger.info(f"Submission {submission_id} already exists, skipping insert.") else: logger.info(f"Inserting submission {submission_id}.") async with session: submission = Submission(**submission_data) session.add(submission) await session.commit() async def update_submission_state(session, submission_id, new_state): """ Updates the state of a submission in the database. :param session: Database session object. :param submission_id: ID of the submission to be updated. :param new_state: New state to be assigned to the submission. :return: True if the update was successful, False otherwise. """ logger.info(f"Updating submission {submission_id}.") async with session: submission = await _find_submission_by_id(session, submission_id) if submission: submission.submission_state = new_state await session.commit() return True else: return False async def fetch_submission_by_state_and_classification(session, states, classifications): """ Fetches submissions that meet certain state and classification criteria. :param session: Database session object. :param states: List of states to filter the submissions. :param classifications: List of classifications to filter the submissions. :return: List of submissions that meet the criteria. """ logger.info("Fetching submissions meeting states & classification criteria.") async with session: stmt = select(Submission).filter( Submission.submission_state.in_(states), Submission.classification.in_(classifications) ) result = await session.execute(stmt) return result.scalars().all() async def fetch_submission_by_id(session, submission_id): """ Fetches a submission from the database by its ID. :param session: Database session object. :param submission_id: ID of the submission to be fetched. :return: Submission object if found, None otherwise. """ logger.info(f"Fetching submission {submission_id} from database.") async with session: return session.query(Submission).filter(Submission.submission_id == submission_id).first()