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) user_data = {"id": 0, "username": "Deleted User", "avatar": None} if user: user_data = { "id": user.id, "username": user.email.split("@")[0] if user.email else "User", "avatar": user.avatar } feed_items.append(FeedItem( type="review", timestamp=r.created_at or datetime.utcnow(), data=r, user=user_data )) for a in attendance: user = session.get(User, a.user_id) user_data = {"id": 0, "username": "Deleted User", "avatar": None} if user: user_data = { "id": user.id, "username": user.email.split("@")[0] if user.email else "User", "avatar": user.avatar } feed_items.append(FeedItem( type="attendance", timestamp=a.created_at, data=a, user=user_data )) for p in posts: user = session.get(User, p.user_id) user_data = {"id": 0, "username": "Deleted User", "avatar": None} if user: user_data = { "id": user.id, "username": user.email.split("@")[0] if user.email else "User", "avatar": user.avatar } feed_items.append(FeedItem( type="post", timestamp=p.created_at, data=p, user=user_data )) # Sort by timestamp desc feed_items.sort(key=lambda x: x.timestamp, reverse=True) return feed_items[:limit]