app-MAIL-temp/app/api/base.py

52 lines
1.2 KiB
Python
Raw Normal View History

2019-12-04 00:48:30 +01:00
from functools import wraps
import arrow
from flask import Blueprint, request, jsonify, g
from flask_login import current_user
2020-04-25 11:30:09 +02:00
2019-12-04 00:48:30 +01:00
from app.extensions import db
2020-05-13 22:02:38 +02:00
from app.log import LOG
2019-12-04 00:48:30 +01:00
from app.models import ApiKey
api_bp = Blueprint(name="api", import_name=__name__, url_prefix="/api")
2019-12-04 00:48:30 +01:00
def require_api_auth(f):
2019-12-04 00:48:30 +01:00
@wraps(f)
def decorated(*args, **kwargs):
if current_user.is_authenticated:
g.user = current_user
else:
api_code = request.headers.get("Authentication")
api_key = ApiKey.get_by(code=api_code)
2019-12-04 00:48:30 +01:00
if not api_key:
return jsonify(error="Wrong api key"), 401
2019-12-04 00:48:30 +01:00
# Update api key stats
api_key.last_used = arrow.now()
api_key.times += 1
db.session.commit()
2019-12-04 00:48:30 +01:00
g.user = api_key.user
2019-12-04 00:48:30 +01:00
return f(*args, **kwargs)
return decorated
2020-05-13 22:02:38 +02:00
@api_bp.app_errorhandler(404)
def not_found(e):
return jsonify(error="No such endpoint"), 404
@api_bp.app_errorhandler(Exception)
def internal_error(e):
LOG.exception(e)
return jsonify(error="Internal error"), 500
2020-05-13 23:28:00 +02:00
@api_bp.app_errorhandler(405)
def wrong_method(e):
return jsonify(error="Method not allowed"), 405