summaryrefslogtreecommitdiff
path: root/src/api/OlympicsAPI.cpp
blob: 0334800b10e9643781f552847c51351e2a034b1c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140

#include "OlympicsAPI.h"
#include <string>
#include <stdexcept>

// networking
#include <QEventLoop>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QUrl>
#include <QUrlQuery>

// json parsing
#include <QFile>
#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);

    if (USE_API_REQUEST) {
        // 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.");
        }
    }

    // if API is not used, open locally stored data
    QString filePath = ("../../res/mock/" + shortName + ".json").c_str();
    QFile file( filePath );

    if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
        throw invalid_argument("Could not open file to read data of the given discipline.");
    } else {
        QString text = file.readAll();
        file.close();
        return (QJsonDocument::fromJson(text.toUtf8())).object();
    }
}

/**
 * @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";
    case OlympicsAPI::Disciplines::Shooting: return "SHO";
    case OlympicsAPI::Disciplines::Skateboarding: return "SKB";
    case OlympicsAPI::Disciplines::SportClimbing: return "CLB";
    case OlympicsAPI::Disciplines::Surfing: return "SRF";
    case OlympicsAPI::Disciplines::TableTennis: return "TTE";
    case OlympicsAPI::Disciplines::Taekwondo: return "TKW";
    case OlympicsAPI::Disciplines::Tennis: return "TEN";
    case OlympicsAPI::Disciplines::Triathlon: return "TRI";
    case OlympicsAPI::Disciplines::VolleyballBeach: return "VBV";
    case OlympicsAPI::Disciplines::VolleyballIndoor: return "VVO";
    case OlympicsAPI::Disciplines::Weightlifting: return "WLF";
    case OlympicsAPI::Disciplines::WrestlingFreestyle: return "WRE";
    case OlympicsAPI::Disciplines::WrestlingGrecoRoman: return "WRG";
    default: return "ARC"; // default, which should not be possible, because of enum
    }
}