Files
TIP/app/routers/messages.py
T
2026-06-09 21:18:13 -03:00

191 lines
6.2 KiB
Python

"""
Messages.py
Contiene los endpoints de CRUD de mensajes.
"""
import re
from fastapi import APIRouter, Depends, HTTPException, Request, status
from sqlalchemy.orm import Session
from database import get_db
import models
import schemas
from typing import List, Optional
from datetime import datetime
from auth import get_current_user
from audit import log_action
router = APIRouter()
@router.post("/messages/", response_model=schemas.MessageResponse, tags=['Messages'])
def create_message(
message: schemas.MessageCreate,
request: Request,
db: Session = Depends(get_db),
current_user: int = Depends(get_current_user)
):
existing = db.query(models.Message).filter(
models.Message.id_mess_g == message.id_mess_g,
models.Message.group_id == message.group_id
).first()
if existing:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail=f"Message in Group ID {message.group_id} with Message ID {message.id_mess_g} already exists"
)
db_message = models.Message(**message.model_dump())
db.add(db_message)
db.flush()
log_action(
db=db, entity_type='message',
entity_id=f"{db_message.id_mess_g}_{db_message.group_id}",
action='create', user_id=current_user,
after={'id_mess_g': db_message.id_mess_g, 'group_id': db_message.group_id,
'sender_id': db_message.sender_id, 'date': str(db_message.date)},
ip_address=request.client.host
)
rules = db.query(models.Rule).filter(models.Rule.is_active == True).all()
alerts = []
for rule in rules:
try:
if re.search(rule.regex, db_message.content, re.IGNORECASE):
new_alert = models.Alert(
message_id=db_message.id_mess_g,
group_id=db_message.group_id,
rule_id=rule.id,
status="open",
notes=f"Detected pattern: {rule.regex}",
created_at=datetime.utcnow()
)
db.add(new_alert)
alerts.append(new_alert)
except re.error:
print(f"[WARN] Regex inválida en regla {rule.id}: {rule.regex}")
continue
db.commit()
db.refresh(db_message)
return db_message
@router.get("/messages/", response_model=List[schemas.MessageResponse], tags=['Messages'])
def read_messages(
skip: int = 0,
limit: int = 100,
db: Session = Depends(get_db),
current_user: int = Depends(get_current_user)
):
return db.query(models.Message).offset(skip).limit(limit).all()
@router.get("/messages/search/", response_model=List[schemas.MessageResponse], tags=['Messages'])
def search_messages(
q: str = "",
group_id: int = None,
date_from: Optional[datetime] = None,
date_to: Optional[datetime] = None,
skip: int = 0,
limit: int = 100,
db: Session = Depends(get_db),
current_user: int = Depends(get_current_user)
):
query = db.query(models.Message)
if q:
query = query.filter(models.Message.content.ilike(f"%{q}%"))
if group_id:
query = query.filter(models.Message.group_id == group_id)
if date_from:
query = query.filter(models.Message.date >= date_from)
if date_to:
query = query.filter(models.Message.date <= date_to)
return query.offset(skip).limit(limit).all()
@router.get("/groups/{group_id}/messages/", response_model=List[schemas.MessageResponse], tags=['Messages'])
def read_messages_by_group(
group_id: int,
skip: int = 0,
limit: int = 100,
db: Session = Depends(get_db),
current_user: int = Depends(get_current_user)
):
db_group = db.query(models.Group).filter(
models.Group.id_telegram == group_id
).first()
if not db_group:
raise HTTPException(status_code=404, detail="Group not found")
return db.query(models.Message).filter(
models.Message.group_id == group_id
).offset(skip).limit(limit).all()
@router.get("/senders/{sender_id}/messages/", response_model=List[schemas.MessageResponse], tags=['Messages'])
def read_messages_by_sender(
sender_id: int,
skip: int = 0,
limit: int = 100,
db: Session = Depends(get_db),
current_user: int = Depends(get_current_user)
):
db_sender = db.query(models.Sender).filter(
models.Sender.id_telegram == sender_id
).first()
if not db_sender:
raise HTTPException(status_code=404, detail="Sender not found")
return db.query(models.Message).filter(
models.Message.sender_id == sender_id
).offset(skip).limit(limit).all()
@router.get("/groups/{group_id}/messages/{message_id}", response_model=schemas.MessageResponse, tags=['Messages'])
def read_message(
group_id: int,
message_id: int,
db: Session = Depends(get_db),
current_user: int = Depends(get_current_user)
):
db_message = db.query(models.Message).filter(
models.Message.id_mess_g == message_id,
models.Message.group_id == group_id
).first()
if not db_message:
raise HTTPException(
status_code=404,
detail=f"Message with ID {message_id} in group {group_id} not found"
)
return db_message
@router.delete("/groups/{group_id}/messages/{message_id}", tags=['Messages'])
def delete_message(
group_id: int,
message_id: int,
request: Request,
db: Session = Depends(get_db),
current_user: int = Depends(get_current_user)
):
db_message = db.query(models.Message).filter(
models.Message.id_mess_g == message_id,
models.Message.group_id == group_id
).first()
if not db_message:
raise HTTPException(
status_code=404,
detail=f"Message with ID {message_id} in group {group_id} not found"
)
log_action(
db=db, entity_type='message',
entity_id=f"{message_id}_{group_id}",
action='delete', user_id=current_user,
before={'id_mess_g': message_id, 'group_id': group_id},
ip_address=request.client.host
)
db.delete(db_message)
db.commit()
return {"message": "Message deleted successfully"}