100 lines
4.2 KiB
Python
100 lines
4.2 KiB
Python
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
|
|
|