58 lines
1.7 KiB
Python
58 lines
1.7 KiB
Python
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
|