sms.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. import datetime
  2. from uuid import UUID
  3. from fastapi import APIRouter, Depends, HTTPException
  4. from sqlalchemy import delete, select
  5. from sqlalchemy.ext.asyncio import AsyncSession
  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/{id}/sms", response_model=list[SMSResponse])
  17. async def list_project_sms(
  18. id: UUID,
  19. current_user: User = Depends(deps.get_current_user),
  20. session: AsyncSession = Depends(deps.get_session),
  21. ):
  22. """List sms from project"""
  23. p = await session.get(Project, id)
  24. if p is None:
  25. raise HTTPException(status_code=404, detail="Project not found")
  26. results = await session.execute(select(Sms).where(Sms.project_id == id))
  27. return results.scalars()
  28. @router.post("/project/{id}/sms", response_model=list[SMSResponse])
  29. async def create_sms(
  30. id: UUID,
  31. new_sms: SmsCreateRequest,
  32. current_user: User = Depends(deps.get_current_user),
  33. session: AsyncSession = Depends(deps.get_session),
  34. ):
  35. """create a new to the project"""
  36. p = await session.get(Project, id)
  37. if p is None:
  38. raise HTTPException(status_code=404, detail="Project not found")
  39. sms = Sms(project_id=id, **new_sms.dict())
  40. session.add(sms)
  41. await session.commit()
  42. return sms
  43. @router.post("/project/{project_id}/sms/{sms_id}", response_model=list[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: AsyncSession = Depends(deps.get_session),
  50. ):
  51. """Create a new to the project"""
  52. sms = await session.get(Sms, sms_id)
  53. if (sms is None) or sms.project_id != project_id:
  54. raise HTTPException(status_code=404, detail="Sms not found")
  55. update_object_from_payload(sms, new_sms.dict())
  56. await session.commit()
  57. await session.refresh(sms)
  58. return sms
  59. @router.delete("/project/{id}/sms/{sms_id}")
  60. async def delete_sms(
  61. id: UUID,
  62. sms_id: UUID,
  63. current_user: User = Depends(deps.get_current_user),
  64. session: AsyncSession = Depends(deps.get_session),
  65. ):
  66. """Delete a sms from the project"""
  67. await session.execute(
  68. delete(Sms).where((Sms.id == sms_id) & (Sms.project_id == id))
  69. )
  70. await session.commit()
  71. @router.get("/sms/to-send", response_model=list[SMSResponse])
  72. async def list_sms_to_send(
  73. current_user: User = Depends(deps.get_current_user),
  74. session: AsyncSession = Depends(deps.get_session),
  75. ):
  76. """List sms to"""
  77. results = await session.execute(
  78. select(Sms).where(
  79. (Sms.sending_time < datetime.datetime.now()) & Sms.send_time.is_not(None)
  80. )
  81. )
  82. return results.scalars()
  83. @router.get("/sms/not-send", response_model=list[SMSResponse])
  84. async def list_not_sent(
  85. current_user: User = Depends(deps.get_current_user),
  86. session: AsyncSession = Depends(deps.get_session),
  87. ):
  88. """List sms that are not sent"""
  89. results = await session.execute(select(Sms).where(Sms.send_time.is_not(None)))
  90. return results.scalars()
  91. @router.get("/sms/future", response_model=list[SMSResponse])
  92. async def list_future_sms(
  93. current_user: User = Depends(deps.get_current_user),
  94. session: AsyncSession = Depends(deps.get_session),
  95. ):
  96. """List sms that should be sent in the future"""
  97. results = await session.execute(
  98. select(Sms).where(Sms.sending_time > datetime.datetime.now())
  99. )
  100. return results.scalars()