From 569922dc5bfe6cd4681326d5069772bb86972d0d Mon Sep 17 00:00:00 2001 From: Zhonglu Date: Sun, 21 Jul 2019 11:35:18 -0400 Subject: [PATCH] Bump version to v0.9.0 & fix two issues --- Dockerfile | 2 +- README.md | 6 ++--- db/poli.db | Bin 61440 -> 65536 bytes db/schema-postgresql.sql | 2 +- db/schema-sqlite.sql | 2 +- .../screenshots/rls_user_attributes.jpg | Bin 0 -> 42340 bytes docs/change-logs.md | 4 +++ docs/installation.md | 2 +- docs/report-component.md | 2 ++ pom.xml | 2 +- src/main/java/com/shzlw/poli/dao/UserDao.java | 5 ++++ .../com/shzlw/poli/filter/AuthFilter.java | 3 ++- src/main/java/com/shzlw/poli/rest/AuthWs.java | 2 +- .../java/com/shzlw/poli/rest/GroupWs.java | 23 ++++++++++++++++++ .../java/com/shzlw/poli/rest/JdbcQueryWs.java | 6 ----- .../com/shzlw/poli/service/ReportService.java | 1 + .../java/com/shzlw/poli/util/Constants.java | 2 +- .../com/shzlw/poli/filter/AuthFilterTest.java | 1 + start.bat | 2 +- start.sh | 2 +- web-app/package-lock.json | 14 +++++------ web-app/package.json | 2 +- 22 files changed, 58 insertions(+), 27 deletions(-) create mode 100644 docs/_images/screenshots/rls_user_attributes.jpg diff --git a/Dockerfile b/Dockerfile index 5bad607..3044058 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,7 +2,7 @@ FROM openjdk:8-jre-alpine WORKDIR /app -COPY target/poli-0.8.1.jar /app/poli-0.8.1.jar +COPY target/poli-0.9.0.jar /app/poli-0.9.0.jar COPY db/poli.db /app/db/poli.db COPY start.sh /app/start.sh COPY config/poli.docker.properties /app/config/poli.properties diff --git a/README.md b/README.md index dbe8bb4..e8e9353 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # **Poli** -[![Version](https://img.shields.io/badge/Version-0.8.1-0065FF.svg)](#) +[![Version](https://img.shields.io/badge/Version-0.9.0-0065FF.svg)](#) [![license: MIT](https://img.shields.io/badge/license-MIT-FF5630.svg)](https://opensource.org/licenses/MIT) [![Download](https://img.shields.io/github/downloads/shzlw/poli/total.svg?color=6554C0)](https://github.com/shzlw/poli/releases) [![Docker Pulls](https://img.shields.io/docker/pulls/zhonglu/poli.svg)](https://cloud.docker.com/u/zhonglu/repository/docker/zhonglu/poli) @@ -56,13 +56,13 @@ Auto refresh, drill through, fullscreen, embeds, color themes + more features in Windows/Linux ```sh -java -jar poli-0.8.1.jar +java -jar poli-0.9.0.jar ``` Docker ```sh -docker run -d -p 6688:6688 --name poli zhonglu/poli:0.8.1 +docker run -d -p 6688:6688 --name poli zhonglu/poli:0.9.0 ``` Check [installation guide](https://shzlw.github.io/poli/#/installation) for more details. diff --git a/db/poli.db b/db/poli.db index 416d09987a7597b8b3e90b7a8cdbf11628b9e7d2..891155ffba08c46ea333dab60da7caddc3732577 100644 GIT binary patch delta 210 zcmZp8z}(QlGC^99n}LBr0El6LYod-Z4>yCJMiwvs4+ehLs)^asEUd3tt2R#jz`~Tz zKiP*(k5OQ9HJgKfqc0!3xUMc^lW$34Qch|?d}(oNQG8-aNl|7}X$c0O-#N(DF~n6N z#L>yeRRLYKg2rSWc4bwN?)dD~N`(;Dh!6!oe;^L^@zLQ@00OXFSz=D<-C*#pZT%k%7P>1pxq@z&{57 delta 74 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 KosNNi8~hLcc-|-g literal 0 HcmV?d00001 diff --git a/docs/change-logs.md b/docs/change-logs.md index 66ccae2..7979d25 100644 --- a/docs/change-logs.md +++ b/docs/change-logs.md @@ -23,6 +23,10 @@ - When filters are modified, the color of the "apply filters" button will be changed to show indication. - When the report view is loaded with url parameters from drill through, the filter values will be applied immediately. +### Bug Fixes +- Fix an issue that the report group modification doesn't update the user report cache. +- Fix an issue that the user with viewer role cannot save canned report. + ## v0.8.1 ### Bug Fixes diff --git a/docs/installation.md b/docs/installation.md index 5eea789..5e82de8 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -68,7 +68,7 @@ 1. Pull and run the Poli image. ```bash - docker run -d -p 6688:6688 --name poli zhonglu/poli:0.8.1 + docker run -d -p 6688:6688 --name poli zhonglu/poli:0.9.0 ``` 2. Add JDBC drivers. diff --git a/docs/report-component.md b/docs/report-component.md index 9739ce8..b7d5ca1 100644 --- a/docs/report-component.md +++ b/docs/report-component.md @@ -218,6 +218,8 @@ Assume that we have a table: department_data. The goal here is to have user1 who 1. Create a new user: user1. Define a user attribute on the User page. +![rls user attributes](_images/screenshots/rls_user_attributes.jpg) + 2. Create a table chart using ```sql diff --git a/pom.xml b/pom.xml index b4d0684..f964ba6 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.shzlw.poli poli jar - 0.8.1 + 0.9.0 1.8 diff --git a/src/main/java/com/shzlw/poli/dao/UserDao.java b/src/main/java/com/shzlw/poli/dao/UserDao.java index 75d8e09..3a2bb9a 100644 --- a/src/main/java/com/shzlw/poli/dao/UserDao.java +++ b/src/main/java/com/shzlw/poli/dao/UserDao.java @@ -154,6 +154,11 @@ public List findUserGroups(long userId) { return jt.queryForList(sql, new Object[]{ userId }, Long.class); } + public List findGroupUsers(long groupId) { + String sql = "SELECT user_id FROM p_group_user WHERE group_id = ?"; + return jt.queryForList(sql, new Object[]{ groupId }, Long.class); + } + public List findUserAttributes(long userId) { String sql = "SELECT attr_key, attr_value FROM p_user_attribute WHERE user_id = ?"; return jt.query(sql, new Object[]{ userId }, (rs, i) -> { diff --git a/src/main/java/com/shzlw/poli/filter/AuthFilter.java b/src/main/java/com/shzlw/poli/filter/AuthFilter.java index 4b69df2..fccc23d 100644 --- a/src/main/java/com/shzlw/poli/filter/AuthFilter.java +++ b/src/main/java/com/shzlw/poli/filter/AuthFilter.java @@ -109,7 +109,8 @@ private static boolean validateViewer(String requestMethod, String path) { isValid = true; } } else if (Constants.HTTP_METHOD_POST.equals(requestMethod)) { - if (path.startsWith("/ws/jdbcquery")) { + if (path.startsWith("/ws/jdbcquery") + || path.startsWith("/ws/cannedreport")) { isValid = true; } } else if (Constants.HTTP_METHOD_DELETE.equals(requestMethod)) { diff --git a/src/main/java/com/shzlw/poli/rest/AuthWs.java b/src/main/java/com/shzlw/poli/rest/AuthWs.java index e6e29bd..b5b42ab 100644 --- a/src/main/java/com/shzlw/poli/rest/AuthWs.java +++ b/src/main/java/com/shzlw/poli/rest/AuthWs.java @@ -69,11 +69,11 @@ public LoginResponse loginBySessionKey(@CookieValue(value = Constants.SESSION_KE } User user = userDao.findBySessionKey(sessionKey); - user.setUserAttributes(userDao.findUserAttributes(user.getId())); if (user == null) { return LoginResponse.ofError(INVALID_USERNAME_PASSWORD); } + user.setUserAttributes(userDao.findUserAttributes(user.getId())); userService.newOrUpdateUser(user, user.getSessionKey(), sessionKey); return LoginResponse.ofSucess(user.getUsername(), user.getSysRole(), false); } diff --git a/src/main/java/com/shzlw/poli/rest/GroupWs.java b/src/main/java/com/shzlw/poli/rest/GroupWs.java index 740e504..53c51ab 100644 --- a/src/main/java/com/shzlw/poli/rest/GroupWs.java +++ b/src/main/java/com/shzlw/poli/rest/GroupWs.java @@ -1,7 +1,9 @@ package com.shzlw.poli.rest; import com.shzlw.poli.dao.GroupDao; +import com.shzlw.poli.dao.UserDao; import com.shzlw.poli.model.Group; +import com.shzlw.poli.service.ReportService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -18,6 +20,12 @@ public class GroupWs { @Autowired GroupDao groupDao; + @Autowired + ReportService reportService; + + @Autowired + UserDao userDao; + @RequestMapping(method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) @Transactional(readOnly = true) public List findAll() { @@ -42,6 +50,11 @@ public Group findOne(@PathVariable("id") long groupId) { public ResponseEntity add(@RequestBody Group group) { long groupId = groupDao.insertGroup(group.getName()); groupDao.insertGroupReports(groupId, group.getGroupReports()); + + List userIds = userDao.findGroupUsers(groupId); + for (Long userId : userIds) { + reportService.invalidateCache(userId); + } return new ResponseEntity(groupId, HttpStatus.CREATED); } @@ -52,6 +65,11 @@ public ResponseEntity update(@RequestBody Group group) { groupDao.updateGroup(group); groupDao.deleteGroupReports(groupId); groupDao.insertGroupReports(groupId, group.getGroupReports()); + + List userIds = userDao.findGroupUsers(groupId); + for (Long userId : userIds) { + reportService.invalidateCache(userId); + } return new ResponseEntity(HttpStatus.OK); } @@ -61,6 +79,11 @@ public ResponseEntity delete(@PathVariable("id") long groupId) { groupDao.deleteGroupUsers(groupId); groupDao.deleteGroupReports(groupId); groupDao.deleteGroup(groupId); + + List userIds = userDao.findGroupUsers(groupId); + for (Long userId : userIds) { + reportService.invalidateCache(userId); + } return new ResponseEntity(HttpStatus.NO_CONTENT); } } \ No newline at end of file diff --git a/src/main/java/com/shzlw/poli/rest/JdbcQueryWs.java b/src/main/java/com/shzlw/poli/rest/JdbcQueryWs.java index 9470c2c..dee1e0b 100644 --- a/src/main/java/com/shzlw/poli/rest/JdbcQueryWs.java +++ b/src/main/java/com/shzlw/poli/rest/JdbcQueryWs.java @@ -72,12 +72,6 @@ public ResponseEntity queryComponent( String sql = component.getSqlQuery(); DataSource dataSource = jdbcDataSourceService.getDataSource(component.getJdbcDataSourceId()); User user = (User) request.getAttribute(Constants.HTTP_REQUEST_ATTR_USER); - - List userAttributes = user.getUserAttributes(); - LOGGER.info("userAttributes: {}", userAttributes.size()); - for (UserAttribute attr : userAttributes) { - LOGGER.info("attr: {}", attr); - } List newFilterParams = addUserAttributesToFilterParams(user.getUserAttributes(), filterParams); QueryResult queryResult = jdbcQueryService.queryComponentByParams(dataSource, sql, newFilterParams); return new ResponseEntity(queryResult, HttpStatus.OK); diff --git a/src/main/java/com/shzlw/poli/service/ReportService.java b/src/main/java/com/shzlw/poli/service/ReportService.java index fa1d015..8f28c29 100644 --- a/src/main/java/com/shzlw/poli/service/ReportService.java +++ b/src/main/java/com/shzlw/poli/service/ReportService.java @@ -45,6 +45,7 @@ public List getReportsByUser(User user) { List reports = new ArrayList<>(); if (Constants.SYS_ROLE_VIEWER.equals(user.getSysRole())) { reports = reportDao.findByViewer(user.getId()); + LOGGER.info("reports: {}", reports.size()); } else { reports = reportDao.findAll(); } diff --git a/src/main/java/com/shzlw/poli/util/Constants.java b/src/main/java/com/shzlw/poli/util/Constants.java index c08328e..0cc1269 100644 --- a/src/main/java/com/shzlw/poli/util/Constants.java +++ b/src/main/java/com/shzlw/poli/util/Constants.java @@ -4,7 +4,7 @@ public final class Constants { private Constants() {} - public static final String CURRENT_VERSION = "0.8.1"; + public static final String CURRENT_VERSION = "0.9.0"; public static final String SUCCESS = "success"; public static final String GOOD = ""; diff --git a/src/test/java/com/shzlw/poli/filter/AuthFilterTest.java b/src/test/java/com/shzlw/poli/filter/AuthFilterTest.java index 28e1cc3..3395d60 100644 --- a/src/test/java/com/shzlw/poli/filter/AuthFilterTest.java +++ b/src/test/java/com/shzlw/poli/filter/AuthFilterTest.java @@ -165,6 +165,7 @@ public void testViewerValidAccess() throws IOException, ServletException { new AccessRule(Constants.HTTP_METHOD_GET, "/ws/user/account"), new AccessRule(Constants.HTTP_METHOD_PUT, "/ws/user/account"), new AccessRule(Constants.HTTP_METHOD_POST, "/ws/jdbcquery"), + new AccessRule(Constants.HTTP_METHOD_POST, "/ws/cannedreport"), new AccessRule(Constants.HTTP_METHOD_DELETE, "/ws/cannedreport") ); diff --git a/start.bat b/start.bat index 6a58a51..a2116eb 100644 --- a/start.bat +++ b/start.bat @@ -1 +1 @@ -java -jar poli-0.8.1.jar --spring.config.name=application,poli \ No newline at end of file +java -jar poli-0.9.0.jar --spring.config.name=application,poli \ No newline at end of file diff --git a/start.sh b/start.sh index 2649493..4a8cb87 100755 --- a/start.sh +++ b/start.sh @@ -1,4 +1,4 @@ #!/bin/sh set -e -java -jar poli-0.8.1.jar --spring.config.name=application,poli +java -jar poli-0.9.0.jar --spring.config.name=application,poli diff --git a/web-app/package-lock.json b/web-app/package-lock.json index c9d8151..c981e07 100644 --- a/web-app/package-lock.json +++ b/web-app/package-lock.json @@ -1,6 +1,6 @@ { "name": "poli-web-app", - "version": "0.8.1", + "version": "0.9.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -2480,7 +2480,7 @@ "fill-range": "^4.0.0", "isobject": "^3.0.1", "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", + "snapdragon": "^0.9.0", "snapdragon-node": "^2.0.1", "split-string": "^3.0.2", "to-regex": "^3.0.1" @@ -4460,7 +4460,7 @@ "esprima": "^3.1.3", "estraverse": "^4.2.0", "esutils": "^2.0.2", - "optionator": "^0.8.1", + "optionator": "^0.9.0", "source-map": "~0.6.1" }, "dependencies": { @@ -4963,7 +4963,7 @@ "extend-shallow": "^2.0.1", "posix-character-classes": "^0.1.0", "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", + "snapdragon": "^0.9.0", "to-regex": "^3.0.1" }, "dependencies": { @@ -5118,7 +5118,7 @@ "extend-shallow": "^2.0.1", "fragment-cache": "^0.2.1", "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", + "snapdragon": "^0.9.0", "to-regex": "^3.0.1" }, "dependencies": { @@ -8089,7 +8089,7 @@ "nanomatch": "^1.2.9", "object.pick": "^1.3.0", "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", + "snapdragon": "^0.9.0", "to-regex": "^3.0.2" }, "dependencies": { @@ -8289,7 +8289,7 @@ "kind-of": "^6.0.2", "object.pick": "^1.3.0", "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", + "snapdragon": "^0.9.0", "to-regex": "^3.0.1" }, "dependencies": { diff --git a/web-app/package.json b/web-app/package.json index e492791..19d7e8b 100644 --- a/web-app/package.json +++ b/web-app/package.json @@ -1,6 +1,6 @@ { "name": "poli-web-app", - "version": "0.8.1", + "version": "0.9.0", "private": true, "dependencies": { "@fortawesome/fontawesome-svg-core": "^1.2.17",