diff options
Diffstat (limited to 'src/api')
| -rw-r--r-- | src/api/OlympicsAPI.cpp | 126 | ||||
| -rw-r--r-- | src/api/OlympicsAPI.h | 84 | 
2 files changed, 210 insertions, 0 deletions
| diff --git a/src/api/OlympicsAPI.cpp b/src/api/OlympicsAPI.cpp new file mode 100644 index 0000000..edcb021 --- /dev/null +++ b/src/api/OlympicsAPI.cpp @@ -0,0 +1,126 @@ + +#include "OlympicsAPI.h" +#include <string> +#include <stdexcept> + +// networking +#include <QEventLoop> +#include <QNetworkAccessManager> +#include <QNetworkRequest> +#include <QNetworkReply> +#include <QUrl> +#include <QUrlQuery> + +// json parsing +#include <QJsonValue> +#include <QJsonDocument> +#include <QJsonObject> +#include <QVariantMap> +#include <QJsonArray> + + +using namespace std; + +/** + * @brief OlympicsAPI::getSportData Requests the current data from the Olympics API of a certain discipline. + * @param sport The discipline to request. + * @return The current information provided by the API endpoint. + */ +QJsonObject OlympicsAPI::getSportData(OlympicsAPI::Disciplines sport) { +    string shortName = this->getDisciplineShort(sport); + +    // create custom temporary event loop on stack +    QEventLoop eventLoop; + +    // "quit()" the event-loop, when the network request "finished()" +    QNetworkAccessManager mgr; +    QObject::connect(&mgr, SIGNAL(finished(QNetworkReply*)), &eventLoop, SLOT(quit())); + +    QString endpoint = (API_LINK + shortName).c_str(); + +    // the HTTP request +    QNetworkRequest req( (QUrl( endpoint )) ); +    QNetworkReply *reply = mgr.get(req); +    eventLoop.exec(); // blocks stack until "finished()" has been called + +    if (reply->error() == QNetworkReply::NoError) { +        //success + +        QString strReply = (QString)reply->readAll(); + +        //parse json +        QJsonDocument jsonResponse = QJsonDocument::fromJson(strReply.toUtf8()); + +        QJsonObject jsonObj = jsonResponse.object(); + +        delete reply; + +        return jsonObj; +    } +    else { +        //failure +        delete reply; + +        throw invalid_argument("API request failed."); +    } + +} + +/** + * @brief OlympicsAPI::getDisciplineShort Get the discipline's short name defined by the IOC (International Olympic Committee) + * @param sport The sport you want to get the name from. + * @return The short name as a string. + */ +string OlympicsAPI::getDisciplineShort(OlympicsAPI::Disciplines sport) { +    switch (sport) { +    case OlympicsAPI::Disciplines::AquaticsArtisticSwimming: return "SWA"; +    case OlympicsAPI::Disciplines::AquaticsDiving: return "DIV"; +    case OlympicsAPI::Disciplines::AquaticsMarathonSwimming: return "OWS"; +    case OlympicsAPI::Disciplines::AquaticsSwimming: return "SWM"; +    case OlympicsAPI::Disciplines::AquaticsWaterPolo: return "WPO"; +    case OlympicsAPI::Disciplines::Archery: return "ARC"; +    case OlympicsAPI::Disciplines::Athletics: return "ATH"; +    case OlympicsAPI::Disciplines::Badminton: return "BDM"; +    case OlympicsAPI::Disciplines::Basketball3v3: return "BK3"; +    case OlympicsAPI::Disciplines::Basketball: return "BKB"; +    case OlympicsAPI::Disciplines::Boxing: return "BOX"; +    case OlympicsAPI::Disciplines::Breaking: return "BKG"; +    case OlympicsAPI::Disciplines::CanoeingSprint: return "CSP"; +    case OlympicsAPI::Disciplines::CanoeingSlalom: return "CSL"; +    case OlympicsAPI::Disciplines::CyclingBMXFreestyle: return "BMF"; +    case OlympicsAPI::Disciplines::CyclingBMXRacing: return "BMX"; +    case OlympicsAPI::Disciplines::CyclingMaountainBike: return "MTB"; +    case OlympicsAPI::Disciplines::CyclingRoad: return "CRD"; +    case OlympicsAPI::Disciplines::CyclingTrack: return "CTR"; +    case OlympicsAPI::Disciplines::EquestrianDressage: return "EDR"; +    case OlympicsAPI::Disciplines::EquestrianEventing: return "EVE"; +    case OlympicsAPI::Disciplines::EquestrianJumping: return "EJP"; +    case OlympicsAPI::Disciplines::Fencing: return "FEN"; +    case OlympicsAPI::Disciplines::FieldHockey: return "HOC"; +    case OlympicsAPI::Disciplines::Football: return "FBL"; +    case OlympicsAPI::Disciplines::Golf: return "GLF"; +    case OlympicsAPI::Disciplines::GymnasticsArtistic: return "GAR"; +    case OlympicsAPI::Disciplines::GymnasticsRhythmic: return "GRY"; +    case OlympicsAPI::Disciplines::GymnasticsTrampoline: return "GTR"; +    case OlympicsAPI::Disciplines::HandballIndoor: return "HBL"; +    case OlympicsAPI::Disciplines::Judo: return "JUD"; +    case OlympicsAPI::Disciplines::ModernPentathlon: return "MPN"; +    case OlympicsAPI::Disciplines::Rowing: return "ROW"; +    case OlympicsAPI::Disciplines::Rugby7: return "RU7"; +    case OlympicsAPI::Disciplines::Sailing: return "SAL"; break; +    case OlympicsAPI::Disciplines::Shooting: return "SHO"; break; +    case OlympicsAPI::Disciplines::Skateboarding: return "SKB"; break; +    case OlympicsAPI::Disciplines::SportClimbing: return "CLB"; break; +    case OlympicsAPI::Disciplines::Surfing: return "SRF"; break; +    case OlympicsAPI::Disciplines::TableTennis: return "TTE"; break; +    case OlympicsAPI::Disciplines::Taekwondo: return "TKW"; break; +    case OlympicsAPI::Disciplines::Tennis: return "TEN"; break; +    case OlympicsAPI::Disciplines::Triathlon: return "TRI"; break; +    case OlympicsAPI::Disciplines::VolleyballBeach: return "VBV"; break; +    case OlympicsAPI::Disciplines::VolleyballIndoor: return "VVO"; break; +    case OlympicsAPI::Disciplines::Weightlifting: return "WLF"; break; +    case OlympicsAPI::Disciplines::WrestlingFreestyle: return "WRE"; break; +    case OlympicsAPI::Disciplines::WrestlingGrecoRoman: return "WRG"; break; +    default: return "ARC"; // default, which should not be possible, because of enum +    } +} diff --git a/src/api/OlympicsAPI.h b/src/api/OlympicsAPI.h new file mode 100644 index 0000000..8efaa26 --- /dev/null +++ b/src/api/OlympicsAPI.h @@ -0,0 +1,84 @@ + +#ifndef ITAT_CHALLANGE_OLYMPICS_OLYMPICSAPI_H +#define ITAT_CHALLANGE_OLYMPICS_OLYMPICSAPI_H + + +#define API_LINK "https://sph-s-api.olympics.com/summer/schedules/api/ENG/schedule/discipline/" + +#include <string> +#include <QJsonObject> + +using namespace std; + +/* + * TODO: + * Replace api request code snippet in main with: + * +    OlympicsAPI api; +    QJsonObject archery = api.getSportData(api.Archery); +    qDebug() << "Competitor:" << archery["units"][0]["competitors"][0]["name"].toString(); + * + */ + +class OlympicsAPI { + +public: + +    enum Disciplines { +        AquaticsArtisticSwimming, +        AquaticsDiving, +        AquaticsMarathonSwimming, +        AquaticsSwimming, +        AquaticsWaterPolo, +        Archery, +        Athletics, +        Badminton, +        Basketball3v3, +        Basketball, +        Boxing, +        Breaking, +        CanoeingSprint, +        CanoeingSlalom, +        CyclingBMXFreestyle, +        CyclingBMXRacing, +        CyclingMaountainBike, +        CyclingRoad, +        CyclingTrack, +        EquestrianDressage, +        EquestrianEventing, +        EquestrianJumping, +        Fencing, +        FieldHockey, +        Football, +        Golf, +        GymnasticsArtistic, +        GymnasticsRhythmic, +        GymnasticsTrampoline, +        HandballIndoor, +        Judo, +        ModernPentathlon, +        Rowing, +        Rugby7, +        Sailing, +        Shooting, +        Skateboarding, +        SportClimbing, +        Surfing, +        TableTennis, +        Taekwondo, +        Tennis, +        Triathlon, +        VolleyballBeach, +        VolleyballIndoor, +        Weightlifting, +        WrestlingFreestyle, +        WrestlingGrecoRoman +    }; + +    QJsonObject getSportData(Disciplines sport); +    string getDisciplineShort(Disciplines sport); + +}; + + +#endif //ITAT_CHALLANGE_OLYMPICS_OLYMPICSAPI_H | 
