Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
109 changes: 86 additions & 23 deletions Backend/app/routes/post.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from fastapi import APIRouter, Depends, HTTPException
from fastapi import APIRouter, Depends, HTTPException, Query
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.future import select
from ..db.db import AsyncSessionLocal
Expand All @@ -10,8 +10,8 @@
UserCreate, AudienceInsightsCreate, SponsorshipCreate, UserPostCreate,
SponsorshipApplicationCreate, SponsorshipPaymentCreate, CollaborationCreate
)
from ..utils.pagination import get_pagination_params, paginate_query

from fastapi import APIRouter, HTTPException
import os
from supabase import create_client, Client
from dotenv import load_dotenv
Expand Down Expand Up @@ -53,9 +53,18 @@ async def create_user(user: UserCreate):
return response

@router.get("/users/")
async def get_users():
result = supabase.table("users").select("*").execute()
return result
async def get_users(
skip: int = Query(0, ge=0, description="Number of records to skip"),
limit: int = Query(50, ge=1, le=100, description="Maximum number of records to return")
):
skip, limit = get_pagination_params(skip, limit)
start = skip
end = skip + limit - 1

result = supabase.table("users").select("*").order("id").range(start, end).execute()
count_result = supabase.table("users").select("*", count="exact").limit(0).execute()
total_count = count_result.count if hasattr(count_result, 'count') else len(count_result.data)
return paginate_query(result, skip, limit, total_count)

# ========== AUDIENCE INSIGHTS ROUTES ==========
@router.post("/audience-insights/")
Expand All @@ -78,9 +87,18 @@ async def create_audience_insights(insights: AudienceInsightsCreate):
return response

@router.get("/audience-insights/")
async def get_audience_insights():
result = supabase.table("audience_insights").select("*").execute()
return result
async def get_audience_insights(
skip: int = Query(0, ge=0, description="Number of records to skip"),
limit: int = Query(50, ge=1, le=100, description="Maximum number of records to return")
):
skip, limit = get_pagination_params(skip, limit)
start = skip
end = skip + limit - 1

result = supabase.table("audience_insights").select("*").order("id").range(start, end).execute()
count_result = supabase.table("audience_insights").select("*", count="exact").limit(0).execute()
total_count = count_result.count if hasattr(count_result, 'count') else len(count_result.data)
return paginate_query(result, skip, limit, total_count)

# ========== SPONSORSHIP ROUTES ==========
@router.post("/sponsorships/")
Expand All @@ -103,9 +121,18 @@ async def create_sponsorship(sponsorship: SponsorshipCreate):
return response

@router.get("/sponsorships/")
async def get_sponsorships():
result = supabase.table("sponsorships").select("*").execute()
return result
async def get_sponsorships(
skip: int = Query(0, ge=0, description="Number of records to skip"),
limit: int = Query(50, ge=1, le=100, description="Maximum number of records to return")
):
skip, limit = get_pagination_params(skip, limit)
start = skip
end = skip + limit - 1

result = supabase.table("sponsorships").select("*").order("id").range(start, end).execute()
count_result = supabase.table("sponsorships").select("*", count="exact").limit(0).execute()
total_count = count_result.count if hasattr(count_result, 'count') else len(count_result.data)
return paginate_query(result, skip, limit, total_count)

# ========== USER POST ROUTES ==========
@router.post("/posts/")
Expand All @@ -127,9 +154,18 @@ async def create_post(post: UserPostCreate):
return response

@router.get("/posts/")
async def get_posts():
result = supabase.table("user_posts").select("*").execute()
return result
async def get_posts(
skip: int = Query(0, ge=0, description="Number of records to skip"),
limit: int = Query(50, ge=1, le=100, description="Maximum number of records to return")
):
skip, limit = get_pagination_params(skip, limit)
start = skip
end = skip + limit - 1

result = supabase.table("user_posts").select("*").order("id").range(start, end).execute()
count_result = supabase.table("user_posts").select("*", count="exact").limit(0).execute()
total_count = count_result.count if hasattr(count_result, 'count') else len(count_result.data)
return paginate_query(result, skip, limit, total_count)

