From 5c71ecb3dc6e52a896c98120c9504e0e74ec08d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Otto=20Kek=C3=A4l=C3=A4inen?= Date: Sat, 21 Mar 2020 13:54:28 +0200 Subject: [PATCH] Implement first crude /stats endpoint Example output: curl -iLsS http://localhost:9000/api/v0/stats HTTP/1.1 200 OK Content-Type: application/json Content-Length: 359 { "success": true, "data": { "submitters": { "since": "2020-03-20T15:32:55", "total": 9, "today": 1, "past_7_days": 9 }, "submissions": { "since": "2020-03-20T15:32:55", "total": 13, "today": 5, "past_7_days": 13 } } } --- api/fevermap/api/__init__.py | 5 +++- api/fevermap/api/stats.py | 45 ++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 api/fevermap/api/stats.py diff --git a/api/fevermap/api/__init__.py b/api/fevermap/api/__init__.py index 43fe27d..d684ff0 100644 --- a/api/fevermap/api/__init__.py +++ b/api/fevermap/api/__init__.py @@ -4,8 +4,9 @@ from flask import Blueprint from flask_restful import Api -from .submission import SubmissionResource from .ping import PingResource +from .submission import SubmissionResource +from .stats import StatsResource v0_blueprint = Blueprint('v0', __name__) api = Api(v0_blueprint) @@ -13,3 +14,5 @@ api = Api(v0_blueprint) api.add_resource(PingResource, '/ping') api.add_resource(SubmissionResource, '/submit') + +api.add_resource(StatsResource, '/stats') diff --git a/api/fevermap/api/stats.py b/api/fevermap/api/stats.py new file mode 100644 index 0000000..52b2a38 --- /dev/null +++ b/api/fevermap/api/stats.py @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- + +from datetime import date, datetime, timedelta + +from flask_restful import Resource + +from fevermap.db import db_session +from fevermap.db.models.submission import Submission +from fevermap.db.models.submitter import Submitter + +from flask import Flask +app = Flask('fevermap') + +class StatsResource(Resource): + + def get(self, **kwargs): + """Get stats.""" + + # @TODO: Add cache headers so Nginx will cache the respons and not + # hit the Flask server for all requests + + app.logger.info('Serving stats') + + midnight = datetime.combine(datetime.now(), datetime.min.time()) + midnight_7_days_ago = midnight - timedelta(days=7) + + data = { + 'submitters': { + 'since': db_session.query(Submitter).order_by(Submitter.timestamp_created).limit(1).one().timestamp_created.isoformat(timespec='seconds'), + 'total': db_session.query(Submitter).count(), + 'today': db_session.query(Submitter).filter(Submitter.timestamp_modified > midnight).count(), + 'past_7_days': db_session.query(Submitter).filter(Submitter.timestamp_modified > midnight_7_days_ago).count(), + }, + 'submissions': { + 'since': db_session.query(Submission).order_by(Submission.timestamp_created).limit(1).one().timestamp_created.isoformat(timespec='seconds'), + 'total': db_session.query(Submission).count(), + 'today': db_session.query(Submission).filter(Submission.timestamp_modified > midnight).count(), + 'past_7_days': db_session.query(Submission).filter(Submission.timestamp_modified > midnight_7_days_ago).count(), + } + } + + return { + 'success': True, + 'data': data + } -- GitLab