[intent] Remove links from intents

This removes the link-based intent parameters.

MF-6 #done
TESTED=Existing tests.

Change-Id: Icc56d62dbc4fa2938fafa3afb768bb336761d02b
diff --git a/bin/sessionmgr/puppet_master/command_runners/add_mod_command_runner_unittest.cc b/bin/sessionmgr/puppet_master/command_runners/add_mod_command_runner_unittest.cc
index 4327806..aa187c4 100644
--- a/bin/sessionmgr/puppet_master/command_runners/add_mod_command_runner_unittest.cc
+++ b/bin/sessionmgr/puppet_master/command_runners/add_mod_command_runner_unittest.cc
@@ -116,16 +116,6 @@
           }
           break;
         }
-        case fuchsia::modular::IntentParameterData::Tag::kLinkName:
-          if (old_param.link_name() != new_param.link_name()) {
-            return false;
-          }
-          break;
-        case fuchsia::modular::IntentParameterData::Tag::kLinkPath:
-          if (old_param.link_path() != new_param.link_path()) {
-            return false;
-          }
-          break;
         case fuchsia::modular::IntentParameterData::Tag::Invalid:
           break;
       }
@@ -202,24 +192,6 @@
     intent->parameters.push_back(std::move(parameter));
   }
 
-  void AddLinkNameParameter(fuchsia::modular::Intent* intent,
-                            const std::string& name,
-                            const std::string& link_name) {
-    fuchsia::modular::IntentParameter parameter;
-    parameter.name = name;
-    parameter.data.set_link_name(link_name);
-    intent->parameters.push_back(std::move(parameter));
-  }
-
-  void AddLinkPathParameter(fuchsia::modular::Intent* intent,
-                            const std::string& name,
-                            const std::string& link_path) {
-    fuchsia::modular::IntentParameter parameter;
-    parameter.name = name;
-    parameter.data.set_link_path(MakeLinkPath(link_path));
-    intent->parameters.push_back(std::move(parameter));
-  }
-
   void AddInvalidParameter(fuchsia::modular::Intent* intent,
                            const std::string& name) {
     // This parameter has no data union field set, hence it's invalid.
@@ -390,9 +362,6 @@
   AddJsonParameter(&intent, "param_json", R"({"@type": "foo"})");
   AddEntityRefParameter(&intent, "param_ref", reference);
   AddEntityTypeParameter(&intent, "param_type", {"entity_type2"});
-  SetLinkValue(story_storage_.get(), "link_path1", R"({"@type": "bar"})");
-  AddLinkPathParameter(&intent, "param_linkpath", "link_path1");
-  AddLinkNameParameter(&intent, "param_linkname", "parent_link_name");
   auto command = MakeAddModCommand("mod", "parent_mod", 0.5, intent);
 
   auto manifest = fuchsia::modular::ModuleManifest::New();
@@ -409,7 +378,7 @@
       [&](const fuchsia::modular::FindModulesQuery& query) {
         EXPECT_EQ("intent_action", query.action);
         auto& constraints = query.parameter_constraints;
-        EXPECT_EQ(5u, constraints.size());
+        EXPECT_EQ(3u, constraints.size());
         for (auto& constraint : constraints) {
           EXPECT_EQ(1u, constraint.param_types.size());
         }
@@ -421,10 +390,6 @@
         EXPECT_EQ("entity_type1", constraints.at(1).param_types.at(0));
         EXPECT_EQ("param_type", constraints.at(2).param_name);
         EXPECT_EQ("entity_type2", constraints.at(2).param_types.at(0));
-        EXPECT_EQ("param_linkpath", constraints.at(3).param_name);
-        EXPECT_EQ("bar", constraints.at(3).param_types.at(0));
-        EXPECT_EQ("param_linkname", constraints.at(4).param_name);
-        EXPECT_EQ("baz", constraints.at(4).param_types.at(0));
       });
 
   bool done{};
@@ -454,7 +419,7 @@
   EXPECT_EQ(0.5, module_data->surface_relation->emphasis);
   EXPECT_TRUE(AreIntentsEqual(intent, *module_data->intent));
   EXPECT_EQ(*manifest, *module_data->module_manifest);
-  EXPECT_EQ(5u, module_data->parameter_map.entries.size());
+  EXPECT_EQ(3u, module_data->parameter_map.entries.size());
 
   // Verify parameters
   auto& link_path1 = module_data->parameter_map.entries.at(0).link_path;
@@ -476,21 +441,6 @@
   EXPECT_EQ(full_path, link_path3.module_path);
   EXPECT_EQ("param_type", link_path3.link_name);
   EXPECT_EQ("null", GetLinkValue(story_storage_.get(), link_path3));
