Advertisement
Guest User

Untitled

a guest
Oct 16th, 2019
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.79 KB | None | 0 0
  1. import os
  2. import sys
  3. from urllib.parse import unquote
  4.  
  5. from sanic import Sanic, Blueprint, response
  6. from sanic_openapi import swagger_blueprint, doc
  7. from sanic_prometheus import monitor
  8.  
  9. sys.path.append(f'{os.path.dirname(os.path.abspath(__file__))}/../')
  10. from config import MAILS
  11. from database.connection import seo_queries_db, DB_HOST, DB_USER, DB_PASSWORD, DB_DATABASE
  12. from rest_api.docs import doc_support
  13. from rest_api.helpers import json_validator, parse_args_to_dict, error_and_response_handler
  14. from rest_api.json_schema import QUERY_SCHEMA
  15. from rest_api.panel.endpoints import panel_bp
  16. from rest_api.panel.tasks_keeper import TasksKeeper
  17. from rest_api.queries_connector import QueryStatus, QueriesConnector
  18. from utils.time import get_cache_ttl
  19.  
  20. app = Sanic('seo', strict_slashes=True)
  21.  
  22. DEVELOPMENT = os.environ.get("DEVELOPMENT", "True") == "True"
  23. app.config.API_VERSION = '0.1'
  24. app.config.API_TITLE = 'SEO Queries API'
  25. app.config.API_DESCRIPTION = 'Be polite and follow the schemas please!\n'
  26. app.config.API_SCHEMES = ['http' if DEVELOPMENT else 'https']
  27. app.DEBUG = os.environ.get("DEBUG", "True") == "True"
  28.  
  29. app.config.DB_HOST = DB_HOST
  30. app.config.DB_USER = DB_USER
  31. app.config.DB_PASSWORD = DB_PASSWORD
  32. app.config.DB_DATABASE = DB_DATABASE
  33. seo_queries_db.init_app(app)
  34.  
  35. PREFIX = 'seo-query'
  36.  
  37. seo_bp = Blueprint(PREFIX, url_prefix=f'/{PREFIX}', strict_slashes=True)
  38.  
  39.  
  40. @seo_bp.get('/all')
  41. @doc_support('Sitemap queries', QUERY_SCHEMA['all'], {"total": doc.Integer, "data": doc.List(doc.String)})
  42. @parse_args_to_dict
  43. @json_validator(QUERY_SCHEMA['all'])
  44. @error_and_response_handler(headers_func=lambda *_: {"Cache-Control": f'max_age={get_cache_ttl()}'})
  45. async def get_queries(request):
  46. payload = request.json
  47. return await request.app.queries.get(**payload)
  48.  
  49.  
  50. # to be deleted
  51. @seo_bp.get('/random')
  52. @doc_support('Sitemap queries', QUERY_SCHEMA['random'], doc.List(doc.String))
  53. @parse_args_to_dict
  54. @json_validator(QUERY_SCHEMA['random'])
  55. @error_and_response_handler(headers_func=lambda *_: {"Cache-Control": f'max_age={get_cache_ttl()}'})
  56. async def get_random(request):
  57. payload = request.json
  58. return await request.app.queries.boosted(**payload)
  59.  
  60.  
  61. @seo_bp.get('/static')
  62. @doc_support('Sitemap queries', QUERY_SCHEMA['static'], doc.List(doc.String))
  63. @parse_args_to_dict
  64. @json_validator(QUERY_SCHEMA['static'])
  65. @error_and_response_handler(headers_func=lambda *_: {"Cache-Control": f'max_age={get_cache_ttl()}'})
  66. async def get_static(request):
  67. payload = request.json
  68. return await request.app.queries.boosted(**payload)
  69.  
  70.  
  71. @seo_bp.get('/prefixes')
  72. @doc_support('Sitemap queries', QUERY_SCHEMA['prefixes'], doc.List(doc.String))
  73. @parse_args_to_dict
  74. @json_validator(QUERY_SCHEMA['prefixes'])
  75. @error_and_response_handler(headers_func=lambda *_: {"Cache-Control": f'max_age={get_cache_ttl()}'})
  76. async def get_prefixes(request):
  77. return await request.app.queries.prefixes(**request.json)
  78.  
  79.  
  80. @seo_bp.get('/status')
  81. @doc_support('Query status', QUERY_SCHEMA['status'],
  82. {"status": doc.String(choices=list(map(lambda x: x, vars(QueryStatus))))})
  83. @parse_args_to_dict
  84. @json_validator(QUERY_SCHEMA['status'])
  85. @error_and_response_handler(headers_func=lambda *_: {"Cache-Control": f'max_age={get_cache_ttl()}'})
  86. async def get_status(request):
  87. payload = request.json
  88. query = unquote(payload.pop('query')) if payload.get('query') else ''
  89. return await request.app.queries.check_status(query, **payload)
  90.  
  91.  
  92. @seo_bp.get('/available')
  93. @doc_support('Market status', QUERY_SCHEMA['available'],
  94. {"available": doc.Boolean})
  95. @parse_args_to_dict
  96. @json_validator(QUERY_SCHEMA['available'])
  97. @error_and_response_handler(headers_func=lambda *_: {"Cache-Control": f'max_age={get_cache_ttl()}'})
  98. async def get_market_status(request):
  99. payload = request.json
  100. return await request.app.queries.check_availability(**payload)
  101.  
  102.  
  103. group = Blueprint.group(seo_bp, panel_bp)
  104. app.blueprint(group, strict_slashes=True)
  105.  
  106.  
  107. @app.route(f'/{PREFIX}/liveness', methods=["GET", "OPTIONS"])
  108. async def liveness(request):
  109. return response.json("siemanko")
  110.  
  111.  
  112. @app.listener('before_server_start')
  113. async def init(_app, loop):
  114. mails = MAILS["DEVELOPMENT" if DEVELOPMENT else "PRODUCTION"]
  115. _app.queries = QueriesConnector()
  116. _app.panel_tasks = TasksKeeper(mails)
  117. _app.mails = mails
  118.  
  119.  
  120. @app.listener('before_server_stop')
  121. async def close(_app, loop):
  122. print('before-server-stop')
  123. await _app.panel_tasks.clear()
  124.  
  125.  
  126. if __name__ == '__main__':
  127. if app.DEBUG:
  128. swagger_blueprint.url_prefix = f'{PREFIX}/docs'
  129. app.blueprint(swagger_blueprint, strict_slashes=True)
  130. monitor(app, endpoint_type='url', mmc_period_sec=None).expose_endpoint()
  131. app.run(host='0.0.0.0', port=50069, workers=1, debug=DEVELOPMENT, access_log=False)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement