|
@@ -1,48 +1,91 @@
|
|
|
+import asyncio
|
|
|
+import asyncpg
|
|
|
+import jinja2
|
|
|
+import os
|
|
|
import ujson as json
|
|
|
+from operator import itemgetter
|
|
|
|
|
|
|
|
|
-def json_endpoint(message):
|
|
|
+async def setup():
|
|
|
+ global pool
|
|
|
+ pool = await asyncpg.create_pool(
|
|
|
+ user=os.getenv('PGUSER', 'benchmarkdbuser'),
|
|
|
+ password=os.getenv('PGPASS', 'benchmarkdbpass'),
|
|
|
+ database='hello_world',
|
|
|
+ host=os.getenv('DBHOST', 'localhost'),
|
|
|
+ port=5432
|
|
|
+ )
|
|
|
+
|
|
|
+
|
|
|
+pool = None
|
|
|
+additional = [0, 'Additional fortune added at request time.']
|
|
|
+key = itemgetter(1)
|
|
|
+template = None
|
|
|
+path = os.path.join('templates', 'fortune.html')
|
|
|
+with open(path, 'r') as template_file:
|
|
|
+ template_text = template_file.read()
|
|
|
+ template = jinja2.Template(template_text)
|
|
|
+
|
|
|
+loop = asyncio.get_event_loop()
|
|
|
+loop.run_until_complete(setup())
|
|
|
+
|
|
|
+
|
|
|
+async def json_endpoint(message, channels):
|
|
|
content = json.dumps({'message': 'Hello, world!'}).encode('utf-8')
|
|
|
- response = {
|
|
|
+ await channels['reply'].send({
|
|
|
'status': 200,
|
|
|
'headers': [
|
|
|
[b'content-type', b'application/json'],
|
|
|
],
|
|
|
'content': content
|
|
|
- }
|
|
|
- message['reply_channel'].send(response)
|
|
|
+ })
|
|
|
|
|
|
|
|
|
-def plaintext_endpoint(message):
|
|
|
- content = b'Hello, world!'
|
|
|
- response = {
|
|
|
+async def fortunes_endpoint(message, channels):
|
|
|
+ connection = await pool.acquire()
|
|
|
+ try:
|
|
|
+ fortunes = await connection.fetch('SELECT * FROM Fortune')
|
|
|
+ fortunes.append(additional)
|
|
|
+ fortunes.sort(key=key)
|
|
|
+ content = template.render(fortunes=fortunes).encode('utf-8')
|
|
|
+ await channels['reply'].send({
|
|
|
+ 'status': 200,
|
|
|
+ 'headers': [
|
|
|
+ [b'content-type', b'text/html; charset=utf-8'],
|
|
|
+ ],
|
|
|
+ 'content': content
|
|
|
+ })
|
|
|
+ finally:
|
|
|
+ await pool.release(connection)
|
|
|
+
|
|
|
+
|
|
|
+async def plaintext_endpoint(message, channels):
|
|
|
+ await channels['reply'].send({
|
|
|
'status': 200,
|
|
|
'headers': [
|
|
|
[b'content-type', b'text/plain'],
|
|
|
],
|
|
|
- 'content': content
|
|
|
- }
|
|
|
- message['reply_channel'].send(response)
|
|
|
+ 'content': b'Hello, world!'
|
|
|
+ })
|
|
|
|
|
|
|
|
|
-def handle_404(message):
|
|
|
- content = b'Not found'
|
|
|
- response = {
|
|
|
+async def handle_404(message, channels):
|
|
|
+ await channels['reply'].send({
|
|
|
'status': 404,
|
|
|
'headers': [
|
|
|
[b'content-type', b'text/plain'],
|
|
|
],
|
|
|
- 'content': content
|
|
|
- }
|
|
|
- message['reply_channel'].send(response)
|
|
|
+ 'content': b'Not found'
|
|
|
+ })
|
|
|
|
|
|
|
|
|
routes = {
|
|
|
'/json': json_endpoint,
|
|
|
+ '/fortunes': fortunes_endpoint,
|
|
|
'/plaintext': plaintext_endpoint
|
|
|
}
|
|
|
|
|
|
|
|
|
-def main(message):
|
|
|
- path = message['content']['path']
|
|
|
- routes.get(path, handle_404)(message)
|
|
|
+async def main(message, channels):
|
|
|
+ path = message['path']
|
|
|
+ await routes.get(path, handle_404)(message, channels)
|