1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
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)
|