dspace_statistics_api/app.py: Use UUID

DSpace 6+ uses a UUID for item identifiers instead of an integer so
we need to adapt our PostgreSQL queries to use those. Note that we
can no longer sort results in the "all items" endpoint by ID. Also,
we need to use parameterized psycopg2 queries instead of strings to
support queries with UUIDs properly. To use the Python UUID objects
elsewhere in the code we need to make sure that we cast them to str.
This commit is contained in:
Alan Orth 2020-03-02 11:06:27 +02:00
parent 250fd8164f
commit 5955868b9a
1 changed files with 13 additions and 7 deletions

View File

@ -27,9 +27,9 @@ class AllItemsResource:
cursor.execute("SELECT COUNT(id) FROM items")
pages = round(cursor.fetchone()[0] / limit)
# get statistics, ordered by id, and use limit and offset to page through results
# get statistics and use limit and offset to page through results
cursor.execute(
"SELECT id, views, downloads FROM items ORDER BY id ASC LIMIT {} OFFSET {}".format(
"SELECT id, views, downloads FROM items LIMIT {} OFFSET {}".format(
limit, offset
)
)
@ -41,7 +41,7 @@ class AllItemsResource:
for item in cursor:
statistics.append(
{
"id": item["id"],
"id": str(item["id"]),
"views": item["views"],
"downloads": item["downloads"],
}
@ -61,26 +61,32 @@ class ItemResource:
def on_get(self, req, resp, item_id):
"""Handles GET requests"""
import psycopg2.extras
# Adapt Pythons uuid.UUID type to PostgreSQLs uuid
# See: https://www.psycopg.org/docs/extras.html
psycopg2.extras.register_uuid()
with DatabaseManager() as db:
db.set_session(readonly=True)
with db.cursor() as cursor:
cursor = db.cursor()
cursor.execute(
"SELECT views, downloads FROM items WHERE id={}".format(item_id)
"SELECT views, downloads FROM items WHERE id=%s", [str(item_id)]
)
if cursor.rowcount == 0:
raise falcon.HTTPNotFound(
title="Item not found",
description='The item with id "{}" was not found.'.format(
item_id
str(item_id)
),
)
else:
results = cursor.fetchone()
statistics = {
"id": item_id,
"id": str(item_id),
"views": results["views"],
"downloads": results["downloads"],
}
@ -91,6 +97,6 @@ class ItemResource:
api = application = falcon.API()
api.add_route("/", RootResource())
api.add_route("/items", AllItemsResource())
api.add_route("/item/{item_id:int}", ItemResource())
api.add_route("/item/{item_id:uuid}", ItemResource())
# vim: set sw=4 ts=4 expandtab: