from db.models import ManaboxExportData, Box, UploadHistory from db.utils import db_transaction import uuid from datetime import datetime from sqlalchemy.orm import Session from sqlalchemy.engine.result import Row import logging logger = logging.getLogger(__name__) class BoxObject: def __init__( self, upload_id: str, set_name: str, set_code: str, cost: float = None, date_purchased: datetime = None, date_opened: datetime = None, box_id: str = None): self.upload_id = upload_id self.box_id = box_id if box_id else str(uuid.uuid4()) self.set_name = set_name self.set_code = set_code self.cost = cost self.date_purchased = date_purchased self.date_opened = date_opened class BoxService: def __init__(self, db: Session): self.db = db def _validate_upload_id(self, upload_id: str): # check if upload_history status = 'success' if self.db.query(UploadHistory).filter(UploadHistory.upload_id == upload_id).first() is None: raise Exception(f"Upload ID {upload_id} not found") if self.db.query(UploadHistory).filter(UploadHistory.upload_id == upload_id).first().status != 'success': raise Exception(f"Upload ID {upload_id} not successful") # check if at least 1 row in manabox_export_data with upload_id if self.db.query(ManaboxExportData).filter(ManaboxExportData.upload_id == upload_id).first() is None: raise Exception(f"Upload ID {upload_id} has no data") def _get_set_info(self, upload_id: str) -> list[Row[tuple[str, str]]]: # get distinct set_name, set_code from manabox_export_data for upload_id boxes = self.db.query(ManaboxExportData.set_name, ManaboxExportData.set_code).filter(ManaboxExportData.upload_id == upload_id).distinct().all() if not boxes or len(boxes) == 0: raise Exception(f"Upload ID {upload_id} has no data") return boxes def _update_manabox_export_data_box_id(self, box: Box): # based on upload_id, set_name, set_code, update box_id in manabox_export_data for all rows where box id is null with db_transaction(self.db): self.db.query(ManaboxExportData).filter( ManaboxExportData.upload_id == box.upload_id).filter( ManaboxExportData.set_name == box.set_name).filter( ManaboxExportData.set_code == box.set_code).filter( ManaboxExportData.box_id == None).update({ManaboxExportData.box_id: box.id}) def convert_upload_to_boxes(self, upload_id: str): self._validate_upload_id(upload_id) # get distinct set_name, set_code from manabox_export_data for upload_id box_set_info = self._get_set_info(upload_id) created_boxes = [] # create boxes for box in box_set_info: box_obj = BoxObject(upload_id, set_name = box.set_name, set_code = box.set_code) new_box = self.create_box(box_obj) logger.info(f"Created box {new_box.id} for upload {upload_id}") self._update_manabox_export_data_box_id(new_box) created_boxes.append(new_box) return {"status": "success", "boxes": f"{[box.id for box in created_boxes]}"} def create_box(self, box: BoxObject): with db_transaction(self.db): box_record = Box( id = box.box_id, upload_id = box.upload_id, set_name = box.set_name, set_code = box.set_code, cost = box.cost, date_purchased = box.date_purchased, date_opened = box.date_opened ) self.db.add(box_record) return box_record def get_box(self): pass def delete_box(self, box_id: str): # delete box with db_transaction(self.db): self.db.query(Box).filter(Box.id == box_id).delete() # update manabox_export_data box_id to null with db_transaction(self.db): self.db.query(ManaboxExportData).filter(ManaboxExportData.box_id == box_id).update({ManaboxExportData.box_id: None}) return {"status": "success", "box_id": box_id} def update_box(self): pass