Skip to content

Commit

Permalink
Internal API for lookup stats
Browse files Browse the repository at this point in the history
  • Loading branch information
lalinsky committed Feb 17, 2016
1 parent 108922c commit d951ee2
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 5 deletions.
36 changes: 35 additions & 1 deletion acoustid/api/v2/internal.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,14 @@
# Distributed under the MIT license, see the LICENSE file for details.

import logging
from acoustid.data.stats import update_lookup_stats, update_user_agent_stats
from acoustid.data.stats import (
update_lookup_stats,
update_user_agent_stats,
find_application_lookup_stats_multi,
)
from acoustid.data.application import (
find_applications_by_apikeys,
)
from acoustid.api import errors
from acoustid.api.v2 import APIHandler, APIHandlerParams
from acoustid.handler import Handler, Response
Expand Down Expand Up @@ -67,3 +74,30 @@ def _handle_internal(self, params):
params.user_agent, params.ip, params.count)
return {}


class LookupStatsHandlerParams(APIHandlerParams):

def parse(self, values, conn):
super(LookupStatsHandlerParams, self).parse(values, conn)
self.secret = values.get('secret')
apikeys = values.getlist('client')
if not apikeys:
raise errors.InvalidAPIKeyError()
self.applications = find_applications_by_apikeys(conn, apikeys)
if not self.applications:
raise errors.InvalidAPIKeyError()


class LookupStatsHandler(APIHandler):

params_class = LookupStatsHandlerParams

def _handle_internal(self, params):
if self.cluster.secret != params.secret:
logger.warning('Invalid cluster secret')
raise errors.NotAllowedError()
application_ids = dict((app['id'], app['apikey']) for app in params.applications)
stats = find_application_lookup_stats_multi(self.conn, application_ids.keys())
for entry in stats:
entry['date'] = entry['date'].strftime('%Y-%m-%d')
return {'stats': stats}
5 changes: 5 additions & 0 deletions acoustid/data/application.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@ def find_applications_by_account(conn, account_id):
return [dict(i) for i in conn.execute(query).fetchall()]


def find_applications_by_apikeys(conn, apikeys):
query = schema.application.select(schema.application.c.apikey.in_(apikeys))
return [dict(i) for i in conn.execute(query).fetchall()]


def insert_application(conn, data):
"""
Insert a new application into the database
Expand Down
12 changes: 8 additions & 4 deletions acoustid/data/stats.py
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,7 @@ def update_user_agent_stats(db, application_id, date, user_agent, ip, count):
db.execute(stmt)


def find_application_lookup_stats(conn, application_id):
def find_application_lookup_stats_multi(conn, application_ids):
query = """
SELECT
date,
Expand All @@ -183,17 +183,21 @@ def find_application_lookup_stats(conn, application_id):
sum(count_hits) + sum(count_nohits) AS count
FROM stats_lookups
WHERE
application_id = %s AND
application_id IN ({ids}) AND
date > now() - INTERVAL '30 day' AND date < date(now())
GROUP BY date
ORDER BY date
"""
""".format(ids=",".join(["%s"] * len(application_ids)))
stats = []
for row in conn.execute(query, (application_id,)):
for row in conn.execute(query, application_ids):
stats.append(dict(row))
return stats


def find_application_lookup_stats(conn, application_id):
return find_application_lookup_stats_multi(conn, (application_id,))


def find_top_contributors(conn):
src = schema.stats_top_accounts.join(schema.account)
query = sql.select([
Expand Down
1 change: 1 addition & 0 deletions acoustid/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
Submount('/internal', [
Rule('/update_lookup_stats', endpoint=api.v2.internal.UpdateLookupStatsHandler),
Rule('/update_user_agent_stats', endpoint=api.v2.internal.UpdateUserAgentStatsHandler),
Rule('/lookup_stats', endpoint=api.v2.internal.LookupStatsHandler),
]),
]),
])
Expand Down

0 comments on commit d951ee2

Please sign in to comment.