91 lines
3.6 KiB
Python
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
|