Skip to content

Commit 5b630a8

Browse files
committed
feat key-service: added get keys by name and by id functions, and tests for them
1 parent 7993db9 commit 5b630a8

File tree

15 files changed

+296
-16
lines changed

15 files changed

+296
-16
lines changed

CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,10 @@ add_library(${PROJECT_NAME}_objs OBJECT
109109

110110
src/handlers/v1/key/create-key/view.hpp
111111
src/handlers/v1/key/create-key/view.cpp
112+
src/handlers/v1/key/get-by-id/view.hpp
113+
src/handlers/v1/key/get-by-id/view.cpp
114+
src/handlers/v1/key/get-by-name/view.hpp
115+
src/handlers/v1/key/get-by-name/view.cpp
112116
)
113117
target_link_libraries(${PROJECT_NAME}_objs PUBLIC userver::postgresql)
114118

configs/static_config.yaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,14 @@ components_manager:
6969
path: /v1/keys/create-key
7070
method: POST
7171
task_processor: main-task-processor
72+
handler-v1-get-key-by-id:
73+
path: /v1/keys/get-key-by-id
74+
method: POST
75+
task_processor: main-task-processor
76+
handler-v1-get-key-by-name:
77+
path: /v1/keys/get-key-by-name
78+
method: POST
79+
task_processor: main-task-processor
7280

7381
postgres-db-1:
7482
dbconnection: $dbconnection

postgresql/data/initial_data.sql

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ VALUES
66
('01234567-89ab-cdef-0123-456789abcdef', 'cclark', 'Clark', 'Kent', '[email protected]', '789-123-4567'),
77
('fedcba98-7654-3210-fedc-ba9876543210', 'ddiana', 'Diana', 'Prince', '[email protected]', '321-654-9870');
88

