from typing import List from fastapi import APIRouter, Depends, HTTPException from sqlmodel.ext.asyncio.session import AsyncSession from src.core.database import get_async_session from src.core.schemas import BaseResponse from src.auth.utils import get_current_user from .schemas import EmotionLogCreate, EmotionLogResponse, HomeResponseData, BroadcastNotificationRequest from .service import add_or_update_emotion, get_emotions, get_home_data, send_broadcast_notification router = APIRouter(tags=["Home"]) @router.get("/{user_id}", response_model=BaseResponse[HomeResponseData]) async def fetch_home_data( user_id: str = Depends(get_current_user), session: AsyncSession = Depends(get_async_session), ): try: data = await get_home_data(user_id, session) return {"status_code": 200, "data": data} except ValueError as e: raise HTTPException(status_code=404, detail=str(e)) @router.post("/emotion", response_model=BaseResponse[EmotionLogResponse]) async def create_or_update_emotion( data: EmotionLogCreate, session: AsyncSession = Depends(get_async_session), user_id: str = Depends(get_current_user), ): record = await add_or_update_emotion(data, session) return { "status_code": 200, "data": record, } @router.get("/emotion/{user_id}", response_model=BaseResponse[List[EmotionLogResponse]]) async def get_user_emotions( user_id: str = Depends(get_current_user), session: AsyncSession = Depends(get_async_session), ): data = await get_emotions(user_id, session) return {"status_code": 200, "data": data} @router.post("/notify/all") async def notify_all_users( payload: BroadcastNotificationRequest, session: AsyncSession = Depends(get_async_session) ): if payload.data: safe_data = {k: str(v) for k, v in payload.data.items()} else: safe_data = {} from .service import send_broadcast_notification result = await send_broadcast_notification( session, payload.title, payload.body, safe_data ) return { "message": "Broadcast sent", "devices_notified": result["sent"] }