kind of a mess lol but file caching and front end
This commit is contained in:
@ -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
|
||||
|
@ -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
|
||||
)
|
Reference in New Issue
Block a user