9-
INSERT INTO vpn_manager.key (user_id, name, key)
9+
INSERT INTO vpn_manager.key (id, user_id, name, key)
1010
VALUES
11-
((SELECT id FROM vpn_manager.user WHERE username = 'jdoe'), 'Home WiFi', 'abc123key'),
12-
((SELECT id FROM vpn_manager.user WHERE username = 'asmith'), 'Work VPN', 'xyz456key'),
13-
((SELECT id FROM vpn_manager.user WHERE username = 'bwayne'), 'Batcave VPN', 'bat789key'),
14-
((SELECT id FROM vpn_manager.user WHERE username = 'cclark'), 'Fortress VPN', 'krypton101key'),
15-
((SELECT id FROM vpn_manager.user WHERE username = 'ddiana'), 'Amazon VPN', 'wonder102key');
11+
('1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d', (SELECT id FROM vpn_manager.user WHERE username = 'jdoe'), 'Home WiFi', 'abc123key'),
12+
('2b3c4d5e-6f7a-8b9c-0d1e-2f3a4b5c6d7e', (SELECT id FROM vpn_manager.user WHERE username = 'asmith'), 'Work VPN', 'xyz456key'),
13+
('3c4d5e6f-7a8b-9c0d-1e2f-3a4b5c6d7e8f', (SELECT id FROM vpn_manager.user WHERE username = 'bwayne'), 'Batcave VPN', 'bat789key'),
14+
('4d5e6f7a-8b9c-0d1e-2f3a-4b5c6d7e8f9f', (SELECT id FROM vpn_manager.user WHERE username = 'cclark'), 'Fortress VPN', 'krypton101key'),
15+
('5e6f7a8b-9c0d-1e2f-3a4b-5c6d7e8f9f0a', (SELECT id FROM vpn_manager.user WHERE username = 'ddiana'), 'Amazon VPN', 'wonder102key');
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
#include "view.hpp"
2+
#include "../../../../constants.hpp"
3+
#include "../../../../models/key_dto.hpp"
4+
#include "../../../../models/response.hpp"
5+
#include "../../../../repositories/key_repository/key_repository.hpp"
6+
7+
#include <fmt/format.h>
8+
#include <boost/uuid/string_generator.hpp>
9+
#include <boost/uuid/uuid.hpp>
10+
11+
#include <userver/components/component_config.hpp>
12+
#include <userver/components/component_context.hpp>
13+
#include <userver/formats/json/serialize.hpp>
14+
#include <userver/server/handlers/http_handler_base.hpp>
15+
#include <userver/server/http/http_status.hpp>
16+
#include <userver/storages/postgres/cluster.hpp>
17+
#include <userver/storages/postgres/component.hpp>
18+
#include <userver/storages/postgres/io/user_types.hpp>
19+
#include <userver/utils/assert.hpp>
20+
#include <userver/utils/uuid4.hpp>
21+
22+
namespace vpn_manager {
23+
24+
namespace {
25+
26+
class GetKeyById final : public userver::server::handlers::HttpHandlerBase {
27+
public:
28+
static constexpr std::string_view kName = "handler-v1-get-key-by-id";
29+
30+
GetKeyById(const userver::components::ComponentConfig& config,
31+
const userver::components::ComponentContext& component_context)
32+
: HttpHandlerBase(config, component_context),
33+
pg_cluster_(component_context
34+
.FindComponent<userver::components::Postgres>(
35+
constants::postgres::kPostgresDBName)
36+
.GetCluster()),
37+
key_repository_(config, component_context) {}
38+
39+
std::string HandleRequestThrow(
40+
const userver::server::http::HttpRequest& request,
41+
userver::server::request::RequestContext&) const override {
42+
auto& response = request.GetHttpResponse();
43+
44+
const auto json_body =
45+
userver::formats::json::FromString(request.RequestBody());
46+
const auto& key_id = json_body["id"].As<std::string>();
47+
48+
boost::uuids::uuid key_id_uuid;
49+
try {
50+
key_id_uuid = userver::utils::BoostUuidFromString(key_id);
51+
} catch (const std::exception& e) {
52+
response.SetStatus(userver::server::http::HttpStatus::kBadRequest);
53+
return response::ErrorResponse(kInvalidKeyId).ToJson();
54+
}
55+
56+
auto keyOpt = key_repository_.GetKeyById(key_id_uuid);
57+
if (!keyOpt.has_value()) {
58+
response.SetStatus(userver::server::http::HttpStatus::kNotFound);
59+
return response::ErrorResponse(kKeyNotFound).ToJson();
60+
}
61+
auto key = keyOpt.value();
62+
63+
response.SetStatus(userver::server::http::HttpStatus::kOk);
64+
65+
return response::Response(
66+
userver::formats::json::ToString(key.ToJson().ExtractValue()))
67+
.ToJson();
68+
}
69+
70+
userver::storages::postgres::ClusterPtr pg_cluster_;
71+
repositories::KeyRepositoryComponent key_repository_;
72+
73+
private:
74+
inline static constexpr std::string_view kKeyNotFound = "Key wasn't found";
75+
inline static constexpr std::string_view kInvalidKeyId = "Invalid Key ID";
76+
};
77+
78+
} // namespace
79+
80+
void AppendGetKeyById(userver::components::ComponentList& component_list) {
81+
component_list.Append<GetKeyById>();
82+
}
83+
84+
} // namespace vpn_manager
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#pragma once
2+
3+
#include <string>
4+
#include <string_view>
5+
6+
#include <userver/components/component_list.hpp>
7+
8+
namespace vpn_manager {
9+
10+
void AppendGetKeyById(userver::components::ComponentList& component_list);
11+
12+
} // namespace vpn_manager
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
#include "view.hpp"
2+
#include "../../../../constants.hpp"
3+
#include "../../../../models/key_dto.hpp"
4+
#include "../../../../models/response.hpp"
5+
#include "../../../../repositories/key_repository/key_repository.hpp"
6+
7+
#include <fmt/format.h>
8+
#include <boost/uuid/string_generator.hpp>
9+
#include <boost/uuid/uuid.hpp>
10+
11+
#include <userver/components/component_config.hpp>
12+
#include <userver/components/component_context.hpp>
13+
#include <userver/formats/json/serialize.hpp>
14+
#include <userver/server/handlers/http_handler_base.hpp>
15+
#include <userver/server/http/http_status.hpp>
16+
#include <userver/storages/postgres/cluster.hpp>
17+
#include <userver/storages/postgres/component.hpp>
18+
#include <userver/storages/postgres/io/user_types.hpp>
19+
#include <userver/utils/assert.hpp>
20+
#include <userver/utils/uuid4.hpp>
21+
22+
namespace vpn_manager {
23+
24+
namespace {
25+
26+
class GetKeyByName final : public userver::server::handlers::HttpHandlerBase {
27+
public:
28+
static constexpr std::string_view kName = "handler-v1-get-key-by-name";
29+
30+
GetKeyByName(const userver::components::ComponentConfig& config,
31+
const userver::components::ComponentContext& component_context)
32+
: HttpHandlerBase(config, component_context),
33+
pg_cluster_(component_context
34+
.FindComponent<userver::components::Postgres>(
35+
constants::postgres::kPostgresDBName)
36+
.GetCluster()),
37+
key_repository_(config, component_context) {}
38+
39+
std::string HandleRequestThrow(
40+
const userver::server::http::HttpRequest& request,
41+
userver::server::request::RequestContext&) const override {
42+
auto& response = request.GetHttpResponse();
43+
44+
const auto json_body =
45+
userver::formats::json::FromString(request.RequestBody());
46+
const auto& keyname = json_body["name"].As<std::string>();
47+
48+
auto keyOpt = key_repository_.GetKeyByName(keyname);
49+
if (!keyOpt.has_value()) {
50+
response.SetStatus(userver::server::http::HttpStatus::kNotFound);
51+
return response::ErrorResponse(kKeyNotFound).ToJson();
52+
}
53+
auto key = keyOpt.value();
54+
55+
response.SetStatus(userver::server::http::HttpStatus::kOk);
56+
57+
return response::Response(
58+
userver::formats::json::ToString(key.ToJson().ExtractValue()))
59+
.ToJson();
60+
}
61+
62+
userver::storages::postgres::ClusterPtr pg_cluster_;
63+
repositories::KeyRepositoryComponent key_repository_;
64+
65+
private:
66+
inline static constexpr std::string_view kKeyNotFound = "Key wasn't found";
67+
};
68+
69+
} // namespace
70+
71+
void AppendGetKeyByName(userver::components::ComponentList& component_list) {
72+
component_list.Append<GetKeyByName>();
73+
}
74+
75+
} // namespace vpn_manager
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#pragma once
2+
3+
#include <string>
4+
#include <string_view>
5+
6+
#include <userver/components/component_list.hpp>
7+
8+
namespace vpn_manager {
9+
10+
void AppendGetKeyByName(userver::components::ComponentList& component_list);
11+
12+
} // namespace vpn_manager

