diff --git a/api/v1/services/blog.py b/api/v1/services/blog.py index 58f2896e5..f69af2abc 100644 --- a/api/v1/services/blog.py +++ b/api/v1/services/blog.py @@ -52,11 +52,43 @@ def create(self, schema: BlogCreate, author_id: str): self.db.refresh(new_blogpost) return new_blogpost - def fetch_all(self): - """Fetch all blog posts""" + def fetch_all( + self, + sort_by: Optional[str] = "created_at", + sort_order: Optional[str] = "desc", + author_id: Optional[str] = None, + category: Optional[str] = None, + limit: int = 10, + offset: int = 0 + ): + """Fetch all blog posts with sorting, filtering, and pagination""" + + query = self.db.query(Blog).filter(Blog.is_deleted.is_(False)) + + # Validate sort_by field + valid_columns = {column.key for column in inspect(Blog).columns} + if sort_by not in valid_columns: + sort_by = "created_at" # Default to a safe column + + # Apply filters + if author_id: + query = query.filter(Blog.author_id == author_id) + if category: + query = query.filter(Blog.category.ilike(f"%{category}%")) + + total_count = query.count() + + # Apply sorting + if sort_order == "desc": + query = query.order_by(desc(getattr(Blog, sort_by))) + else: + query = query.order_by(asc(getattr(Blog, sort_by))) + + # Apply pagination + total_count = query.count() + blogs = query.offset(offset).limit(limit).all() - blogs = self.db.query(Blog).filter(Blog.is_deleted == False).all() - return blogs + return {"total_count": total_count, "blogs": blogs} def fetch(self, blog_id: str): """Fetch a blog post by its ID"""