Skip to content
Snippets Groups Projects
Commit c25e5f07 authored by OZGCloud's avatar OZGCloud
Browse files

OZG-3539 OZG-6784 implement migration script

parent 40a6a4ba
Branches
Tags
No related merge requests found
......@@ -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>
......
......@@ -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>
......
......@@ -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
......
package de.ozgcloud.user.common;
public class DocumentUtils {
public static String buildFieldPath(String... fields) {
return String.join(".", fields);
}
}
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
}
}
......@@ -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)
......
......@@ -34,6 +34,9 @@ quarkus:
management:
enabled: true
port: 9002
mongock:
migrate-at-start: true
transaction-enabled: false
grpc:
server:
......
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
......@@ -22,6 +22,13 @@ class UserSettingsTest {
assertThat(userSettings.isVorgangCreated()).isFalse();
}
@Test
void shouldCreateWithDefaultValues() {
var userSettings = new UserSettings();
assertThat(userSettings).usingRecursiveComparison().isEqualTo(UserSettings.createDefault());
}
}
@Nested
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment