Source code for flexget.api.core.database
from __future__ import annotations
from typing import TYPE_CHECKING
from flask import jsonify, request
from sqlalchemy import text
from flexget.api import APIResource, api
from flexget.api.app import BadRequest, base_message_schema, success_response
from flexget.db_schema import plugin_schemas, reset_schema
if TYPE_CHECKING:
from flask import Response
from sqlalchemy.orm import Session
db_api = api.namespace('database', description='Manage Flexget DB')
[docs]
class ObjectsContainer:
plugin_list = {'type': 'array', 'items': {'type': 'string'}}
database_input_object = {
'type': 'object',
'properties': {
'operation': {'type': 'string', 'enum': ['cleanup', 'vacuum', 'plugin_reset']},
'plugin_name': {'type': 'string'},
},
'required': ['operation'],
'additionalProperties': False,
}
plugins_schema = api.schema_model('plugins_list', ObjectsContainer.plugin_list)
input_schema = api.schema_model('db_schema', ObjectsContainer.database_input_object)
[docs]
@db_api.route('/')
class DBOperation(APIResource):
[docs]
@api.validate(input_schema)
@api.response(200, model=base_message_schema)
def post(self, session: Session = None) -> Response:
"""Perform DB operations."""
msg = ''
data = request.json
operation = data['operation']
if operation == 'cleanup':
self.manager.db_cleanup(force=True)
msg = 'DB Cleanup finished'
elif operation == 'vacuum':
session.execute(text('VACUUM'))
session.commit()
msg = 'DB VACUUM finished'
elif operation == 'plugin_reset':
plugin_name = data.get('plugin_name')
if not plugin_name:
raise BadRequest(
"'plugin_name' attribute must be used when trying to reset plugin"
)
try:
reset_schema(plugin_name)
msg = f'Plugin {plugin_name} DB reset was successful'
except ValueError:
raise BadRequest(f'The plugin {plugin_name} has no stored schema to reset')
return success_response(msg)
[docs]
@db_api.route('/plugins/')
class DBCleanup(APIResource):
[docs]
@api.response(200, model=plugins_schema)
def get(self, session: Session = None) -> Response:
"""List resettable DB plugins."""
return jsonify(sorted(plugin_schemas))