File: Client.cc

package info (click to toggle)
drogon 1.9.0%2Bds-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 4,096 kB
  • sloc: cpp: 52,222; sh: 249; xml: 20; makefile: 11
file content (87 lines) | stat: -rw-r--r-- 2,501 bytes parent folder | download | duplicates (2)
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
#include "Client.h"

using namespace drogon;

void Client::get(const HttpRequestPtr &,
                 std::function<void(const HttpResponsePtr &)> &&callback,
                 std::string key)
{
    nosql::RedisClientPtr redisClient = app().getRedisClient();

    redisClient->execCommandAsync(
        [callback](const nosql::RedisResult &r) {
            if (r.type() == nosql::RedisResultType::kNil)
            {
                auto resp = HttpResponse::newHttpResponse();
                resp->setStatusCode(k404NotFound);
                callback(resp);
                return;
            }

            std::string redisResponse = r.asString();
            Json::Value response;

            Json::CharReaderBuilder builder;
            Json::CharReader *reader = builder.newCharReader();

            Json::Value json;
            std::string errors;

            bool parsingSuccessful =
                reader->parse(redisResponse.c_str(),
                              redisResponse.c_str() + redisResponse.size(),
                              &json,
                              &errors);

            delete reader;

            response["response"] = redisResponse;
            if (parsingSuccessful)
            {
                response["response"] = json;
            }

            auto resp = HttpResponse::newHttpJsonResponse(response);

            callback(resp);
        },
        [](const std::exception &err) {
            LOG_ERROR << "something failed!!! " << err.what();
        },
        "get %s",
        key.c_str());
}

void Client::post(const HttpRequestPtr &req,
                  std::function<void(const HttpResponsePtr &)> &&callback,
                  std::string key)
{
    nosql::RedisClientPtr redisClient = app().getRedisClient();
    auto json = req->getJsonObject();

    if (!json)
    {
        auto resp = HttpResponse::newHttpResponse();
        resp->setBody("missing 'value' in body");
        resp->setStatusCode(k400BadRequest);
        callback(resp);
        return;
    }

    std::string value = (*json)["value"].asString();

    redisClient->execCommandAsync(
        [callback](const nosql::RedisResult &) {
            auto resp = HttpResponse::newHttpResponse();

            resp->setStatusCode(k201Created);

            callback(resp);
        },
        [](const std::exception &err) {
            LOG_ERROR << "something failed!!! " << err.what();
        },
        "set %s %s",
        key.c_str(),
        value.c_str());
}