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

91 lines
3.6 KiB
Python

"""
notes.py
Contiene los endpoints de CRUD de notas.
"""
from fastapi import APIRouter, Depends, HTTPException, status
from sqlalchemy.orm import Session
from database import get_db
import models
import schemas
from typing import List
from datetime import datetime
router = APIRouter()
@router.post("/notes/", response_model=schemas.NoteResponse, tags=['Notes'])
def create_note(note: schemas.NoteCreate, db: Session = Depends(get_db)):
# verificar que la alerta existe
db_alert = db.query(models.Alert).filter(models.Alert.id == note.alert_id).first()
if not db_alert:
raise HTTPException(status_code=404, detail="Alert not found")
db_note = models.Note(
alert_id=note.alert_id,
user_id=note.user_id,
content=note.content,
creation_date=datetime.utcnow()
)
db.add(db_note)
db.commit()
db.refresh(db_note)
return db_note
@router.get("/notes/", response_model=List[schemas.NoteResponse], tags=['Notes'])
def read_notes(skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):
notes = db.query(models.Note).offset(skip).limit(limit).all()
return notes
@router.get("/notes/{note_id}", response_model=schemas.NoteResponse, tags=['Notes'])
def read_note(note_id: int, db: Session = Depends(get_db)):
db_note = db.query(models.Note).filter(models.Note.id == note_id).first()
if not db_note:
raise HTTPException(status_code=404, detail="Note not found")
return db_note
@router.put("/notes/{note_id}", response_model=schemas.NoteResponse, tags=['Notes'])
def update_note(note_id: int, note: schemas.NoteCreate, db: Session = Depends(get_db)):
db_note = db.query(models.Note).filter(models.Note.id == note_id).first()
if not db_note:
raise HTTPException(status_code=404, detail="Note not found")
# validar cambios de alerta
if note.alert_id != db_note.alert_id:
db_alert = db.query(models.Alert).filter(models.Alert.id == note.alert_id).first()
if not db_alert:
raise HTTPException(status_code=404, detail="New alert not found")
# validar cambio de usuario
if note.user_id != db_note.user_id:
existing = db.query(models.Note).filter(models.Note.user_id == note.user_id).first()
if existing:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail=f"Note for user {note.user_id} already exists"
)
for field, value in note.model_dump().items():
setattr(db_note, field, value)
db.commit()
db.refresh(db_note)
return db_note
@router.delete("/notes/{note_id}", tags=['Notes'])
def delete_note(note_id: int, db: Session = Depends(get_db)):
db_note = db.query(models.Note).filter(models.Note.id == note_id).first()
if not db_note:
raise HTTPException(status_code=404, detail="Note not found")
db.delete(db_note)
db.commit()
return {"message": "Note deleted successfully"}
# Special endpoints
@router.get("/alerts/{alert_id}/notes", response_model=List[schemas.NoteResponse], tags=['Notes'])
def get_alert_notes(alert_id: int, db: Session = Depends(get_db)):
db_alert = db.query(models.Alert).filter(models.Alert.id == alert_id).first()
if not db_alert:
raise HTTPException(status_code=404, detail="Alert not found")
return db.query(models.Note).filter(models.Note.alert_id == alert_id).all()
@router.get("/users/{user_id}/notes", response_model=List[schemas.NoteResponse], tags=['Notes'])
def get_user_notes(user_id: int, db: Session = Depends(get_db)):
notes = db.query(models.Note).filter(models.Note.user_id == user_id).all()
return notes