|
# retoor <retoor@molodetz.nl>
|
|
|
|
from .core import _in_clause, _now_iso, db, get_table
|
|
|
|
|
|
SEO_META_TYPES = ("post", "project", "gist", "news", "issue")
|
|
|
|
|
|
def get_seo_metadata(target_type: str, target_uid: str) -> dict | None:
|
|
if not target_type or not target_uid or "seo_metadata" not in db.tables:
|
|
return None
|
|
row = get_table("seo_metadata").find_one(
|
|
target_type=target_type,
|
|
target_uid=str(target_uid),
|
|
status="ready",
|
|
deleted_at=None,
|
|
)
|
|
return dict(row) if row else None
|
|
|
|
|
|
def get_seo_metadata_batch(target_type: str, uids: list) -> dict:
|
|
uids = [str(uid) for uid in (uids or []) if uid]
|
|
if not uids or "seo_metadata" not in db.tables:
|
|
return {}
|
|
placeholders, params = _in_clause(uids)
|
|
params["tt"] = target_type
|
|
rows = db.query(
|
|
"SELECT * FROM seo_metadata WHERE target_type = :tt AND status = 'ready' "
|
|
f"AND deleted_at IS NULL AND target_uid IN ({placeholders})",
|
|
**params,
|
|
)
|
|
return {row["target_uid"]: dict(row) for row in rows}
|
|
|
|
|
|
def has_fresh_seo_metadata(target_type: str, target_uid: str) -> bool:
|
|
return get_seo_metadata(target_type, target_uid) is not None
|
|
|
|
|
|
def upsert_seo_metadata(
|
|
target_type: str,
|
|
target_uid: str,
|
|
seo_title: str,
|
|
seo_description: str,
|
|
seo_keywords: str,
|
|
status: str,
|
|
source: str,
|
|
) -> None:
|
|
if not target_type or not target_uid:
|
|
return
|
|
from devplacepy.utils import generate_uid
|
|
|
|
table = get_table("seo_metadata")
|
|
now = _now_iso()
|
|
generated_at = now if status == "ready" else ""
|
|
existing = table.find_one(target_type=target_type, target_uid=str(target_uid))
|
|
payload = {
|
|
"target_type": target_type,
|
|
"target_uid": str(target_uid),
|
|
"seo_title": seo_title,
|
|
"seo_description": seo_description,
|
|
"seo_keywords": seo_keywords,
|
|
"status": status,
|
|
"source": source,
|
|
"generated_at": generated_at,
|
|
"updated_at": now,
|
|
"deleted_at": None,
|
|
"deleted_by": None,
|
|
}
|
|
if existing:
|
|
payload["id"] = existing["id"]
|
|
table.update(payload, ["id"])
|
|
else:
|
|
payload["uid"] = generate_uid()
|
|
payload["created_at"] = now
|
|
table.insert(payload)
|
|
|
|
|
|
def mark_seo_metadata_stale(target_type: str, target_uid: str) -> None:
|
|
if not target_type or not target_uid or "seo_metadata" not in db.tables:
|
|
return
|
|
table = get_table("seo_metadata")
|
|
existing = table.find_one(target_type=target_type, target_uid=str(target_uid))
|
|
if existing:
|
|
table.update(
|
|
{"id": existing["id"], "status": "pending", "updated_at": _now_iso()},
|
|
["id"],
|
|
)
|