""" 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