kind of a mess lol but file caching and front end

This commit is contained in:
2025-04-17 13:28:49 -04:00
parent 21408af48c
commit 8f35cedb4a
45 changed files with 1435 additions and 1316 deletions

View File

@ -1,4 +1,4 @@
from typing import Any, Dict, Optional, Union
from typing import Any, Dict, Optional, Union, Literal
import logging
from app.services.external_api.tcgplayer.base_tcgplayer_service import BaseTCGPlayerService
from app.schemas.tcgplayer import (
@ -21,7 +21,8 @@ from app.db.database import transaction
import os
import csv
import io
from app.schemas.file import FileInDB
from datetime import datetime
logger = logging.getLogger(__name__)
class OrderManagementService(BaseTCGPlayerService):
@ -87,7 +88,12 @@ class OrderManagementService(BaseTCGPlayerService):
response = await self._make_request("GET", f"/{order_id}{self.API_VERSION}")
return response
async def get_packing_slip(self, order_ids: list[str]):
async def get_or_create_packing_slip(self, db: Session, order_ids: list[str]) -> FileInDB:
# check if the file already exists
file_service = self.get_service('file')
file = await file_service.get_file_by_metadata(db, "order_ids", order_ids, "packing_slip", "application/pdf")
if file:
return file
payload = {
"sortingType": "byRelease",
"format": "default",
@ -95,40 +101,53 @@ class OrderManagementService(BaseTCGPlayerService):
"orderNumbers": order_ids
}
response = await self._make_request("POST", self.packing_slip_endpoint, data=payload, headers=self._get_headers("POST", "application/json"), auth_required=True, download_file=True)
return response
return await file_service.save_file(
db=db,
file_data=response,
filename=f"packing_slip_{datetime.now().strftime('%Y-%m-%d_%H-%M-%S')}.pdf",
subdir='tcgplayer/packing_slips/pdf',
file_type='packing_slip',
content_type='application/pdf',
metadata={"order_ids": order_ids}
)
async def get_pull_sheet(self, order_ids: list[str]):
async def get_pull_sheet(self, db: Session, order_ids: list[str]) -> FileInDB:
payload = {
"orderNumbers": order_ids,
"timezoneOffset": -4
}
response = await self._make_request("POST", self.pull_sheet_endpoint, data=payload, headers=self._get_headers("POST", "application/json"), auth_required=True, download_file=True)
return response
# get file service
file_service = self.get_service('file')
# save file
return await file_service.save_file(
db=db,
file_data=response,
filename=f"pull_sheet_{datetime.now().strftime('%Y-%m-%d_%H-%M-%S')}.csv",
subdir='tcgplayer/pull_sheets/csv',
file_type='pull_sheet',
content_type='text/csv',
metadata={"order_ids": order_ids}
)
async def get_shipping_csv(self, order_ids: list[str]):
async def get_shipping_csv(self, db: Session, order_ids: list[str]) -> FileInDB:
payload = {
"orderNumbers": order_ids,
"timezoneOffset": -4
}
response = await self._make_request("POST", self.shipping_endpoint, data=payload, headers=self._get_headers("POST", "application/json"), auth_required=True, download_file=True)
return response
async def save_file(self, file_data: Union[bytes, list[dict]], file_name: str) -> str:
if not os.path.exists("app/data/cache/tcgplayer/orders"):
os.makedirs("app/data/cache/tcgplayer/orders")
file_path = f"app/data/cache/tcgplayer/orders/{file_name}"
if isinstance(file_data, list):
# Convert list of dictionaries to CSV bytes
output = io.StringIO()
writer = csv.DictWriter(output, fieldnames=file_data[0].keys())
writer.writeheader()
writer.writerows(file_data)
file_data = output.getvalue().encode('utf-8')
with open(file_path, "wb") as f:
f.write(file_data)
return file_path
# get file service
file_service = self.get_service('file')
# save file
return await file_service.save_file(
db=db,
file_data=response,
filename=f"shipping_{datetime.now().strftime('%Y-%m-%d_%H-%M-%S')}.csv",
subdir='tcgplayer/shipping/csv',
file_type='shipping_csv',
content_type='text/csv',
metadata={"order_ids": order_ids}
)
async def save_order_to_db(self, order: dict, db: Session):
# Parse API response using our API schema

View File

@ -1,21 +1,33 @@
from typing import Dict, List, Optional
from app.services.external_api.tcgplayer.base_tcgplayer_service import BaseTCGPlayerService
from sqlalchemy.orm import Session
from app.schemas.file import FileInDB
class TCGPlayerInventoryService(BaseTCGPlayerService):
def __init__(self):
super().__init__()
async def get_tcgplayer_export(self, export_type: str):
async def get_tcgplayer_export(self, db: Session, export_type: str) -> FileInDB:
"""
Get a TCGPlayer Staged Inventory Export, Live Inventory Export, or Pricing Export
"""
if export_type == "staged":
endpoint = self.staged_inventory_endpoint
file_type = "text/csv"
elif export_type == "live":
endpoint = self.live_inventory_endpoint
file_type = "text/csv"
elif export_type == "pricing":
endpoint = self.pricing_export_endpoint
file_type = "text/csv"
else:
raise ValueError(f"Invalid export type: {export_type}, must be 'staged', 'live', or 'pricing'")
file_bytes = await self._make_request("GET", endpoint, download_file=True)
return file_bytes
return await self.save_file(
db=db,
file_data=file_bytes,
file_name=f"tcgplayer_{export_type}_export.csv",
subdir="tcgplayer/inventory",
file_type=file_type
)