aboutsummaryrefslogtreecommitdiffstats
path: root/pysite/views/api
diff options
context:
space:
mode:
authorGravatar lmn <[email protected]>2018-02-13 13:11:57 +0100
committerGravatar Joseph <[email protected]>2018-02-13 12:11:57 +0000
commitf92946e12f9acfa394c04a140a2a4d025a5fe3ca (patch)
treea74a0874c842952899f3d10ff2df8397fb89560d /pysite/views/api
parentWebsocket echo test (diff)
RethinkDB API Views #yqhg
* Refactoring the database implementation into a class of its own. * Refactoring the database implementation into a class of its own. * healthcheck should belong to the API. * dynamic subdomain loading, setting up basic handling for staff.pythondiscord.com, and started on a TagView for a bot tag feature. * Oops, forgot to fix some merges. * Some quality of life updates - default values for env variables that aren't secret, and starting to get through the tag view. * Refactoring the database implementation into a class of its own. * healthcheck should belong to the API. * dynamic subdomain loading, setting up basic handling for staff.pythondiscord.com, and started on a TagView for a bot tag feature. * Oops, forgot to fix some merges. * Some quality of life updates - default values for env variables that aren't secret, and starting to get through the tag view. * API validation added to the APIView class, TagView should be finished as well. * super important commit you guys * fixed a bug with the RethinkDB class where host and port attributes were accessed before being created * Fixed my editor now you guys * Fixing up some of the problems brought up in gdude's review * Handling GET requests with param indata and POST with JSON. Fixed error handling to use the constants and the baseclass self.error(). * Get API-key from headers, context manage the db assignment, and default env var values * Changed API-KEY header to X_API_Key. Added a default for secret key. it should no longer be necessary with environment variables to run this system locally. * Changing back the nav to have relative paths * Why am I like this
Diffstat (limited to 'pysite/views/api')
-rw-r--r--pysite/views/api/bot/__init__.py0
-rw-r--r--pysite/views/api/bot/tag.py66
-rw-r--r--pysite/views/api/healthcheck.py4
3 files changed, 68 insertions, 2 deletions
diff --git a/pysite/views/api/bot/__init__.py b/pysite/views/api/bot/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/pysite/views/api/bot/__init__.py
diff --git a/pysite/views/api/bot/tag.py b/pysite/views/api/bot/tag.py
new file mode 100644
index 00000000..acbdbc0c
--- /dev/null
+++ b/pysite/views/api/bot/tag.py
@@ -0,0 +1,66 @@
+# coding=utf-8
+
+from flask import g, jsonify, request
+
+import rethinkdb
+
+from pysite.base_route import APIView
+from pysite.constants import ErrorCodes
+
+
+class TagView(APIView):
+ path = '/tag'
+ name = 'tag'
+ table = 'tag'
+
+ def __init__(self):
+ # make sure the table exists
+ with g.db.get_connection() as conn:
+ try:
+ rethinkdb.db(g.db.database).table_create(self.table, {'primary_key': 'tag_name'}).run(conn)
+ except rethinkdb.RqlRuntimeError:
+ print(f'Table {self.table} exists')
+
+ def get(self):
+ """
+ Indata must be provided as params,
+ API key must be provided as header
+ """
+ rdb = rethinkdb.table(self.table)
+ api_key = request.headers.get('X-API-Key')
+ tag_name = request.args.get('tag_name')
+
+ if self.validate_key(api_key):
+ if tag_name:
+ data = rdb.get(tag_name).run(g.db.conn)
+ data = dict(data) if data else {}
+ else:
+ data = rdb.pluck('tag_name').run(g.db.conn)
+ data = list(data) if data else []
+ else:
+ self.error(ErrorCodes.invalid_api_key)
+
+ return jsonify(data)
+
+ def post(self):
+ """ Indata must be provided as JSON. """
+ rdb = rethinkdb.table(self.table)
+ indata = request.get_json()
+ tag_name = indata.get('tag_name')
+ tag_content = indata.get('tag_content')
+ tag_category = indata.get('tag_category')
+ api_key = indata.get('api_key')
+
+ if self.validate_key(api_key):
+ if tag_name and tag_content:
+ rdb.insert({
+ 'tag_name': tag_name,
+ 'tag_content': tag_content,
+ 'tag_category': tag_category
+ }).run(g.db.conn)
+ else:
+ self.error(ErrorCodes.missing_parameters)
+ else:
+ self.error(ErrorCodes.invalid_api_key)
+
+ return jsonify({'success': True})
diff --git a/pysite/views/api/healthcheck.py b/pysite/views/api/healthcheck.py
index 9d1f681a..2ff5dfb0 100644
--- a/pysite/views/api/healthcheck.py
+++ b/pysite/views/api/healthcheck.py
@@ -1,10 +1,10 @@
# coding=utf-8
from flask import jsonify
-from pysite.base_route import RouteView
+from pysite.base_route import APIView
-class IndexView(RouteView):
+class HealthCheckView(APIView):
path = "/healthcheck"
name = "healthcheck"