diff options
Diffstat (limited to 'pysite/views/api')
| -rw-r--r-- | pysite/views/api/bot/doc.py | 98 | 
1 files changed, 98 insertions, 0 deletions
| diff --git a/pysite/views/api/bot/doc.py b/pysite/views/api/bot/doc.py new file mode 100644 index 00000000..c1d6020c --- /dev/null +++ b/pysite/views/api/bot/doc.py @@ -0,0 +1,98 @@ +from flask import jsonify +from schema import Optional, Schema + +from pysite.base_route import APIView +from pysite.constants import ValidationTypes +from pysite.decorators import api_key, api_params +from pysite.mixins import DBMixin + + +GET_SCHEMA = Schema([ +    { +        Optional("package"): str +    } +]) + +POST_SCHEMA = Schema([ +    { +        "package": str, +        "base_url": str, +        "inventory_url": str +    } +]) + +DELETE_SCHEMA = Schema([ +    { +        "package": str +    } +]) + + +class DocView(APIView, DBMixin): +    path = "/bot/docs" +    name = "bot.docs" +    table_name = "pydoc_links" + +    @api_key +    @api_params(schema=GET_SCHEMA, validation_type=ValidationTypes.params) +    def get(self, params=None): +        """ +        Fetches documentation metadata from the database. + +        - If `package` parameters are provided, fetch metadata +        for the given packages, or `[]` if none matched. + +        - If `package` is not provided, return all +        packages known to the database. + +        Data must be provided as params. +        API key must be provided as header. +        """ + +        if params: +            packages = (param['package'] for param in params if 'package' in param) +            data = self.db.get_all(self.table_name, *packages, index='package') or [] +        else: +            data = self.db.pluck(self.table_name, ("package", "base_url", "inventory_url")) or [] + +        return jsonify(data) + +    @api_key +    @api_params(schema=POST_SCHEMA, validation_type=ValidationTypes.json) +    def post(self, json_data): +        """ +        Adds one or more new documentation metadata objects. + +        If the `package` passed in the data +        already exists, it will be updated instead. + +        Data must be provided as JSON. +        API key must be provided as header. +        """ + +        packages_to_insert = ( +            { +                "package": json_object["package"], +                "base_url": json_object["base_url"], +                "inventory_url": json_object["inventory_url"] +            } for json_object in json_data +        ) + +        self.db.insert(self.table_name, *packages_to_insert, conflict="update") +        return jsonify({"success": True}) + +    @api_key +    @api_params(schema=DELETE_SCHEMA, validation_type=ValidationTypes.json) +    def delete(self, json_data): +        """ +        Deletes a documentation metadata object. +        Expects the `package` to be deleted to +        be specified as a request parameter. + +        Data must be provided as params. +        API key must be provided as header. +        """ + +        packages = (json_object["package"]for json_object in json_data) +        changes = self.db.delete(self.table_name, *packages, return_changes=True) +        return jsonify(changes) | 
