1
0
mirror of https://github.com/ilri/dspace-statistics-api.git synced 2025-02-10 04:02:59 +01:00
Alan Orth 3339bf8d9c
Add communities and collections support to API
The basic logic is similar to items, where you can request single
item statistics with a UUID, all item statistics, and item statis-
tics for a list of items (optionally with a date range). Most of
the item code was re-purposed to work on "elements", which can be
items, communities, or collections depending on the request, with
the use of Falcon's `before` hooks to set the statistics scope so
we know how to behave for the current request.

Other than the minor difference in facet fields, another issue I
had with communities and collections is that the owningComm and
owningColl fields are multi-valued (unlike items' id field). This
means that, when you facet the results of your query, Solr returns
ids that seem unrelated, but are actually present in the field, so
I had to make sure I checked all returned ids to see if they were
in the user's POSTed elements list.

TODO:
  - Add tests
  - Revise docstrings
  - Refactor items.py as it is now generic
2020-12-20 16:14:46 +02:00
2020-11-25 14:56:47 +02:00
2018-11-04 00:48:06 +02:00
2018-09-25 00:56:01 +03:00
2018-09-18 14:16:07 +03:00
2020-12-18 11:19:16 +02:00
2020-12-14 22:05:03 +02:00
2020-12-18 10:42:48 +02:00
2020-12-18 11:20:17 +02:00
2020-12-18 11:20:17 +02:00

DSpace Statistics API Build Status builds.sr.ht status

DSpace stores item view and download events in a Solr "statistics" core. This information is available for use in the various DSpace user interfaces, but is not exposed externally via any APIs. The DSpace 4/5/6 REST API, for example, only exposes metadata about communities, collections, items, and bitstreams.

This project contains an indexer and a Falcon-based web application to make the statistics available via a simple REST API. You can read more about the Solr queries used to gather the item view and download statistics on the DSpace wiki.

If you use the DSpace Statistics API please cite:

Orth, A. 2018. DSpace statistics API. Nairobi, Kenya: ILRI. https://hdl.handle.net/10568/99143.

Requirements

Installation

Create a Python virtual environment and install the dependencies:

$ python3 -m venv venv
$ source venv/bin/activate
$ pip install -r requirements.txt

Running

Set up the environment variables for Solr and PostgreSQL:

$ export SOLR_SERVER=http://localhost:8080/solr
$ export DATABASE_NAME=dspacestatistics
$ export DATABASE_USER=dspacestatistics
$ export DATABASE_PASS=dspacestatistics
$ export DATABASE_HOST=localhost

Index the Solr statistics core to populate the PostgreSQL database:

$ python -m dspace_statistics_api.indexer

Run the REST API:

$ gunicorn dspace_statistics_api.app

Test to see if there are any statistics:

$ curl 'http://localhost:8000/items?limit=1'

Testing

Install development packages using pip:

$ pip install -r requirements-dev.txt

Run tests:

$ pytest

Deployment

There are example systemd service and timer units in the contrib directory. The API service listens on localhost by default so you will need to expose it publicly using a web server like nginx.

An example nginx configuration is:

server {
    #...

    location ~ /rest/statistics/?(.*) {
        access_log /var/log/nginx/statistics.log;
        proxy_pass http://statistics_api/$1$is_args$args;
    }
}

upstream statistics_api {
    server 127.0.0.1:5000;
}

This would expose the API at /rest/statistics.

Using the API

The API exposes the following endpoints:

  • GET /return a basic API documentation page.
  • GET /itemsreturn views and downloads for all items that Solr knows about¹. Accepts limit and page query parameters for pagination of results (limit must be an integer between 1 and 100, and page must be an integer greater than or equal to 0).
  • POST /itemsreturn views and downloads for an arbitrary list of items with an optional date range. Accepts limit, page, dateFrom, and dateTo parameters².
  • GET /item/idreturn views and downloads for a single item (id must be a UUID). Returns HTTP 404 if an item id is not found.

The item id is the internal UUID for an item. You can get these from the standard DSpace REST API.

¹ We are querying the Solr statistics core, which technically only knows about items that have either views or downloads. If an item is not present here you can assume it has zero views and zero downloads, but not necessarily that it does not exist in the repository.

² POST requests to /items should be in JSON format with the following parameters:

{
    "limit": 100, // optional, integer between 0 and 100, default 100
    "page": 0, // optional, integer greater than 0, default 0
    "dateFrom": "2020-01-01T00:00:00Z", // optional, default *
    "dateTo": "2020-09-09T00:00:00Z", // optional, default *
    "items": [
        "f44cf173-2344-4eb2-8f00-ee55df32c76f",
        "2324aa41-e9de-4a2b-bc36-16241464683e",
        "8542f9da-9ce1-4614-abf4-f2e3fdb4b305",
        "0fe573e7-042a-4240-a4d9-753b61233908"
    ]
}

TODO

  • Better logging
  • Version API (or at least include a /version endpoint?)
    • Probably use /status with a version in the response
  • Use JSON in PostgreSQL
  • Add top items endpoint, perhaps /top/items or /items/top?
    • Actually we could add /items?limit=10&sort=views
  • Make community and collection stats available
    • Facet on owningComm and owningColl
  • Add Swagger with OpenAPI 3.0.x with falcon-swagger-ui

License

This work is licensed under the GPLv3.

The license allows you to use and modify the work for personal and commercial purposes, but if you distribute the work you must provide users with a means to access the source code for the version you are distributing. Read more about the GPLv3 at TL;DR Legal.

Description
A simple REST API to expose Solr view and download statistics for items in a DSpace repository.
Readme 1.4 MiB
Languages
Python 100%