first commit

This commit is contained in:
2025-07-24 20:13:47 +03:00
commit 94b7585f8b
175 changed files with 85264 additions and 0 deletions

110
app/api/v1/task.py Normal file
View 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)