import json from products.db import Product, find_product_by_tag, find_product_by_product_id, insert_product, get_tags, add_tag, find_product_by_id from products.scraping import scrape_woolies_data, get_product_id, get_product_details_url from typing import List async def create_product(link: str) -> Product: product_id = get_product_id(link) if not product_id: return None, None product_url = get_product_details_url(product_id) product, data = None, await scrape_woolies_data(product_url) if data: product = Product( id=0, product_id=product_id, name=data['Product']['Name'], link=link, img_small=data['Product']['SmallImageFile'], img_large=data['Product']['LargeImageFile'], ) return product, data async def add_missing_tags(conn, product: Product, tags: List[str]): existing_tags = set() async for tag in get_tags(conn, product): existing_tags.add(tag) remaining_tags = set(tags) - existing_tags if not remaining_tags: return False for tag in remaining_tags: await add_tag(conn, product, tag) return product async def get_or_create(conn, url: str, tags: List[str]) -> Product: product_id = get_product_id(url) if not product_id: return None existing = await find_product_by_product_id(conn, product_id) if existing: await add_missing_tags(conn, existing, tags) return existing product, data = await create_product(url) if product: await insert_product(conn, product, data) await add_missing_tags(conn, product, tags) return product