src/main.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,15 @@
77

88
#include "constants.hpp"
99

10+
#include "handlers/v1/key/create-key/view.hpp"
11+
#include "handlers/v1/key/get-by-id/view.hpp"
12+
#include "handlers/v1/key/get-by-name/view.hpp"
1013
#include "handlers/v1/user/create-user/view.hpp"
1114
#include "handlers/v1/user/get-by-username/view.hpp"
15+
1216
#include "repositories/key_repository/key_repository.hpp"
1317
#include "repositories/user_repository/user_repository.hpp"
1418

15-
#include "handlers/v1/key/create-key/view.hpp"
16-
1719
#include "third_party/userver/core/include/userver/clients/dns/component.hpp"
1820
#include "third_party/userver/core/include/userver/dynamic_config/client/component.hpp"
1921
#include "third_party/userver/core/include/userver/dynamic_config/updater/component.hpp"
@@ -37,6 +39,8 @@ int main(int argc, char* argv[]) {
3739
vpn_manager::AppendGetUserByUsername(component_list);
3840
vpn_manager::AppendCreateUser(component_list);
3941
vpn_manager::AppendCreateKey(component_list);
42+
vpn_manager::AppendGetKeyById(component_list);
43+
vpn_manager::AppendGetKeyByName(component_list);
4044

4145
return userver::utils::DaemonMain(argc, argv, component_list);
4246
}

src/repositories/key_repository/key_repository.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include "models/key_dto.hpp"
44
#include "models/user_dto.hpp"
55

6+
#include <boost/uuid/uuid.hpp>
67
#include <userver/components/component_config.hpp>
78
#include <userver/components/component_context.hpp>
89
#include <userver/dynamic_config/snapshot.hpp>
@@ -41,7 +42,7 @@ bool KeyRepositoryComponent::KeyExistsByName(std::string_view name) const {
4142
}
4243

4344
std::optional<KeyDto> KeyRepositoryComponent::GetKeyById(
44-
std::string_view key_id) const {
45+
boost::uuids::uuid key_id) const {
4546
auto query = fmt::format(
4647
"SELECT id, user_id, name, key, created_at FROM {} WHERE id = $1;",
4748
kKeyTable);

src/repositories/key_repository/key_repository.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class KeyRepositoryComponent final : public userver::components::ComponentBase {
2323
bool KeyExistsByUserId(std::string_view user_id) const;
2424
bool KeyExistsByName(std::string_view name) const;
2525

26-
std::optional<KeyDto> GetKeyById(std::string_view key_id) const;
26+
std::optional<KeyDto> GetKeyById(boost::uuids::uuid key_id) const;
2727
std::optional<KeyDto> GetKeyByName(std::string_view name) const;
2828

2929
boost::uuids::uuid CreateKey(boost::uuids::uuid user_id,

0 commit comments

Comments
 (0)