from typing import List from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.orm import Session from app.db.session import get_db from app.models.message import Message from app.models.user import User from app.schemas.message import MessageCreate, Message as MessageSchema from app.auth.auth import get_current_active_user router = APIRouter() @router.post("/send", response_model=MessageSchema) def send_message( message: MessageCreate, current_user: User = Depends(get_current_active_user), db: Session = Depends(get_db) ): receiver = db.query(User).filter(User.id == message.receiver_id).first() if not receiver: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="Receiver not found" ) if receiver.id == current_user.id: raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail="Cannot send message to yourself" ) db_message = Message( sender_id=current_user.id, receiver_id=message.receiver_id, content=message.content ) db.add(db_message) db.commit() db.refresh(db_message) return db_message @router.get("/received", response_model=List[MessageSchema]) def get_received_messages( current_user: User = Depends(get_current_active_user), db: Session = Depends(get_db) ): messages = db.query(Message).filter( Message.receiver_id == current_user.id ).order_by(Message.created_at.desc()).all() return messages @router.get("/sent", response_model=List[MessageSchema]) def get_sent_messages( current_user: User = Depends(get_current_active_user), db: Session = Depends(get_db) ): messages = db.query(Message).filter( Message.sender_id == current_user.id ).order_by(Message.created_at.desc()).all() return messages @router.get("/conversation/{user_id}", response_model=List[MessageSchema]) def get_conversation( user_id: int, current_user: User = Depends(get_current_active_user), db: Session = Depends(get_db) ): other_user = db.query(User).filter(User.id == user_id).first() if not other_user: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="User not found" ) messages = db.query(Message).filter( ((Message.sender_id == current_user.id) & (Message.receiver_id == user_id)) | ((Message.sender_id == user_id) & (Message.receiver_id == current_user.id)) ).order_by(Message.created_at.asc()).all() return messages @router.get("/users", response_model=List[dict]) def get_users( current_user: User = Depends(get_current_active_user), db: Session = Depends(get_db) ): users = db.query(User).filter(User.id != current_user.id).all() return [{"id": user.id, "username": user.username, "email": user.email} for user in users]