sms.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. from uuid import UUID
  2. from fastapi import APIRouter, Depends, HTTPException
  3. from sqlalchemy import delete, select
  4. from sqlalchemy.orm import Session
  5. from app.api import deps
  6. from app.api.utils import assert_project_exists_or_404, update_object_from_payload
  7. from app.models import (
  8. OrgRole,
  9. Sms,
  10. User,
  11. )
  12. from app.schemas.requests import SmsCreateRequest, SmsUpdateRequest
  13. from app.schemas.responses import SMSResponse
  14. router = APIRouter(prefix="/project/{project_id}", tags=["project", "sms"])
  15. READ_ROLES = (OrgRole.ORG_ADMIN, OrgRole.RESPO_BENEVOLE, OrgRole.RESPO_COMMISSION)
  16. WRITE_ROLES = (OrgRole.ORG_ADMIN, OrgRole.RESPO_BENEVOLE, OrgRole.RESPO_COMMISSION)
  17. @router.get("/sms", response_model=list[SMSResponse])
  18. async def list_project_sms(
  19. project_id: UUID,
  20. current_user: User = Depends(deps.require_org_role(*READ_ROLES)),
  21. session: Session = Depends(deps.get_session),
  22. ):
  23. """List sms from project"""
  24. assert_project_exists_or_404(session, project_id)
  25. results = session.execute(select(Sms).where(Sms.project_id == project_id))
  26. return results.scalars().all()
  27. @router.post("/sms", response_model=SMSResponse)
  28. async def create_sms(
  29. project_id: UUID,
  30. new_sms: SmsCreateRequest,
  31. current_user: User = Depends(deps.require_org_role(*WRITE_ROLES)),
  32. session: Session = Depends(deps.get_session),
  33. ):
  34. """Create a new to the project"""
  35. assert_project_exists_or_404(session, project_id)
  36. sms = Sms(project_id=project_id, **new_sms.model_dump())
  37. session.add(sms)
  38. session.commit()
  39. return sms
  40. @router.post("/sms/{sms_id}", response_model=SMSResponse)
  41. async def update_sms(
  42. project_id: UUID,
  43. sms_id: UUID,
  44. new_sms: SmsUpdateRequest,
  45. current_user: User = Depends(deps.require_org_role(*WRITE_ROLES)),
  46. session: Session = Depends(deps.get_session),
  47. ):
  48. """Update an sms from the project"""
  49. sms = session.get(Sms, sms_id)
  50. if (sms is None) or (sms.project_id != str(project_id)):
  51. raise HTTPException(status_code=404, detail="Sms not found")
  52. update_object_from_payload(sms, new_sms.model_dump(exclude_unset=True))
  53. session.commit()
  54. session.refresh(sms)
  55. return sms
  56. @router.delete("/sms/{sms_id}")
  57. async def delete_sms(
  58. project_id: UUID,
  59. sms_id: UUID,
  60. current_user: User = Depends(deps.require_org_role(*WRITE_ROLES)),
  61. session: Session = Depends(deps.get_session),
  62. ):
  63. """Delete a sms from the project"""
  64. session.execute(delete(Sms).where((Sms.id == sms_id) & (Sms.project_id == str(project_id))))
  65. session.commit()