from uuid import UUID from fastapi import APIRouter, Depends, HTTPException from sqlalchemy import delete, select from sqlalchemy.orm import Session from app.api import deps from app.api.utils import update_object_from_payload from app.models import ( Project, Sms, User, ) from app.schemas.requests import SmsCreateRequest, SmsUpdateRequest from app.schemas.responses import SMSResponse router = APIRouter(prefix="/project/{project_id}", tags=["project", "sms"]) @router.get("/sms", response_model=list[SMSResponse]) async def list_project_sms( project_id: UUID, current_user: User = Depends(deps.get_current_user), session: Session = Depends(deps.get_session), ): """List sms from project""" p = session.get(Project, project_id) if p is None: raise HTTPException(status_code=404, detail="Project not found") results = session.execute(select(Sms).where(Sms.project_id == project_id)) return results.scalars().all() @router.post("/sms", response_model=SMSResponse) async def create_sms( project_id: UUID, new_sms: SmsCreateRequest, current_user: User = Depends(deps.get_current_user), session: Session = Depends(deps.get_session), ): """Create a new to the project""" p = session.get(Project, project_id) if p is None: raise HTTPException(status_code=404, detail="Project not found") sms = Sms(project_id=project_id, **new_sms.model_dump()) session.add(sms) session.commit() return sms @router.post("/sms/{sms_id}", response_model=SMSResponse) async def update_sms( project_id: UUID, sms_id: UUID, new_sms: SmsUpdateRequest, current_user: User = Depends(deps.get_current_user), session: Session = Depends(deps.get_session), ): """Update an sms from the project""" sms = session.get(Sms, sms_id) if (sms is None) or (sms.project_id != str(project_id)): raise HTTPException(status_code=404, detail="Sms not found") update_object_from_payload(sms, new_sms.model_dump(exclude_unset=True)) session.commit() session.refresh(sms) return sms @router.delete("/sms/{sms_id}") async def delete_sms( project_id: UUID, sms_id: UUID, current_user: User = Depends(deps.get_current_user), session: Session = Depends(deps.get_session), ): """Delete a sms from the project""" session.execute(delete(Sms).where((Sms.id == sms_id) & (Sms.project_id == str(project_id)))) session.commit()