From ae3bd2c36f676f7fba9d1af363d88205da0bc8f7 Mon Sep 17 00:00:00 2001 From: Jonathan Cobb Date: Sat, 1 Feb 2020 13:21:38 -0500 Subject: [PATCH] WIP. manage block lists - config views now working --- .../src/main/java/bubble/ApiConstants.java | 1 + .../bubble/app/bblock/BlockListEntry.java | 14 ++++ .../bblock/BubbleBlockAppConfigDriver.java | 70 ++++++++++++++++++- .../model/app/config/AppConfigDriver.java | 10 +++ .../resources/app/AppConfigResource.java | 64 +++++++++++++++++ .../resources/app/AppsResourceBase.java | 8 +++ .../bubble/rule/bblock/BubbleBlockList.java | 2 + .../bubble_block/bubbleApp_bubbleBlock.json | 6 +- bubble-web | 2 +- utils/cobbzilla-utils | 2 +- 10 files changed, 173 insertions(+), 6 deletions(-) create mode 100644 bubble-server/src/main/java/bubble/app/bblock/BlockListEntry.java create mode 100644 bubble-server/src/main/java/bubble/resources/app/AppConfigResource.java diff --git a/bubble-server/src/main/java/bubble/ApiConstants.java b/bubble-server/src/main/java/bubble/ApiConstants.java index 412ab1a9..6c94a695 100644 --- a/bubble-server/src/main/java/bubble/ApiConstants.java +++ b/bubble-server/src/main/java/bubble/ApiConstants.java @@ -131,6 +131,7 @@ public class ApiConstants { public static final String EP_MATCHERS = "/matchers"; public static final String EP_DATA = "/data"; public static final String EP_VIEW = "/view"; + public static final String EP_CONFIG = "/config"; public static final String EP_SITES = "/sites"; public static final String EP_MESSAGES = MESSAGES_ENDPOINT; public static final String EP_DRIVERS = DRIVERS_ENDPOINT; diff --git a/bubble-server/src/main/java/bubble/app/bblock/BlockListEntry.java b/bubble-server/src/main/java/bubble/app/bblock/BlockListEntry.java new file mode 100644 index 00000000..605a19f0 --- /dev/null +++ b/bubble-server/src/main/java/bubble/app/bblock/BlockListEntry.java @@ -0,0 +1,14 @@ +package bubble.app.bblock; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.experimental.Accessors; + +@NoArgsConstructor @AllArgsConstructor @Accessors(chain=true) +public class BlockListEntry { + + @Getter @Setter private String rule; + +} 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 643494e3..ba155cd7 100644 --- a/bubble-server/src/main/java/bubble/app/bblock/BubbleBlockAppConfigDriver.java +++ b/bubble-server/src/main/java/bubble/app/bblock/BubbleBlockAppConfigDriver.java @@ -1,4 +1,72 @@ package bubble.app.bblock; -public class BubbleBlockAppConfigDriver { +import bubble.dao.app.AppRuleDAO; +import bubble.dao.app.RuleDriverDAO; +import bubble.model.account.Account; +import bubble.model.app.AppRule; +import bubble.model.app.BubbleApp; +import bubble.model.app.RuleDriver; +import bubble.model.app.config.AppConfigDriver; +import bubble.rule.bblock.BubbleBlockConfig; +import bubble.rule.bblock.BubbleBlockList; +import bubble.rule.bblock.BubbleBlockRuleDriver; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.*; +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; +import static org.cobbzilla.wizard.resources.ResourceUtil.notFoundEx; + +public class BubbleBlockAppConfigDriver implements AppConfigDriver { + + public static final String VIEW_manage_lists = "manage_lists"; + public static final String VIEW_manage_list = "manage_list"; + public static final String VIEW_manage_entries = "manage_entries"; + + @Autowired private RuleDriverDAO driverDAO; + @Autowired private AppRuleDAO ruleDAO; + + @Override public Object getView(Account account, BubbleApp app, String view, Map params) { + final String id = params.get(PARAM_ID); + switch (view) { + case VIEW_manage_lists: + return loadAllLists(account, app); + + case VIEW_manage_list: + if (empty(id)) throw notFoundEx(id); + return loadList(account, app, id); + + case VIEW_manage_entries: + if (empty(id)) throw notFoundEx(id); + return loadListEntries(account, app, id); + } + throw notFoundEx(view); + } + + private List loadListEntries(Account account, BubbleApp app, String id) { + final BubbleBlockList list = loadList(account, app, id); + return list == null || !list.hasAdditionalEntries() ? emptyList() : Arrays.stream(list.getAdditionalEntries()).map(BlockListEntry::new).collect(Collectors.toList()); + } + + private BubbleBlockList loadList(Account account, BubbleApp app, String id) { + return loadAllLists(account, app).stream().filter(list -> list.hasId(id)).findFirst().orElse(null); + } + + private List loadAllLists(Account account, BubbleApp app) { + final List blockLists = new ArrayList<>(); + final List rules = ruleDAO.findByAccountAndApp(account.getUuid(), app.getUuid()); + for (AppRule rule : rules) { + 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())); + } + } + return blockLists; + } + } 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 0e3d9812..8dcf1763 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 @@ -1,4 +1,14 @@ package bubble.model.app.config; +import bubble.model.account.Account; +import bubble.model.app.BubbleApp; + +import java.util.Map; + public interface AppConfigDriver { + + String PARAM_ID = "id"; + + Object getView(Account account, BubbleApp app, String view, Map params); + } diff --git a/bubble-server/src/main/java/bubble/resources/app/AppConfigResource.java b/bubble-server/src/main/java/bubble/resources/app/AppConfigResource.java new file mode 100644 index 00000000..f0b5ae4b --- /dev/null +++ b/bubble-server/src/main/java/bubble/resources/app/AppConfigResource.java @@ -0,0 +1,64 @@ +package bubble.resources.app; + +import bubble.model.account.Account; +import bubble.model.app.BubbleApp; +import bubble.model.app.config.AppConfigDriver; +import bubble.model.app.config.AppConfigView; +import bubble.server.BubbleConfiguration; +import lombok.extern.slf4j.Slf4j; +import org.glassfish.grizzly.http.server.Request; +import org.glassfish.jersey.server.ContainerRequest; +import org.springframework.beans.factory.annotation.Autowired; + +import javax.ws.rs.*; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.Response; + +import java.util.Map; + +import static org.cobbzilla.util.http.HttpContentTypes.APPLICATION_JSON; +import static org.cobbzilla.util.http.URIUtil.queryParams; +import static org.cobbzilla.wizard.resources.ResourceUtil.*; + +@Consumes(APPLICATION_JSON) +@Produces(APPLICATION_JSON) +@Slf4j +public class AppConfigResource { + + private Account account; + private BubbleApp app; + + public AppConfigResource (Account account, BubbleApp app) { + this.account = account; + this.app = app; + } + + @Autowired private BubbleConfiguration configuration; + + private AppConfigDriver getConfigDriver() { return app.getDataConfig().getConfigDriver(configuration); } + + @GET + public Response getConfigView(@Context ContainerRequest ctx) { + final Account caller = userPrincipal(ctx); + if (!caller.admin() && !caller.getUuid().equals(account.getUuid())) return forbidden(); + return ok(app.getDataConfig().getConfigViews()); + } + + @GET @Path("/{view}") + public Response getConfigView(@Context Request req, + @Context ContainerRequest ctx, + @PathParam("view") String view) { + + 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); + + final Map queryParams = queryParams(req.getQueryString()); + + final AppConfigDriver configDriver = getConfigDriver(); + return ok(configDriver.getView(account, app, view, queryParams)); + } + +} diff --git a/bubble-server/src/main/java/bubble/resources/app/AppsResourceBase.java b/bubble-server/src/main/java/bubble/resources/app/AppsResourceBase.java index 5df9852d..91c9af68 100644 --- a/bubble-server/src/main/java/bubble/resources/app/AppsResourceBase.java +++ b/bubble-server/src/main/java/bubble/resources/app/AppsResourceBase.java @@ -127,4 +127,12 @@ public abstract class AppsResourceBase extends AccountOwnedTemplateResource