from typing import List from fastapi import APIRouter, Depends, HTTPException, status, Query from sqlalchemy.orm import Session from sqlalchemy import or_, and_ from app.auth.dependencies import get_db, get_current_active_user from app.models.user import User from app.models.message import Message from app.schemas.message import MessageCreate, MessageResponse router = APIRouter(prefix="/api/messages", tags=["Messages"]) @router.post("/", response_model=MessageResponse) def send_message( message_data: MessageCreate, current_user: User = Depends(get_current_active_user), db: Session = Depends(get_db) ): # Check if receiver exists receiver = db.query(User).filter(User.id == message_data.receiver_id).first() if not receiver: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="Receiver not found" ) # Create message db_message = Message( sender_id=current_user.id, receiver_id=message_data.receiver_id, content=message_data.content ) db.add(db_message) db.commit() db.refresh(db_message) return db_message @router.get("/conversations/{user_id}", response_model=List[MessageResponse]) def get_conversation( user_id: int, skip: int = Query(0, ge=0), limit: int = Query(50, ge=1, le=100), current_user: User = Depends(get_current_active_user), db: Session = Depends(get_db) ): # Get messages between current user and specified user messages = db.query(Message).filter( or_( and_(Message.sender_id == current_user.id, Message.receiver_id == user_id), and_(Message.sender_id == user_id, Message.receiver_id == current_user.id) ) ).order_by(Message.created_at.desc()).offset(skip).limit(limit).all() return messages @router.get("/", response_model=List[MessageResponse]) def get_user_messages( skip: int = Query(0, ge=0), limit: int = Query(50, ge=1, le=100), current_user: User = Depends(get_current_active_user), db: Session = Depends(get_db) ): # Get all messages for current user (sent and received) messages = db.query(Message).filter( or_( Message.sender_id == current_user.id, Message.receiver_id == current_user.id ) ).order_by(Message.created_at.desc()).offset(skip).limit(limit).all() return messages @router.put("/{message_id}/read") def mark_message_as_read( message_id: int, current_user: User = Depends(get_current_active_user), db: Session = Depends(get_db) ): message = db.query(Message).filter( Message.id == message_id, Message.receiver_id == current_user.id ).first() if not message: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="Message not found" ) message.is_read = True db.commit() return {"message": "Message marked as read"}