From 2f59a74b65887bf5ac0ff4e081640586406c3ccd Mon Sep 17 00:00:00 2001 From: dashevchenko Date: Tue, 14 Mar 2023 12:16:04 +0200 Subject: [PATCH 1/6] added methods for RestClient, added system comment after comment deletion --- .../controller/AlarmCommentController.java | 2 +- .../controller/ControllerConstants.java | 2 +- .../alarm/DefaultTbAlarmCommentService.java | 10 +++++++ .../thingsboard/rest/client/RestClient.java | 26 +++++++++++++++++++ 4 files changed, 38 insertions(+), 2 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/controller/AlarmCommentController.java b/application/src/main/java/org/thingsboard/server/controller/AlarmCommentController.java index 265db183a1..46ce177481 100644 --- a/application/src/main/java/org/thingsboard/server/controller/AlarmCommentController.java +++ b/application/src/main/java/org/thingsboard/server/controller/AlarmCommentController.java @@ -104,7 +104,7 @@ public class AlarmCommentController extends BaseController { @RequestMapping(value = "/alarm/{alarmId}/comment", method = RequestMethod.GET) @ResponseBody public PageData getAlarmComments( - @ApiParam(value = ALARM_ID_PARAM_DESCRIPTION) + @ApiParam(value = ALARM_ID_PARAM_DESCRIPTION, required = true) @PathVariable(ALARM_ID) String strAlarmId, @ApiParam(value = PAGE_SIZE_DESCRIPTION, required = true) @RequestParam int pageSize, diff --git a/application/src/main/java/org/thingsboard/server/controller/ControllerConstants.java b/application/src/main/java/org/thingsboard/server/controller/ControllerConstants.java index 768d98e403..8c8a8cdfb8 100644 --- a/application/src/main/java/org/thingsboard/server/controller/ControllerConstants.java +++ b/application/src/main/java/org/thingsboard/server/controller/ControllerConstants.java @@ -102,7 +102,7 @@ public class ControllerConstants { protected static final String ASSET_PROFILE_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, name, description, isDefault"; protected static final String ASSET_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, name, type, label, customerTitle"; protected static final String ALARM_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, startTs, endTs, type, ackTs, clearTs, severity, status"; - protected static final String ALARM_COMMENT_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime"; + protected static final String ALARM_COMMENT_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, id"; protected static final String EVENT_SORT_PROPERTY_ALLOWABLE_VALUES = "ts, id"; protected static final String EDGE_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, name, type, label, customerTitle"; protected static final String RULE_CHAIN_SORT_PROPERTY_ALLOWABLE_VALUES = "createdTime, name, root"; diff --git a/application/src/main/java/org/thingsboard/server/service/entitiy/alarm/DefaultTbAlarmCommentService.java b/application/src/main/java/org/thingsboard/server/service/entitiy/alarm/DefaultTbAlarmCommentService.java index 42380dfe93..3484f35646 100644 --- a/application/src/main/java/org/thingsboard/server/service/entitiy/alarm/DefaultTbAlarmCommentService.java +++ b/application/src/main/java/org/thingsboard/server/service/entitiy/alarm/DefaultTbAlarmCommentService.java @@ -17,10 +17,12 @@ package org.thingsboard.server.service.entitiy.alarm; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; +import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.User; import org.thingsboard.server.common.data.alarm.Alarm; import org.thingsboard.server.common.data.alarm.AlarmComment; +import org.thingsboard.server.common.data.alarm.AlarmCommentType; import org.thingsboard.server.common.data.audit.ActionType; import org.thingsboard.server.common.data.exception.ThingsboardException; import org.thingsboard.server.common.data.id.UserId; @@ -48,5 +50,13 @@ public class DefaultTbAlarmCommentService extends AbstractTbEntityService implem public void deleteAlarmComment(Alarm alarm, AlarmComment alarmComment, User user) { alarmCommentService.deleteAlarmComment(alarm.getTenantId(), alarmComment.getId()); notificationEntityService.notifyAlarmComment(alarm, alarmComment, ActionType.DELETED_COMMENT, user); + + AlarmComment.AlarmCommentBuilder commentDeletedComment = AlarmComment.builder() + .alarmId(alarm.getId()) + .type(AlarmCommentType.SYSTEM) + .comment(JacksonUtil.newObjectNode().put("text", + String.format("User %s deleted his comment", user.getName()))); + + alarmCommentService.createOrUpdateAlarmComment(alarm.getTenantId(), commentDeletedComment.build()); } } diff --git a/rest-client/src/main/java/org/thingsboard/rest/client/RestClient.java b/rest-client/src/main/java/org/thingsboard/rest/client/RestClient.java index 058d9c08fd..7573b61b65 100644 --- a/rest-client/src/main/java/org/thingsboard/rest/client/RestClient.java +++ b/rest-client/src/main/java/org/thingsboard/rest/client/RestClient.java @@ -66,6 +66,8 @@ import org.thingsboard.server.common.data.TenantProfile; import org.thingsboard.server.common.data.UpdateMessage; import org.thingsboard.server.common.data.User; import org.thingsboard.server.common.data.alarm.Alarm; +import org.thingsboard.server.common.data.alarm.AlarmComment; +import org.thingsboard.server.common.data.alarm.AlarmCommentInfo; import org.thingsboard.server.common.data.alarm.AlarmInfo; import org.thingsboard.server.common.data.alarm.AlarmSearchStatus; import org.thingsboard.server.common.data.alarm.AlarmSeverity; @@ -84,6 +86,7 @@ import org.thingsboard.server.common.data.edge.EdgeInfo; import org.thingsboard.server.common.data.edge.EdgeInstallInstructions; import org.thingsboard.server.common.data.edge.EdgeSearchQuery; import org.thingsboard.server.common.data.entityview.EntityViewSearchQuery; +import org.thingsboard.server.common.data.id.AlarmCommentId; import org.thingsboard.server.common.data.id.AlarmId; import org.thingsboard.server.common.data.id.AssetId; import org.thingsboard.server.common.data.id.AssetProfileId; @@ -464,6 +467,29 @@ public class RestClient implements ClientHttpRequestInterceptor, Closeable { return restTemplate.postForEntity(baseURL + "/api/alarm", alarm, Alarm.class).getBody(); } + public AlarmComment saveAlarmComment(AlarmId alarmId, AlarmComment alarmComment) { + return restTemplate.postForEntity(baseURL + "/api/alarm/{alarmId}/comment", alarmComment, AlarmComment.class, alarmId.getId()).getBody(); + } + + public void deleteAlarmComment(AlarmId alarmId, AlarmCommentId alarmCommentId) { + restTemplate.delete(baseURL + "/api/alarm/{alarmId}/comment/{alarmCommentId}", + alarmId.getId(), alarmCommentId.getId()); + } + + public PageData getAlarmComments(AlarmId alarmId, PageLink pageLink) { + String urlSecondPart = "/api/alarm/{alarmId}/comment"; + Map params = new HashMap<>(); + params.put("alarmId", alarmId.getId().toString()); + + return restTemplate.exchange( + baseURL + urlSecondPart + "&" + getUrlParams(pageLink), + HttpMethod.GET, + HttpEntity.EMPTY, + new ParameterizedTypeReference>() { + }, + params).getBody(); + } + public Optional getAssetById(AssetId assetId) { try { ResponseEntity asset = restTemplate.getForEntity(baseURL + "/api/asset/{assetId}", Asset.class, assetId.getId()); From 210aae6a864c8bab098ad69a6d7b05672c087e20 Mon Sep 17 00:00:00 2001 From: dashevchenko Date: Tue, 14 Mar 2023 14:15:37 +0200 Subject: [PATCH 2/6] updated alarm comment deletion --- .../alarm/DefaultTbAlarmCommentService.java | 10 +-------- .../DefaultTbAlarmCommentServiceTest.java | 7 ++++--- .../server/dao/alarm/AlarmCommentService.java | 3 ++- .../dao/alarm/BaseAlarmCommentService.java | 21 ++++++++++++++++--- .../service/BaseAlarmCommentServiceTest.java | 2 +- 5 files changed, 26 insertions(+), 17 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/entitiy/alarm/DefaultTbAlarmCommentService.java b/application/src/main/java/org/thingsboard/server/service/entitiy/alarm/DefaultTbAlarmCommentService.java index 3484f35646..045714d58a 100644 --- a/application/src/main/java/org/thingsboard/server/service/entitiy/alarm/DefaultTbAlarmCommentService.java +++ b/application/src/main/java/org/thingsboard/server/service/entitiy/alarm/DefaultTbAlarmCommentService.java @@ -48,15 +48,7 @@ public class DefaultTbAlarmCommentService extends AbstractTbEntityService implem @Override public void deleteAlarmComment(Alarm alarm, AlarmComment alarmComment, User user) { - alarmCommentService.deleteAlarmComment(alarm.getTenantId(), alarmComment.getId()); + alarmCommentService.deleteAlarmComment(alarm.getTenantId(), alarmComment, user); notificationEntityService.notifyAlarmComment(alarm, alarmComment, ActionType.DELETED_COMMENT, user); - - AlarmComment.AlarmCommentBuilder commentDeletedComment = AlarmComment.builder() - .alarmId(alarm.getId()) - .type(AlarmCommentType.SYSTEM) - .comment(JacksonUtil.newObjectNode().put("text", - String.format("User %s deleted his comment", user.getName()))); - - alarmCommentService.createOrUpdateAlarmComment(alarm.getTenantId(), commentDeletedComment.build()); } } diff --git a/application/src/test/java/org/thingsboard/server/service/entitiy/alarmComment/DefaultTbAlarmCommentServiceTest.java b/application/src/test/java/org/thingsboard/server/service/entitiy/alarmComment/DefaultTbAlarmCommentServiceTest.java index 485049bfd6..f00008fc5e 100644 --- a/application/src/test/java/org/thingsboard/server/service/entitiy/alarmComment/DefaultTbAlarmCommentServiceTest.java +++ b/application/src/test/java/org/thingsboard/server/service/entitiy/alarmComment/DefaultTbAlarmCommentServiceTest.java @@ -86,10 +86,11 @@ public class DefaultTbAlarmCommentServiceTest { @Test public void testDelete() { var alarmId = new AlarmId(UUID.randomUUID()); - var alarmCommentId = new AlarmCommentId(UUID.randomUUID()); + var alarmComment = new AlarmComment(); + alarmComment.setAlarmId(alarmId); - doNothing().when(alarmCommentService).deleteAlarmComment(Mockito.any(), eq(alarmCommentId)); - service.deleteAlarmComment(new Alarm(alarmId), new AlarmComment(alarmCommentId), new User()); + doNothing().when(alarmCommentService).deleteAlarmComment(Mockito.any(), eq(alarmComment), Mockito.any()); + service.deleteAlarmComment(new Alarm(alarmId), new AlarmComment(), new User()); verify(notificationEntityService, times(1)).notifyAlarmComment(any(), any(), any(), any()); } diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/alarm/AlarmCommentService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/alarm/AlarmCommentService.java index 81795c092d..3aa2972b14 100644 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/alarm/AlarmCommentService.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/alarm/AlarmCommentService.java @@ -16,6 +16,7 @@ package org.thingsboard.server.dao.alarm; import com.google.common.util.concurrent.ListenableFuture; +import org.thingsboard.server.common.data.User; import org.thingsboard.server.common.data.alarm.AlarmComment; import org.thingsboard.server.common.data.alarm.AlarmCommentInfo; import org.thingsboard.server.common.data.id.AlarmCommentId; @@ -27,7 +28,7 @@ import org.thingsboard.server.common.data.page.PageLink; public interface AlarmCommentService { AlarmComment createOrUpdateAlarmComment(TenantId tenantId, AlarmComment alarmComment); - void deleteAlarmComment(TenantId tenantId, AlarmCommentId alarmCommentId); + void deleteAlarmComment(TenantId tenantId, AlarmComment alarmComment, User user); PageData findAlarmComments(TenantId tenantId, AlarmId alarmId, PageLink pageLink); diff --git a/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmCommentService.java b/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmCommentService.java index aefae8778d..3a0784407e 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmCommentService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmCommentService.java @@ -22,12 +22,16 @@ import com.google.common.util.concurrent.ListenableFuture; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.thingsboard.common.util.JacksonUtil; +import org.thingsboard.server.common.data.User; import org.thingsboard.server.common.data.alarm.AlarmComment; import org.thingsboard.server.common.data.alarm.AlarmCommentInfo; import org.thingsboard.server.common.data.alarm.AlarmCommentType; import org.thingsboard.server.common.data.id.AlarmCommentId; import org.thingsboard.server.common.data.id.AlarmId; +import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.common.data.id.UserId; import org.thingsboard.server.common.data.page.PageData; import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.dao.entity.AbstractEntityService; @@ -58,9 +62,20 @@ public class BaseAlarmCommentService extends AbstractEntityService implements Al } @Override - public void deleteAlarmComment(TenantId tenantId, AlarmCommentId alarmCommentId) { - log.debug("Deleting Alarm Comment with id: {}", alarmCommentId); - alarmCommentDao.deleteAlarmComment(tenantId, alarmCommentId); + public void deleteAlarmComment(TenantId tenantId, AlarmComment alarmComment, User user) { + log.debug("Deleting Alarm Comment: {}", alarmComment); + + if (alarmComment.getType() == AlarmCommentType.OTHER) { + alarmComment.setType(AlarmCommentType.SYSTEM); + alarmComment.setUserId(null); + alarmComment.setComment(JacksonUtil.newObjectNode().put("text", + String.format("User %s deleted his comment", + (user.getFirstName() == null || user.getLastName() == null) ? user.getName() : user.getFirstName() + " " + user.getLastName()))); + alarmCommentDao.save(tenantId, alarmComment); + } + else { + alarmCommentDao.deleteAlarmComment(tenantId, alarmComment.getId()); + } } @Override diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/BaseAlarmCommentServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/BaseAlarmCommentServiceTest.java index 688793d6c6..ea7e19c058 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/BaseAlarmCommentServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/BaseAlarmCommentServiceTest.java @@ -155,7 +155,7 @@ public abstract class BaseAlarmCommentServiceTest extends AbstractServiceTest { Assert.assertNotNull(createdComment); Assert.assertNotNull(createdComment.getId()); - alarmCommentService.deleteAlarmComment(tenantId, createdComment.getId()); + alarmCommentService.deleteAlarmComment(tenantId, createdComment, user); AlarmComment fetched = alarmCommentService.findAlarmCommentByIdAsync(tenantId, createdComment.getId()).get(); From a0f46e2e242027d61ad527f7d4d243810f9bed45 Mon Sep 17 00:00:00 2001 From: dashevchenko Date: Wed, 15 Mar 2023 18:37:42 +0200 Subject: [PATCH 3/6] fixed test --- .../server/dao/service/BaseAlarmCommentServiceTest.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/BaseAlarmCommentServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/BaseAlarmCommentServiceTest.java index ea7e19c058..0f2ef81eb5 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/BaseAlarmCommentServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/BaseAlarmCommentServiceTest.java @@ -27,6 +27,7 @@ import org.thingsboard.server.common.data.User; import org.thingsboard.server.common.data.alarm.Alarm; import org.thingsboard.server.common.data.alarm.AlarmComment; import org.thingsboard.server.common.data.alarm.AlarmCommentInfo; +import org.thingsboard.server.common.data.alarm.AlarmCommentType; import org.thingsboard.server.common.data.alarm.AlarmSeverity; import org.thingsboard.server.common.data.alarm.AlarmStatus; import org.thingsboard.server.common.data.id.AssetId; @@ -158,7 +159,9 @@ public abstract class BaseAlarmCommentServiceTest extends AbstractServiceTest { alarmCommentService.deleteAlarmComment(tenantId, createdComment, user); AlarmComment fetched = alarmCommentService.findAlarmCommentByIdAsync(tenantId, createdComment.getId()).get(); - - Assert.assertNull("Alarm comment was returned when it was expected to be null", fetched); + Assert.assertNull(fetched.getUserId()); + Assert.assertEquals(AlarmCommentType.SYSTEM, fetched.getType()); + Assert.assertEquals(fetched.getComment().get("text").asText(), String.format("User %s deleted his comment", + (user.getFirstName() == null || user.getLastName() == null) ? user.getName() : user.getFirstName() + " " + user.getLastName())); } } From c7487029333c41ffb7ffd4a38424738e83a1a17c Mon Sep 17 00:00:00 2001 From: dashevchenko Date: Thu, 16 Mar 2023 12:37:10 +0200 Subject: [PATCH 4/6] fixed tests --- .../BaseAlarmCommentControllerTest.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/application/src/test/java/org/thingsboard/server/controller/BaseAlarmCommentControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/BaseAlarmCommentControllerTest.java index 8566d9d6a4..b8c091de05 100644 --- a/application/src/test/java/org/thingsboard/server/controller/BaseAlarmCommentControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/BaseAlarmCommentControllerTest.java @@ -202,7 +202,13 @@ public abstract class BaseAlarmCommentControllerTest extends AbstractControllerT doDelete("/api/alarm/" + alarm.getId() + "/comment/" + alarmComment.getId()) .andExpect(status().isOk()); - testLogEntityAction(alarm, alarm.getId(), tenantId, customerId, customerUserId, CUSTOMER_USER_EMAIL, ActionType.DELETED_COMMENT, 1, alarmComment); + AlarmComment expectedAlarmComment = AlarmComment.builder() + .alarmId(alarm.getId()) + .type(AlarmCommentType.SYSTEM) + .comment(JacksonUtil.newObjectNode().put("text", String.format("User %s deleted his comment", + CUSTOMER_USER_EMAIL))) + .build(); + testLogEntityAction(alarm, alarm.getId(), tenantId, customerId, customerUserId, CUSTOMER_USER_EMAIL, ActionType.DELETED_COMMENT, 1, expectedAlarmComment); } @Test @@ -215,7 +221,13 @@ public abstract class BaseAlarmCommentControllerTest extends AbstractControllerT doDelete("/api/alarm/" + alarm.getId() + "/comment/" + alarmComment.getId()) .andExpect(status().isOk()); - testLogEntityAction(alarm, alarm.getId(), tenantId, customerId, tenantAdminUserId, TENANT_ADMIN_EMAIL, ActionType.DELETED_COMMENT, 1, alarmComment); + AlarmComment expectedAlarmComment = AlarmComment.builder() + .alarmId(alarm.getId()) + .type(AlarmCommentType.SYSTEM) + .comment(JacksonUtil.newObjectNode().put("text", String.format("User %s deleted his comment", + TENANT_ADMIN_EMAIL))) + .build(); + testLogEntityAction(alarm, alarm.getId(), tenantId, customerId, tenantAdminUserId, TENANT_ADMIN_EMAIL, ActionType.DELETED_COMMENT, 1, expectedAlarmComment); } @Test From c7d446a19dc2a69bf7b08672aa42ca8e6ddcb5b1 Mon Sep 17 00:00:00 2001 From: YevhenBondarenko Date: Tue, 21 Mar 2023 11:27:15 +0100 Subject: [PATCH 5/6] fixed upgrade schema update --- application/src/main/data/upgrade/3.4.4/schema_update.sql | 2 -- .../server/service/install/SqlDatabaseUpgradeService.java | 5 +++++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/application/src/main/data/upgrade/3.4.4/schema_update.sql b/application/src/main/data/upgrade/3.4.4/schema_update.sql index d71fc158ef..17e5632a28 100644 --- a/application/src/main/data/upgrade/3.4.4/schema_update.sql +++ b/application/src/main/data/upgrade/3.4.4/schema_update.sql @@ -72,8 +72,6 @@ WHERE cleared = FALSE ORDER BY l.created_time DESC, l.id LIMIT 1); -VACUUM FULL ANALYZE alarm; - -- ALARM STATUS REFACTORING END -- ALARM COMMENTS START diff --git a/application/src/main/java/org/thingsboard/server/service/install/SqlDatabaseUpgradeService.java b/application/src/main/java/org/thingsboard/server/service/install/SqlDatabaseUpgradeService.java index b9ff5383b5..f5f212beb2 100644 --- a/application/src/main/java/org/thingsboard/server/service/install/SqlDatabaseUpgradeService.java +++ b/application/src/main/java/org/thingsboard/server/service/install/SqlDatabaseUpgradeService.java @@ -684,6 +684,11 @@ public class SqlDatabaseUpgradeService implements DatabaseEntitiesUpgradeService schemaUpdateFile = Paths.get(installScripts.getDataDir(), "upgrade", "3.4.4", SCHEMA_UPDATE_SQL); loadSql(schemaUpdateFile, conn); + try { + conn.createStatement().execute("VACUUM FULL ANALYZE alarm;"); //NOSONAR, ignoring because method used to execute thingsboard database upgrade script + } catch (Exception e) { + } + try { conn.createStatement().execute("ALTER TABLE asset_profile ADD COLUMN default_edge_rule_chain_id uuid"); //NOSONAR, ignoring because method used to execute thingsboard database upgrade script } catch (Exception e) { From b6adbd6ec8ed7ff3b4eaf6b83a540b45571936a2 Mon Sep 17 00:00:00 2001 From: dashevchenko Date: Tue, 21 Mar 2023 13:29:46 +0200 Subject: [PATCH 6/6] moved logic to DefaultTbAlarmCommentService --- .../controller/AlarmCommentController.java | 7 ++---- .../alarm/DefaultTbAlarmCommentService.java | 16 ++++++++++--- .../entitiy/alarm/TbAlarmCommentService.java | 2 +- .../DefaultTbAlarmCommentServiceTest.java | 23 ++++++++++++++++--- .../server/dao/alarm/AlarmCommentService.java | 2 +- .../dao/alarm/BaseAlarmCommentService.java | 18 ++++----------- .../service/BaseAlarmCommentServiceTest.java | 13 ++++------- 7 files changed, 46 insertions(+), 35 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/controller/AlarmCommentController.java b/application/src/main/java/org/thingsboard/server/controller/AlarmCommentController.java index 46ce177481..92b2cb923f 100644 --- a/application/src/main/java/org/thingsboard/server/controller/AlarmCommentController.java +++ b/application/src/main/java/org/thingsboard/server/controller/AlarmCommentController.java @@ -90,7 +90,7 @@ public class AlarmCommentController extends BaseController { public void deleteAlarmComment(@ApiParam(value = ALARM_ID_PARAM_DESCRIPTION) @PathVariable(ALARM_ID) String strAlarmId, @ApiParam(value = ALARM_COMMENT_ID_PARAM_DESCRIPTION) @PathVariable(ALARM_COMMENT_ID) String strCommentId) throws ThingsboardException { checkParameter(ALARM_ID, strAlarmId); AlarmId alarmId = new AlarmId(toUUID(strAlarmId)); - Alarm alarm = checkAlarmId(alarmId, Operation.DELETE); + Alarm alarm = checkAlarmId(alarmId, Operation.WRITE); AlarmCommentId alarmCommentId = new AlarmCommentId(toUUID(strCommentId)); AlarmComment alarmComment = checkAlarmCommentId(alarmCommentId, alarmId); @@ -117,10 +117,7 @@ public class AlarmCommentController extends BaseController { ) throws Exception { checkParameter(ALARM_ID, strAlarmId); AlarmId alarmId = new AlarmId(toUUID(strAlarmId)); - Alarm alarm = alarmService.findAlarmByIdAsync(getCurrentUser().getTenantId(), alarmId).get(); - checkNotNull(alarm, "Alarm with id [" + alarmId + "] is not found"); - checkEntityId(alarm.getOriginator(), Operation.READ); - + Alarm alarm = checkAlarmId(alarmId, Operation.READ); PageLink pageLink = createPageLink(pageSize, page, null, sortProperty, sortOrder); return checkNotNull(alarmCommentService.findAlarmComments(alarm.getTenantId(), alarmId, pageLink)); } diff --git a/application/src/main/java/org/thingsboard/server/service/entitiy/alarm/DefaultTbAlarmCommentService.java b/application/src/main/java/org/thingsboard/server/service/entitiy/alarm/DefaultTbAlarmCommentService.java index 045714d58a..0e289f73f3 100644 --- a/application/src/main/java/org/thingsboard/server/service/entitiy/alarm/DefaultTbAlarmCommentService.java +++ b/application/src/main/java/org/thingsboard/server/service/entitiy/alarm/DefaultTbAlarmCommentService.java @@ -24,6 +24,7 @@ import org.thingsboard.server.common.data.alarm.Alarm; import org.thingsboard.server.common.data.alarm.AlarmComment; import org.thingsboard.server.common.data.alarm.AlarmCommentType; import org.thingsboard.server.common.data.audit.ActionType; +import org.thingsboard.server.common.data.exception.ThingsboardErrorCode; import org.thingsboard.server.common.data.exception.ThingsboardException; import org.thingsboard.server.common.data.id.UserId; import org.thingsboard.server.service.entitiy.AbstractTbEntityService; @@ -47,8 +48,17 @@ public class DefaultTbAlarmCommentService extends AbstractTbEntityService implem } @Override - public void deleteAlarmComment(Alarm alarm, AlarmComment alarmComment, User user) { - alarmCommentService.deleteAlarmComment(alarm.getTenantId(), alarmComment, user); - notificationEntityService.notifyAlarmComment(alarm, alarmComment, ActionType.DELETED_COMMENT, user); + public void deleteAlarmComment(Alarm alarm, AlarmComment alarmComment, User user) throws ThingsboardException { + if (alarmComment.getType() == AlarmCommentType.OTHER) { + alarmComment.setType(AlarmCommentType.SYSTEM); + alarmComment.setUserId(null); + alarmComment.setComment(JacksonUtil.newObjectNode().put("text", + String.format("User %s deleted his comment", + (user.getFirstName() == null || user.getLastName() == null) ? user.getName() : user.getFirstName() + " " + user.getLastName()))); + AlarmComment savedAlarmComment = checkNotNull(alarmCommentService.saveAlarmComment(alarm.getTenantId(), alarmComment)); + notificationEntityService.notifyAlarmComment(alarm, savedAlarmComment, ActionType.DELETED_COMMENT, user); + } else { + throw new ThingsboardException("System comment could not be deleted", ThingsboardErrorCode.BAD_REQUEST_PARAMS); + } } } diff --git a/application/src/main/java/org/thingsboard/server/service/entitiy/alarm/TbAlarmCommentService.java b/application/src/main/java/org/thingsboard/server/service/entitiy/alarm/TbAlarmCommentService.java index 8c6aa3366a..a2bca133cb 100644 --- a/application/src/main/java/org/thingsboard/server/service/entitiy/alarm/TbAlarmCommentService.java +++ b/application/src/main/java/org/thingsboard/server/service/entitiy/alarm/TbAlarmCommentService.java @@ -23,5 +23,5 @@ import org.thingsboard.server.common.data.exception.ThingsboardException; public interface TbAlarmCommentService { AlarmComment saveAlarmComment(Alarm alarm, AlarmComment alarmComment, User user) throws ThingsboardException; - void deleteAlarmComment(Alarm alarm, AlarmComment alarmComment, User user); + void deleteAlarmComment(Alarm alarm, AlarmComment alarmComment, User user) throws ThingsboardException; } diff --git a/application/src/test/java/org/thingsboard/server/service/entitiy/alarmComment/DefaultTbAlarmCommentServiceTest.java b/application/src/test/java/org/thingsboard/server/service/entitiy/alarmComment/DefaultTbAlarmCommentServiceTest.java index f00008fc5e..1377b1a934 100644 --- a/application/src/test/java/org/thingsboard/server/service/entitiy/alarmComment/DefaultTbAlarmCommentServiceTest.java +++ b/application/src/test/java/org/thingsboard/server/service/entitiy/alarmComment/DefaultTbAlarmCommentServiceTest.java @@ -28,9 +28,11 @@ import org.thingsboard.server.cluster.TbClusterService; import org.thingsboard.server.common.data.User; import org.thingsboard.server.common.data.alarm.Alarm; import org.thingsboard.server.common.data.alarm.AlarmComment; +import org.thingsboard.server.common.data.alarm.AlarmCommentType; import org.thingsboard.server.common.data.exception.ThingsboardException; import org.thingsboard.server.common.data.id.AlarmCommentId; import org.thingsboard.server.common.data.id.AlarmId; +import org.thingsboard.server.common.data.id.UserId; import org.thingsboard.server.dao.alarm.AlarmCommentService; import org.thingsboard.server.dao.alarm.AlarmService; import org.thingsboard.server.dao.customer.CustomerService; @@ -41,6 +43,7 @@ import org.thingsboard.server.service.telemetry.AlarmSubscriptionService; import java.util.UUID; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doNothing; @@ -84,14 +87,28 @@ public class DefaultTbAlarmCommentServiceTest { } @Test - public void testDelete() { + public void testDelete() throws ThingsboardException { var alarmId = new AlarmId(UUID.randomUUID()); var alarmComment = new AlarmComment(); alarmComment.setAlarmId(alarmId); + alarmComment.setUserId(new UserId(UUID.randomUUID())); + alarmComment.setType(AlarmCommentType.OTHER); - doNothing().when(alarmCommentService).deleteAlarmComment(Mockito.any(), eq(alarmComment), Mockito.any()); - service.deleteAlarmComment(new Alarm(alarmId), new AlarmComment(), new User()); + when(alarmCommentService.saveAlarmComment(Mockito.any(), eq(alarmComment))).thenReturn(alarmComment); + service.deleteAlarmComment(new Alarm(alarmId), alarmComment, new User()); verify(notificationEntityService, times(1)).notifyAlarmComment(any(), any(), any(), any()); } + + @Test + public void testShouldNotDeleteSystemComment() { + var alarmId = new AlarmId(UUID.randomUUID()); + var alarmComment = new AlarmComment(); + alarmComment.setAlarmId(alarmId); + alarmComment.setType(AlarmCommentType.SYSTEM); + + assertThatThrownBy(() -> service.deleteAlarmComment(new Alarm(alarmId), alarmComment, new User())) + .isInstanceOf(ThingsboardException.class) + .hasMessageContaining("System comment could not be deleted"); + } } \ No newline at end of file diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/alarm/AlarmCommentService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/alarm/AlarmCommentService.java index 3aa2972b14..90fbc09fcf 100644 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/alarm/AlarmCommentService.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/alarm/AlarmCommentService.java @@ -28,7 +28,7 @@ import org.thingsboard.server.common.data.page.PageLink; public interface AlarmCommentService { AlarmComment createOrUpdateAlarmComment(TenantId tenantId, AlarmComment alarmComment); - void deleteAlarmComment(TenantId tenantId, AlarmComment alarmComment, User user); + AlarmComment saveAlarmComment(TenantId tenantId, AlarmComment alarmComment); PageData findAlarmComments(TenantId tenantId, AlarmId alarmId, PageLink pageLink); diff --git a/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmCommentService.java b/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmCommentService.java index 3a0784407e..6c6cc18355 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmCommentService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmCommentService.java @@ -43,7 +43,7 @@ import static org.thingsboard.server.dao.service.Validator.validateId; @Service @Slf4j -public class BaseAlarmCommentService extends AbstractEntityService implements AlarmCommentService{ +public class BaseAlarmCommentService extends AbstractEntityService implements AlarmCommentService { @Autowired private AlarmCommentDao alarmCommentDao; @@ -62,20 +62,10 @@ public class BaseAlarmCommentService extends AbstractEntityService implements Al } @Override - public void deleteAlarmComment(TenantId tenantId, AlarmComment alarmComment, User user) { + public AlarmComment saveAlarmComment(TenantId tenantId, AlarmComment alarmComment) { log.debug("Deleting Alarm Comment: {}", alarmComment); - - if (alarmComment.getType() == AlarmCommentType.OTHER) { - alarmComment.setType(AlarmCommentType.SYSTEM); - alarmComment.setUserId(null); - alarmComment.setComment(JacksonUtil.newObjectNode().put("text", - String.format("User %s deleted his comment", - (user.getFirstName() == null || user.getLastName() == null) ? user.getName() : user.getFirstName() + " " + user.getLastName()))); - alarmCommentDao.save(tenantId, alarmComment); - } - else { - alarmCommentDao.deleteAlarmComment(tenantId, alarmComment.getId()); - } + alarmCommentDataValidator.validate(alarmComment, c -> tenantId); + return alarmCommentDao.save(tenantId, alarmComment); } @Override diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/BaseAlarmCommentServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/BaseAlarmCommentServiceTest.java index 6ff4211249..e79e00515b 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/BaseAlarmCommentServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/BaseAlarmCommentServiceTest.java @@ -80,7 +80,7 @@ public abstract class BaseAlarmCommentServiceTest extends AbstractServiceTest { @Test - public void testSaveAndFetchAlarmComment() throws ExecutionException, InterruptedException { + public void testCreateAndFetchAlarmComment() throws ExecutionException, InterruptedException { AlarmComment alarmComment = AlarmComment.builder().alarmId(alarm.getId()) .userId(user.getId()) .type(OTHER) @@ -143,7 +143,7 @@ public abstract class BaseAlarmCommentServiceTest extends AbstractServiceTest { } @Test - public void testDeleteAlarmComment() throws ExecutionException, InterruptedException { + public void testSaveAlarmComment() throws ExecutionException, InterruptedException { UserId userId = new UserId(UUID.randomUUID()); AlarmComment alarmComment = AlarmComment.builder().alarmId(alarm.getId()) .userId(userId) @@ -153,15 +153,12 @@ public abstract class BaseAlarmCommentServiceTest extends AbstractServiceTest { AlarmComment createdComment = alarmCommentService.createOrUpdateAlarmComment(tenantId, alarmComment); - Assert.assertNotNull(createdComment); - Assert.assertNotNull(createdComment.getId()); - - alarmCommentService.deleteAlarmComment(tenantId, createdComment, user); + createdComment.setType(AlarmCommentType.SYSTEM); + createdComment.setUserId(null); + alarmCommentService.saveAlarmComment(tenantId, createdComment); AlarmComment fetched = alarmCommentService.findAlarmCommentByIdAsync(tenantId, createdComment.getId()).get(); Assert.assertNull(fetched.getUserId()); Assert.assertEquals(AlarmCommentType.SYSTEM, fetched.getType()); - Assert.assertEquals(fetched.getComment().get("text").asText(), String.format("User %s deleted his comment", - (user.getFirstName() == null || user.getLastName() == null) ? user.getName() : user.getFirstName() + " " + user.getLastName())); } }