from __future__ import annotations from fastapi import APIRouter, Depends, Query from fastapi.exceptions import HTTPException from sqlalchemy import func, select from sqlalchemy.ext.asyncio import AsyncSession from core.authx import auth from core.db import get_db from models.video_model import Channel, Video from schemas.video_schemas import VideoDetailOut, VideoOut, VideosResponse router = APIRouter() @router.get("/videos", response_model=VideosResponse, dependencies=[Depends(auth.access_token_required)]) async def videos( page: int = Query(1, ge=1), per_page: int = Query(24, ge=1), session: AsyncSession = Depends(get_db), # noqa: B008 ): offset = (page - 1) * per_page query = ( select(Video, Channel.name.label("channel_name")) .join(Channel, Channel.id == Video.channel_id) .order_by(func.random()) .offset(offset) .limit(per_page) ) result = await session.execute(query) rows = result.all() videos = [] for v, channel_name in rows: v_out = VideoOut.model_validate(v) v_out.channel_name = channel_name videos.append(v_out) return { "videos": videos, "page_inc": f"/videos?page={page + 1}&per_page={per_page}", "page_dec": f"/videos?page={max(1, page - 1)}&per_page={per_page}", } @router.get("/video", response_model=VideoDetailOut, dependencies=[Depends(auth.access_token_required)]) async def video(id: int = Query(...), session: AsyncSession = Depends(get_db)): # noqa: B008 query = select(Video).where(Video.id == id) result = await session.execute(query) video = result.scalar() if video is None: raise HTTPException(status_code=404, detail="Video not found") return video