# ========== SPONSORSHIP APPLICATION ROUTES ==========
@router.post("/sponsorship-applications/")
Expand All @@ -150,9 +186,18 @@ async def create_sponsorship_application(application: SponsorshipApplicationCrea
return response

@router.get("/sponsorship-applications/")
async def get_sponsorship_applications():
result = supabase.table("sponsorship_applications").select("*").execute()
return result
async def get_sponsorship_applications(
skip: int = Query(0, ge=0, description="Number of records to skip"),
limit: int = Query(50, ge=1, le=100, description="Maximum number of records to return")
):
skip, limit = get_pagination_params(skip, limit)
start = skip
end = skip + limit - 1

result = supabase.table("sponsorship_applications").select("*").order("id").range(start, end).execute()
count_result = supabase.table("sponsorship_applications").select("*", count="exact").limit(0).execute()
total_count = count_result.count if hasattr(count_result, 'count') else len(count_result.data)
return paginate_query(result, skip, limit, total_count)

# ========== SPONSORSHIP PAYMENT ROUTES ==========
@router.post("/sponsorship-payments/")
Expand All @@ -172,9 +217,18 @@ async def create_sponsorship_payment(payment: SponsorshipPaymentCreate):
return response

@router.get("/sponsorship-payments/")
async def get_sponsorship_payments():
result = supabase.table("sponsorship_payments").select("*").execute()
return result
async def get_sponsorship_payments(
skip: int = Query(0, ge=0, description="Number of records to skip"),
limit: int = Query(50, ge=1, le=100, description="Maximum number of records to return")
):
skip, limit = get_pagination_params(skip, limit)
start = skip
end = skip + limit - 1

result = supabase.table("sponsorship_payments").select("*").order("id").range(start, end).execute()
count_result = supabase.table("sponsorship_payments").select("*", count="exact").limit(0).execute()
total_count = count_result.count if hasattr(count_result, 'count') else len(count_result.data)
return paginate_query(result, skip, limit, total_count)

# ========== COLLABORATION ROUTES ==========
@router.post("/collaborations/")
Expand All @@ -194,6 +248,15 @@ async def create_collaboration(collab: CollaborationCreate):
return response

@router.get("/collaborations/")
async def get_collaborations():
result = supabase.table("collaborations").select("*").execute()
return result
async def get_collaborations(
skip: int = Query(0, ge=0, description="Number of records to skip"),
limit: int = Query(50, ge=1, le=100, description="Maximum number of records to return")
):
skip, limit = get_pagination_params(skip, limit)
start = skip
end = skip + limit - 1

result = supabase.table("collaborations").select("*").order("id").range(start, end).execute()
count_result = supabase.table("collaborations").select("*", count="exact").limit(0).execute()
total_count = count_result.count if hasattr(count_result, 'count') else len(count_result.data)
return paginate_query(result, skip, limit, total_count)
Empty file added Backend/app/utils/__init__.py
Empty file.
33 changes: 33 additions & 0 deletions Backend/app/utils/pagination.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
from typing import Dict, Any


DEFAULT_SKIP = 0
DEFAULT_LIMIT = 50
MAX_LIMIT = 100


def get_pagination_params(skip: int = DEFAULT_SKIP, limit: int = DEFAULT_LIMIT) -> tuple:
"""Validate and return pagination parameters."""
if skip < 0:
skip = DEFAULT_SKIP
if limit < 1:
limit = DEFAULT_LIMIT
if limit > MAX_LIMIT:
limit = MAX_LIMIT
return skip, limit


def paginate_query(query_result, skip: int, limit: int, total_count: int = 0) -> Dict[str, Any]:
"""Format paginated response with metadata."""
data = query_result.data if hasattr(query_result, 'data') else query_result

if not isinstance(data, list):
data = []

return {
"data": data,
"skip": skip,
"limit": limit,
"count": len(data),
"total_count": total_count
}