elmeg-demo/backend/routers/feed.py
fullsizemalt b879f28813
Some checks are pending
Deploy Elmeg / deploy (push) Waiting to run
fix(backend): Handle missing users in feed API gracefully
2025-12-21 01:13:07 -08:00

96 lines
2.9 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)
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]