Files
d3m0k1d.ru/backend/app/api/v1/posts.py
2025-11-24 14:45:08 +03:00

76 lines
2.1 KiB
Python

from typing import Optional, Sequence
from fastapi import APIRouter, Depends, HTTPException, Query
from sqlalchemy import select, delete
from sqlalchemy.ext.asyncio import AsyncSession
from app.schemas.posts import PostCreate, PostRead
from app.db_engine import get_async_session
from app.models.posts import Post
router = APIRouter(
prefix="/posts",
tags=["posts"],
responses={404: {"description": "Not found"}},
)
@router.get("/")
async def get_posts(
page: int = Query(1, ge=1),
page_size: int = Query(10, ge=1, le=100),
db: AsyncSession = Depends(get_async_session),
):
offset = (page - 1) * page_size
stmt = select(Post).order_by(Post.id).offset(offset).limit(page_size)
result = await db.execute(stmt)
posts: Sequence[Post] = result.scalars().all()
return posts
@router.get("/{id}", response_model=PostRead)
async def get_post(id: int, db: AsyncSession = Depends(get_async_session)):
post = await db.get(Post, id)
if post is None:
raise HTTPException(status_code=404, detail="Post not found")
else:
return post
@router.post("/", response_model=PostRead)
async def create_post(
title: str,
content: str,
images: Optional[str] = None,
db: AsyncSession = Depends(get_async_session),
) -> Post:
try:
post = PostCreate(title=title, content=content, images=images)
except Exception as e:
raise HTTPException(status_code=423, detail=str("Validation error"))
new_post = Post(title=post.title, content=post.content, images=post.images)
try:
db.add(new_post)
await db.commit()
await db.refresh(new_post)
except Exception as e:
raise HTTPException(status_code=400, detail=str(e))
return new_post
@router.put("/{id}")
async def update_post(id: int, db: AsyncSession = Depends(get_async_session)):
pass
@router.delete("/{id}")
async def delete_post(id: int, db: AsyncSession = Depends(get_async_session)):
stmt = delete(Post).where(Post.id == id)
await db.execute(stmt)
await db.commit()
return {"message": f"Post with id {id} deleted"}