From a4119ef1dabdb78eb08abfa956896877693d5f9d Mon Sep 17 00:00:00 2001 From: Robert von Burg Date: Mon, 4 Mar 2024 16:10:38 +0100 Subject: [PATCH] [New] Completed implementation of notifications --- .../CreateNotificationService.java | 56 +++++++++++++------ .../UpdateNotificationService.java | 7 ++- .../rest/endpoint/NotificationResource.java | 1 - 3 files changed, 44 insertions(+), 20 deletions(-) diff --git a/service/src/main/java/li/strolch/service/notifications/CreateNotificationService.java b/service/src/main/java/li/strolch/service/notifications/CreateNotificationService.java index c3bf6f251..c1660ac60 100644 --- a/service/src/main/java/li/strolch/service/notifications/CreateNotificationService.java +++ b/service/src/main/java/li/strolch/service/notifications/CreateNotificationService.java @@ -5,18 +5,23 @@ import li.strolch.agent.api.StrolchAgent; import li.strolch.model.ParameterBag; import li.strolch.model.Resource; import li.strolch.model.builder.ResourceBuilder; -import li.strolch.model.json.FromFlatJsonVisitor; +import li.strolch.persistence.api.Operation; import li.strolch.persistence.api.StrolchTransaction; +import li.strolch.privilege.model.PrivilegeContext; +import li.strolch.privilege.model.SimpleRestrictable; import li.strolch.runtime.configuration.SupportedLanguage; import li.strolch.service.JsonServiceArgument; import li.strolch.service.api.AbstractService; import li.strolch.service.api.ServiceResult; +import li.strolch.utils.collections.Tuple; import li.strolch.utils.dbc.DBC; import java.util.Set; import java.util.stream.Collectors; import static li.strolch.model.StrolchModelConstants.*; +import static li.strolch.privilege.handler.DefaultPrivilegeHandler.PRIVILEGE_GET_ROLE; +import static li.strolch.utils.iso8601.ISO8601.parseToZdt; public class CreateNotificationService extends AbstractService { @Override @@ -35,9 +40,9 @@ public class CreateNotificationService extends AbstractService supportedLanguages) { - DBC.PRE.assertTrue("JsonObject must have languages!", jsonObject.has(PARAM_LANGUAGES)); - JsonObject languagesJ = jsonObject.get(PARAM_LANGUAGES).getAsJsonObject(); - DBC.PRE.assertNotEmpty("JsonObject must have at least one languages!", languagesJ.keySet()); - - FromFlatJsonVisitor visitor = new FromFlatJsonVisitor(jsonObject); - visitor.optionalParameter(PARAM_ROLES); - visitor.optionalParameter(PARAM_LOCATIONS); - visitor.optionalParameter(PARAM_FOR_ALL); + protected static Resource buildNotification(StrolchTransaction tx, JsonObject jsonObject, + Set supportedLanguages) { Resource notification = newNotification(); - notification.accept(visitor); + PrivilegeContext ctx = tx.getPrivilegeContext(); - for (String language : languagesJ.keySet()) { - if (!supportedLanguages.contains(language)) - throw new IllegalArgumentException("The agent doesn't support language " + language); - JsonObject languageJ = languagesJ.get(language).getAsJsonObject(); + JsonObject visibilityJ = jsonObject.get(BAG_VISIBILITY).getAsJsonObject(); + ParameterBag visibility = notification.getParameterBag(BAG_VISIBILITY); + + visibility.setBoolean(PARAM_FOR_ALL, + visibilityJ.has(PARAM_FOR_ALL) && visibilityJ.get(PARAM_FOR_ALL).getAsBoolean()); + if (visibilityJ.has(PARAM_VISIBLE_FROM)) + visibility.setDate(PARAM_VISIBLE_FROM, parseToZdt(visibilityJ.get(PARAM_VISIBLE_FROM).getAsString())); + if (visibilityJ.has(PARAM_VISIBLE_TO)) + visibility.setDate(PARAM_VISIBLE_TO, parseToZdt(visibilityJ.get(PARAM_VISIBLE_TO).getAsString())); + + if (visibilityJ.has(PARAM_ROLES)) { + String rolesJ = visibilityJ.get(PARAM_ROLES).getAsString(); + visibility.getStringListP(PARAM_ROLES).setValueFromString(rolesJ); + for (String role : visibility.getStringList(PARAM_ROLES)) { + ctx.validateAction(new SimpleRestrictable(PRIVILEGE_GET_ROLE, new Tuple(null, role))); + } + } + + if (visibilityJ.has(PARAM_LOCATIONS)) { + String locationsJ = visibilityJ.get(PARAM_LOCATIONS).getAsString(); + visibility.getStringListP(PARAM_LOCATIONS).setValueFromString(locationsJ); + for (String locationId : visibility.getStringList(PARAM_LOCATIONS)) { + tx.assertHasPrivilege(Operation.GET, tx.getResourceBy(TYPE_LOCATION, locationId, true)); + } + } + + for (String language : supportedLanguages) { + if (!jsonObject.has(language)) + continue; + JsonObject languageJ = jsonObject.get(language).getAsJsonObject(); String title = languageJ.get(PARAM_TITLE).getAsString(); String text = languageJ.get(PARAM_TEXT).getAsString(); diff --git a/service/src/main/java/li/strolch/service/notifications/UpdateNotificationService.java b/service/src/main/java/li/strolch/service/notifications/UpdateNotificationService.java index a4dd894b6..cd6ccb6df 100644 --- a/service/src/main/java/li/strolch/service/notifications/UpdateNotificationService.java +++ b/service/src/main/java/li/strolch/service/notifications/UpdateNotificationService.java @@ -33,10 +33,11 @@ public class UpdateNotificationService extends AbstractService addLocationNames(notification, notificationJ, tx));