"""Likes app data endpoints.""" from __future__ import annotations from quart import Blueprint, g, jsonify, request from shared.infrastructure.data_client import DATA_HEADER def register() -> Blueprint: bp = Blueprint("data", __name__, url_prefix="/internal/data") @bp.before_request async def _require_data_header(): if not request.headers.get(DATA_HEADER): return jsonify({"error": "forbidden"}), 403 from shared.infrastructure.internal_auth import validate_internal_request if not validate_internal_request(): return jsonify({"error": "forbidden"}), 403 _handlers: dict[str, object] = {} @bp.get("/") async def handle_query(query_name: str): handler = _handlers.get(query_name) if handler is None: return jsonify({"error": "unknown query"}), 404 result = await handler() return jsonify(result) # --- is-liked --- async def _is_liked(): """Check if a user has liked a specific target.""" from sqlalchemy import select from likes.models.like import Like user_id = request.args.get("user_id", type=int) target_type = request.args.get("target_type", "") target_slug = request.args.get("target_slug") target_id = request.args.get("target_id", type=int) if not user_id or not target_type: return {"liked": False} filters = [ Like.user_id == user_id, Like.target_type == target_type, Like.deleted_at.is_(None), ] if target_slug is not None: filters.append(Like.target_slug == target_slug) elif target_id is not None: filters.append(Like.target_id == target_id) else: return {"liked": False} row = await g.s.scalar(select(Like.id).where(*filters)) return {"liked": row is not None} _handlers["is-liked"] = _is_liked # --- liked-slugs --- async def _liked_slugs(): """Return all liked target_slugs for a user + target_type.""" from sqlalchemy import select from likes.models.like import Like user_id = request.args.get("user_id", type=int) target_type = request.args.get("target_type", "") if not user_id or not target_type: return [] result = await g.s.execute( select(Like.target_slug).where( Like.user_id == user_id, Like.target_type == target_type, Like.target_slug.isnot(None), Like.deleted_at.is_(None), ) ) return list(result.scalars().all()) _handlers["liked-slugs"] = _liked_slugs # --- liked-ids --- async def _liked_ids(): """Return all liked target_ids for a user + target_type.""" from sqlalchemy import select from likes.models.like import Like user_id = request.args.get("user_id", type=int) target_type = request.args.get("target_type", "") if not user_id or not target_type: return [] result = await g.s.execute( select(Like.target_id).where( Like.user_id == user_id, Like.target_type == target_type, Like.target_id.isnot(None), Like.deleted_at.is_(None), ) ) return list(result.scalars().all()) _handlers["liked-ids"] = _liked_ids return bp