sms.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. import datetime
  2. from uuid import UUID
  3. from fastapi import APIRouter, Depends, HTTPException
  4. from sqlalchemy import delete, select
  5. from sqlalchemy.orm import Session
  6. from app.api import deps
  7. from app.api.utils import update_object_from_payload
  8. from app.models import (
  9. Project,
  10. Sms,
  11. User,
  12. )
  13. from app.schemas.requests import SmsCreateRequest, SmsUpdateRequest
  14. from app.schemas.responses import SMSResponse
  15. router = APIRouter()
  16. @router.get("/project/{project_id}/sms", response_model=list[SMSResponse])
  17. async def list_project_sms(
  18. project_id: UUID,
  19. current_user: User = Depends(deps.get_current_user),
  20. session: Session = Depends(deps.get_session),
  21. ):
  22. """List sms from project"""
  23. p = session.get(Project, project_id)
  24. if p is None:
  25. raise HTTPException(status_code=404, detail="Project not found")
  26. results = session.execute(select(Sms).where(Sms.project_id == project_id))
  27. return results.scalars().all()
  28. @router.post("/project/{project_id}/sms", response_model=SMSResponse)
  29. async def create_sms(
  30. project_id: UUID,
  31. new_sms: SmsCreateRequest,
  32. current_user: User = Depends(deps.get_current_user),
  33. session: Session = Depends(deps.get_session),
  34. ):
  35. """Create a new to the project"""
  36. p = session.get(Project, project_id)
  37. if p is None:
  38. raise HTTPException(status_code=404, detail="Project not found")
  39. sms = Sms(project_id=project_id, **new_sms.model_dump())
  40. session.add(sms)
  41. session.commit()
  42. return sms
  43. @router.post("/project/{project_id}/sms/{sms_id}", response_model=SMSResponse)
  44. async def update_sms(
  45. project_id: UUID,
  46. sms_id: UUID,
  47. new_sms: SmsUpdateRequest,
  48. current_user: User = Depends(deps.get_current_user),
  49. session: Session = Depends(deps.get_session),
  50. ):
  51. """Update an sms from the project"""
  52. sms = session.get(Sms, sms_id)
  53. if (sms is None) or (sms.project_id != str(project_id)):
  54. raise HTTPException(status_code=404, detail="Sms not found")
  55. update_object_from_payload(sms, new_sms.model_dump(exclude_unset=True))
  56. session.commit()
  57. session.refresh(sms)
  58. return sms
  59. @router.delete("/project/{project_id}/sms/{sms_id}")
  60. async def delete_sms(
  61. project_id: UUID,
  62. sms_id: UUID,
  63. current_user: User = Depends(deps.get_current_user),
  64. session: Session = Depends(deps.get_session),
  65. ):
  66. """Delete a sms from the project"""
  67. session.execute(delete(Sms).where((Sms.id == sms_id) & (Sms.project_id == str(project_id))))
  68. session.commit()
  69. @router.get("/sms/to-send", response_model=list[SMSResponse])
  70. async def list_sms_to_send(
  71. current_user: User = Depends(deps.get_current_user),
  72. session: Session = Depends(deps.get_session),
  73. ):
  74. """List sms that should be send by now"""
  75. results = session.execute(
  76. select(Sms).where((Sms.sending_time < datetime.datetime.now()) & (Sms.send_time == None))
  77. )
  78. return results.scalars().all()
  79. @router.post("/sms/send-now/{sms_id}", response_model=SMSResponse)
  80. async def send_sms_now(
  81. sms_id: UUID,
  82. current_user: User = Depends(deps.get_current_user),
  83. session: Session = Depends(deps.get_session),
  84. ):
  85. """Update the SMS to be sent now"""
  86. sms = session.get(Sms, sms_id)
  87. if sms is None:
  88. raise HTTPException(status_code=404, detail="SMS not found")
  89. elif sms.send_time is not None:
  90. raise HTTPException(status_code=400, detail="SMS has already been sent")
  91. else:
  92. sms.send_time = datetime.datetime.now()
  93. session.commit()
  94. return sms
  95. @router.get("/sms/not-send", response_model=list[SMSResponse])
  96. async def list_not_sent(
  97. current_user: User = Depends(deps.get_current_user),
  98. session: Session = Depends(deps.get_session),
  99. ):
  100. """List sms that are not sent"""
  101. results = session.execute(select(Sms).where((Sms.send_time == None)))
  102. return results.scalars().all()
  103. @router.get("/sms/future", response_model=list[SMSResponse])
  104. async def list_future_sms(
  105. current_user: User = Depends(deps.get_current_user),
  106. session: Session = Depends(deps.get_session),
  107. ):
  108. """List sms that should be sent in the future"""
  109. results = session.execute(select(Sms).where(Sms.sending_time > datetime.datetime.now()))
  110. return results.scalars().all()