Move business logic to ActionRequestHandler from Service
authorSangyoon Jang <jeremy.jang@samsung.com>
Wed, 12 Mar 2025 07:02:43 +0000 (16:02 +0900)
committer장상윤/Tizen Platform Lab(SR)/삼성전자 <jeremy.jang@samsung.com>
Thu, 13 Mar 2025 01:15:47 +0000 (10:15 +0900)
Signed-off-by: Sangyoon Jang <jeremy.jang@samsung.com>
src/action/action_loader.hh
src/action/action_request_handler.cc
src/action/action_request_handler.hh
src/action/request_handler.hh
src/action/service.cc
src/action/sqlite_db.cc
src/action/sqlite_db.hh
src/common/CMakeLists.txt
src/common/action_model.cc
src/common/action_model.h

index 61fbd7e57a7e00c4e44b9dbe19905cf333f6c39b..79860bdf1d35b7c372832d2b2c5fc559ec4f463a 100644 (file)
@@ -23,7 +23,7 @@ class IActionLoader {
  public:
   virtual ~IActionLoader() = default;
   virtual void ListActions() = 0;
-  virtual void GetAction(const std::string& name) = 0;
+  virtual std::string GetAction(const std::string& name) = 0;
 };
 
 }  // namespace action
index d042198d274f728a6e9b435a06754d2c0c14c0de..4fe11b20a2d44220ab584150213f084233d3cafd 100644 (file)
 #include "common/utils/logging.hh"
 #include "utils/action_model_converter.hh"
 
