from fastapi import APIRouter, Depends, Request from fastapi.responses import HTMLResponse, RedirectResponse from sqlalchemy.orm import Session from web.auth.session import get_viewed_user from web.config import settings from web.database import get_db from web.models.connections import VkCachedAlbum, VkCachedProduct, VkConnection from web.templates_env import templates router = APIRouter() def _render(request: Request, template: str, ctx: dict) -> HTMLResponse: ctx["request"] = request ctx.setdefault("jivosite_widget_id", settings.JIVOSITE_WIDGET_ID) return templates.TemplateResponse(ctx.pop("request"), template, ctx) @router.get("/vk-catalog/albums") async def vk_catalog_albums(request: Request, db: Session = Depends(get_db)): try: real_user, viewed_user = get_viewed_user(request, db) except Exception: return RedirectResponse("/login", 303) vk_conn = db.query(VkConnection).filter_by(user_id=viewed_user.id).first() albums = ( db.query(VkCachedAlbum) .filter(VkCachedAlbum.user_id == viewed_user.id) .order_by(VkCachedAlbum.title) .all() ) return _render(request, "vk_catalog/albums.html", { "user": real_user, "viewed_user": viewed_user if viewed_user.id != real_user.id else None, "albums": albums, "vk_conn": vk_conn, "refresh_interval": settings.CATALOG_REFRESH_INTERVAL_SECONDS, }) @router.get("/vk-catalog/albums/{album_id}/products") async def vk_catalog_products(album_id: str, request: Request, db: Session = Depends(get_db)): try: real_user, viewed_user = get_viewed_user(request, db) except Exception: return RedirectResponse("/login", 303) album = db.query(VkCachedAlbum).filter_by(user_id=viewed_user.id, album_id=album_id).first() if not album: return RedirectResponse("/vk-catalog/albums", 303) products = ( db.query(VkCachedProduct) .filter(VkCachedProduct.user_id == viewed_user.id, VkCachedProduct.album_id == album_id) .order_by(VkCachedProduct.name) .all() ) return _render(request, "vk_catalog/products.html", { "user": real_user, "viewed_user": viewed_user if viewed_user.id != real_user.id else None, "album": album, "products": products, })