-
-  auto& link_path4 = module_data->parameter_map.entries.at(3).link_path;
-  EXPECT_EQ("param_linkpath", module_data->parameter_map.entries.at(3).name);
-  EXPECT_TRUE(link_path4.module_path.empty());
-  EXPECT_EQ("link_path1", link_path4.link_name);
-  EXPECT_EQ(R"({"@type": "bar"})",
-            GetLinkValue(story_storage_.get(), link_path4));
-
-  auto& link_path5 = module_data->parameter_map.entries.at(4).link_path;
-  EXPECT_EQ("param_linkname", module_data->parameter_map.entries.at(4).name);
-  EXPECT_EQ(1u, link_path5.module_path.size());
-  EXPECT_EQ("parent_mod", link_path5.module_path.at(0));
-  EXPECT_EQ("parent_link_name", link_path5.link_name);
-  EXPECT_EQ(R"({"@type": "baz"})",
-            GetLinkValue(story_storage_.get(), link_path5));
 }
 
 TEST_F(AddModCommandRunnerTest, ExecuteNoModulesFound) {
@@ -597,63 +547,6 @@
   RunLoopUntil([&] { return done; });
 }
 
-TEST_F(AddModCommandRunnerTest, ExecuteNoLinkPathForLinkName) {
-  // Set up command
-  auto intent = CreateEmptyIntent("intent_action");
-  AddLinkNameParameter(&intent, "invalid_param", "parent_linkname");
-  auto command = MakeAddModCommand("mod", "parent_mod", 0.5, intent);
-
-  // Set up fake module resolver.
-  auto manifest = fuchsia::modular::ModuleManifest::New();
-  manifest->binary = "mod_url";
-  manifest->intent_filters.push_back(MakeIntentFilter("intent_action", {}));
-  fuchsia::modular::FindModulesResult result;
-  result.module_id = "mod_url";
-  fidl::Clone(manifest, &result.manifest);
-  fake_module_resolver_->AddFindModulesResult(std::move(result));
-
-  // Run the command and assert results.
-  bool done{};
-  runner_->Execute(story_id_, story_storage_.get(), std::move(command),
-                   [&done](fuchsia::modular::ExecuteResult result) {
-                     EXPECT_EQ(fuchsia::modular::ExecuteStatus::INVALID_COMMAND,
-                               result.status);
-                     EXPECT_EQ(
-                         "No link path found for parameter with name "
-                         "invalid_param",
-                         result.error_message);
-                     done = true;
-                   });
-  RunLoopUntil([&done] { return done; });
-}
-
-// An empty json link should evaluate to a type of "com.google.fuchsia.unknown"
-TEST_F(AddModCommandRunnerTest, ExecuteEmptyJsonLinkPathParam) {
-  // Set up command
-  auto intent = CreateEmptyIntent("intent_action");
-  AddLinkPathParameter(&intent, "invalid_param", "invalid_linkpath");
-  auto command = MakeAddModCommand("mod", "parent_mod", 0.5, intent);
-
-  // Set up fake module resolver.
-  auto manifest = fuchsia::modular::ModuleManifest::New();
-  manifest->binary = "mod_url";
-  manifest->intent_filters.push_back(MakeIntentFilter("intent_action", {}));
-  fuchsia::modular::FindModulesResult result;
-  result.module_id = "mod_url";
-  fidl::Clone(manifest, &result.manifest);
-  fake_module_resolver_->AddFindModulesResult(std::move(result));
-
-  // Run the command and assert results.
-  bool done{};
-  runner_->Execute(story_id_, story_storage_.get(), std::move(command),
-                   [&](fuchsia::modular::ExecuteResult result) {
-                     EXPECT_EQ(fuchsia::modular::ExecuteStatus::OK,
-                               result.status);
-                     done = true;
-                   });
-  RunLoopUntil([&] { return done; });
-}
-
 TEST_F(AddModCommandRunnerTest, ExecuteInvalidJsonParamResolution) {
   // Set up command
   auto intent = CreateEmptyIntent("intent_action");
diff --git a/bin/sessionmgr/puppet_master/command_runners/operation_calls/add_mod_call.cc b/bin/sessionmgr/puppet_master/command_runners/operation_calls/add_mod_call.cc
index f7205b8..41eca48 100644
--- a/bin/sessionmgr/puppet_master/command_runners/operation_calls/add_mod_call.cc
+++ b/bin/sessionmgr/puppet_master/command_runners/operation_calls/add_mod_call.cc
@@ -57,7 +57,7 @@
     // forgivingly execute the handler anyway.
     if (!intent_.action.is_null()) {
       AddFindModulesOperation(
-          &operation_queue_, story_storage_, module_resolver_, entity_resolver_,
+          &operation_queue_, module_resolver_, entity_resolver_,
           CloneOptional(intent_), surface_parent_mod_name_,
           [this, flow](fuchsia::modular::ExecuteResult result,
                        fuchsia::modular::FindModulesResponse response) {
@@ -170,45 +170,6 @@
           entry.value.set_create_link(std::move(create_link));
           break;
         }
-        case fuchsia::modular::IntentParameterData::Tag::kLinkName: {
-          auto did_get_lp = Future<fuchsia::modular::LinkPathPtr>::Create(
-              "AddModCommandRunner::AddModCall::did_get_link");
-          // TODO(miguelfrde): get rid of using surface_parent_mod_name this
-          // way. Maybe INVALID status should be returned here since using
-          // this parameter in a StoryCommand doesn't make much sense.
-          AddGetLinkPathForParameterNameOperation(
-              &operations_, story_storage_, surface_parent_mod_name_,
-              param.data.link_name(), did_get_lp->Completer());
-
-          did_get_entries.emplace_back(
-              did_get_lp->Map([this, param_name = param.name,
-                               done](fuchsia::modular::LinkPathPtr link_path) {
-                if (!GetWeakPtr()) {
-                  return fuchsia::modular::CreateModuleParameterMapEntry{};
-                }
-                if (!link_path) {
-                  // OH NO! bail on this entire function's flow.
-                  out_result_.status =
-                      fuchsia::modular::ExecuteStatus::INTERNAL_ERROR;
-                  out_result_.error_message = fxl::StringPrintf(
-                      "Link path does not exist for parameter name = %s",
-                      param_name.get().c_str());
-                  done();
-                  return fuchsia::modular::CreateModuleParameterMapEntry{};
-                }
-                fuchsia::modular::CreateModuleParameterMapEntry entry;
-                entry.key = param_name;
-                entry.value.set_link_path(std::move(*link_path));
-                return entry;
-              }));
-          continue;
-        }
-        case fuchsia::modular::IntentParameterData::Tag::kLinkPath: {
-          fuchsia::modular::LinkPath lp;
-          param.data.link_path().Clone(&lp);
-          entry.value.set_link_path(std::move(lp));
-          break;
-        }
         case fuchsia::modular::IntentParameterData::Tag::Invalid: {
           out_result_.status = fuchsia::modular::ExecuteStatus::INVALID_COMMAND;
           out_result_.error_message =
diff --git a/bin/sessionmgr/puppet_master/command_runners/operation_calls/find_modules_call.cc b/bin/sessionmgr/puppet_master/command_runners/operation_calls/find_modules_call.cc
index 08eeb5e..4bcb1e3 100644
--- a/bin/sessionmgr/puppet_master/command_runners/operation_calls/find_modules_call.cc
+++ b/bin/sessionmgr/puppet_master/command_runners/operation_calls/find_modules_call.cc
@@ -10,7 +10,6 @@
 #include <lib/fxl/logging.h>
 #include <lib/fxl/type_converter.h>
 
-#include "peridot/bin/sessionmgr/puppet_master/command_runners/operation_calls/get_link_path_for_parameter_name_call.h"
 #include "peridot/bin/sessionmgr/puppet_master/command_runners/operation_calls/get_types_from_entity_call.h"
 #include "peridot/lib/fidl/clone.h"
 
@@ -30,14 +29,12 @@
     : public Operation<fuchsia::modular::ExecuteResult,
                        fuchsia::modular::FindModulesResponse> {
  public:
-  FindModulesCall(StoryStorage* const story_storage,
-                  fuchsia::modular::ModuleResolver* const module_resolver,
+  FindModulesCall(fuchsia::modular::ModuleResolver* const module_resolver,
                   fuchsia::modular::EntityResolver* const entity_resolver,
                   fuchsia::modular::IntentPtr intent,
                   std::vector<std::string> requesting_module_path,
                   ResultCall result_call)
       : Operation("FindModulesCall", std::move(result_call)),
-        story_storage_(story_storage),
         module_resolver_(module_resolver),
         entity_resolver_(entity_resolver),
         intent_(std::move(intent)),
@@ -136,34 +133,6 @@
         }
         break;
       }
-      case fuchsia::modular::IntentParameterData::Tag::kLinkName: {
-        auto did_get_lp = Future<fuchsia::modular::LinkPathPtr>::Create(
-            "AddModCommandRunner::GetTypesFromIntentParameter.did_get_lp");
-        AddGetLinkPathForParameterNameOperation(
-            &operations_, story_storage_, requesting_module_path_,
-            input.link_name(), did_get_lp->Completer());
-        did_get_lp->Then([this, fut,
-                          param_name](fuchsia::modular::LinkPathPtr lp) {
-          if (!lp) {
-            std::ostringstream stream;
-            stream << "No link path found for parameter with name "
-                   << param_name;
-            result_.error_message = stream.str();
-            result_.status = fuchsia::modular::ExecuteStatus::INVALID_COMMAND;
-            fut->Complete({});
-          } else {
-            // If the call below has some error it will be set in result_.
-            GetTypesFromLink(std::move(lp), fut->Completer(), param_name);
-          }
-        });
-        break;
-      }
-      case fuchsia::modular::IntentParameterData::Tag::kLinkPath: {
-        LinkPathPtr lp = CloneOptional(input.link_path());
-        // If the call below has some error it will be set in result_.
-        GetTypesFromLink(std::move(lp), fut->Completer(), param_name);
-        break;
-      }
       case fuchsia::modular::IntentParameterData::Tag::Invalid: {
         std::ostringstream stream;
         stream << "Invalid data for parameter with name: " << param_name;
@@ -185,36 +154,6 @@
     return std::nullopt;
   }
 
-  void GetTypesFromLink(fuchsia::modular::LinkPathPtr link_path,
-                        std::function<void(std::vector<std::string>)> done,
-                        const fidl::StringPtr& param_name) {
-    story_storage_->GetLinkValue(*link_path)
-        ->Then([this, done = std::move(done), param_name](
-                   StoryStorage::Status status, fidl::StringPtr v) {
-          if (status != StoryStorage::Status::OK) {
-            std::ostringstream stream;
-            stream << "StoryStorage failed with status: " << (uint32_t)status
-                   << " for parameter with name " << param_name;
-            result_.error_message = stream.str();
-            result_.status = fuchsia::modular::ExecuteStatus::INTERNAL_ERROR;
-            done({});
-            return;
-          }
-          if (auto result = GetTypesFromJson(v)) {
-            FXL_LOG(INFO) << "type=" << result.value()[0];
-            done(*result);
-            return;
-          }
-          std::ostringstream stream;
-          stream << "Mal-formed JSON read from link for parameter: "
-                 << param_name;
-          result_.error_message = stream.str();
-          result_.status = fuchsia::modular::ExecuteStatus::INTERNAL_ERROR;
-          done({});
-        });
-  }
-
-  StoryStorage* const story_storage_;                        // Not owned.
   fuchsia::modular::ModuleResolver* const module_resolver_;  // Not Owned
   fuchsia::modular::EntityResolver* const entity_resolver_;  // Not owned.
   const fuchsia::modular::IntentPtr intent_;
@@ -223,7 +162,6 @@
   fuchsia::modular::FindModulesQuery resolver_query_;
   std::vector<FuturePtr<fuchsia::modular::FindModulesParameterConstraint>>
       constraint_futs_;
-  fuchsia::modular::LinkPtr link_;  // in case we need itf for
   fuchsia::modular::ExecuteResult result_;
   fuchsia::modular::FindModulesResponse response_;
   OperationCollection operations_;
@@ -234,7 +172,7 @@
 }  // namespace
 
 void AddFindModulesOperation(
-    OperationContainer* operation_container, StoryStorage* const story_storage,
+    OperationContainer* operation_container,
     fuchsia::modular::ModuleResolver* const module_resolver,
     fuchsia::modular::EntityResolver* const entity_resolver,
     fuchsia::modular::IntentPtr intent,
@@ -243,7 +181,7 @@
                        fuchsia::modular::FindModulesResponse)>
         result_call) {
   operation_container->Add(new FindModulesCall(
-      story_storage, module_resolver, entity_resolver, std::move(intent),
+      module_resolver, entity_resolver, std::move(intent),
       std::move(requesting_module_path), std::move(result_call)));
 }
 
diff --git a/bin/sessionmgr/puppet_master/command_runners/operation_calls/find_modules_call.h b/bin/sessionmgr/puppet_master/command_runners/operation_calls/find_modules_call.h
index 97e6a67..dcd34af 100644
--- a/bin/sessionmgr/puppet_master/command_runners/operation_calls/find_modules_call.h
+++ b/bin/sessionmgr/puppet_master/command_runners/operation_calls/find_modules_call.h
@@ -7,12 +7,11 @@
 
 #include <fuchsia/modular/cpp/fidl.h>
 #include <lib/async/cpp/operation.h>
-#include "peridot/bin/sessionmgr/storage/story_storage.h"
 
 namespace modular {
 
 void AddFindModulesOperation(
-    OperationContainer* operation_container, StoryStorage* story_storage,
+    OperationContainer* operation_container,
     fuchsia::modular::ModuleResolver* module_resolver,
     fuchsia::modular::EntityResolver* entity_resolver,
     fuchsia::modular::IntentPtr intent,
diff --git a/bin/sessionmgr/storage/story_storage_xdr.cc b/bin/sessionmgr/storage/story_storage_xdr.cc
index 22fbde4..238cb99 100644
--- a/bin/sessionmgr/storage/story_storage_xdr.cc
+++ b/bin/sessionmgr/storage/story_storage_xdr.cc
@@ -45,8 +45,6 @@
   static constexpr char kEntityReference[] = "entity_reference";
   static constexpr char kJson[] = "json";
   static constexpr char kEntityType[] = "entity_type";
-  static constexpr char kLinkName[] = "link_name";
-  static constexpr char kLinkPath[] = "link_path";
 
   switch (xdr->op()) {
     case XdrOp::FROM_JSON: {
@@ -67,14 +65,6 @@
         ::std::vector<::std::string> value;
         xdr->Field(kEntityType, &value);
         data->set_entity_type(std::move(value));
-      } else if (tag == kLinkName) {
-        fidl::StringPtr value;
-        xdr->Field(kLinkName, &value);
-        data->set_link_name(std::move(value));
-      } else if (tag == kLinkPath) {
-        fuchsia::modular::LinkPath value;
-        xdr->Field(kLinkPath, &value, XdrLinkPath);
-        data->set_link_path(std::move(value));
       } else {
         FXL_LOG(ERROR) << "XdrIntentParameterData FROM_JSON unknown tag: "
                        << tag;
@@ -106,17 +96,6 @@
           xdr->Field(kEntityType, &value);
           break;
         }
-        case fuchsia::modular::IntentParameterData::Tag::kLinkName: {
-          tag = kLinkName;
-          fidl::StringPtr value = data->link_name();
-          xdr->Field(kLinkName, &value);
-          break;
-        }
-        case fuchsia::modular::IntentParameterData::Tag::kLinkPath: {
-          tag = kLinkPath;
-          xdr->Field(kLinkPath, &data->link_path(), XdrLinkPath);
-          break;
-        }
         case fuchsia::modular::IntentParameterData::Tag::Invalid:
           FXL_LOG(ERROR) << "XdrIntentParameterData TO_JSON unknown tag: "
                          << static_cast<int>(data->Which());
diff --git a/bin/sessionmgr/story_runner/story_controller_impl.cc b/bin/sessionmgr/story_runner/story_controller_impl.cc
index 5e76939..4a196fc 100644
--- a/bin/sessionmgr/story_runner/story_controller_impl.cc
+++ b/bin/sessionmgr/story_runner/story_controller_impl.cc
@@ -257,18 +257,6 @@
     fuchsia::modular::Intent intent;
     module_data_.intent->Clone(&intent);
 
-    for (auto& parameter : *intent.parameters) {
-      // When an Intent is created the creator specifies a link either by
-      // absolute path, or by name in the creator's namespace.
-      //
-      // The link_path and link_name both get converted to the handler's
-      // namespace before the intent is sent to the handler. The link name in
-      // the handler's namespace is always the same as the parameter name.
-      if (parameter.data.is_link_path() || parameter.data.is_link_name()) {
-        parameter.data.set_link_name(parameter.name);
-      }
-    }
-
     intent_handler->HandleIntent(std::move(intent));
   }
 
diff --git a/public/fidl/fuchsia.modular/intent/intent.fidl b/public/fidl/fuchsia.modular/intent/intent.fidl
index d2b07c9..09fb8ef 100644
--- a/public/fidl/fuchsia.modular/intent/intent.fidl
+++ b/public/fidl/fuchsia.modular/intent/intent.fidl
@@ -57,15 +57,4 @@
     // Only one entry in |entity_type| must match the constraint specified by
     // the Module for the constraint to be considered satisfied.
     vector<string> entity_type;
-
-    // Set this to use an existing Link accessible from your Module as the noun's
-    // value.
-    // TODO(thatguy): This is allowed to be null for backwards compatibility with
-    // Mods that use the 'default link' (= a link with null name). Once no mods
-    // use the default link any more, this can be made required again.
-    // MI4-736
-    string? link_name;
-
-    // Set to re-use an existing link within a story.
-    LinkPath link_path;
 };