From 0ab6b70e6f2a93203fab00664dfc6a3b710601b1 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Mon, 31 May 2021 16:08:10 +0300 Subject: [PATCH] cors + api rewrite --- config.yml | 1 + pub1c-rest.py | 88 ++++++++++++++++++++++++++++++++++++------------ requirements.txt | 1 + 3 files changed, 69 insertions(+), 21 deletions(-) diff --git a/config.yml b/config.yml index a7dc719..909d6a4 100644 --- a/config.yml +++ b/config.yml @@ -2,6 +2,7 @@ infobases: server_file: test/1CV8Clst.lst apache_restart_flagfile: test/apache_restart apache_config: webpub1c/test/apache.cfg +url_prefix: http://localhost vrd_path: webpub1c/test/vrds dir_path: webpub1c/test/pubs url_base: /1c diff --git a/pub1c-rest.py b/pub1c-rest.py index d175214..e696fa8 100644 --- a/pub1c-rest.py +++ b/pub1c-rest.py @@ -1,19 +1,40 @@ import logging import os -from typing import List, Optional +from typing import List, Optional, Dict import traceback import yaml from flask import Flask, g from flask_restful import Resource, Api, reqparse, abort +from flask_cors import CORS from pathvalidate import is_valid_filepath from brackets import get_infobases as br_get_infobases -from webpub1c.webpub1c import VRDConfig, ApacheConfig, urlpath_join +from webpub1c.webpub1c import VRDConfig, ApacheConfig, urlpath_join, WebPublication apache_restart_flagfile = 'restart_apache' +def infobase_data_blank(name: str): + return { + 'name': name, + 'publicated': False, + 'url': '', + 'directory': '', + 'vrd_filename': '', + } + + +def publication_data(publication: WebPublication): + return { + 'name': publication.name, + 'publicated': True, + 'url': publication.url_path, + 'directory': publication.directory, + 'vrd_filename': publication.vrd_filename, + } + + class WebPub1C: def __init__(self, config, verbose: bool = False): level = logging.INFO if verbose else logging.WARNING @@ -51,7 +72,6 @@ class WebPub1C: def check(self): return { - 'config': self._config, 'is_apache_cfg_valid': self._apache_cfg.is_valid(), 'is_vrd_path_valid': self._is_vrd_path_valid(), 'is_dir_path_valid': self._is_dir_path_valid(), @@ -73,10 +93,15 @@ class WebPub1C: self._log.info('module added') def list(self) -> List[str]: - """ List publications """ - + """ List publication names """ return list(self._apache_cfg.publications) + def publications(self) -> List[Dict[str, str]]: + """ List of publications """ + + pubs = map(lambda p: publication_data(p), self._apache_cfg.iter()) + return list(pubs) + def get(self, ibname: str): """ Get publication info """ @@ -84,12 +109,7 @@ class WebPub1C: if publication is None: return publication - return { - 'name': publication.name, - 'url': publication.url_path, - 'directory': publication.directory, - 'vrd_filename': publication.vrd_filename, - } + return publication_data(publication) def add(self, ibname: str, url: Optional[str] = None) -> str: """ Add new publication """ @@ -161,23 +181,46 @@ def validate_url(url: Optional[str]): abort(400, message='invalid url') -class InfobasesAvaible(Resource): +class InfobasesAvailable(Resource): def get(self) -> List[str]: cfg = get_config() bases = load_infobases(cfg) return bases +class Config(Resource): + def get(self): + return get_config() + + class ConfigTest(Resource): def get(self): webpub = get_webpub1c() return webpub.check() -class Publications(Resource): - def get(self) -> List[str]: +class InfobasesAll(Resource): + def get(self) -> List[Dict[str, str]]: + cfg = get_config() webpub = get_webpub1c() - return webpub.list() + infobase_names = load_infobases(cfg) + pubs = webpub.publications() + result: List[Dict[str, str]] = [] + for name in infobase_names: + publicated = False + for pub in filter(lambda x: x["name"] == name, pubs): + publicated = True + result.append(pub) + break + if not publicated: + result.append(infobase_data_blank(name)) + return result + + +class Publications(Resource): + def get(self) -> List[Dict[str, str]]: + webpub = get_webpub1c() + return webpub.publications() def put(self): args = pub_parser.parse_args() @@ -292,20 +335,23 @@ class ApacheRestartFlag(Resource): class APIIndex(Resource): def get(self): - return ['infobases', 'publications', - 'module', 'config', 'apache_restart'] + return ['infobases-available', 'infobases-all', 'publications', + 'module', 'config', 'config-test', 'apache-restart'] app = Flask(__name__) api = Api(app, '/api/v1/') +cors = CORS(app, resources={r"/api/*": {"origins": "*"}}) -api.add_resource(InfobasesAvaible, '/infobases') -api.add_resource(Publications, '/publications') +api.add_resource(InfobasesAvailable, '/infobases-available') +api.add_resource(InfobasesAll, '/infobases-all') +api.add_resource(Publications, '/publications', '/publications/') api.add_resource(Publication, '/publications/') api.add_resource(PublicationURL, '/publications//url') api.add_resource(EnterpriseModule, '/module') -api.add_resource(ConfigTest, '/config') -api.add_resource(ApacheRestartFlag, '/apache_restart') +api.add_resource(Config, '/config') +api.add_resource(ConfigTest, '/config-test') +api.add_resource(ApacheRestartFlag, '/apache-restart') api.add_resource(APIIndex, '/') with app.app_context(): diff --git a/requirements.txt b/requirements.txt index 93f0c53..c551e39 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,6 @@ Flask==2.0.0 Flask-RESTful==0.3.9 +flask-cors==3.0.10 jinja2==2.11.3 PyYAML==5.4.1 pathvalidate==2.4.1