from flask import request from flask_login import login_required from flask_restful import Resource, marshal, marshal_with, reqparse from werkzeug.exceptions import NotFound from controllers.console import api from controllers.console.wraps import account_initialization_required, setup_required from fields.external_application_fields import external_application_fields from models.external_application import ExternalApplication from services.external_application_service import ExternalApplicationService class ExternalApplicationListApi(Resource): @setup_required @login_required @account_initialization_required def get(self): page = request.args.get("page", default=1, type=int) limit = request.args.get("limit", default=20, type=int) search = request.args.get("search", default=None, type=str) type = request.args.get("type", default=None, type=str) url = request.args.get("url", default=None, type=str) method = request.args.get("method", default=None, type=str) external_applications, total = ExternalApplicationService.get_external_applications( page, limit, search, type, url, method) data = marshal(external_applications, external_application_fields) response = {"data": data, "has_more": len(external_applications) == limit, "limit": limit, "total": total, "page": page} return response, 200 @setup_required @login_required @account_initialization_required @marshal_with(external_application_fields) def post(self): parser = reqparse.RequestParser() parser.add_argument( "name", location="json", nullable=False, required=True, help="Name must be between 1 to 50 characters." ) parser.add_argument( "type", type=str, location="json", choices=ExternalApplication.EXTERNAL_APPLICATION_TYPE_LIST, nullable=False, help="Invalid external_application type." ) parser.add_argument( "url", type=str, location="json", nullable=False, help="Invalid external_application url." ) parser.add_argument( "method", type=str, location="json", nullable=False, help="Invalid external_application method." ) parser.add_argument( "status", type=bool, location="json", nullable=False, help="Invalid external_application status." ) args = parser.parse_args() external_application = ExternalApplicationService.save_external_application(args) return external_application, 200 class ExternalApplicationApi(Resource): @setup_required @login_required @account_initialization_required @marshal_with(external_application_fields) def get(self, external_application_id): external_application = ExternalApplicationService.get_external_application(external_application_id) if not external_application: raise NotFound(f"ExternalApplication with id {id} not found.") return external_application, 200 @setup_required @login_required @account_initialization_required @marshal_with(external_application_fields) def patch(self, external_application_id): external_application_id = str(external_application_id) parser = reqparse.RequestParser() parser.add_argument( "name", location="json", nullable=False, required=True, help="Name must be between 1 to 50 characters." ) parser.add_argument( "type", type=str, location="json", nullable=False, help="Invalid external_application type." ) parser.add_argument( "url", type=str, location="json", nullable=False, help="Invalid external_application url." ) parser.add_argument( "method", type=str, location="json", nullable=False, help="Invalid external_application method." ) parser.add_argument( "status", type=bool, location="json", nullable=False, help="Invalid external_application status." ) args = parser.parse_args() external_application = ExternalApplicationService.update_external_application(args, external_application_id) return external_application, 200 @setup_required @login_required @account_initialization_required def delete(self, external_application_id): external_application_id = str(external_application_id) ExternalApplicationService.delete_external_application(external_application_id) return 200 api.add_resource(ExternalApplicationListApi, '/external_applications') api.add_resource(ExternalApplicationApi, '/external_applications/')