diff --git a/src/APIWebService.cpp b/src/APIWebService.cpp index e369e2c6b..0e1f49b80 100644 --- a/src/APIWebService.cpp +++ b/src/APIWebService.cpp @@ -40,7 +40,7 @@ APIWebService::service(HttpRequest &request, HttpResponse &response) // ROOT PATH RETURNS A LIST OF ATHLETES if (paths[0] == "") { - listAthletes(response); // return csv list of all athlete and their characteristics + listAthletes(request, response); // return csv list of all athlete and their characteristics return; } @@ -49,30 +49,30 @@ APIWebService::service(HttpRequest &request, HttpResponse &response) // Call to retreive athlete data, downstream will resolve // which functions to call for different data requests - athleteData(paths, response); + athleteData(paths, request, response); } void -APIWebService::athleteData(QStringList &paths, HttpResponse &response) +APIWebService::athleteData(QStringList &paths, HttpRequest &request, HttpResponse &response) { // LIST ACTIVITIES FOR ATHLETE - if (paths.count() == 2) listRides(paths[0], response); + if (paths.count() == 2) listRides(paths[0], request, response); else if (paths.count() > 2) { QString athlete = paths[0]; paths.removeFirst(); // GET ACTIVITY - if (paths[0] == "activity") listActivity(athlete, paths, response); + if (paths[0] == "activity") listActivity(athlete, paths, request, response); // GET MMP - if (paths[0] == "mmp") listMMP(athlete, paths, response); + if (paths[0] == "mmp") listMMP(athlete, paths, request, response); } } void -APIWebService::listAthletes(HttpResponse &response) +APIWebService::listAthletes(HttpRequest &request, HttpResponse &response) { response.setHeader("Content-Type", "text; charset=ISO-8859-1"); @@ -104,7 +104,7 @@ APIWebService::listAthletes(HttpResponse &response) void -APIWebService::writeRideLine(RideItem &item, HttpResponse *response) +APIWebService::writeRideLine(QList wanted, RideItem &item, HttpRequest *request, HttpResponse *response) { // date, time, filename response->write(item.dateTime.date().toString("yyyy/MM/dd").toLocal8Bit()); @@ -113,16 +113,26 @@ APIWebService::writeRideLine(RideItem &item, HttpResponse *response) response->write(","); response->write(item.fileName.toLocal8Bit()); - // metrics... - foreach(double value, item.metrics()) { - response->write(","); - response->write(QString("%1").arg(value, 'f').simplified().toLocal8Bit()); + if (wanted.count()) { + // specific metrics + foreach(int index, wanted) { + double value = item.metrics()[index]; + response->write(","); + response->write(QString("%1").arg(value, 'f').simplified().toLocal8Bit()); + } + } else { + + // all metrics... + foreach(double value, item.metrics()) { + response->write(","); + response->write(QString("%1").arg(value, 'f').simplified().toLocal8Bit()); + } } response->write("\n"); } void -APIWebService::listActivity(QString athlete, QStringList paths, HttpResponse &response) +APIWebService::listActivity(QString athlete, QStringList paths, HttpRequest &request, HttpResponse &response) { // list activities and associated metrics response.setHeader("Content-Type", "text; charset=ISO-8859-1"); @@ -130,7 +140,7 @@ APIWebService::listActivity(QString athlete, QStringList paths, HttpResponse &re } void -APIWebService::listMMP(QString athlete, QStringList paths, HttpResponse &response) +APIWebService::listMMP(QString athlete, QStringList paths, HttpRequest &request, HttpResponse &response) { // list activities and associated metrics response.setHeader("Content-Type", "text; charset=ISO-8859-1"); diff --git a/src/APIWebService.h b/src/APIWebService.h index aa0d805fd..5768fa189 100644 --- a/src/APIWebService.h +++ b/src/APIWebService.h @@ -33,16 +33,16 @@ class APIWebService : public HttpRequestHandler // request despatchers void service(HttpRequest &request, HttpResponse &response); - void athleteData(QStringList &paths, HttpResponse &response); + void athleteData(QStringList &paths, HttpRequest &request, HttpResponse &response); // Discrete API endpoints - void listAthletes(HttpResponse &response); - void listRides(QString athlete, HttpResponse &response); - void listActivity(QString athlete, QStringList paths, HttpResponse &response); - void listMMP(QString athlete, QStringList paths, HttpResponse &response); + void listAthletes(HttpRequest &request, HttpResponse &response); + void listRides(QString athlete, HttpRequest &request, HttpResponse &response); + void listActivity(QString athlete, QStringList paths, HttpRequest &request, HttpResponse &response); + void listMMP(QString athlete, QStringList paths, HttpRequest &request, HttpResponse &response); // utility - void writeRideLine(RideItem &item, HttpResponse *response); + void writeRideLine(QList wanted, RideItem &item, HttpRequest *request, HttpResponse *response); private: QDir home; diff --git a/src/RideDB.h b/src/RideDB.h index a1fd92ca4..3aae46b2a 100644 --- a/src/RideDB.h +++ b/src/RideDB.h @@ -42,6 +42,7 @@ class APIWebService; class HttpResponse; +class HttpRequest; // using context (we are reentrant) struct RideDBContext { @@ -49,8 +50,11 @@ struct RideDBContext { // either reading a cache or providing an api ... RideCache *cache; + // api parms APIWebService *api; + HttpRequest *request; HttpResponse *response; + QList wanted; // the scanner void *scanner; diff --git a/src/RideDB.y b/src/RideDB.y index d8cc0bb57..2949ff6c1 100644 --- a/src/RideDB.y +++ b/src/RideDB.y @@ -75,7 +75,7 @@ ride: '{' rideelement_list '}' { if (jc->api != NULL) { // we're listing rides in the api - jc->api->writeRideLine(jc->item, jc->response); + jc->api->writeRideLine(jc->wanted, jc->item, jc->request, jc->response); } else { @@ -465,7 +465,7 @@ void RideCache::save() } void -APIWebService::listRides(QString athlete, HttpResponse &response) +APIWebService::listRides(QString athlete, HttpRequest &request, HttpResponse &response) { // list activities and associated metrics response.setHeader("Content-Type", "text; charset=ISO-8859-1"); @@ -481,15 +481,35 @@ APIWebService::listRides(QString athlete, HttpResponse &response) indexed[m->index()] = m; } + // was the metric parameter passed? + QString metrics(request.getParameter("metrics")); + + // do all ? + QStringList wantedNames; + QList wanted; + if (metrics != "") wantedNames = metrics.split(","); + // write headings response.write("date, time, filename"); + + int i=0; foreach(const RideMetric *m, indexed) { + + i++; + + // if limited don't do limited headings + QString underscored = m->name().replace(" ","_"); + if (wantedNames.count() && !wantedNames.contains(underscored)) continue; + if (m->name().startsWith("BikeScore")) response.write(", BikeScore"); else { response.write(", "); response.write(m->name().toLocal8Bit()); } + + // index of wanted metrics + wanted << (i-1); } response.write("\n"); @@ -513,6 +533,8 @@ APIWebService::listRides(QString athlete, HttpResponse &response) jc->cache = NULL; jc->api = this; jc->response = &response; + jc->request = &request; + jc->wanted = wanted; jc->old = false; // clean item