1- from typing import Any
1+ import logging
2+
23from fastapi import APIRouter , Depends , HTTPException , Query , status
3- from sqlalchemy .orm import Session
4- from sqlalchemy .exc import SQLAlchemyError
54from sqlalchemy import not_
6- from api .v1 .models .blog import Blog
7- from api .v1 .schemas .blog import BlogCreateSchema , BlogResponseSchema
5+ from sqlalchemy .exc import SQLAlchemyError
6+ from sqlalchemy .orm import Session
7+
88from api .db .database import get_db
9- import logging
9+ from api .v1 .models .blog import Blog
10+ from api .v1 .schemas .blog import (
11+ BlogCreateResponseSchema ,
12+ BlogCreateSchema ,
13+ BlogListItemResponseSchema ,
14+ BlogListResponseSchema ,
15+ )
1016
1117blog = APIRouter (prefix = "/blogs" , tags = ["Blog" ])
1218
1521
1622@blog .post (
1723 "" ,
18- response_model = BlogResponseSchema ,
24+ response_model = BlogCreateResponseSchema ,
1925 status_code = status .HTTP_201_CREATED ,
2026)
21- async def create_blog (blog : BlogCreateSchema , db : Session = Depends (get_db )):
27+ async def create_blog (
28+ blog : BlogCreateSchema ,
29+ db : Session = Depends (get_db ),
30+ ) -> BlogCreateResponseSchema :
2231 try :
2332 existing_blog = db .query (Blog ).filter (Blog .title == blog .title ).first ()
2433 if existing_blog :
@@ -38,7 +47,8 @@ async def create_blog(blog: BlogCreateSchema, db: Session = Depends(get_db)):
3847 db .commit ()
3948 db .refresh (new_blog )
4049 logger .info (f"Blog post '{ new_blog .title } ' created successfully." )
41- return new_blog
50+
51+ return BlogCreateResponseSchema .model_validate (new_blog .__dict__ )
4252
4353 except HTTPException as http_err :
4454 logger .warning (f"HTTP error occurred: { http_err .detail } " )
@@ -59,12 +69,16 @@ async def create_blog(blog: BlogCreateSchema, db: Session = Depends(get_db)):
5969 )
6070
6171
62- @blog .get ("" , status_code = status .HTTP_200_OK )
72+ @blog .get (
73+ "" ,
74+ response_model = BlogListResponseSchema ,
75+ status_code = status .HTTP_200_OK ,
76+ )
6377async def list_blog (
6478 page : int = Query (1 , ge = 1 ),
6579 page_size : int = Query (10 , ge = 1 , le = 100 ),
6680 db : Session = Depends (get_db ),
67- ) -> dict [ str , Any ] :
81+ ) -> BlogListResponseSchema :
6882 try :
6983 offset = (page - 1 ) * page_size
7084 query = (
@@ -84,22 +98,22 @@ async def list_blog(
8498 prev_page = f"/api/v1/blogs?page={ page - 1 } &page_size={ page_size } "
8599
86100 results = [
87- {
88- "id" : blog .id ,
89- " title" : blog .title ,
90- " excerpt" : blog .excerpt ,
91- " image_url" : blog .image_url ,
92- " created_at" : blog .created_at ,
93- }
101+ BlogListItemResponseSchema (
102+ id = blog .id ,
103+ title = blog .title ,
104+ excerpt = blog .excerpt ,
105+ image_url = blog .image_url ,
106+ created_at = blog .created_at ,
107+ )
94108 for blog in blogs
95109 ]
96110
97- return {
98- " count" : total_count ,
99- " next" : next_page ,
100- " previous" : prev_page ,
101- " results" : results ,
102- }
111+ return BlogListResponseSchema (
112+ count = total_count ,
113+ next = next_page ,
114+ previous = prev_page ,
115+ results = results ,
116+ )
103117
104118 except SQLAlchemyError as e :
105119 logger .error (f"Database error occurred: { e } " )
0 commit comments