54 lines
1.4 KiB
Python
54 lines
1.4 KiB
Python
|
from typing import Dict, Tuple, Union
|
||
|
|
||
|
from flask import Blueprint, request
|
||
|
|
||
|
from fittrackee import db
|
||
|
from fittrackee.responses import HttpResponse, InvalidPayloadErrorResponse
|
||
|
from fittrackee.users.decorators import authenticate
|
||
|
from fittrackee.users.models import User
|
||
|
|
||
|
from .client import create_oauth_client
|
||
|
|
||
|
oauth_blueprint = Blueprint('oauth', __name__)
|
||
|
|
||
|
EXPECTED_METADATA_KEYS = [
|
||
|
'client_name',
|
||
|
'client_uri',
|
||
|
'redirect_uris',
|
||
|
'scope',
|
||
|
]
|
||
|
|
||
|
|
||
|
@oauth_blueprint.route('/oauth/apps', methods=['POST'])
|
||
|
@authenticate
|
||
|
def create_client(auth_user: User) -> Union[HttpResponse, Tuple[Dict, int]]:
|
||
|
client_metadata = request.get_json()
|
||
|
if not client_metadata:
|
||
|
return InvalidPayloadErrorResponse(
|
||
|
message='OAuth client metadata missing'
|
||
|
)
|
||
|
|
||
|
missing_keys = [
|
||
|
key
|
||
|
for key in EXPECTED_METADATA_KEYS
|
||
|
if key not in client_metadata.keys()
|
||
|
]
|
||
|
if missing_keys:
|
||
|
return InvalidPayloadErrorResponse(
|
||
|
message=(
|
||
|
'OAuth client metadata missing keys: '
|
||
|
f'{", ".join(missing_keys)}'
|
||
|
)
|
||
|
)
|
||
|
|
||
|
new_client = create_oauth_client(client_metadata, auth_user)
|
||
|
db.session.add(new_client)
|
||
|
db.session.commit()
|
||
|
return (
|
||
|
{
|
||
|
'status': 'created',
|
||
|
'data': {'client': new_client.serialize()},
|
||
|
},
|
||
|
201,
|
||
|
)
|