88 lines
2.5 KiB
Python
88 lines
2.5 KiB
Python
"""Projects catalog changes into Redis for the Shop frontend to read."""
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
|
|
from sqlalchemy.orm import Session
|
|
|
|
from core.redis_client import redis_client
|
|
|
|
from .models import Category, Product
|
|
|
|
|
|
def _product_to_dict(p: Product) -> dict:
|
|
return {
|
|
"id": p.id,
|
|
"sku": p.sku,
|
|
"name": p.name,
|
|
"description": p.description,
|
|
"price": float(p.price),
|
|
"currency": p.currency,
|
|
"stock": p.stock,
|
|
"active": p.active,
|
|
"image_url": p.image_url,
|
|
"category_id": p.category_id,
|
|
"attributes": p.attributes or {},
|
|
}
|
|
|
|
|
|
def _category_to_dict(c: Category) -> dict:
|
|
return {
|
|
"id": c.id,
|
|
"slug": c.slug,
|
|
"name": c.name,
|
|
"parent_id": c.parent_id,
|
|
"sort_order": c.sort_order,
|
|
}
|
|
|
|
|
|
def project_product(db: Session, product_id: int) -> None:
|
|
p = db.get(Product, product_id)
|
|
if not p or not p.active:
|
|
redis_client.delete(f"product:{product_id}")
|
|
_refresh_product_list(db)
|
|
return
|
|
redis_client.set(f"product:{product_id}", json.dumps(_product_to_dict(p)))
|
|
_refresh_product_list(db)
|
|
|
|
|
|
def delete_product_from_cache(product_id: int, db: Session) -> None:
|
|
redis_client.delete(f"product:{product_id}")
|
|
_refresh_product_list(db)
|
|
|
|
|
|
def _refresh_product_list(db: Session) -> None:
|
|
ids = [row[0] for row in db.query(Product.id).filter(Product.active.is_(True)).all()]
|
|
redis_client.set("product:list", json.dumps(ids))
|
|
|
|
|
|
def project_category(db: Session, category_id: int) -> None:
|
|
c = db.get(Category, category_id)
|
|
if not c:
|
|
redis_client.delete(f"category:{category_id}")
|
|
else:
|
|
redis_client.set(f"category:{category_id}", json.dumps(_category_to_dict(c)))
|
|
_refresh_category_tree(db)
|
|
|
|
|
|
def delete_category_from_cache(category_id: int, db: Session) -> None:
|
|
redis_client.delete(f"category:{category_id}")
|
|
_refresh_category_tree(db)
|
|
|
|
|
|
def _refresh_category_tree(db: Session) -> None:
|
|
cats = db.query(Category).order_by(Category.sort_order, Category.id).all()
|
|
data = [_category_to_dict(c) for c in cats]
|
|
redis_client.set("category:tree", json.dumps(data))
|
|
|
|
|
|
def rebuild_all(db: Session) -> None:
|
|
# Refresh every product/category key
|
|
for p in db.query(Product).all():
|
|
if p.active:
|
|
redis_client.set(f"product:{p.id}", json.dumps(_product_to_dict(p)))
|
|
for c in db.query(Category).all():
|
|
redis_client.set(f"category:{c.id}", json.dumps(_category_to_dict(c)))
|
|
_refresh_product_list(db)
|
|
_refresh_category_tree(db)
|