in_time.py 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. """
  2. Middleware para agregar headers de no-cache a las respuestas
  3. """
  4. from fastapi.responses import HTMLResponse
  5. from fastapi.security import HTTPAuthorizationCredentials
  6. from starlette.middleware.base import BaseHTTPMiddleware
  7. from starlette.requests import Request
  8. from starlette.responses import Response
  9. from auth.security import get_current_user
  10. from config import settings
  11. import datetime
  12. from logging import getLogger
  13. logger = getLogger(__name__)
  14. start_time = datetime.time(10, 0, 0)
  15. end_time = datetime.time(23, 30, 0)
  16. class EmptyUser:
  17. def __init__(self):
  18. self.permissions = 0
  19. class InTimeMiddleware(BaseHTTPMiddleware):
  20. """
  21. Middleware que revisa si la peticion se hizo dentro del horario de funcionamiento del local
  22. 10:00 a 23:30 horario de Chile
  23. """
  24. async def dispatch(self, request: Request, call_next):
  25. if "admin" in request.headers.get("Origin", ""):
  26. return await call_next(request)
  27. authorization = request.headers.get("Authorization")
  28. if not authorization:
  29. if settings.IS_OPEN_STORE:
  30. return await call_next(request)
  31. else:
  32. return HTMLResponse("""
  33. <!DOCTYPE html>
  34. <html lang="en">
  35. <head>
  36. <meta charset="UTF-8">
  37. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  38. <title>Local Cerrando :(</title>
  39. <script src="https://cdn.tailwindcss.com?plugins=forms,container-queries"></script>
  40. </head>
  41. <body>
  42. <!-- Header -->
  43. <div class="bg-[#101419] h-screen flex justify-center items-center flex- px-6 py-8 text-white text-center relative">
  44. <!-- Icono principal -->
  45. <div class="text-6xl mb-3">😫</div>
  46. <!-- Título -->
  47. <h2 class="text-2xl font-bold mb-2">¡El local se encuentra cerrado!</h2>
  48. </div>
  49. </body>
  50. </html>
  51. """, status_code=420)
  52. time = datetime.datetime.now().time()
  53. try:
  54. user = await get_current_user(
  55. HTTPAuthorizationCredentials(scheme="Bearer", credentials=authorization)
  56. )
  57. except Exception as e:
  58. logger.warning(f"Not user verified in {request.url.path}: {e}")
  59. user = EmptyUser()
  60. if ((time >= start_time and time <= end_time) and settings.IS_OPEN_STORE) or (user.permissions or 0) >= 1:
  61. response = await call_next(request)
  62. return response
  63. else:
  64. return HTMLResponse("""
  65. <!DOCTYPE html>
  66. <html lang="en">
  67. <head>
  68. <meta charset="UTF-8">
  69. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  70. <title>Local Cerrando :(</title>
  71. <script src="https://cdn.tailwindcss.com?plugins=forms,container-queries"></script>
  72. </head>
  73. <body>
  74. <!-- Header -->
  75. <div class="bg-[#101419] h-screen flex justify-center items-center flex- px-6 py-8 text-white text-center relative">
  76. <!-- Icono principal -->
  77. <div class="text-6xl mb-3">😫</div>
  78. <!-- Título -->
  79. <h2 class="text-2xl font-bold mb-2">¡El local se encuentra cerrado!</h2>
  80. </div>
  81. </body>
  82. </html>
  83. """, status_code=420)