docs: @ActionMapping(params = {"action=delete"})
      public void unFavoriteNode(@RequestParam("nodeId") String nodeId, ActionResponse response) {
  
          try {
  
              // ferret out the layout manager
              HttpServletRequest servletRequest = this.portalRequestUtils.getCurrentPortalRequest();
              IUserInstance userInstance = this.userInstanceManager.getUserInstance(servletRequest);
              IUserPreferencesManager preferencesManager = userInstance.getPreferencesManager();
              IUserLayoutManager layoutManager = preferencesManager.getUserLayoutManager();
  
              IUserLayoutNodeDescription nodeDescription = layoutManager.getNode(nodeId);
  
              String userFacingNodeName = nodeDescription.getName();
              response.setRenderParameter("nameOfFavoriteActedUpon", userFacingNodeName);
  
              if (nodeDescription.isDeleteAllowed()) {
  
                  boolean nodeSuccessfullyDeleted = layoutManager.deleteNode(nodeId);
  
                  if (nodeSuccessfullyDeleted) {
                      layoutManager.saveUserLayout();
  
                      response.setRenderParameter(
                              "successMessageCode", "favorites.unfavorite.success.parameterized");
  
                      IUserLayout updatedLayout = layoutManager.getUserLayout();
  
                      // if removed last favorite, return to VIEW mode
                      if (!favoritesUtils.hasAnyFavorites(updatedLayout)) {
                          response.setPortletMode(PortletMode.VIEW);
                      }
  
                      logger.debug("Successfully unfavorited [{}]", nodeDescription);
  
                  } else {
                      logger.error(
                              "Failed to delete node [{}] on unfavorite request, but this should have succeeded?",
                              nodeDescription);
  
                      response.setRenderParameter(
                              "errorMessageCode", "favorites.unfavorite.fail.parameterized");
                  }
  
              } else {
                  logger.warn(
                          "Attempt to unfavorite [{}] failed because user lacks permission to delete that layout node.",
                          nodeDescription);
  
                  response.setRenderParameter(
                          "errorMessageCode",
                          "favorites.unfavorite.fail.lack.permission.parameterized");
              }
  
          } catch (Exception e) {
  
              // TODO: this log message is kind of useless without the username to put the node in
              // context
              logger.error("Something went wrong unfavoriting nodeId [{}].", nodeId);
  
              // may have failed to load node description, so fall back on describing by id
              final String fallbackUserFacingNodeName = "node with id " + nodeId;
  
              response.setRenderParameter(
                      "errorMessageCode", "favorites.unfavorite.fail.parameterized");
              response.setRenderParameter("nameOfFavoriteActedUpon", fallbackUserFacingNodeName);
          }
  
          response.setRenderParameter("action", "list");
      }