diff --git a/pom.xml b/pom.xml index 3f0b57afc37093b3413ccd0ca2e77fb922f720da..75cb93d9f7aa640cdef0cee88d93124caa2a3101 100644 --- a/pom.xml +++ b/pom.xml @@ -46,6 +46,8 @@ <ozgcloud.license.version>1.6.0</ozgcloud.license.version> <lombok.version>1.18.34</lombok.version> + <quarkus.mongock.version>0.3.0</quarkus.mongock.version> + <!-- plugins --> <maven.compiler.release>21</maven.compiler.release> <jandex-maven-plugin-version>1.2.3</jandex-maven-plugin-version> diff --git a/user-manager-server/pom.xml b/user-manager-server/pom.xml index 5c919c5270be1c2c999fb00484ebeaff1cfcb3b0..9ae6f04364246aeb50383a357bb3b6ced675832b 100644 --- a/user-manager-server/pom.xml +++ b/user-manager-server/pom.xml @@ -122,6 +122,11 @@ <groupId>io.quarkus</groupId> <artifactId>quarkus-grpc</artifactId> </dependency> + <dependency> + <groupId>io.quarkiverse.mongock</groupId> + <artifactId>quarkus-mongock</artifactId> + <version>${quarkus.mongock.version}</version> + </dependency> <!-- Logging --> <dependency> diff --git a/user-manager-server/src/main/java/de/ozgcloud/user/User.java b/user-manager-server/src/main/java/de/ozgcloud/user/User.java index 0d645513f212f4958a4b2e712c0428046d63e995..4730ac15f4b5c424bfe50b964817965f356dde44 100644 --- a/user-manager-server/src/main/java/de/ozgcloud/user/User.java +++ b/user-manager-server/src/main/java/de/ozgcloud/user/User.java @@ -50,6 +50,8 @@ import lombok.ToString; @RegisterForReflection public class User { + public static final String COLLECTION_NAME = "User"; + public static final String EXTERNAL_ID_FIELD = "externalId"; public static final String KEYCLOAK_USER_ID = "keycloakUserId"; public static final String EMAIL_FIELD = "email"; @@ -61,6 +63,7 @@ public class User { public static final String FULL_NAME_REVERSED_FIELD = "fullNameReversed"; public static final String USERNAME_FIELD = "username"; public static final String ORGANISATIONS_EINHEIT_IDS_FIELD = "organisationsEinheitIds"; + public static final String USER_SETTINGS_FIELD = "userSettings"; public static final String NOTIFICATION_SEND_FOR_FIELD = "userSettings.notificationsSendFor"; @JsonIgnore diff --git a/user-manager-server/src/main/java/de/ozgcloud/user/common/DocumentUtils.java b/user-manager-server/src/main/java/de/ozgcloud/user/common/DocumentUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..11e45a77b6e24c07879f59db2b4deac17615b382 --- /dev/null +++ b/user-manager-server/src/main/java/de/ozgcloud/user/common/DocumentUtils.java @@ -0,0 +1,8 @@ +package de.ozgcloud.user.common; + +public class DocumentUtils { + + public static String buildFieldPath(String... fields) { + return String.join(".", fields); + } +} diff --git a/user-manager-server/src/main/java/de/ozgcloud/user/common/migration/M001_SetNewAndMigrateUserSettings.java b/user-manager-server/src/main/java/de/ozgcloud/user/common/migration/M001_SetNewAndMigrateUserSettings.java new file mode 100644 index 0000000000000000000000000000000000000000..321c642e900d7375f711924034c5d6a3e33afd57 --- /dev/null +++ b/user-manager-server/src/main/java/de/ozgcloud/user/common/migration/M001_SetNewAndMigrateUserSettings.java @@ -0,0 +1,70 @@ +package de.ozgcloud.user.common.migration; + +import static de.ozgcloud.user.common.DocumentUtils.*; + +import java.util.Map; + +import org.bson.Document; + +import com.mongodb.client.MongoCollection; +import com.mongodb.client.MongoDatabase; + +import de.ozgcloud.user.User; +import de.ozgcloud.user.settings.UserSettings; +import io.mongock.api.annotations.ChangeUnit; +import io.mongock.api.annotations.Execution; +import io.mongock.api.annotations.RollbackExecution; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@ChangeUnit(id = "2024-09-22 12:00:00 OZG-3539", order = "M001", author = "sbergandy", systemVersion = "1") +public class M001_SetNewAndMigrateUserSettings { + + private final MongoDatabase mongoDatabase; + + @Execution + public void migrationMethod() { + var userCollection = mongoDatabase.getCollection(User.COLLECTION_NAME); + migrateNotificationsSendForALL(userCollection); + migrateNotificationsSendForNONE(userCollection); + migrateEmptySettings(userCollection); + } + + private void migrateNotificationsSendForALL(MongoCollection<Document> userCollection) { + userCollection.updateMany( + new Document(Map.of(buildFieldPath(User.USER_SETTINGS_FIELD, UserSettings.NOTIFICATIONS_SEND_FOR_FIELD), "ALL")), + new Document(Map.of("$set", Map.of(User.USER_SETTINGS_FIELD, + Map.of(UserSettings.NOTIFICATIONS_SEND_FOR_FIELD, "ALL", + UserSettings.VORGANG_CREATED_FIELD, true, + UserSettings.VORGANG_ASSIGNED_TO_USER_FIELD, true, + UserSettings.POSTFACH_NACHRICHT_FROM_ANTRAGSTELLER_FIELD, true, + UserSettings.WIEDERVORLAGE_OVERDUE_FIELD, true))))); + } + + private void migrateNotificationsSendForNONE(MongoCollection<Document> userCollection) { + userCollection.updateMany( + new Document(Map.of(buildFieldPath(User.USER_SETTINGS_FIELD, UserSettings.NOTIFICATIONS_SEND_FOR_FIELD), "NONE")), + new Document(Map.of("$set", Map.of(User.USER_SETTINGS_FIELD, + Map.of(UserSettings.NOTIFICATIONS_SEND_FOR_FIELD, "NONE", + UserSettings.VORGANG_CREATED_FIELD, false, + UserSettings.VORGANG_ASSIGNED_TO_USER_FIELD, true, + UserSettings.POSTFACH_NACHRICHT_FROM_ANTRAGSTELLER_FIELD, true, + UserSettings.WIEDERVORLAGE_OVERDUE_FIELD, true))))); + } + + private void migrateEmptySettings(MongoCollection<Document> userCollection) { + userCollection.updateMany( + new Document(Map.of(buildFieldPath(User.USER_SETTINGS_FIELD, UserSettings.NOTIFICATIONS_SEND_FOR_FIELD), Map.of("$exists", false))), + new Document(Map.of("$set", Map.of(User.USER_SETTINGS_FIELD, + Map.of(UserSettings.NOTIFICATIONS_SEND_FOR_FIELD, "NONE", + UserSettings.VORGANG_CREATED_FIELD, false, + UserSettings.VORGANG_ASSIGNED_TO_USER_FIELD, true, + UserSettings.POSTFACH_NACHRICHT_FROM_ANTRAGSTELLER_FIELD, true, + UserSettings.WIEDERVORLAGE_OVERDUE_FIELD, true))))); + } + + @RollbackExecution + public void rollback() { + // kein rollback implementiert + } +} diff --git a/user-manager-server/src/main/java/de/ozgcloud/user/settings/UserSettings.java b/user-manager-server/src/main/java/de/ozgcloud/user/settings/UserSettings.java index 594f462277faf584988d2e43a07438a833d2a6a6..b686a9cb6e5d3b4a4d4b500bcee22eb83b78f832 100644 --- a/user-manager-server/src/main/java/de/ozgcloud/user/settings/UserSettings.java +++ b/user-manager-server/src/main/java/de/ozgcloud/user/settings/UserSettings.java @@ -25,16 +25,18 @@ package de.ozgcloud.user.settings; import lombok.Builder; import lombok.Getter; -import lombok.NoArgsConstructor; import lombok.Setter; @Builder(toBuilder = true) -@NoArgsConstructor @Getter @Setter public class UserSettings { - static final String NOTIFICATIONS_SEND_FOR_FIELD = "notificationsSendFor"; + public static final String NOTIFICATIONS_SEND_FOR_FIELD = "notificationsSendFor"; + public static final String VORGANG_CREATED_FIELD = "vorgangCreated"; + public static final String VORGANG_ASSIGNED_TO_USER_FIELD = "vorgangAssignedToUser"; + public static final String POSTFACH_NACHRICHT_FROM_ANTRAGSTELLER_FIELD = "postfachNachrichtFromAntragsteller"; + public static final String WIEDERVORLAGE_OVERDUE_FIELD = "wiedervorlageOverdue"; private NotificationsSendFor notificationsSendFor; private boolean vorgangCreated; @@ -55,6 +57,10 @@ public class UserSettings { this(notificationsSendFor, notificationsSendFor == NotificationsSendFor.ALL, true, true, true); } + public UserSettings() { + this(NotificationsSendFor.NONE, false, true, true, true); + } + public static UserSettings createDefault() { return UserSettings.builder() .notificationsSendFor(NotificationsSendFor.NONE) diff --git a/user-manager-server/src/main/resources/application.yaml b/user-manager-server/src/main/resources/application.yaml index c5f0bca40745037a671471028db8c950b57c93fd..3e78b8d22c234f4a2565cf3d6a9058c47e5ba665 100644 --- a/user-manager-server/src/main/resources/application.yaml +++ b/user-manager-server/src/main/resources/application.yaml @@ -34,6 +34,9 @@ quarkus: management: enabled: true port: 9002 + mongock: + migrate-at-start: true + transaction-enabled: false grpc: server: diff --git a/user-manager-server/src/test/java/de/ozgcloud/user/common/migration/M001_SetNewAndMigrateUserSettingsITCase.java b/user-manager-server/src/test/java/de/ozgcloud/user/common/migration/M001_SetNewAndMigrateUserSettingsITCase.java new file mode 100644 index 0000000000000000000000000000000000000000..d0b74814a531148c13e186562aa9077b03f560ec --- /dev/null +++ b/user-manager-server/src/test/java/de/ozgcloud/user/common/migration/M001_SetNewAndMigrateUserSettingsITCase.java @@ -0,0 +1,94 @@ +package de.ozgcloud.user.common.migration; + +import static org.assertj.core.api.Assertions.*; + +import java.util.Map; + +import jakarta.inject.Inject; + +import org.bson.Document; +import org.eclipse.microprofile.config.inject.ConfigProperty; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoCollection; + +import de.ozgcloud.user.User; +import de.ozgcloud.user.common.MongoDbTestProfile; +import de.ozgcloud.user.settings.UserSettings; +import io.quarkus.test.junit.QuarkusTest; +import io.quarkus.test.junit.TestProfile; + +@QuarkusTest +@TestProfile(MongoDbTestProfile.class) +class M001_SetNewAndMigrateUserSettingsITCase { + + @ConfigProperty(name = "quarkus.mongodb.database") + String database; + + @Inject + MongoClient mongoClient; + + private M001_SetNewAndMigrateUserSettings migration; + private MongoCollection<Document> userCollection; + + @BeforeEach + void setUp() { + migration = new M001_SetNewAndMigrateUserSettings(mongoClient.getDatabase(database)); + } + + @BeforeEach + void initDatabase() { + userCollection = mongoClient.getDatabase(database).getCollection(User.COLLECTION_NAME); + userCollection.drop(); + userCollection.insertOne(new Document( + Map.of(User.USERNAME_FIELD, "alluser", + User.USER_SETTINGS_FIELD, Map.of(UserSettings.NOTIFICATIONS_SEND_FOR_FIELD, "ALL")))); + userCollection.insertOne(new Document(Map.of(User.USERNAME_FIELD, "noneuser", + User.USER_SETTINGS_FIELD, Map.of(UserSettings.NOTIFICATIONS_SEND_FOR_FIELD, "NONE")))); + userCollection.insertOne(new Document(Map.of(User.USERNAME_FIELD, "nosettings"))); + } + + @Test + void shouldMigrateNotificationSendFor_ALL() { + migration.migrationMethod(); + + var user = userCollection.find(new Document(Map.of(User.USERNAME_FIELD, "alluser"))); + assertThat(user.first()).contains( + entry(User.USER_SETTINGS_FIELD, new Document(Map.of( + UserSettings.NOTIFICATIONS_SEND_FOR_FIELD, "ALL", + UserSettings.VORGANG_CREATED_FIELD, true, + UserSettings.VORGANG_ASSIGNED_TO_USER_FIELD, true, + UserSettings.POSTFACH_NACHRICHT_FROM_ANTRAGSTELLER_FIELD, true, + UserSettings.WIEDERVORLAGE_OVERDUE_FIELD, true)))); + } + + @Test + void shouldMigrateNotificationSendFor_NONE() { + migration.migrationMethod(); + + var user = userCollection.find(new Document(Map.of(User.USERNAME_FIELD, "noneuser"))); + assertThat(user.first()).contains( + entry(User.USER_SETTINGS_FIELD, new Document(Map.of( + UserSettings.NOTIFICATIONS_SEND_FOR_FIELD, "NONE", + UserSettings.VORGANG_CREATED_FIELD, false, + UserSettings.VORGANG_ASSIGNED_TO_USER_FIELD, true, + UserSettings.POSTFACH_NACHRICHT_FROM_ANTRAGSTELLER_FIELD, true, + UserSettings.WIEDERVORLAGE_OVERDUE_FIELD, true)))); + } + + @Test + void shouldSetDefaultSettings() { + migration.migrationMethod(); + + var user = userCollection.find(new Document(Map.of(User.USERNAME_FIELD, "nosettings"))); + assertThat(user.first()).contains( + entry(User.USER_SETTINGS_FIELD, new Document(Map.of( + UserSettings.NOTIFICATIONS_SEND_FOR_FIELD, "NONE", + UserSettings.VORGANG_CREATED_FIELD, false, + UserSettings.VORGANG_ASSIGNED_TO_USER_FIELD, true, + UserSettings.POSTFACH_NACHRICHT_FROM_ANTRAGSTELLER_FIELD, true, + UserSettings.WIEDERVORLAGE_OVERDUE_FIELD, true)))); + } +} \ No newline at end of file diff --git a/user-manager-server/src/test/java/de/ozgcloud/user/settings/UserSettingsTest.java b/user-manager-server/src/test/java/de/ozgcloud/user/settings/UserSettingsTest.java index b3c52e9efb8f5fb02fe24e1cab478af307ad0543..f017b39bb68b5c89d24450ca9a1be6c0ff8573d1 100644 --- a/user-manager-server/src/test/java/de/ozgcloud/user/settings/UserSettingsTest.java +++ b/user-manager-server/src/test/java/de/ozgcloud/user/settings/UserSettingsTest.java @@ -22,6 +22,13 @@ class UserSettingsTest { assertThat(userSettings.isVorgangCreated()).isFalse(); } + + @Test + void shouldCreateWithDefaultValues() { + var userSettings = new UserSettings(); + + assertThat(userSettings).usingRecursiveComparison().isEqualTo(UserSettings.createDefault()); + } } @Nested