first commit
This commit is contained in:
110
app/api/v1/task.py
Normal file
110
app/api/v1/task.py
Normal file
@ -0,0 +1,110 @@
|
||||
import asyncio
|
||||
import uuid
|
||||
from time import time
|
||||
|
||||
from fastapi import APIRouter
|
||||
|
||||
from app import mongo
|
||||
from app.providers import wildberries, ozon
|
||||
from app.utils.response_util import response
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
|
||||
async def update_task_status(task_id: str, status: str, message: str):
|
||||
await mongo.tasks_collection.update_one(
|
||||
{"taskId": task_id},
|
||||
{"$set": {"status": status, "message": message, "updatedAt": time()}}
|
||||
)
|
||||
|
||||
|
||||
async def process_synchronization(task_id: str, marketplace: dict):
|
||||
try:
|
||||
if marketplace["baseMarketplaceKey"] == "wb":
|
||||
products = wildberries.load_all_products(marketplace["authData"]["Authorization"])
|
||||
elif marketplace["baseMarketplaceKey"] == "ozon":
|
||||
products = ozon.load_all_products(marketplace["authData"]["Client-Id"], marketplace["authData"]["Api-Key"])
|
||||
else:
|
||||
products = []
|
||||
|
||||
client_id = marketplace["clientId"]
|
||||
client = await mongo.clients_collection.find_one(
|
||||
{"id": client_id}, {"_id": False}
|
||||
)
|
||||
|
||||
if client and client.get("barcodeTemplate"):
|
||||
barcode_template = client["barcodeTemplate"]
|
||||
else:
|
||||
barcode_template = await mongo.templates_collection.find_one({}, {"_id": False})
|
||||
|
||||
for product in products:
|
||||
for barcode in product["barcodes"]:
|
||||
product_data = product.copy()
|
||||
product_data["clientId"] = client_id
|
||||
product_data["barcodes"] = [barcode]
|
||||
product_data["barcodeTemplate"] = barcode_template
|
||||
|
||||
barcodes_with_sizes = product_data.get("barcodesWithSizes")
|
||||
if barcodes_with_sizes:
|
||||
product_data["size"] = barcodes_with_sizes.get(barcode)
|
||||
|
||||
existing_product = await mongo.products_collection.find_one({"clientId": client_id, "article": product_data["article"], "barcodes": product_data["barcodes"]})
|
||||
|
||||
if existing_product:
|
||||
await mongo.products_collection.update_one(
|
||||
{"_id": existing_product["_id"]},
|
||||
{"$set": product_data}
|
||||
)
|
||||
else:
|
||||
product_data["id"] = await mongo.get_next_id(mongo.products_collection)
|
||||
await mongo.products_collection.insert_one(product_data)
|
||||
|
||||
await update_task_status(task_id, "SUCCESS", "Товары успешно синхронизированы")
|
||||
except Exception:
|
||||
await update_task_status(task_id, "FAILURE", "Ошибка синхронизации товаров")
|
||||
raise
|
||||
|
||||
|
||||
@router.post("/synchronize-marketplace", tags=[""])
|
||||
async def sync(params: dict):
|
||||
start_time = time()
|
||||
task_id = str(uuid.uuid4())
|
||||
|
||||
marketplace = await mongo.marketplaces_collection.find_one({"id": params["marketplaceId"]})
|
||||
if not marketplace:
|
||||
return response({"message": "Маркетплейс не найден", "ok": False}, start_time=start_time)
|
||||
|
||||
task = {
|
||||
"taskId": task_id,
|
||||
"marketplaceId": params["marketplaceId"],
|
||||
"status": "STARTED",
|
||||
"message": "Синхронизация товаров запущена",
|
||||
"createdAt": start_time,
|
||||
"updatedAt": start_time
|
||||
}
|
||||
|
||||
await mongo.tasks_collection.insert_one(task)
|
||||
asyncio.create_task(process_synchronization(task_id, marketplace))
|
||||
|
||||
return response({
|
||||
"ok": True,
|
||||
"status": task["status"],
|
||||
"message": task["message"],
|
||||
"taskId": task_id
|
||||
}, start_time=start_time)
|
||||
|
||||
|
||||
@router.get("/info/{task_id}")
|
||||
async def task_info(task_id: str):
|
||||
start_time = time()
|
||||
task = await mongo.tasks_collection.find_one({"taskId": task_id}, {"_id": False})
|
||||
|
||||
if not task:
|
||||
return response({"message": "Задача не найдена", "ok": False}, start_time=start_time)
|
||||
|
||||
return response({
|
||||
"ok": True,
|
||||
"status": "SUCCESS",
|
||||
"message": task["message"],
|
||||
"taskId": task_id
|
||||
}, start_time=start_time)
|
||||
Reference in New Issue
Block a user