diff --git a/api/fevermap/api/__init__.py b/api/fevermap/api/__init__.py index 43fe27d195e5bf056ae3d5c0b729c59a1cb438dd..d684ff0ec15df7a98ddc48f6b4c03b4cb4a9a1eb 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 0000000000000000000000000000000000000000..52b2a38ea9f7ede393bf5c322f8c614603acf018 --- /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 + }