72 lines
2.3 KiB
Python
72 lines
2.3 KiB
Python
from typing import List, Union
|
|
from fastapi import APIRouter, Depends, Query
|
|
from sqlmodel import Session, select, desc
|
|
from database import get_session
|
|
from models import Review, Attendance, GroupPost, User
|
|
from schemas import ReviewRead, AttendanceRead, GroupPostRead
|
|
from datetime import datetime
|
|
|
|
router = APIRouter(prefix="/feed", tags=["feed"])
|
|
|
|
# We need a unified schema for the feed
|
|
from pydantic import BaseModel
|
|
|
|
class FeedItem(BaseModel):
|
|
type: str # review, attendance, post
|
|
timestamp: datetime
|
|
data: Union[ReviewRead, AttendanceRead, GroupPostRead, dict]
|
|
user: dict # Basic user info
|
|
|
|
@router.get("/", response_model=List[FeedItem])
|
|
def get_global_feed(
|
|
limit: int = 20,
|
|
session: Session = Depends(get_session)
|
|
):
|
|
# Fetch latest reviews
|
|
reviews = session.exec(
|
|
select(Review).order_by(desc(Review.created_at)).limit(limit)
|
|
).all()
|
|
|
|
# Fetch latest attendance
|
|
attendance = session.exec(
|
|
select(Attendance).order_by(desc(Attendance.created_at)).limit(limit)
|
|
).all()
|
|
|
|
# Fetch latest group posts
|
|
posts = session.exec(
|
|
select(GroupPost).order_by(desc(GroupPost.created_at)).limit(limit)
|
|
).all()
|
|
|
|
feed_items = []
|
|
|
|
for r in reviews:
|
|
user = session.get(User, r.user_id)
|
|
feed_items.append(FeedItem(
|
|
type="review",
|
|
timestamp=r.created_at or datetime.utcnow(), # Handle missing created_at if any
|
|
data=r,
|
|
user={"id": user.id, "username": user.email.split("@")[0], "avatar": user.avatar} if user else {}
|
|
))
|
|
|
|
for a in attendance:
|
|
user = session.get(User, a.user_id)
|
|
feed_items.append(FeedItem(
|
|
type="attendance",
|
|
timestamp=a.created_at,
|
|
data=a,
|
|
user={"id": user.id, "username": user.email.split("@")[0], "avatar": user.avatar} if user else {}
|
|
))
|
|
|
|
for p in posts:
|
|
user = session.get(User, p.user_id)
|
|
feed_items.append(FeedItem(
|
|
type="post",
|
|
timestamp=p.created_at,
|
|
data=p,
|
|
user={"id": user.id, "username": user.email.split("@")[0], "avatar": user.avatar} if user else {}
|
|
))
|
|
|
|
# Sort by timestamp desc
|
|
feed_items.sort(key=lambda x: x.timestamp, reverse=True)
|
|
|
|
return feed_items[:limit]
|