Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import os
- import sys
- from urllib.parse import unquote
- from sanic import Sanic, Blueprint, response
- from sanic_openapi import swagger_blueprint, doc
- from sanic_prometheus import monitor
- sys.path.append(f'{os.path.dirname(os.path.abspath(__file__))}/../')
- from config import MAILS
- from database.connection import seo_queries_db, DB_HOST, DB_USER, DB_PASSWORD, DB_DATABASE
- from rest_api.docs import doc_support
- from rest_api.helpers import json_validator, parse_args_to_dict, error_and_response_handler
- from rest_api.json_schema import QUERY_SCHEMA
- from rest_api.panel.endpoints import panel_bp
- from rest_api.panel.tasks_keeper import TasksKeeper
- from rest_api.queries_connector import QueryStatus, QueriesConnector
- from utils.time import get_cache_ttl
- app = Sanic('seo', strict_slashes=True)
- DEVELOPMENT = os.environ.get("DEVELOPMENT", "True") == "True"
- app.config.API_VERSION = '0.1'
- app.config.API_TITLE = 'SEO Queries API'
- app.config.API_DESCRIPTION = 'Be polite and follow the schemas please!\n'
- app.config.API_SCHEMES = ['http' if DEVELOPMENT else 'https']
- app.DEBUG = os.environ.get("DEBUG", "True") == "True"
- app.config.DB_HOST = DB_HOST
- app.config.DB_USER = DB_USER
- app.config.DB_PASSWORD = DB_PASSWORD
- app.config.DB_DATABASE = DB_DATABASE
- seo_queries_db.init_app(app)
- PREFIX = 'seo-query'
- seo_bp = Blueprint(PREFIX, url_prefix=f'/{PREFIX}', strict_slashes=True)
- @seo_bp.get('/all')
- @doc_support('Sitemap queries', QUERY_SCHEMA['all'], {"total": doc.Integer, "data": doc.List(doc.String)})
- @parse_args_to_dict
- @json_validator(QUERY_SCHEMA['all'])
- @error_and_response_handler(headers_func=lambda *_: {"Cache-Control": f'max_age={get_cache_ttl()}'})
- async def get_queries(request):
- payload = request.json
- return await request.app.queries.get(**payload)
- # to be deleted
- @seo_bp.get('/random')
- @doc_support('Sitemap queries', QUERY_SCHEMA['random'], doc.List(doc.String))
- @parse_args_to_dict
- @json_validator(QUERY_SCHEMA['random'])
- @error_and_response_handler(headers_func=lambda *_: {"Cache-Control": f'max_age={get_cache_ttl()}'})
- async def get_random(request):
- payload = request.json
- return await request.app.queries.boosted(**payload)
- @seo_bp.get('/static')
- @doc_support('Sitemap queries', QUERY_SCHEMA['static'], doc.List(doc.String))
- @parse_args_to_dict
- @json_validator(QUERY_SCHEMA['static'])
- @error_and_response_handler(headers_func=lambda *_: {"Cache-Control": f'max_age={get_cache_ttl()}'})
- async def get_static(request):
- payload = request.json
- return await request.app.queries.boosted(**payload)
- @seo_bp.get('/prefixes')
- @doc_support('Sitemap queries', QUERY_SCHEMA['prefixes'], doc.List(doc.String))
- @parse_args_to_dict
- @json_validator(QUERY_SCHEMA['prefixes'])
- @error_and_response_handler(headers_func=lambda *_: {"Cache-Control": f'max_age={get_cache_ttl()}'})
- async def get_prefixes(request):
- return await request.app.queries.prefixes(**request.json)
- @seo_bp.get('/status')
- @doc_support('Query status', QUERY_SCHEMA['status'],
- {"status": doc.String(choices=list(map(lambda x: x, vars(QueryStatus))))})
- @parse_args_to_dict
- @json_validator(QUERY_SCHEMA['status'])
- @error_and_response_handler(headers_func=lambda *_: {"Cache-Control": f'max_age={get_cache_ttl()}'})
- async def get_status(request):
- payload = request.json
- query = unquote(payload.pop('query')) if payload.get('query') else ''
- return await request.app.queries.check_status(query, **payload)
- @seo_bp.get('/available')
- @doc_support('Market status', QUERY_SCHEMA['available'],
- {"available": doc.Boolean})
- @parse_args_to_dict
- @json_validator(QUERY_SCHEMA['available'])
- @error_and_response_handler(headers_func=lambda *_: {"Cache-Control": f'max_age={get_cache_ttl()}'})
- async def get_market_status(request):
- payload = request.json
- return await request.app.queries.check_availability(**payload)
- group = Blueprint.group(seo_bp, panel_bp)
- app.blueprint(group, strict_slashes=True)
- @app.route(f'/{PREFIX}/liveness', methods=["GET", "OPTIONS"])
- async def liveness(request):
- return response.json("siemanko")
- @app.listener('before_server_start')
- async def init(_app, loop):
- mails = MAILS["DEVELOPMENT" if DEVELOPMENT else "PRODUCTION"]
- _app.queries = QueriesConnector()
- _app.panel_tasks = TasksKeeper(mails)
- _app.mails = mails
- @app.listener('before_server_stop')
- async def close(_app, loop):
- print('before-server-stop')
- await _app.panel_tasks.clear()
- if __name__ == '__main__':
- if app.DEBUG:
- swagger_blueprint.url_prefix = f'{PREFIX}/docs'
- app.blueprint(swagger_blueprint, strict_slashes=True)
- monitor(app, endpoint_type='url', mmc_period_sec=None).expose_endpoint()
- 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