from datetime import datetime
from typing import Dict, Union
from flask import Blueprint, current_app, request
from sqlalchemy.orm.exc import MultipleResultsFound, NoResultFound
from fittrackee import db
from fittrackee.oauth2.server import require_auth
from fittrackee.responses import (
HttpResponse,
InvalidPayloadErrorResponse,
handle_error_and_return_response,
)
from fittrackee.users.models import User
from fittrackee.users.utils.controls import is_valid_email
from .models import AppConfig
from .utils import update_app_config_from_database, verify_app_config
config_blueprint = Blueprint('config', __name__)
@config_blueprint.route('/config', methods=['GET'])
def get_application_config() -> Union[Dict, HttpResponse]:
"""
Get Application configuration.
**Example request**:
.. sourcecode:: http
GET /api/config HTTP/1.1
Content-Type: application/json
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Content-Type: application/json
{
"data": {
"about": null,
"admin_contact": "admin@example.com",
"gpx_limit_import": 10,
"is_email_sending_enabled": true,
"is_registration_enabled": false,
"max_single_file_size": 1048576,
"max_users": 0,
"max_zip_file_size": 10485760,
"map_attribution": "© OpenStreetMap contributors",
"privacy_policy": null,
"privacy_policy_date": null,
"version": "0.7.23",
"weather_provider": null
},
"status": "success"
}
:statuscode 200: ``success``
:statuscode 500: ``error on getting configuration``
"""
try:
config = AppConfig.query.one()
return {'status': 'success', 'data': config.serialize()}
except (MultipleResultsFound, NoResultFound) as e:
return handle_error_and_return_response(
e, message='error on getting configuration'
)
@config_blueprint.route('/config', methods=['PATCH'])
@require_auth(scopes=['application:write'], as_admin=True)
def update_application_config(auth_user: User) -> Union[Dict, HttpResponse]:
"""
Update Application configuration.
Authenticated user must be an admin.
**Scope**: ``application:write``
**Example request**:
.. sourcecode:: http
GET /api/config HTTP/1.1
Content-Type: application/json
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Content-Type: application/json
{
"data": {
"about": null,
"admin_contact": "admin@example.com",
"gpx_limit_import": 10,
"is_email_sending_enabled": true,
"is_registration_enabled": false,
"max_single_file_size": 1048576,
"max_users": 10,
"max_zip_file_size": 10485760,
"map_attribution": "© OpenStreetMap contributors",
"privacy_policy": null,
"privacy_policy_date": null,
"version": "0.7.23",
"weather_provider": null
},
"status": "success"
}
: Union[Dict, HttpResponse]:
"""health check endpoint
**Example request**:
.. sourcecode:: http
GET /api/ping HTTP/1.1
Content-Type: application/json
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Content-Type: application/json
{
"message": "pong!",
"status": "success"
}
:statuscode 200: ``success``
"""
return {'status': 'success', 'message': 'pong!'}