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
0 commit comments