+namespace {
+
+common::ParameterType GetParameterTypeFromString(const std::string& type) {
+  LOG(DEBUG) << "GetParmameterType : " << type;
+
+  if (type.compare("integer") == 0)
+    return common::ParameterType::IntType;
+  else if (type.compare("string") == 0)
+    return common::ParameterType::StringType;
+  else if (type.compare("double") == 0)
+    return common::ParameterType::DoubleType;
+  else if (type.compare("bool") == 0)
+    return common::ParameterType::BoolType;
+
+  return common::ParameterType::InvalidType;
+}
+
+}  // namespace
+
 namespace action {
 
 ActionRequestHandler::ActionRequestHandler() {}
@@ -40,9 +59,25 @@ void ActionRequestHandler::OnListActions() {
   db->ListActions();
 }
 
-void ActionRequestHandler::OnGetAction(const std::string& id) {
+rpc::Action ActionRequestHandler::OnGetAction(const std::string& id) {
   auto db = std::make_unique<action::SqliteDb>();
-  db->GetAction(id);
+  std::string json_str = db->GetAction(id);
+  common::ActionModel model(json_str);
+
+  rpc::Action action;
+  action.Setaction_id(model.GetActionId());
+  action.Setapp_id(model.GetAppId());
+  action.Setlabel(model.GetLabel());
+  action.Setdescription(model.GetDescription());
+  action.Settype("app_control");  // TODO
+  // action.Seturi();
+  // action.Setmime();
+  // action.Setoperation();
+  // action.Setparameters();
+  // action.Setresults();
+  // action.Setprivileges();
+
+  return action;
 }
 
 void ActionRequestHandler::OnGetActionId(const std::string& user_description,
@@ -50,9 +85,24 @@ void ActionRequestHandler::OnGetActionId(const std::string& user_description,
                                          float search_threshold) {}
 
 void ActionRequestHandler::OnExecute(const std::string& instance,
-                                     common::ActionModel& model) {
-  LOG(DEBUG) << "OnExecute action : " << model.GetActionId()
-             << ", appid : " << model.GetAppId();
+                                     rpc::Action& action) {
+  auto db = std::make_unique<action::SqliteDb>();
+  std::string json_str = db->GetAction(action.Getaction_id());
+  common::ActionModel model(json_str);
+  LOG(DEBUG) << "OnExecute action : " << model.GetActionId() << " appid: " << model.GetAppId();
+
+  std::vector<common::ActionParameter> params;
+  for (auto const& iter : action.Getparameters()) {
+    common::ParameterType param_type = GetParameterTypeFromString(iter.Gettype());
+    LOG(DEBUG) << "param key : " << iter.Getkey() << ", val : "
+        << iter.Getvalue() << ", type : " << iter.Gettype();
+
+    auto param = common::ActionParameter(iter.Getkey(), param_type,
+        iter.Getvalue(), iter.Getdescription(), iter.Getis_requied());
+
+    params.push_back(param);
+  }
+  model.SetParameters(params);
 
   auto executor = ActionExecutorFactory::CreateExecutor(instance, model);
   executor->SetResultHandler(this);
index 65003d7ff4f055e1075c32656b3372e5974af32a..f6d0d8cc4aa960dcca6dbc1c1902b78d1eea1434 100644 (file)
@@ -35,12 +35,12 @@ class ActionRequestHandler : public IRequestHandler, common::IResultHandler {
   void Init();
 
   void OnListActions() override;
-  void OnGetAction(const std::string& id) override;
+  rpc::Action OnGetAction(const std::string& id) override;
   void OnGetActionId(const std::string& user_description,
                      int top_k,
                      float search_threshold) override;
   void OnExecute(const std::string& instance,
-                 common::ActionModel& model) override;
+                 rpc::Action& model) override;
 
   void OnResult(const std::string& requester,
                 const std::string& result) override;
index 0cd57c93a371d35e5eba63f04463b359b48429b5..3eccbf926a1060ac1fb75d941729e47f25eeccb3 100644 (file)
 
 #include "common/action_model.h"
 
-// TODO: dependency?
 #include "action/tizen_action_service_stub.h"
 
+namespace rpc = rpc_port::tizen_action_service_stub;
+
 namespace action {
 
 class IRequestHandler {
  public:
   virtual ~IRequestHandler() = default;
   virtual void OnListActions() = 0;
-  virtual void OnGetAction(const std::string& id) = 0;
+  virtual rpc::Action OnGetAction(const std::string& id) = 0;
   virtual void OnGetActionId(const std::string& user_description, int top_k,
       float search_threshold) = 0;
-  virtual void OnExecute(const std::string& requester, common::ActionModel& model) = 0;
+  virtual void OnExecute(const std::string& requester, rpc::Action& model) = 0;
 };
 
 }  // namespace action
index e8229793399225ab31544ccf08a0c60b2174a0cf..bdb6aaf317d427040eee2f5c51781900a7e994f1 100644 (file)
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
- #include "action/service.hh"
+#include "action/service.hh"
 
 #include <algorithm>
 
 #include "common/utils/logging.hh"
 #include "common/action_model.h"
 
-namespace {
-
-common::ActionType GetActionType(std::string type) {
-  if (type.compare("app_control") == 0)
-    return common::ActionType::AppControl;
-  else if (type.compare("plugin") == 0)
-    return common::ActionType::Plugin;
-
-  return common::ActionType::InvalidType;
-}
-
-common::ParameterType GetParameterType(std::string type) {
-  LOG(DEBUG) << "GetParmameterType : " << type;
-
-  if (type.compare("integer") == 0)
-    return common::ParameterType::IntType;
-  else if (type.compare("string") == 0)
-    return common::ParameterType::StringType;
-  else if (type.compare("double") == 0)
-    return common::ParameterType::DoubleType;
-  else if (type.compare("bool") == 0)
-    return common::ParameterType::BoolType;
-
-  return common::ParameterType::InvalidType;
-}
-
-}
-
 namespace action {
 
 Service::Service(std::string sender, std::string instance,
@@ -70,45 +42,7 @@ std::vector<rpc::Action> Service::ListActions() {
 }
 
 rpc::Action Service::GetAction(std::string action_id) {
-  // return action by id
-  // ActionModel action = handler_.OnGetAction(action_id);
-
-  LOG(DEBUG) << "GetAction : " << action_id;
-
-  action::SqliteDb sqlite_db;
-
-  std::string result = sqlite_db.Select(action_id);
-
-  LOG(DEBUG) << "GetAction result : " << result;
-
-  auto ps = new utils::JsonParser(result);
-
-  auto params = ps->GetParameters();
-
-  rpc::Action action;
-  std::vector<rpc::Parameter> actionparams;
-
-  action.Setapp_id(ps->GetAppId());
-  action.Setaction_id(ps->GetName());
-  action.Setlabel(ps->GetName());
-  action.Setdescription(ps->GetDescription());
-
-  for (auto const& iter : params) {
-    auto param_value = iter.second;
-
-    auto param = rpc::Parameter(iter.first, param_value["type"], "", param_value["desc"],
-                              param_value["isMandatory"].compare("true") == 0 ? true : false);
-
-    actionparams.push_back(param);
-  }
-
-  action.Setparameters(actionparams);
-
-  LOG(DEBUG) << "appid : " << action.Getapp_id();
-  LOG(DEBUG) << "actionid : " << action.Getaction_id();
-
-  // return {};
-  return action;
+  return handler_.OnGetAction(action_id);
 }
 
 std::vector<rpc::VectorDbResult> Service::GetActionId(
@@ -119,45 +53,9 @@ std::vector<rpc::VectorDbResult> Service::GetActionId(
 }
 
 int Service::Execute(rpc::Action action) {
-  LOG(DEBUG) << "Execute : " << action.Getaction_id() << ", type : " << action.Gettype();
-
-  std::string action_id = action.Getaction_id();
-  action::SqliteDb sqlite_db;
-
-  std::string result = sqlite_db.Select(action_id);
-  if (result.empty()) {
-    LOG(DEBUG) << "Not exsit action";
-    return -1;
-  }
-
-  common::ActionModel model;
-  std::vector<common::ActionParameter> actionparams;
-  auto ps = new utils::JsonParser(result);
-
-  auto params = ps->GetParameters();
-  auto param_values = action.Getparameters();
-
-  model.SetActionId(action.Getaction_id());
-  model.SetAppId(ps->GetAppId());
-  model.SetType(GetActionType(action.Gettype()));
-
-  for (auto const& iter : param_values) {
-    std::string param_name = iter.Getkey();
-    auto param_schema = params[param_name];
-
-    common::ParameterType param_type = GetParameterType(param_schema["type"]);
-
-    LOG(DEBUG) << "param key : " << param_name << ", val : " << iter.Getvalue() << ", type : " << param_schema["type"];
-
-    auto param = common::ActionParameter(param_name, param_type, iter.Getvalue(),
-                  iter.Getdescription(), iter.Getis_requied());
-
-    actionparams.push_back(param);
-  }
-  model.SetParameters(actionparams);
-
-  handler_.OnExecute(GetInstance(), model);
-
+  LOG(DEBUG) << "Execute : " << action.Getaction_id()
+      << ", type : " << action.Gettype();
+  handler_.OnExecute(GetInstance(), action);
   return 0;
 }
 
index a727f8154ad6cc5c7b03df0506f700f44feb2dd2..93af200a54a1334e6d6f6413def2f2cf2b34ed34 100644 (file)
@@ -41,9 +41,8 @@ void SqliteDb::ListActions() {
   Select();
 }
 
-void SqliteDb::GetAction(const std::string& name) {
-  // TODO
-  Select(name);
+std::string SqliteDb::GetAction(const std::string& name) {
+  return Select(name);
 }
 
 std::string SqliteDb::Select(const std::string& name) {
index fa28a8af971fca36022c926bd4de2316b644c313..eb04ec684cac7c53f24c2c4e723d4c9d6b1f3d12 100644 (file)
@@ -31,7 +31,7 @@ class SqliteDb : public IActionLoader {
   ~SqliteDb() = default;
 
   void ListActions() override;
-  void GetAction(const std::string& name) override;
+  std::string GetAction(const std::string& name) override;
 
   void Select();
   std::string Select(const std::string& name);
index 9315f1c1e6e7f1eb12b4fc68d48520f4a71ba193..07764f888daedd63a93428de2a134b5f1d492465 100644 (file)
@@ -10,6 +10,7 @@ TARGET_INCLUDE_DIRECTORIES(${TARGET_TIZEN_ACTION_COMMON} PUBLIC "${CMAKE_CURRENT
 
 APPLY_PKG_CONFIG(${TARGET_TIZEN_ACTION_COMMON} PUBLIC
   DLOG_DEPS
+  JSONCPP_DEPS
   TIZEN_DATABASE_DEPS
 )
 
index 01ac715377a0b7d1a28e1b8da3df288a125effe7..bc4d24625a88cccac61b3558450871c9c73de02e 100644 (file)
 
 #include "common/action_model.h"
 
+#include <json/json.h>
+
+#include <string>
+#include <map>
+
+#include "common/utils/logging.hh"
+
+namespace {
+
+Json::Value ParseJsonFromString(const std::string& json_str) {
+  Json::Value root;
+  Json::CharReaderBuilder builder;
+  JSONCPP_STRING err;
+  const std::unique_ptr<Json::CharReader> reader(builder.newCharReader());
+  if (!reader->parse(json_str.c_str(), json_str.c_str() + json_str.length(),
+      &root, &err)) {
+    LOG(ERROR) << "Failed to parse json string: " << err;
+    return {};
+  }
+  return root;
+}
+
+std::map<std::string, common::ParameterType> kTypeMap = {
+  {"int", common::ParameterType::IntType},
+  {"string", common::ParameterType::StringType},
+  {"double", common::ParameterType::DoubleType},
+  {"bool", common::ParameterType::BoolType},
+};
+
+common::ParameterType ConvertStringToParameterType(const std::string& type) {
+  auto it = kTypeMap.find(type);
+  if (it == kTypeMap.end()) {
+    LOG(ERROR) << "Unknown parameter type: " << type;
+    return common::ParameterType::InvalidType;
+  }
+  return it->second;
+}
+
+common::ActionType GetActionTypeFromString(const std::string& type) {
+  if (type.compare("app_control") == 0)
+    return common::ActionType::AppControl;
+  else if (type.compare("plugin") == 0)
+    return common::ActionType::Plugin;
+  return common::ActionType::InvalidType;
+}
+
+}  // namespace
+
 namespace common {
 
 ActionModel::ActionModel() {}
 
+ActionModel::ActionModel(std::string json_str) {
+  Json::Value root = ParseJsonFromString(json_str);
+
+  action_id_ = root["name"].asString();
+  app_id_ = root["appId"].asString();
+  type_ = GetActionTypeFromString(root["type"].asString());
+  label_ = root["label"].asString();
+  description_ = root["desc"].asString();
+
+  // params
+  for (auto const& it : root["params"].getMemberNames()) {
+    std::string name = it;
+    common::ParameterType type =
+        ConvertStringToParameterType(root["params"][it]["type"].asString());
+    std::string description = root["params"][it]["desc"].asString();
+    bool is_required = root["params"][it]["isRequired"].asBool();
+    parameters_.emplace_back(name, type, "", description, is_required);
+  }
+
+  // returns
+  for (auto const& it : root["returns"].getMemberNames()) {
+    std::string name = it;
+    common::ParameterType type =
+        ConvertStringToParameterType(root["returns"][it]["type"].asString());
+    std::string description = root["returns"][it]["desc"].asString();
+    // ActionParameterType -> another class???
+    returns_.emplace_back(name, type, "", description, false);
+  }
+}
+
 ActionModel::ActionModel(std::string action_id, std::string app_id,
       std::string label, std::string description, std::string uri,
       std::string mime, std::string operation, std::vector<ActionParameter> parameters,
@@ -101,6 +179,14 @@ void ActionModel::SetParameters(std::vector<ActionParameter> parameters) {
   parameters_ = std::move(parameters);
 }
 
+const std::vector<ActionParameter>& ActionModel::GetReturns() const {
+  return returns_;
+}
+
+void ActionModel::SetReturns(std::vector<ActionParameter> returns) {
+  returns_ = std::move(returns);
+}
+
 const std::vector<std::string>& ActionModel::GetPrivileges() const {
   return privileges_;
 }
index eb1074526a0fb8489093d49747863dfec4b319c0..1b2a412f4bb3dd1507e269f09277cff4366997db 100644 (file)
@@ -31,7 +31,8 @@ enum class ActionType {
 class ActionModel {
  public:
   ActionModel();
-  ActionModel(std::string action_id, std::string app_id,
+  explicit ActionModel(std::string json_str);
+  explicit ActionModel(std::string action_id, std::string app_id,
       std::string label, std::string description, std::string uri,
       std::string mime, std::string operation, std::vector<ActionParameter> parameters,
       std::vector<std::string> privileges);
@@ -63,6 +64,9 @@ class ActionModel {
   const std::vector<ActionParameter>& GetParameters() const;
   void SetParameters(std::vector<ActionParameter> parameters);
 
+  const std::vector<ActionParameter>& GetReturns() const;
+  void SetReturns(std::vector<ActionParameter> returns);
+
   const std::vector<std::string>& GetPrivileges() const;
   void SetPrivileges(std::vector<std::string> privileges);
 
@@ -78,6 +82,7 @@ class ActionModel {
 
   //is std::map better?
   std::vector<ActionParameter> parameters_;
+  std::vector<ActionParameter> returns_;
 
   // std::vector<Result> results_;
   std::vector<std::string> privileges_;