
- Implement user authentication with JWT tokens - Add messaging system for sending/receiving messages - Create SQLite database with SQLAlchemy models - Set up Alembic for database migrations - Add health check endpoint - Include comprehensive API documentation - Support user registration, login, and message management - Enable conversation history and user listing
91 lines
2.9 KiB
Python
91 lines
2.9 KiB
Python
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] |