diff --git a/bubble-server/src/main/java/bubble/app/bblock/BubbleBlockAppConfigDriver.java b/bubble-server/src/main/java/bubble/app/bblock/BubbleBlockAppConfigDriver.java index ba155cd7..36a021e3 100644 --- a/bubble-server/src/main/java/bubble/app/bblock/BubbleBlockAppConfigDriver.java +++ b/bubble-server/src/main/java/bubble/app/bblock/BubbleBlockAppConfigDriver.java @@ -10,12 +10,15 @@ import bubble.model.app.config.AppConfigDriver; import bubble.rule.bblock.BubbleBlockConfig; import bubble.rule.bblock.BubbleBlockList; import bubble.rule.bblock.BubbleBlockRuleDriver; +import com.fasterxml.jackson.databind.JsonNode; import org.springframework.beans.factory.annotation.Autowired; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; import java.util.stream.Collectors; -import static java.util.Arrays.asList; import static java.util.Collections.emptyList; import static org.cobbzilla.util.daemon.ZillaRuntime.empty; import static org.cobbzilla.util.json.JsonUtil.json; @@ -63,10 +66,52 @@ public class BubbleBlockAppConfigDriver implements AppConfigDriver { final RuleDriver driver = driverDAO.findByAccountAndId(account.getUuid(), rule.getDriver()); if (driver != null && driver.getDriverClass().equals(BubbleBlockRuleDriver.class.getName())) { final BubbleBlockConfig blockConfig = json(rule.getConfigJson(), BubbleBlockConfig.class); - blockLists.addAll(asList(blockConfig.getBlockLists())); + blockLists.addAll( Arrays.stream(blockConfig.getBlockLists()) + .map(list -> list.setRule(rule)) + .collect(Collectors.toList()) ); } } return blockLists; } + public static final String ACTION_enable_list = "enable_list"; + public static final String ACTION_disable_list = "disable_list"; + public static final String ACTION_manage_list = "manage_list"; + public static final String ACTION_remove_list = "remove_list"; + public static final String ACTION_add_list = "add_list"; + public static final String ACTION_manage_list_entries = "manage_list_entries"; + public static final String ACTION_remove_rule = "remove_rule"; + public static final String ACTION_create_rule = "create_rule"; + public static final String ACTION_test_url = "test_url"; + + @Override public Object takeItemAction(Account account, + BubbleApp app, + String view, + String action, + String id, + Map queryParams, + JsonNode data) { + BubbleBlockList list; + + switch (action) { + case ACTION_enable_list: + list = loadList(account, app, id); + if (list == null) throw notFoundEx(id); + return updateList(list.setEnabled(true)); + + case ACTION_disable_list: + list = loadList(account, app, id); + if (list == null) throw notFoundEx(id); + return updateList(list.setEnabled(false)); + } + + throw notFoundEx(action); + } + + private BubbleBlockList updateList(BubbleBlockList list) { + final AppRule rule = list.getRule(); + final BubbleBlockConfig blockConfig = json(rule.getConfigJson(), BubbleBlockConfig.class); + ruleDAO.update(rule.setConfigJson(json(blockConfig.updateList(list)))); + return list; + } } diff --git a/bubble-server/src/main/java/bubble/model/app/config/AppConfigDriver.java b/bubble-server/src/main/java/bubble/model/app/config/AppConfigDriver.java index 8dcf1763..d2d35257 100644 --- a/bubble-server/src/main/java/bubble/model/app/config/AppConfigDriver.java +++ b/bubble-server/src/main/java/bubble/model/app/config/AppConfigDriver.java @@ -2,6 +2,7 @@ package bubble.model.app.config; import bubble.model.account.Account; import bubble.model.app.BubbleApp; +import com.fasterxml.jackson.databind.JsonNode; import java.util.Map; @@ -11,4 +12,12 @@ public interface AppConfigDriver { Object getView(Account account, BubbleApp app, String view, Map params); + Object takeItemAction(Account account, + BubbleApp app, + String view, + String action, + String id, + Map params, + JsonNode data); + } diff --git a/bubble-server/src/main/java/bubble/resources/app/AppConfigResource.java b/bubble-server/src/main/java/bubble/resources/app/AppConfigResource.java index f0b5ae4b..563d4e43 100644 --- a/bubble-server/src/main/java/bubble/resources/app/AppConfigResource.java +++ b/bubble-server/src/main/java/bubble/resources/app/AppConfigResource.java @@ -5,6 +5,7 @@ import bubble.model.app.BubbleApp; import bubble.model.app.config.AppConfigDriver; import bubble.model.app.config.AppConfigView; import bubble.server.BubbleConfiguration; +import com.fasterxml.jackson.databind.JsonNode; import lombok.extern.slf4j.Slf4j; import org.glassfish.grizzly.http.server.Request; import org.glassfish.jersey.server.ContainerRequest; @@ -16,6 +17,8 @@ import javax.ws.rs.core.Response; import java.util.Map; +import static bubble.ApiConstants.EP_ACTIONS; +import static org.cobbzilla.util.daemon.ZillaRuntime.empty; import static org.cobbzilla.util.http.HttpContentTypes.APPLICATION_JSON; import static org.cobbzilla.util.http.URIUtil.queryParams; import static org.cobbzilla.wizard.resources.ResourceUtil.*; @@ -61,4 +64,27 @@ public class AppConfigResource { return ok(configDriver.getView(account, app, view, queryParams)); } + @POST @Path("/{view}"+EP_ACTIONS+"/{action}") + public Response takeConfigItemAction(@Context Request req, + @Context ContainerRequest ctx, + @PathParam("view") String view, + @PathParam("action") String action, + @QueryParam("id") String id, + JsonNode data) { + + final Account caller = userPrincipal(ctx); + if (!caller.admin() && !caller.getUuid().equals(account.getUuid())) return forbidden(); + + final AppConfigView configView = app.getDataConfig().getConfigView(view); + if (configView == null) return notFound(view); + + if (empty(id)) return invalid("err.id.required"); + if (empty(action)) return invalid("err.action.required"); + + final Map queryParams = queryParams(req.getQueryString()); + + final AppConfigDriver configDriver = getConfigDriver(); + return ok(configDriver.takeItemAction(account, app, view, action, id, queryParams, data)); + } + } diff --git a/bubble-server/src/main/java/bubble/rule/bblock/BubbleBlockConfig.java b/bubble-server/src/main/java/bubble/rule/bblock/BubbleBlockConfig.java index 1379a464..75363625 100644 --- a/bubble-server/src/main/java/bubble/rule/bblock/BubbleBlockConfig.java +++ b/bubble-server/src/main/java/bubble/rule/bblock/BubbleBlockConfig.java @@ -3,10 +3,26 @@ package bubble.rule.bblock; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import org.cobbzilla.util.collection.ArrayUtil; @NoArgsConstructor public class BubbleBlockConfig { @Getter @Setter private BubbleBlockList[] blockLists; + public BubbleBlockConfig updateList(BubbleBlockList list) { + if (blockLists == null) { + blockLists = new BubbleBlockList[] {list}; + return this; + } + for (int i=0; i