diff --git a/.dev/docker-compose.yaml b/.dev/docker-compose.yaml index 480b416cd..aaeb0f648 100644 --- a/.dev/docker-compose.yaml +++ b/.dev/docker-compose.yaml @@ -1,7 +1,18 @@ version: '2' services: - + keycloak: + image: quay.io/keycloak/keycloak:20.0 + command: start-dev + environment: + KEYCLOAK_ADMIN: admin + KEYCLOAK_ADMIN_PASSWORD: admin + ports: + - 8080:8080 + redis: + image: redis + ports: + - "6379:6379" db: image: postgres restart: always @@ -10,7 +21,7 @@ services: environment: POSTGRES_USER: redaction POSTGRES_PASSWORD: redaction - POSTGRES_DB: redaction + POSTGRES_DB: master rabbitmq: image: 'rabbitmq:3.9-alpine' mem_limit: 500m diff --git a/persistence-service-v1/keycloak-commons/pom.xml b/persistence-service-v1/keycloak-commons/pom.xml new file mode 100644 index 000000000..ee2c9fba7 --- /dev/null +++ b/persistence-service-v1/keycloak-commons/pom.xml @@ -0,0 +1,121 @@ + + + + + persistence-service-v1 + com.iqser.red.service + 1.0-SNAPSHOT + + + 4.0.0 + + keycloak-commons + + + + + com.iqser.red.commons + spring-commons + + + com.iqser.red.commons + logging-commons + + + org.apache.commons + commons-lang3 + 3.9 + + + org.apache.commons + commons-compress + 1.21 + + + org.apache.commons + commons-collections4 + 4.4 + + + + com.iqser.red.commons + metric-commons + + + + org.keycloak + keycloak-spring-boot-adapter-core + ${keycloak.version} + + + + org.keycloak + keycloak-spring-security-adapter + ${keycloak.version} + + + + org.keycloak + keycloak-admin-client + ${keycloak.version} + + + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + 2.13.4 + + + + com.google.guava + guava + + + + + io.github.openfeign + feign-core + provided + + + + org.springframework + spring-web + provided + + + + org.springframework.boot + spring-boot-starter-security + + + + org.springframework.boot + spring-boot-starter-validation + + + + org.springframework.boot + spring-boot-starter-data-redis + + + + com.iqser.red.commons + jackson-commons + + + + + com.iqser.red.commons + test-commons + test + + + org.springframework.retry + spring-retry + + + + diff --git a/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/DefaultKeyCloakCommonsConfiguration.java b/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/DefaultKeyCloakCommonsConfiguration.java new file mode 100644 index 000000000..a5bb84b47 --- /dev/null +++ b/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/DefaultKeyCloakCommonsConfiguration.java @@ -0,0 +1,24 @@ +package com.iqser.red.keycloak.commons; + +import static com.iqser.red.keycloak.commons.UserCacheBuilder.USERS_CACHE; + +import java.time.Duration; + +import org.springframework.boot.autoconfigure.cache.RedisCacheManagerBuilderCustomizer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.cache.RedisCacheConfiguration; + +@Configuration +@ComponentScan +public class DefaultKeyCloakCommonsConfiguration { + + + @Bean + public RedisCacheManagerBuilderCustomizer redisUserCacheManagerBuilderCustomizer() { + + return (builder) -> builder.withCacheConfiguration(USERS_CACHE, RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofSeconds(10))); + } + +} diff --git a/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/KeyCloakAdminClientService.java b/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/KeyCloakAdminClientService.java new file mode 100644 index 000000000..cbc5768c4 --- /dev/null +++ b/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/KeyCloakAdminClientService.java @@ -0,0 +1,41 @@ +package com.iqser.red.keycloak.commons; + +import java.util.concurrent.TimeUnit; + +import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder; +import org.jboss.resteasy.client.jaxrs.internal.ResteasyClientBuilderImpl; +import org.keycloak.OAuth2Constants; +import org.keycloak.admin.client.Keycloak; +import org.keycloak.admin.client.KeycloakBuilder; +import org.springframework.stereotype.Service; + +@Service +public class KeyCloakAdminClientService { + + private final Keycloak adminClient; + + + public KeyCloakAdminClientService(KeyCloakSettings settings) { + + adminClient = KeycloakBuilder.builder() + .serverUrl(settings.getServerUrl()) + .realm(settings.getRealm()) + .clientId(settings.getClientId()) + .clientSecret(settings.getClientSecret()) + .grantType(OAuth2Constants.CLIENT_CREDENTIALS) + .resteasyClient(new ResteasyClientBuilderImpl().connectionTTL(2, TimeUnit.SECONDS) + .hostnameVerification(ResteasyClientBuilder.HostnameVerificationPolicy.ANY) + .connectionPoolSize(settings.getConnectionPoolSize()) + .disableTrustManager() + .build()) + .build(); + + } + + + public Keycloak getAdminClient() { + + return adminClient; + } + +} diff --git a/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/KeyCloakRoleManager.java b/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/KeyCloakRoleManager.java new file mode 100644 index 000000000..cce6591b6 --- /dev/null +++ b/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/KeyCloakRoleManager.java @@ -0,0 +1,135 @@ +package com.iqser.red.keycloak.commons; + +import static com.iqser.red.keycloak.commons.roles.ActionRoles.GET_RSS; +import static com.iqser.red.keycloak.commons.roles.ApplicationRoles.RED_ADMIN_ROLE; +import static com.iqser.red.keycloak.commons.roles.ApplicationRoles.RED_MANAGER_ROLE; +import static com.iqser.red.keycloak.commons.roles.ApplicationRoles.RED_USER_ADMIN_ROLE; +import static com.iqser.red.keycloak.commons.roles.ApplicationRoles.RED_USER_ROLE; +import static com.iqser.red.keycloak.commons.roles.ApplicationRoles.UNMAPPED_ACTION_ROLES; + +import java.util.ArrayList; +import java.util.Set; +import java.util.stream.Collectors; + +import org.keycloak.representations.idm.ClientRepresentation; +import org.keycloak.representations.idm.RoleRepresentation; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.stereotype.Component; + +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; +import com.iqser.red.keycloak.commons.roles.ApplicationRoles; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Component +@RequiredArgsConstructor +public class KeyCloakRoleManager implements ApplicationRunner { + + private final RealmService realmService; + + private final KeyCloakSettings settings; + + + @Override + public void run(ApplicationArguments args) { + + log.info("Running KeyCloak Role Manager, managing client: {} with system client {}", settings.getApplicationClientId(), settings.getClientId()); + var existingRoles = realmService.realm().roles().list().stream().map(RoleRepresentation::getName).collect(Collectors.toList()); + + log.info("Existing KC roles: {}", existingRoles); + + var redactionClientRepresentation = getRedactionClientRepresentation(); + var redactionClient = realmService.realm().clients().get(redactionClientRepresentation.getId()); + var clientRoles = redactionClient.roles().list().stream().map(RoleRepresentation::getName).collect(Collectors.toList()); + + var allRoles = ApplicationRoles.ROLE_DATA.values().stream().flatMap(Set::stream).collect(Collectors.toSet()); + allRoles.addAll(UNMAPPED_ACTION_ROLES); + log.info("Existing KC client roles: {}", clientRoles); + log.info("Current Application KC client roles: {}", allRoles); + if (!Sets.newHashSet(clientRoles).equals(allRoles)) { + + log.info("Role-Sets are different, recreating form scratch ... "); + // remove all roles from the redaction client + + clientRoles.forEach(clientRole -> { + try { + redactionClient.roles().deleteRole(clientRole); + }catch (Exception e){ + log.warn("Failed to delete client role: {}",clientRole); + } + }); + + // re-create all client-roles + allRoles.forEach(role -> { + var roleRepresentation = new RoleRepresentation(role, role, false); + redactionClient.roles().create(roleRepresentation); + }); + log.info("Cleaned up KC client roles and written current ones!"); + } + + var allClientRoles = redactionClient.roles().list(); + + if (settings.isScmEnabled()) { + ApplicationRoles.ROLE_DATA.get(RED_USER_ROLE).add(GET_RSS); + } + + // if an application-role doesn't exist, create it + for (String applicationRole : ApplicationRoles.ROLE_DATA.keySet()) { + + log.info("Running Role Composition for role: {}", applicationRole); + if (!existingRoles.contains(applicationRole)) { + + log.info("Application Role: {} doesn't exist, creating it now", applicationRole); + var role = new RoleRepresentation(applicationRole, applicationRole, false); + role.setComposite(true); + realmService.realm().roles().create(role); + + } + var applicationRoleResource = realmService.realm().roles().get(applicationRole); + Set composites = realmService.realm() + .rolesById() + .getClientRoleComposites(applicationRoleResource.toRepresentation().getId(), redactionClient.toRepresentation().getId()); + + log.info("Deleting previous composites for application role {}", applicationRole); + realmService.realm().rolesById().deleteComposites(applicationRoleResource.toRepresentation().getId(), new ArrayList<>(composites)); + var relevantClientRoles = allClientRoles.stream().filter(role -> ApplicationRoles.ROLE_DATA.get(applicationRole).contains(role.getName())).collect(Collectors.toList()); + log.info("Writing new composites for application role {}", applicationRole); + realmService.realm().rolesById().addComposites(applicationRoleResource.toRepresentation().getId(), relevantClientRoles); + log.info("Finished application role {}", applicationRole); + } + + // add RED_USER Realm Role to RED_MANAGER + var redUserRole = realmService.realm().roles().get(RED_USER_ROLE); + var redManagerRole = realmService.realm().roles().get(RED_MANAGER_ROLE); + + realmService.realm().rolesById().addComposites(redManagerRole.toRepresentation().getId(), Lists.newArrayList(redUserRole.toRepresentation())); + + // add RED_USER_ADMIN Realm Role to RED_ADMIN + var redAdminRole = realmService.realm().roles().get(RED_ADMIN_ROLE); + var redUserAdminRole = realmService.realm().roles().get(RED_USER_ADMIN_ROLE); + + realmService.realm().rolesById().addComposites(redAdminRole.toRepresentation().getId(), Lists.newArrayList(redUserAdminRole.toRepresentation())); + + log.info("Finished KC Role Manager"); + + } + + + private ClientRepresentation getRedactionClientRepresentation() { + + String applicationClientId = settings.getApplicationClientId(); + var clientRepresentationIterator = realmService.realm().clients().findByClientId(applicationClientId).iterator(); + + if (clientRepresentationIterator.hasNext()) { + return clientRepresentationIterator.next(); + } else { + throw new IllegalStateException(String.format("The application client information for the id %s could not be retrieved. " + // + "Please check the application settings and correct the license-service/userKeycloakSettings/applicationClientId setting.", applicationClientId)); + } + } + +} diff --git a/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/KeyCloakSettings.java b/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/KeyCloakSettings.java new file mode 100644 index 000000000..241a9cd3c --- /dev/null +++ b/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/KeyCloakSettings.java @@ -0,0 +1,21 @@ +package com.iqser.red.keycloak.commons; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +import lombok.Data; + +@Data +@ConfigurationProperties("commons.keycloak") +public class KeyCloakSettings { + + private String serverUrl; + private String realm; + private String applicationClientId; + private String clientId; + private String clientSecret; + private String issuer; + private String rolePrefix = "RED_"; + private int connectionPoolSize = 10; + private boolean scmEnabled; + +} diff --git a/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/KeycloakSecurity.java b/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/KeycloakSecurity.java new file mode 100644 index 000000000..2cc8e3f55 --- /dev/null +++ b/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/KeycloakSecurity.java @@ -0,0 +1,30 @@ +package com.iqser.red.keycloak.commons; + +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; + +import lombok.experimental.UtilityClass; +import lombok.extern.slf4j.Slf4j; + +/** + * Collection of helpful functions to easily access information about an authenticated user. + */ +@Slf4j +@UtilityClass +public class KeycloakSecurity { + + /** + * Determines the unique identifier for the currently logged in user. + * + * @return The unique user identifier. Never {@code null}. + */ + public String getUserId() { + + Authentication auth = SecurityContextHolder.getContext().getAuthentication(); + if (auth == null) { + return "anonymousUser"; + } + return auth.getName(); + } + +} diff --git a/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/KeycloakSecurityService.java b/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/KeycloakSecurityService.java new file mode 100644 index 000000000..17580dc7e --- /dev/null +++ b/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/KeycloakSecurityService.java @@ -0,0 +1,18 @@ +package com.iqser.red.keycloak.commons; + +import org.springframework.stereotype.Service; + +@Service +public class KeycloakSecurityService { + + /** + * Determines the unique identifier for the currently logged in user. + * + * @return The unique user identifier. Never {@code null}. + */ + public String getUserId() { + + return KeycloakSecurity.getUserId(); + } + +} diff --git a/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/RealmService.java b/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/RealmService.java new file mode 100644 index 000000000..af2cbd525 --- /dev/null +++ b/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/RealmService.java @@ -0,0 +1,24 @@ +package com.iqser.red.keycloak.commons; + +import org.keycloak.admin.client.resource.RealmResource; +import org.springframework.stereotype.Service; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Service +@RequiredArgsConstructor +@Slf4j +public class RealmService { + + private final KeyCloakAdminClientService keycloak; + + private final KeyCloakSettings settings; + + + public RealmResource realm() { + + return keycloak.getAdminClient().realm(settings.getRealm()); + } + +} diff --git a/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/UserCacheBuilder.java b/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/UserCacheBuilder.java new file mode 100644 index 000000000..a949f589c --- /dev/null +++ b/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/UserCacheBuilder.java @@ -0,0 +1,26 @@ +package com.iqser.red.keycloak.commons; + +import javax.annotation.PostConstruct; + +import org.springframework.stereotype.Service; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Service +@RequiredArgsConstructor +public class UserCacheBuilder { + + public static final String USERS_CACHE = "users"; + + private final UserListingService userService; + + + @PostConstruct + protected void postConstruct() { + + userService.getAllUsers(); + } + +} diff --git a/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/UserListingService.java b/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/UserListingService.java new file mode 100644 index 000000000..1a2fc87d0 --- /dev/null +++ b/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/UserListingService.java @@ -0,0 +1,99 @@ +package com.iqser.red.keycloak.commons; + +import static com.iqser.red.keycloak.commons.UserCacheBuilder.USERS_CACHE; +import static com.iqser.red.keycloak.commons.roles.ApplicationRoles.RED_ADMIN_ROLE; +import static com.iqser.red.keycloak.commons.roles.ApplicationRoles.RED_MANAGER_ROLE; +import static com.iqser.red.keycloak.commons.roles.ApplicationRoles.RED_USER_ADMIN_ROLE; +import static com.iqser.red.keycloak.commons.roles.ApplicationRoles.RED_USER_ROLE; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import org.keycloak.representations.idm.UserRepresentation; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.retry.support.RetryTemplate; +import org.springframework.stereotype.Service; + +import com.iqser.red.keycloak.commons.model.User; +import com.iqser.red.keycloak.commons.roles.ApplicationRoles; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Service +@RequiredArgsConstructor +public class UserListingService { + + private final RealmService realmService; + private final RetryTemplate retryTemplate = RetryTemplate.builder().maxAttempts(3).exponentialBackoff(1000, 2, 5000).build(); + + + @Cacheable(value = USERS_CACHE) + public List getAllUsers() { + + return retryTemplate.execute(context -> { + List allUsers = realmService.realm().users().search(null, 0, 500); + + Map> usersByRole = new HashMap<>(); + if(!allUsers.isEmpty()) { + var realmRoles = realmService.realm().roles().list().stream().map(r -> r.getName().toUpperCase()).collect(Collectors.toSet()); + for (var role : ApplicationRoles.ROLE_DATA.keySet()) { + if(realmRoles.contains(role)) { + Set users = realmService.realm().roles().get(role).getRoleUserMembers(0, 500); + usersByRole.put(role, users.stream().map(UserRepresentation::getId).collect(Collectors.toSet())); + } + } + } + + return compactUsers(allUsers, usersByRole); + + }); + + } + + + private List compactUsers(List allUsers, Map> usersByRole) { + + List users = new ArrayList<>(); + + for (var userRepresentation : allUsers) { + var user = convertBasicUser(userRepresentation); + for (var entry : usersByRole.entrySet()) { + if (entry.getValue().contains(user.getUserId())) { + user.getRoles().add(entry.getKey()); + } + } + users.add(user); + } + + users.forEach(user -> { + if (user.getRoles().contains(RED_MANAGER_ROLE)) { + user.getRoles().add(RED_USER_ROLE); + } + if (user.getRoles().contains(RED_ADMIN_ROLE)) { + user.getRoles().add(RED_USER_ADMIN_ROLE); + } + }); + + return users; + } + + + public User convertBasicUser(UserRepresentation userRepresentation) { + + return User.builder() + .email(userRepresentation.getEmail()) + .username(userRepresentation.getUsername()) + .firstName(userRepresentation.getFirstName()) + .lastName(userRepresentation.getLastName()) + .userId(userRepresentation.getId()) + .isActive(userRepresentation.isEnabled()) + .build(); + } + +} diff --git a/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/model/User.java b/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/model/User.java new file mode 100644 index 000000000..47882f690 --- /dev/null +++ b/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/model/User.java @@ -0,0 +1,33 @@ +package com.iqser.red.keycloak.commons.model; + +import java.io.Serializable; +import java.util.Set; +import java.util.TreeSet; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class User implements Serializable { + + private String userId; + + private String username; + + private String email; + + private String firstName; + + private String lastName; + + private boolean isActive; + + @Builder.Default + private Set roles = new TreeSet<>(); + +} diff --git a/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/roles/ActionRoles.java b/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/roles/ActionRoles.java new file mode 100644 index 000000000..ed7935b69 --- /dev/null +++ b/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/roles/ActionRoles.java @@ -0,0 +1,179 @@ +package com.iqser.red.keycloak.commons.roles; + +public final class ActionRoles { + + // Audit + public static final String SEARCH_AUDIT_LOG = "red-search-audit-log"; + + // Dictionary + public static final String ADD_DICTIONARY_ENTRY = "red-add-dictionary-entry"; + public static final String ADD_DOSSIER_DICTIONARY_ENTRY = "red-add-dossier-dictionary-entry"; + public static final String DELETE_DICTIONARY_ENTRY = "red-delete-dictionary-entry"; + public static final String DELETE_DOSSIER_DICTIONARY_ENTRY = "red-delete-dossier-dictionary-entry"; + public static final String ADD_UPDATE_DICTIONARY_TYPE = "red-add-update-dictionary-type"; + public static final String ADD_UPDATE_DOSSIER_DICTIONARY_TYPE = "red-add-update-dossier-dictionary-type"; + public static final String DELETE_DICTIONARY_TYPE = "red-delete-dictionary-type"; + public static final String DELETE_DOSSIER_DICTIONARY_TYPE = "red-delete-dossier-dictionary-type"; + + public static final String READ_DICTIONARY_TYPES = "red-read-dictionary-types"; + + // Colors + public static final String READ_COLORS = "red-read-colors"; + public static final String WRITE_COLORS = "red-write-colors"; + + // Digital Signature + public static final String WRITE_DIGITAL_SIGNATURE = "red-write-digital-signature"; + public static final String READ_DIGITAL_SIGNATURE = "red-read-digital-signature"; + + // Download + public static final String PROCESS_DOWNLOAD = "red-process-download"; + public static final String READ_DOWNLOAD_STATUS = "red-read-download-status"; + + // Legal Basis + public static final String READ_LEGAL_BASIS = "red-read-legal-basis"; + public static final String WRITE_LEGAL_BASIS = "red-write-legal-basis"; + + // License Report + public static final String READ_LICENSE_REPORT = "red-read-license-report"; + + // Redaction log + public static final String READ_REDACTION_LOG = "red-read-redaction-log"; + + // DossierTemplates + public static final String READ_DOSSIER_TEMPLATES = "red-read-dossier-templates"; + public static final String WRITE_DOSSIER_TEMPLATES = "red-write-dossier-templates"; + + // Dossier Status / States + public static final String READ_DOSSIER_STATUS = "red-read-dossier-status"; + public static final String WRITE_DOSSIER_STATUS = "red-write-dossier-status"; + + // Rules + public static final String READ_RULES = "red-read-rules"; + public static final String WRITE_RULES = "red-write-rules"; + + // SMTP + public static final String READ_SMTP_CONFIGURATION = "red-read-smtp-configuration"; + public static final String WRITE_SMTP_CONFIGURATION = "red-write-smtp-configuration"; + + // General Configurations + public static final String READ_GENERAL_CONFIGURATION = "red-read-general-configuration"; + public static final String WRITE_GENERAL_CONFIGURATION = "red-write-general-configuration"; + + // Preferences + public static final String MANAGE_USER_PREFERENCES = "red-manage-user-preferences"; + + // Users + public static final String READ_USERS = "red-read-users"; + public static final String READ_ALL_USERS = "red-read-all-users"; + public static final String WRITE_USERS = "red-write-users"; + public static final String UPDATE_MY_PROFILE = "red-update-my-profile"; + + // Version + public static final String READ_VERSIONS = "red-read-versions"; + + // Viewed pages + public static final String MANAGE_VIEWED_PAGES = "red-manage-viewed-pages"; + + // Watermark + public static final String READ_WATERMARK = "red-read-watermark"; + public static final String WRITE_WATERMARK = "red-write-watermark"; + + // Dossier + public static final String READ_DOSSIER = "red-read-dossier"; + public static final String ADD_UPDATE_DOSSIER = "red-add-update-dossier"; + public static final String DELETE_DOSSIER = "red-delete-dossier"; + public static final String ARCHIVE_DOSSIER = "red-archived-dossier"; + public static final String UNARCHIVE_DOSSIER = "red-unarchive-dossier"; + + //Re-analyze + public static final String REANALYZE_DOSSIER = "red-reanalyze-dossier"; + public static final String REANALYZE_FILE = "red-reanalyze-file"; + + // Exclude Include File + public static final String EXCLUDE_INCLUDE_FILE = "red-exclude-include-file"; + public static final String EXCLUDE_INCLUDE_PAGES = "red-exclude-include-pages"; + + // Rotate Page + public static final String ROTATE_PAGE = "red-rotate-page"; + + //Status + public static final String READ_FILE_STATUS = "red-read-file-status"; + public static final String SET_REVIEWER = "red-set-reviewer"; + public static final String SET_STATUS_UNDER_APPROVAL = "red-set-status-under-approval"; + public static final String SET_STATUS_APPROVED = "red-set-status-approved"; + + //File Attributes + public static final String WRITE_FILE_ATTRIBUTES_CONFIG = "red-write-file-attributes-config"; + public static final String READ_FILE_ATTRIBUTES_CONFIG = "red-read-file-attributes-config"; + public static final String WRITE_FILE_ATTRIBUTES = "red-write-file-attributes"; + + //Files + public static final String UPLOAD_FILE = "red-upload-file"; + public static final String DELETE_FILE = "red-delete-file"; + public static final String DOWNLOAD_ORIGINAL_FILE = "red-download-original-file"; + public static final String DOWNLOAD_REDACTED_FILE = "red-download-redacted-file"; + public static final String DOWNLOAD_ANNOTATED_FILE = "red-download-annotated-file"; + public static final String DOWNLOAD_REDACTION_PREVIEW_FILE = "red-download-redaction-preview-file"; + + //Manual Redaction + public static final String READ_MANUAL_REDACTIONS = "red-read-manual-redactions"; + public static final String REQUEST_MANUAL_REDACTION = "red-request-redaction"; + public static final String PROCESS_MANUAL_REDACTION_REQUEST = "red-process-manual-redaction-request"; + public static final String DO_MANUAL_REDACTION = "red-add-redaction"; + public static final String DELETE_MANUAL_REDACTION = "red-delete-manual-redaction"; + public static final String ADD_COMMENT = "red-add-comment"; + public static final String DELETE_COMMENT = "red-delete-comment"; + + //Report Template + public static final String UPLOAD_REPORT_TEMPLATE = "red-upload-report-template"; + public static final String GET_REPORT_TEMPLATES = "red-get-report-templates"; + public static final String DOWNLOAD_REPORT_TEMPLATE = "red-download-report-template"; + public static final String DELETE_REPORT_TEMPLATE = "red-delete-report-template"; + + //Dossier Attributes + public static final String WRITE_DOSSIER_ATTRIBUTES_CONFIG = "red-write-dossier-attributes-config"; + public static final String READ_DOSSIER_ATTRIBUTES_CONFIG = "red-read-dossier-attributes-config"; + public static final String WRITE_DOSSIER_ATTRIBUTES = "red-write-dossier-attributes"; + public static final String READ_DOSSIER_ATTRIBUTES = "red-read-dossier-attributes"; + + //Search + public static final String REINDEX = "red-reindex"; + public static final String SEARCH = "red-search"; + + //Notifications + public static final String READ_NOTIFICATIONS = "red-read-notification"; + public static final String UPDATE_NOTIFICATIONS = "red-update-notification"; + + // ImportedRedactions + public static final String PROCESS_TEXT_HIGHLIGHTS = "red-process-texthighlights"; + public static final String DELETE_IMPORTED_REDACTIONS = "red-delete-imported-redactions"; + + // Highlights + public static final String GET_HIGHLIGHTS = "red-get-highlights"; + public static final String CONVERT_HIGHLIGHTS = "red-convert-highlights"; + public static final String DELETE_HIGHLIGHTS = "red-delete-highlights"; + + // ACL Permission Management Signature + public static final String MANAGE_ACL_PERMISSIONS = "red-manage-acl-permissions"; + + // Application Configuration + public static final String READ_APP_CONFIG = "red-read-app-configuration"; + public static final String WRITE_APP_CONFIG = "red-write-app-configuration"; + + // License Management + public static final String UPDATE_LICENSE = "red-update-license"; + public static final String READ_LICENSE = "red-read-license"; + + // RSS + public static final String GET_RSS = "red-get-rss"; + + // Multitenancy + public static final String CREATE_TENANT = "red-create-tenant"; + public static final String GET_TENANTS = "red-get-tenants"; + + public static final String DEPLOYMENT_INFO = "red-deployment-info"; + + + private ActionRoles() {} + +} diff --git a/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/roles/ApplicationRoles.java b/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/roles/ApplicationRoles.java new file mode 100644 index 000000000..b2f0f4010 --- /dev/null +++ b/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/roles/ApplicationRoles.java @@ -0,0 +1,257 @@ +package com.iqser.red.keycloak.commons.roles; + +import static com.iqser.red.keycloak.commons.roles.ActionRoles.ADD_COMMENT; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.ADD_DICTIONARY_ENTRY; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.ADD_DOSSIER_DICTIONARY_ENTRY; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.ADD_UPDATE_DICTIONARY_TYPE; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.ADD_UPDATE_DOSSIER; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.ADD_UPDATE_DOSSIER_DICTIONARY_TYPE; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.ARCHIVE_DOSSIER; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.CONVERT_HIGHLIGHTS; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.CREATE_TENANT; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.DELETE_COMMENT; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.DELETE_DICTIONARY_ENTRY; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.DELETE_DICTIONARY_TYPE; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.DELETE_DOSSIER; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.DELETE_DOSSIER_DICTIONARY_ENTRY; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.DELETE_DOSSIER_DICTIONARY_TYPE; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.DELETE_FILE; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.DELETE_HIGHLIGHTS; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.DELETE_IMPORTED_REDACTIONS; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.DELETE_MANUAL_REDACTION; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.DELETE_REPORT_TEMPLATE; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.DEPLOYMENT_INFO; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.DOWNLOAD_ANNOTATED_FILE; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.DOWNLOAD_ORIGINAL_FILE; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.DOWNLOAD_REDACTED_FILE; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.DOWNLOAD_REDACTION_PREVIEW_FILE; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.DOWNLOAD_REPORT_TEMPLATE; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.DO_MANUAL_REDACTION; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.EXCLUDE_INCLUDE_FILE; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.EXCLUDE_INCLUDE_PAGES; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.GET_HIGHLIGHTS; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.GET_REPORT_TEMPLATES; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.GET_RSS; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.GET_TENANTS; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.MANAGE_ACL_PERMISSIONS; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.MANAGE_USER_PREFERENCES; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.MANAGE_VIEWED_PAGES; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.PROCESS_DOWNLOAD; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.PROCESS_MANUAL_REDACTION_REQUEST; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.PROCESS_TEXT_HIGHLIGHTS; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_ALL_USERS; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_APP_CONFIG; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_COLORS; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_DICTIONARY_TYPES; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_DIGITAL_SIGNATURE; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_DOSSIER; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_DOSSIER_ATTRIBUTES; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_DOSSIER_ATTRIBUTES_CONFIG; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_DOSSIER_STATUS; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_DOSSIER_TEMPLATES; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_DOWNLOAD_STATUS; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_FILE_ATTRIBUTES_CONFIG; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_FILE_STATUS; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_GENERAL_CONFIGURATION; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_LEGAL_BASIS; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_LICENSE; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_LICENSE_REPORT; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_MANUAL_REDACTIONS; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_NOTIFICATIONS; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_REDACTION_LOG; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_RULES; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_SMTP_CONFIGURATION; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_USERS; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_VERSIONS; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_WATERMARK; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.REANALYZE_DOSSIER; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.REANALYZE_FILE; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.REINDEX; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.REQUEST_MANUAL_REDACTION; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.ROTATE_PAGE; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.SEARCH; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.SEARCH_AUDIT_LOG; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.SET_REVIEWER; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.SET_STATUS_APPROVED; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.SET_STATUS_UNDER_APPROVAL; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.UNARCHIVE_DOSSIER; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.UPDATE_LICENSE; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.UPDATE_MY_PROFILE; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.UPDATE_NOTIFICATIONS; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.UPLOAD_FILE; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.UPLOAD_REPORT_TEMPLATE; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_APP_CONFIG; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_COLORS; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_DIGITAL_SIGNATURE; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_DOSSIER_ATTRIBUTES; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_DOSSIER_ATTRIBUTES_CONFIG; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_DOSSIER_STATUS; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_DOSSIER_TEMPLATES; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_FILE_ATTRIBUTES; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_FILE_ATTRIBUTES_CONFIG; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_GENERAL_CONFIGURATION; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_LEGAL_BASIS; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_RULES; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_SMTP_CONFIGURATION; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_USERS; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_WATERMARK; + +import java.util.Collection; +import java.util.Map; +import java.util.Set; + +import com.google.common.collect.Sets; + +public final class ApplicationRoles { + + public static final String RED_USER_ROLE = "RED_USER"; + public static final String RED_MANAGER_ROLE = "RED_MANAGER"; + public static final String RED_ADMIN_ROLE = "RED_ADMIN"; + public static final String RED_USER_ADMIN_ROLE = "RED_USER_ADMIN"; + + public static final Set UNMAPPED_ACTION_ROLES = Sets.newHashSet(UNARCHIVE_DOSSIER, UPDATE_LICENSE, GET_RSS); + + public static final Set RED_USER_ACTION_ROLES = Sets.newHashSet(ADD_COMMENT, + READ_LICENSE, + READ_APP_CONFIG, + READ_DOSSIER_STATUS, + ADD_DOSSIER_DICTIONARY_ENTRY, + DO_MANUAL_REDACTION, + ADD_UPDATE_DOSSIER_DICTIONARY_TYPE, + DELETE_COMMENT, + DELETE_DOSSIER_DICTIONARY_ENTRY, + DELETE_DOSSIER_DICTIONARY_TYPE, + DELETE_FILE, + DELETE_MANUAL_REDACTION, + DOWNLOAD_ANNOTATED_FILE, + DOWNLOAD_ORIGINAL_FILE, + DOWNLOAD_REDACTED_FILE, + DOWNLOAD_REDACTION_PREVIEW_FILE, + DOWNLOAD_REPORT_TEMPLATE, + EXCLUDE_INCLUDE_FILE, + EXCLUDE_INCLUDE_PAGES, + GET_REPORT_TEMPLATES, + MANAGE_USER_PREFERENCES, + MANAGE_VIEWED_PAGES, + PROCESS_DOWNLOAD, + PROCESS_MANUAL_REDACTION_REQUEST, + READ_COLORS, + READ_DICTIONARY_TYPES, + READ_DIGITAL_SIGNATURE, + READ_DOSSIER, + READ_DOSSIER_ATTRIBUTES, + READ_DOSSIER_ATTRIBUTES_CONFIG, + READ_DOSSIER_TEMPLATES, + READ_DOWNLOAD_STATUS, + READ_FILE_ATTRIBUTES_CONFIG, + READ_FILE_STATUS, + READ_GENERAL_CONFIGURATION, + READ_LEGAL_BASIS, + READ_MANUAL_REDACTIONS, + READ_NOTIFICATIONS, + READ_REDACTION_LOG, + READ_RULES, + READ_USERS, + READ_VERSIONS, + READ_WATERMARK, + REANALYZE_DOSSIER, + REANALYZE_FILE, + REQUEST_MANUAL_REDACTION, + ROTATE_PAGE, + SEARCH, + SEARCH_AUDIT_LOG, + SET_REVIEWER, + SET_STATUS_APPROVED, + SET_STATUS_UNDER_APPROVAL, + UPDATE_MY_PROFILE, + UPDATE_NOTIFICATIONS, + UPLOAD_FILE, + WRITE_FILE_ATTRIBUTES, + PROCESS_TEXT_HIGHLIGHTS, + GET_HIGHLIGHTS, + CONVERT_HIGHLIGHTS, + DELETE_HIGHLIGHTS, + DELETE_IMPORTED_REDACTIONS); + + public static final Set RED_ADMIN_ACTION_ROLES = Sets.newHashSet(ADD_DICTIONARY_ENTRY, + ADD_UPDATE_DICTIONARY_TYPE, + WRITE_DOSSIER_STATUS, + READ_DOSSIER_STATUS, + DELETE_DICTIONARY_ENTRY, + DELETE_DICTIONARY_TYPE, + DELETE_REPORT_TEMPLATE, + DOWNLOAD_REPORT_TEMPLATE, + GET_REPORT_TEMPLATES, + MANAGE_USER_PREFERENCES, + READ_COLORS, + READ_DICTIONARY_TYPES, + READ_DIGITAL_SIGNATURE, + READ_DOSSIER_ATTRIBUTES, + READ_DOSSIER_ATTRIBUTES_CONFIG, + READ_DOSSIER_TEMPLATES, + READ_FILE_ATTRIBUTES_CONFIG, + READ_LEGAL_BASIS, + READ_LICENSE_REPORT, + READ_NOTIFICATIONS, + READ_RULES, + READ_SMTP_CONFIGURATION, + READ_VERSIONS, + READ_WATERMARK, + REINDEX, + SEARCH_AUDIT_LOG, + UPDATE_NOTIFICATIONS, + UPLOAD_REPORT_TEMPLATE, + WRITE_COLORS, + WRITE_DIGITAL_SIGNATURE, + WRITE_DOSSIER_ATTRIBUTES_CONFIG, + WRITE_DOSSIER_TEMPLATES, + WRITE_FILE_ATTRIBUTES_CONFIG, + WRITE_GENERAL_CONFIGURATION, + WRITE_LEGAL_BASIS, + WRITE_RULES, + WRITE_SMTP_CONFIGURATION, + WRITE_WATERMARK, + WRITE_APP_CONFIG, + MANAGE_ACL_PERMISSIONS, + CREATE_TENANT, + GET_TENANTS, + DEPLOYMENT_INFO); + + public static final Set RED_MANAGER_ACTION_ROLES = Sets.newHashSet(ADD_UPDATE_DOSSIER, ARCHIVE_DOSSIER, DELETE_DOSSIER, WRITE_DOSSIER_ATTRIBUTES); + + public static final Set RED_USER_ADMIN_ACTION_ROLES = Sets.newHashSet(MANAGE_USER_PREFERENCES, + READ_ALL_USERS, + READ_DOSSIER, + READ_APP_CONFIG, + READ_GENERAL_CONFIGURATION, + READ_GENERAL_CONFIGURATION, + READ_NOTIFICATIONS, + READ_USERS, + UPDATE_MY_PROFILE, + UPDATE_NOTIFICATIONS, + WRITE_USERS, + READ_LICENSE); + + public static final Map> ROLE_DATA = Map.of(RED_USER_ROLE, + RED_USER_ACTION_ROLES, + RED_MANAGER_ROLE, + RED_MANAGER_ACTION_ROLES, + RED_ADMIN_ROLE, + RED_ADMIN_ACTION_ROLES, + RED_USER_ADMIN_ROLE, + RED_USER_ADMIN_ACTION_ROLES); + + + private ApplicationRoles() {} + + + public static void validateRoles(Collection roles) { + + for (String role : roles) { + if (!ROLE_DATA.containsKey(role)) { + throw new IllegalArgumentException("Invalid Role: " + role); + } + } + } + +} diff --git a/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/security/RedBearerTokenRequestAuthenticator.java b/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/security/RedBearerTokenRequestAuthenticator.java new file mode 100644 index 000000000..d233efc12 --- /dev/null +++ b/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/security/RedBearerTokenRequestAuthenticator.java @@ -0,0 +1,91 @@ +package com.iqser.red.keycloak.commons.security; + +import javax.security.cert.X509Certificate; + +import org.keycloak.adapters.BearerTokenRequestAuthenticator; +import org.keycloak.adapters.KeycloakDeployment; +import org.keycloak.adapters.OIDCAuthenticationError; +import org.keycloak.adapters.spi.AuthOutcome; +import org.keycloak.adapters.spi.HttpFacade; +import org.keycloak.common.VerificationException; +import org.keycloak.jose.jws.JWSInput; +import org.keycloak.jose.jws.JWSInputException; + +public class RedBearerTokenRequestAuthenticator extends BearerTokenRequestAuthenticator { + + private final String issuerUrl; + + + public RedBearerTokenRequestAuthenticator(KeycloakDeployment deployment, String issuerUrl) { + + super(deployment); + this.issuerUrl = issuerUrl; + } + + + // This is the exact method copied from BearerTokenRequestAuthenticator but with a custom Token Verifier. + @Override + protected AuthOutcome authenticateToken(HttpFacade exchange, String tokenString) { + + this.log.debug("Verifying access_token"); + if (this.log.isTraceEnabled()) { + try { + JWSInput jwsInput = new JWSInput(tokenString); + String wireString = jwsInput.getWireString(); + this.log.tracef("\taccess_token: %s", wireString.substring(0, wireString.lastIndexOf(".")) + ".signature"); + } catch (JWSInputException var8) { + this.log.debugf(var8, "Failed to parse access_token: %s", tokenString); + } + } + + try { + this.token = RedTokenVerifier.verifyToken(tokenString, this.deployment, issuerUrl); + } catch (VerificationException var7) { + this.log.debug("Failed to verify token"); + this.challenge = this.challengeResponse(exchange, OIDCAuthenticationError.Reason.INVALID_TOKEN, "invalid_token", var7.getMessage()); + return AuthOutcome.FAILED; + } + + if (this.token.getIssuedAt() < this.deployment.getNotBefore()) { + this.log.debug("Stale token"); + this.challenge = this.challengeResponse(exchange, OIDCAuthenticationError.Reason.STALE_TOKEN, "invalid_token", "Stale token"); + return AuthOutcome.FAILED; + } else { + boolean verifyCaller = false; + if (this.deployment.isUseResourceRoleMappings()) { + verifyCaller = this.token.isVerifyCaller(this.deployment.getResourceName()); + } else { + verifyCaller = this.token.isVerifyCaller(); + } + + this.surrogate = null; + if (verifyCaller) { + if (this.token.getTrustedCertificates() == null || this.token.getTrustedCertificates().isEmpty()) { + this.log.warn("No trusted certificates in token"); + this.challenge = this.clientCertChallenge(); + return AuthOutcome.FAILED; + } + + X509Certificate[] chain = new X509Certificate[0]; + + try { + chain = exchange.getCertificateChain(); + } catch (Exception var6) { + log.debug(var6); + } + + if (chain == null || chain.length == 0) { + this.log.warn("No certificates provided by undertow to verify the caller"); + this.challenge = this.clientCertChallenge(); + return AuthOutcome.FAILED; + } + + this.surrogate = chain[0].getSubjectDN().getName(); + } + + this.log.debug("successful authorized"); + return AuthOutcome.AUTHENTICATED; + } + } + +} diff --git a/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/security/RedQueryParameterTokenRequestAuthenticator.java b/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/security/RedQueryParameterTokenRequestAuthenticator.java new file mode 100644 index 000000000..cc5c37e27 --- /dev/null +++ b/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/security/RedQueryParameterTokenRequestAuthenticator.java @@ -0,0 +1,91 @@ +package com.iqser.red.keycloak.commons.security; + +import javax.security.cert.X509Certificate; + +import org.keycloak.adapters.KeycloakDeployment; +import org.keycloak.adapters.OIDCAuthenticationError; +import org.keycloak.adapters.QueryParameterTokenRequestAuthenticator; +import org.keycloak.adapters.spi.AuthOutcome; +import org.keycloak.adapters.spi.HttpFacade; +import org.keycloak.common.VerificationException; +import org.keycloak.jose.jws.JWSInput; +import org.keycloak.jose.jws.JWSInputException; + +public class RedQueryParameterTokenRequestAuthenticator extends QueryParameterTokenRequestAuthenticator { + + private final String issuerUrl; + + + public RedQueryParameterTokenRequestAuthenticator(KeycloakDeployment deployment, String issuerUrl) { + + super(deployment); + this.issuerUrl = issuerUrl; + } + + + // This is the exact method copied from BearerTokenRequestAuthenticator but with a custom Token Verifier. + @Override + protected AuthOutcome authenticateToken(HttpFacade exchange, String tokenString) { + + this.log.debug("Verifying access_token"); + if (this.log.isTraceEnabled()) { + try { + JWSInput jwsInput = new JWSInput(tokenString); + String wireString = jwsInput.getWireString(); + this.log.tracef("\taccess_token: %s", wireString.substring(0, wireString.lastIndexOf(".")) + ".signature"); + } catch (JWSInputException var8) { + this.log.debugf(var8, "Failed to parse access_token: %s", tokenString); + } + } + + try { + this.token = RedTokenVerifier.verifyToken(tokenString, this.deployment, issuerUrl); + } catch (VerificationException var7) { + this.log.debug("Failed to verify token"); + this.challenge = this.challengeResponse(exchange, OIDCAuthenticationError.Reason.INVALID_TOKEN, "invalid_token", var7.getMessage()); + return AuthOutcome.FAILED; + } + + if (this.token.getIssuedAt() < this.deployment.getNotBefore()) { + this.log.debug("Stale token"); + this.challenge = this.challengeResponse(exchange, OIDCAuthenticationError.Reason.STALE_TOKEN, "invalid_token", "Stale token"); + return AuthOutcome.FAILED; + } else { + boolean verifyCaller = false; + if (this.deployment.isUseResourceRoleMappings()) { + verifyCaller = this.token.isVerifyCaller(this.deployment.getResourceName()); + } else { + verifyCaller = this.token.isVerifyCaller(); + } + + this.surrogate = null; + if (verifyCaller) { + if (this.token.getTrustedCertificates() == null || this.token.getTrustedCertificates().isEmpty()) { + this.log.warn("No trusted certificates in token"); + this.challenge = this.clientCertChallenge(); + return AuthOutcome.FAILED; + } + + X509Certificate[] chain = new X509Certificate[0]; + + try { + chain = exchange.getCertificateChain(); + } catch (Exception var6) { + log.debug(var6); + } + + if (chain == null || chain.length == 0) { + this.log.warn("No certificates provided by undertow to verify the caller"); + this.challenge = this.clientCertChallenge(); + return AuthOutcome.FAILED; + } + + this.surrogate = chain[0].getSubjectDN().getName(); + } + + this.log.debug("successful authorized"); + return AuthOutcome.AUTHENTICATED; + } + } + +} diff --git a/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/security/RedTokenVerifier.java b/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/security/RedTokenVerifier.java new file mode 100644 index 000000000..4c8697306 --- /dev/null +++ b/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/security/RedTokenVerifier.java @@ -0,0 +1,87 @@ +package com.iqser.red.keycloak.commons.security; + +import static org.keycloak.TokenVerifier.IS_ACTIVE; +import static org.keycloak.TokenVerifier.SUBJECT_EXISTS_CHECK; + +import java.security.PublicKey; + +import org.apache.commons.lang3.StringUtils; +import org.keycloak.TokenVerifier; +import org.keycloak.adapters.KeycloakDeployment; +import org.keycloak.adapters.rotation.PublicKeyLocator; +import org.keycloak.common.VerificationException; +import org.keycloak.representations.AccessToken; + +import lombok.experimental.UtilityClass; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@UtilityClass +public class RedTokenVerifier { + + public AccessToken verifyToken(String tokenString, KeycloakDeployment deployment, String issuerUrl) throws VerificationException { + + TokenVerifier tokenVerifier = createVerifier(tokenString, deployment, issuerUrl); + if (deployment.isVerifyTokenAudience()) { + tokenVerifier.audience(deployment.getResourceName()); + } + + return tokenVerifier.verify().getToken(); + } + + + private TokenVerifier createVerifier(String tokenString, KeycloakDeployment deployment, String issuerUrl) throws VerificationException { + + TokenVerifier tokenVerifier = TokenVerifier.create(tokenString, AccessToken.class) + .withChecks(SUBJECT_EXISTS_CHECK, IS_ACTIVE, new TokenVerifier.TokenTypeCheck("bearer"), new IssuerCheck(issuerUrl)); + + String kid = tokenVerifier.getHeader().getKeyId(); + PublicKey publicKey = getPublicKey(kid, deployment); + tokenVerifier.publicKey(publicKey); + return tokenVerifier; + } + + + private PublicKey getPublicKey(String kid, KeycloakDeployment deployment) throws VerificationException { + + PublicKeyLocator pkLocator = deployment.getPublicKeyLocator(); + PublicKey publicKey = pkLocator.getPublicKey(kid, deployment); + if (publicKey == null) { + log.debug("Didn't find publicKey for kid: {}", kid); + throw new VerificationException("Didn't find publicKey for specified kid"); + } else { + return publicKey; + } + } + + + @Slf4j + public static class IssuerCheck implements TokenVerifier.Predicate { + + private final String issuerUrl; + + + public IssuerCheck(String issuerUrl) { + + this.issuerUrl = issuerUrl; + } + + + public boolean test(AccessToken t) throws VerificationException { + + if (StringUtils.isEmpty(this.issuerUrl)) { + log.debug("Issuer Not Set, skipping verification"); + return true; + } else if (!this.issuerUrl.equalsIgnoreCase(t.getIssuer())) { + var message = "Invalid token issuer. Expected '" + this.issuerUrl + "', but was '" + t.getIssuer() + "'"; + log.debug(message); + throw new VerificationException(message); + } else { + log.debug("Issuer Verification Successful"); + return true; + } + } + + } + +} diff --git a/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/security/SecuredKeyCloakConfiguration.java b/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/security/SecuredKeyCloakConfiguration.java new file mode 100644 index 000000000..4ebd8ce5b --- /dev/null +++ b/persistence-service-v1/keycloak-commons/src/main/java/com/iqser/red/keycloak/commons/security/SecuredKeyCloakConfiguration.java @@ -0,0 +1,156 @@ +package com.iqser.red.keycloak.commons.security; + +import static com.iqser.red.keycloak.commons.UserCacheBuilder.USERS_CACHE; + +import java.time.Duration; + +import javax.servlet.http.HttpServletRequest; + +import org.keycloak.adapters.AdapterTokenStore; +import org.keycloak.adapters.BearerTokenRequestAuthenticator; +import org.keycloak.adapters.KeycloakDeployment; +import org.keycloak.adapters.QueryParameterTokenRequestAuthenticator; +import org.keycloak.adapters.RequestAuthenticator; +import org.keycloak.adapters.spi.HttpFacade; +import org.keycloak.adapters.springboot.KeycloakBaseSpringBootConfiguration; +import org.keycloak.adapters.springboot.KeycloakSpringBootConfigResolver; +import org.keycloak.adapters.springsecurity.KeycloakConfiguration; +import org.keycloak.adapters.springsecurity.authentication.KeycloakAuthenticationProvider; +import org.keycloak.adapters.springsecurity.authentication.SpringSecurityRequestAuthenticator; +import org.keycloak.adapters.springsecurity.authentication.SpringSecurityRequestAuthenticatorFactory; +import org.keycloak.adapters.springsecurity.config.KeycloakWebSecurityConfigurerAdapter; +import org.keycloak.adapters.springsecurity.filter.KeycloakAuthenticationProcessingFilter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.cache.RedisCacheManagerBuilderCustomizer; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Import; +import org.springframework.context.annotation.Primary; +import org.springframework.data.redis.cache.RedisCacheConfiguration; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.builders.WebSecurity; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.core.authority.mapping.SimpleAuthorityMapper; +import org.springframework.security.web.authentication.HttpStatusEntryPoint; +import org.springframework.security.web.authentication.session.NullAuthenticatedSessionStrategy; +import org.springframework.security.web.authentication.session.SessionAuthenticationStrategy; + +import com.iqser.red.keycloak.commons.KeyCloakSettings; + +import lombok.RequiredArgsConstructor; + +@ConditionalOnProperty(value = "keycloak.enabled", havingValue = "true") +@RequiredArgsConstructor +@KeycloakConfiguration +@EnableConfigurationProperties(KeyCloakSettings.class) +@Import(KeycloakSpringBootConfigResolver.class) +public class SecuredKeyCloakConfiguration extends KeycloakWebSecurityConfigurerAdapter { + private final KeyCloakSettings keyCloakSettings; + + @Bean + public KeycloakBaseSpringBootConfiguration keycloakBaseSpringBootConfiguration() { + + return new KeycloakBaseSpringBootConfiguration(); + } + + + // Submits the KeycloakAuthenticationProvider to the AuthenticationManager + @Autowired + public void configureGlobal(AuthenticationManagerBuilder auth) { + + KeycloakAuthenticationProvider keycloakAuthenticationProvider = keycloakAuthenticationProvider(); + SimpleAuthorityMapper simpleAuthorityMapper = new SimpleAuthorityMapper(); + simpleAuthorityMapper.setPrefix(""); + keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(simpleAuthorityMapper); + auth.authenticationProvider(keycloakAuthenticationProvider); + } + + + @Override + public void configure(WebSecurity web) { + + web.ignoring().antMatchers("/actuator/health/**", + "/redaction-gateway-v1/async/download/with-ott/**", + "/api/async/download/with-ott/**", + "/api/docs", + "/api/docs/**", + "/", + "/api", + "/internal-api/**"); + + web.ignoring().antMatchers(HttpMethod.OPTIONS, "/**"); + } + + + @Bean + @Primary + @Override + protected KeycloakAuthenticationProcessingFilter keycloakAuthenticationProcessingFilter() throws Exception { + + KeycloakAuthenticationProcessingFilter filter = new KeycloakAuthenticationProcessingFilter(authenticationManagerBean()); + filter.setSessionAuthenticationStrategy(sessionAuthenticationStrategy()); + filter.setRequestAuthenticatorFactory(new SpringSecurityRequestAuthenticatorFactory() { + + @Override + public RequestAuthenticator createRequestAuthenticator(HttpFacade facade, + HttpServletRequest request, + KeycloakDeployment deployment, + AdapterTokenStore tokenStore, + int sslRedirectPort) { + + return new SpringSecurityRequestAuthenticator(facade, request, deployment, tokenStore, sslRedirectPort) { + + @Override + protected BearerTokenRequestAuthenticator createBearerTokenAuthenticator() { + + return new RedBearerTokenRequestAuthenticator(deployment, keyCloakSettings.getIssuer()); + } + + + @Override + protected QueryParameterTokenRequestAuthenticator createQueryParameterTokenRequestAuthenticator() { + + return new RedQueryParameterTokenRequestAuthenticator(deployment, keyCloakSettings.getIssuer()); + } + }; + } + }); + + return filter; + } + + + // Specifies the session authentication strategy + @Bean + @Override + protected SessionAuthenticationStrategy sessionAuthenticationStrategy() { + + return new NullAuthenticatedSessionStrategy(); + } + + + @Override + protected void configure(HttpSecurity http) throws Exception { + + super.configure(http); + + http.anonymous().disable(); + + http.authorizeRequests().anyRequest().authenticated(); + + http.csrf().disable(); + + http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); + + http.exceptionHandling().authenticationEntryPoint(new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED)); + + } + + + +} diff --git a/persistence-service-v1/persistence-service-api-v1/src/test/java/com/iqser/red/service/persistence/service/v1/api/model/IdentityTest.java b/persistence-service-v1/keycloak-commons/src/test/java/com/iqser/red/keycloak/commons/IdentityTest.java similarity index 78% rename from persistence-service-v1/persistence-service-api-v1/src/test/java/com/iqser/red/service/persistence/service/v1/api/model/IdentityTest.java rename to persistence-service-v1/keycloak-commons/src/test/java/com/iqser/red/keycloak/commons/IdentityTest.java index fa201e412..fbb8a0d17 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/test/java/com/iqser/red/service/persistence/service/v1/api/model/IdentityTest.java +++ b/persistence-service-v1/keycloak-commons/src/test/java/com/iqser/red/keycloak/commons/IdentityTest.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model; +package com.iqser.red.keycloak.commons; import static org.assertj.core.api.Assertions.assertThat; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/AnnotationStatus.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/AnnotationStatus.java deleted file mode 100644 index 6f4d882d0..000000000 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/AnnotationStatus.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.model.annotations; - -public enum AnnotationStatus { - REQUESTED, - APPROVED, - DECLINED - -} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/DossierTemplateDictionaryStats.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/DossierTemplateDictionaryStats.java deleted file mode 100644 index 702b6fa40..000000000 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/DossierTemplateDictionaryStats.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate; - -import java.util.ArrayList; -import java.util.List; - -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.DictionarySummary; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class DossierTemplateDictionaryStats { - - private String dossierTemplateId; - private int numberOfDictionaries; // number of Types for the dossierTemplate - private List dictionarySummaryList = new ArrayList<>(); - -} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/DossierTemplateStatus.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/DossierTemplateStatus.java deleted file mode 100644 index aee28ae3b..000000000 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/DossierTemplateStatus.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate; - -public enum DossierTemplateStatus { - INCOMPLETE, - INACTIVE, - ACTIVE -} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/ReportTemplateUpdateRequest.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/ReportTemplateUpdateRequest.java deleted file mode 100644 index d4f764ecb..000000000 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/ReportTemplateUpdateRequest.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.NonNull; - -@Data -@Builder -@AllArgsConstructor -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class ReportTemplateUpdateRequest { - - @NonNull - private String fileName; - - private boolean multiFileReport; - private boolean activeByDefault; - -} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/configuration/DigitalSignatureType.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/configuration/DigitalSignatureType.java deleted file mode 100644 index 48e90baa8..000000000 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/configuration/DigitalSignatureType.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration; - -public enum DigitalSignatureType { - CERTIFICATE, - KMS, - HSM; -} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/configuration/Watermark.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/configuration/Watermark.java deleted file mode 100644 index 4d7912344..000000000 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/configuration/Watermark.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration; - -import java.time.OffsetDateTime; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class Watermark { - - private Long id; - private String name; - private boolean enabled; - private String dossierTemplateId; - private String text; - private String hexColor; - private int opacity; - private int fontSize; - private String fontType; - private String createdBy; - private OffsetDateTime dateAdded; - private OffsetDateTime dateModified; - private WatermarkOrientation orientation; - -} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/configuration/WatermarkOrientation.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/configuration/WatermarkOrientation.java deleted file mode 100644 index b95b3de64..000000000 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/configuration/WatermarkOrientation.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration; - -public enum WatermarkOrientation { - VERTICAL, - HORIZONTAL, - DIAGONAL -} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/DossierAttributeType.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/DossierAttributeType.java deleted file mode 100644 index bd1b877aa..000000000 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/DossierAttributeType.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier; - -public enum DossierAttributeType { - TEXT, - NUMBER, - DATE, - IMAGE -} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/DossierInformation.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/DossierInformation.java deleted file mode 100644 index 0fcf5a130..000000000 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/DossierInformation.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier; - -import lombok.Data; - -@Data -public class DossierInformation { - - private int numberOfActiveDossiers; - private int numberOfArchivedDossiers; - private int numberOfSoftDeletedDossiers; - private int numberOfHardDeletedDossiers; - -} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/DossierStats.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/DossierStats.java deleted file mode 100644 index 341eea58f..000000000 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/DossierStats.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier; - -import java.time.OffsetDateTime; -import java.util.Map; - -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -@EqualsAndHashCode(of = {"dossierId"}) -public class DossierStats { - - private String dossierId; - private int numberOfFiles; - private int numberOfSoftDeletedFiles; - private int numberOfPages; // sum of pages - private int numberOfExcludedPages; // sum of excludedPages - private boolean hasRedactionsFilePresent; // true if at least one file in the dossier has redactions - private boolean hasHintsNoRedactionsFilePresent; // true if at least one file in the dossier has hints but doesn't have redactions - private boolean hasSuggestionsFilePresent; // true if at least one file in the dossier has suggestions - private boolean hasUpdatesFilePresent; //true if at least one file in the dossier has updates - private boolean hasNoFlagsFilePresent; // true if at least one file in the dossier has none of the other flags - private Map fileCountPerProcessingStatus; - private Map fileCountPerWorkflowStatus; - private OffsetDateTime lastFileUpdateDate; - private OffsetDateTime fileManipulationDate; - -} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/DossierStatusInfo.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/DossierStatusInfo.java deleted file mode 100644 index ee20caf97..000000000 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/DossierStatusInfo.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier; - -import com.fasterxml.jackson.annotation.JsonProperty; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@Builder -@AllArgsConstructor -@NoArgsConstructor -public class DossierStatusInfo { - - @JsonProperty("dossierStatusId") - private String id; - private String name; - private String description; - private String color; - private String dossierTemplateId; - private int rank; - private Long dossierCount; - -} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/DossierVisibility.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/DossierVisibility.java deleted file mode 100644 index 14100676f..000000000 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/DossierVisibility.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier; - -public enum DossierVisibility { - - PRIVATE, - PUBLIC; -} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/file/FileAttributeType.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/file/FileAttributeType.java deleted file mode 100644 index c76c291e7..000000000 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/file/FileAttributeType.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file; - -public enum FileAttributeType { - TEXT, - NUMBER, - DATE -} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/file/WorkflowStatus.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/file/WorkflowStatus.java deleted file mode 100644 index e0b6465fd..000000000 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/file/WorkflowStatus.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file; - -public enum WorkflowStatus { - NEW, - UNDER_REVIEW, - UNDER_APPROVAL, - APPROVED -} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/type/DictionarySummary.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/type/DictionarySummary.java deleted file mode 100644 index cbbc4fc49..000000000 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/type/DictionarySummary.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class DictionarySummary { - - private String id; // type id - private String type; // type - private String name; // label - private long entriesCount; // entries size - -} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/ApplicationConfigurationResource.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/ApplicationConfigurationResource.java deleted file mode 100644 index a046e8029..000000000 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/ApplicationConfigurationResource.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.resources; - -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.ResponseStatus; - -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.ApplicationConfig; - -@ResponseStatus(value = HttpStatus.OK) -public interface ApplicationConfigurationResource { - - String APPLICATION_CONFIG_PATH = "/app-config"; - - - @ResponseStatus(value = HttpStatus.CREATED) - @PostMapping(value = APPLICATION_CONFIG_PATH, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - ApplicationConfig createOrUpdateAppConfig(@RequestBody ApplicationConfig appConfig); - - - @ResponseStatus(value = HttpStatus.OK) - @GetMapping(value = APPLICATION_CONFIG_PATH, produces = MediaType.APPLICATION_JSON_VALUE) - ApplicationConfig getCurrentApplicationConfig(); - -} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/AuditResource.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/AuditResource.java deleted file mode 100644 index 8f2508c5e..000000000 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/AuditResource.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.resources; - -import java.util.List; - -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.ResponseStatus; - -import com.iqser.red.service.persistence.service.v1.api.model.audit.AuditModel; -import com.iqser.red.service.persistence.service.v1.api.model.audit.AuditRequest; -import com.iqser.red.service.persistence.service.v1.api.model.audit.AuditSearchRequest; -import com.iqser.red.service.persistence.service.v1.api.model.audit.CategoryModel; -import com.iqser.red.service.persistence.service.v1.api.model.common.Page; - -public interface AuditResource { - - String PATH = "/audit"; - - - /** - * @param auditRequest - details to audit - * @throws org.springframework.web.server.ResponseStatusException - 404 - Not Found in case the object doesn't exist - */ - @ResponseBody - @ResponseStatus(value = HttpStatus.OK) - @PostMapping(value = PATH, consumes = MediaType.APPLICATION_JSON_VALUE) - void audit(@RequestBody AuditRequest auditRequest); - - - @ResponseBody - @ResponseStatus(value = HttpStatus.OK) - @PostMapping(value = PATH + "/search", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) - Page search(@RequestBody AuditSearchRequest auditSearchRequest); - - - @ResponseBody - @ResponseStatus(value = HttpStatus.OK) - @GetMapping(value = PATH + "/categories", produces = MediaType.APPLICATION_JSON_VALUE) - List getCategories(); - -} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/ComponentOverrideResource.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/ComponentOverrideResource.java deleted file mode 100644 index 0fdfcc0c8..000000000 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/ComponentOverrideResource.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.resources; - -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.ResponseStatus; - -import com.iqser.red.service.persistence.service.v1.api.model.component.ComponentsOverrides; -import com.iqser.red.service.persistence.service.v1.api.model.component.RevertOverrideRequest; - -public interface ComponentOverrideResource { - - String PATH = "/component"; - - String FILE_ID = "fileId"; - String FILE_ID_PATH_VARIABLE = "/{" + FILE_ID + "}"; - - String DOSSIER_ID_PARAM = "dossierId"; - String DOSSIER_ID_PATH_PARAM = "/{" + DOSSIER_ID_PARAM + "}"; - - - @ResponseBody - @ResponseStatus(value = HttpStatus.OK) - @PostMapping(value = PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE) - void addOverrides(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody ComponentsOverrides componentsOverrides); - - - @ResponseBody - @ResponseStatus(value = HttpStatus.OK) - @GetMapping(value = PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) - ComponentsOverrides getOverrides(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId); - - - @ResponseBody - @ResponseStatus(value = HttpStatus.OK) - @PostMapping(value = PATH + "/revert" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE) - void revertOverrides(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody RevertOverrideRequest revertOverrideRequest); - -} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/DictionaryResource.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/DictionaryResource.java deleted file mode 100644 index 2e4fae6c9..000000000 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/DictionaryResource.java +++ /dev/null @@ -1,113 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.resources; - -import java.util.List; - -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.ResponseStatus; - -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.Colors; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.DictionaryEntry; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.DictionaryEntryType; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.Type; - -@ResponseStatus(value = HttpStatus.OK) -public interface DictionaryResource { - - String DICTIONARY_PATH = "/dictionary"; - String TYPE_PATH = DICTIONARY_PATH + "/type"; - - String TYPE_PARAMETER_NAME = "type"; - String TYPE_PATH_VARIABLE = "/{" + TYPE_PARAMETER_NAME + "}"; - - String INCLUDE_DELETED_PARAMETER_NAME = "includeDeleted"; - String DOSSIER_TEMPLATE_PARAMETER_NAME = "dossierTemplateId"; - String DOSSIER_TEMPLATE_PATH_VARIABLE = "/{" + DOSSIER_TEMPLATE_PARAMETER_NAME + "}"; - - String DOSSIER_ID_PARAMETER_NAME = "dossierId"; - String DOSSIER_PATH = "/dossier"; - String DOSSIER_ID_PATH_VARIABLE = "/{" + DOSSIER_ID_PARAMETER_NAME + "}"; - - String FROM_VERSION_PARAM = "fromVersion"; - - String COLOR_PATH = "/color"; - String VERSION_PATH = "/version"; - String ENTRIES_PATH = "/entries"; - - - @ResponseStatus(HttpStatus.NO_CONTENT) - @PostMapping(value = DICTIONARY_PATH + TYPE_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE) - void addEntries(@PathVariable(TYPE_PARAMETER_NAME) String typeId, - @RequestBody List entries, - @RequestParam(value = "removeCurrent", required = false, defaultValue = "false") boolean removeCurrent, - @RequestParam(value = "ignoreInvalidEntries", required = false, defaultValue = "false") boolean ignoreInvalidEntries, - @RequestParam(value = "dictionaryEntryType", required = false, defaultValue = "ENTRY") DictionaryEntryType dictionaryEntryType); - - - @ResponseStatus(HttpStatus.NO_CONTENT) - @DeleteMapping(value = DICTIONARY_PATH + TYPE_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE) - void deleteEntries(@PathVariable(TYPE_PARAMETER_NAME) String typeId, - @RequestBody List entries, - @RequestParam(value = "dictionaryEntryType", required = false, defaultValue = "ENTRY") DictionaryEntryType dictionaryEntryType); - - - @ResponseStatus(HttpStatus.NO_CONTENT) - @PostMapping(value = TYPE_PATH + TYPE_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE) - void updateTypeValue(@PathVariable(TYPE_PARAMETER_NAME) String typeId, @RequestBody Type typeValue); - - - @ResponseStatus(HttpStatus.CREATED) - @PostMapping(value = TYPE_PATH, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - Type addType(@RequestBody Type typeValue); - - - @ResponseStatus(HttpStatus.NO_CONTENT) - @DeleteMapping(value = TYPE_PATH + TYPE_PATH_VARIABLE) - void deleteType(@PathVariable(TYPE_PARAMETER_NAME) String typeId); - - - @GetMapping(value = TYPE_PATH + DOSSIER_TEMPLATE_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) - List getAllTypesForDossierTemplate(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, - @RequestParam(value = INCLUDE_DELETED_PARAMETER_NAME, required = false, defaultValue = "false") boolean includeDeleted); - - - @GetMapping(value = TYPE_PATH + DOSSIER_PATH + DOSSIER_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) - List getAllTypesForDossier(@PathVariable(DOSSIER_ID_PARAMETER_NAME) String dossierId, - @RequestParam(value = INCLUDE_DELETED_PARAMETER_NAME, required = false, defaultValue = "false") boolean includeDeleted); - - - @GetMapping(value = DICTIONARY_PATH + TYPE_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) - Type getDictionaryForType(@PathVariable(TYPE_PARAMETER_NAME) String typeId, @RequestParam(value = FROM_VERSION_PARAM, required = false) Long fromVersion); - - - @GetMapping(value = DICTIONARY_PATH + TYPE_PATH_VARIABLE + ENTRIES_PATH, produces = MediaType.APPLICATION_JSON_VALUE) - List getEntriesForType(@PathVariable(TYPE_PARAMETER_NAME) String typeId, - @RequestParam(value = FROM_VERSION_PARAM, required = false) Long fromVersion, - @RequestParam(value = "dictionaryEntryType", required = false, defaultValue = "ENTRY") DictionaryEntryType dictionaryEntryType); - - - @GetMapping(value = VERSION_PATH + DOSSIER_TEMPLATE_PATH_VARIABLE) - long getVersion(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId); - - - @GetMapping(value = VERSION_PATH + DOSSIER_PATH + DOSSIER_ID_PATH_VARIABLE) - long getVersionForDossier(@PathVariable(DOSSIER_ID_PARAMETER_NAME) String dossierId); - - - @ResponseStatus(HttpStatus.NO_CONTENT) - @PostMapping(value = COLOR_PATH + DOSSIER_TEMPLATE_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE) - void setColors(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, @RequestBody Colors colors); - - - @ResponseBody - @GetMapping(value = COLOR_PATH + DOSSIER_TEMPLATE_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) - Colors getColors(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId); - -} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/DigitalSignatureResource.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/DigitalSignatureResource.java deleted file mode 100644 index 2c72d300b..000000000 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/DigitalSignatureResource.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.resources; - -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.ResponseStatus; - -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.DigitalSignature; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.DigitalSignatureKms; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.DigitalSignatureType; - -@ResponseStatus(value = HttpStatus.OK) -public interface DigitalSignatureResource { - - String DIGITAL_SIGNATURE_PATH = "/digital-signature"; - String DIGITAL_SIGNATURE_TYPE_PATH = DIGITAL_SIGNATURE_PATH + "/type"; - String DIGITAL_SIGNATURE_KMS_PATH = DIGITAL_SIGNATURE_PATH + "/kms"; - - String DIGITAL_SIGNATURE_TYPE = "digitalSignatureType"; - String DIGITAL_SIGNATURE_TYPE_VARIABLE = "/{" + DIGITAL_SIGNATURE_TYPE + "}"; - - - @GetMapping(value = DIGITAL_SIGNATURE_TYPE_PATH, produces = MediaType.APPLICATION_JSON_VALUE) - DigitalSignatureType getActiveDigitalSignatureType(); - - - @ResponseStatus(HttpStatus.NO_CONTENT) - @PostMapping(value = DIGITAL_SIGNATURE_TYPE_PATH + DIGITAL_SIGNATURE_TYPE_VARIABLE) - void setActiveDigitalSignatureType(@PathVariable(DIGITAL_SIGNATURE_TYPE) DigitalSignatureType digitalSignatureType); - - - @ResponseStatus(HttpStatus.CREATED) - @PostMapping(value = DIGITAL_SIGNATURE_PATH, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - DigitalSignature saveDigitalSignature(@RequestBody DigitalSignature digitalSignatureModel); - - - @ResponseStatus(HttpStatus.CREATED) - @PutMapping(value = DIGITAL_SIGNATURE_PATH, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - void updateDigitalSignature(@RequestBody DigitalSignature digitalSignatureModel); - - - @GetMapping(value = DIGITAL_SIGNATURE_PATH, produces = MediaType.APPLICATION_JSON_VALUE) - DigitalSignature getDigitalSignature(); - - - @ResponseStatus(HttpStatus.NO_CONTENT) - @DeleteMapping(value = DIGITAL_SIGNATURE_PATH) - void deleteDigitalSignature(); - - - @ResponseStatus(HttpStatus.CREATED) - @PostMapping(value = DIGITAL_SIGNATURE_KMS_PATH, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - DigitalSignatureKms saveDigitalSignatureKms(@RequestBody DigitalSignatureKms digitalSignature); - - - @GetMapping(value = DIGITAL_SIGNATURE_KMS_PATH, produces = MediaType.APPLICATION_JSON_VALUE) - DigitalSignatureKms getDigitalSignatureKms(); - - - @ResponseStatus(HttpStatus.NO_CONTENT) - @DeleteMapping(value = DIGITAL_SIGNATURE_KMS_PATH) - void deleteDigitalSignatureKms(); - -} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/DossierAttributesConfigResource.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/DossierAttributesConfigResource.java deleted file mode 100644 index 7a2e4a225..000000000 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/DossierAttributesConfigResource.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.resources; - -import java.util.List; - -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.ResponseStatus; - -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierAttributeConfig; - -public interface DossierAttributesConfigResource { - - String DOSSIER_ATTRIBUTE_PATH = "/dossier-attribute"; - - String DOSSIER_TEMPLATE_ID = "dossierTemplateId"; - String DOSSIER_TEMPLATE_ID_PATH_VARIABLE = "/{" + DOSSIER_TEMPLATE_ID + "}"; - - String DOSSIER_ATTRIBUTE_ID = "dossierAttributeId"; - String DOSSIER_ATTRIBUTE_ID_PATH_VARIABLE = "/{" + DOSSIER_ATTRIBUTE_ID + "}"; - - - @ResponseBody - @ResponseStatus(HttpStatus.OK) - @PostMapping(value = DOSSIER_ATTRIBUTE_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - DossierAttributeConfig addOrUpdateDossierAttribute(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, @RequestBody DossierAttributeConfig dossierAttributeConfig); - - - @ResponseBody - @ResponseStatus(HttpStatus.OK) - @PutMapping(value = DOSSIER_ATTRIBUTE_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - List setDossierAttributesConfig(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, - @RequestBody List dossierAttributesConfig); - - - @ResponseStatus(HttpStatus.NO_CONTENT) - @DeleteMapping(value = DOSSIER_ATTRIBUTE_PATH + DOSSIER_ATTRIBUTE_ID_PATH_VARIABLE) - void deleteDossierAttribute(@PathVariable(DOSSIER_ATTRIBUTE_ID) String dossierAttributeId); - - - @ResponseStatus(HttpStatus.NO_CONTENT) - @PostMapping(value = DOSSIER_ATTRIBUTE_PATH + "/delete") - void deleteDossierAttributes(@RequestBody List dossierAttributeIds); - - - @ResponseBody - @ResponseStatus(HttpStatus.OK) - @GetMapping(value = DOSSIER_ATTRIBUTE_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) - List getDossierAttributes(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId); - -} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/DossierAttributesResource.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/DossierAttributesResource.java deleted file mode 100644 index 24b8a5b76..000000000 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/DossierAttributesResource.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.resources; - -import java.util.List; - -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; - -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierAttribute; - -public interface DossierAttributesResource { - - String REST_PATH = "/dossierAttributes"; - String SET_PATH = "/set"; - String UPDATE_PATH = "/update"; - - String DOSSIER_ID_PARAM = "dossierId"; - String DOSSIER_ID_PATH_PARAM = "/{" + DOSSIER_ID_PARAM + "}"; - - String DOSSIER_ATTRIBUTE_ID_PARAM = "dossierAttributeId"; - String DOSSIER_ATTRIBUTE_ID_PATH_PARAM = "/{" + DOSSIER_ATTRIBUTE_ID_PARAM + "}"; - - - @PostMapping(value = REST_PATH + SET_PATH + DOSSIER_ID_PATH_PARAM, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - List setDossierAttributes(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @RequestBody List dossierAttributes); - - - @PostMapping(value = REST_PATH + UPDATE_PATH + DOSSIER_ID_PATH_PARAM, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - DossierAttribute addOrUpdateDossierAttribute(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @RequestBody DossierAttribute dossierAttribute); - - - @GetMapping(value = REST_PATH + DOSSIER_ID_PATH_PARAM, produces = MediaType.APPLICATION_JSON_VALUE) - List getDossierAttributes(@PathVariable(DOSSIER_ID_PARAM) String dossierId); - - - @DeleteMapping(value = REST_PATH + SET_PATH + DOSSIER_ID_PATH_PARAM + DOSSIER_ATTRIBUTE_ID_PATH_PARAM) - void deleteDossierAttribute(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(DOSSIER_ATTRIBUTE_ID_PARAM) String dossierAttributeId); - -} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/DossierResource.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/DossierResource.java deleted file mode 100644 index b4d053bf7..000000000 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/DossierResource.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.resources; - -import java.time.OffsetDateTime; -import java.util.List; -import java.util.Set; - -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.ResponseStatus; - -import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.CreateOrUpdateDossierRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.Dossier; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierChange; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierInformation; - -@ResponseStatus(value = HttpStatus.OK) -public interface DossierResource { - - String REST_PATH = "/dossier"; - String DOSSIER_TEMPLATE_PATH = "/dossier-template"; - String INFO_PATH = "/dossier-info"; - String DELETED_DOSSIERS_PATH = "/deletedDossiers"; - String HARD_DELETE_PATH = "/hardDelete"; - String UNDELETE_PATH = "/undelete"; - - String ARCHIVE_DOSSIERS_PATH = "/archivedDossiers"; - String ARCHIVE_PATH = "/archive"; - String UNARCHIVE_PATH = "/unarchive"; - - String DOSSIER_ID_PARAM = "dossierId"; - String DOSSIER_ID_PATH_PARAM = "/{" + DOSSIER_ID_PARAM + "}"; - String DOSSIER_TEMPLATE_ID_PARAM = "dossierTemplateId"; - String DOSSIER_TEMPLATE_ID_PATH_PARAM = "/{" + DOSSIER_TEMPLATE_ID_PARAM + "}"; - - String INCLUDE_DELETED_PARAM = "includeDeleted"; - String INCLUDE_ARCHIVED_PARAM = "includeArchived"; - - String CHANGES_PATH = "/changes"; - - - @ResponseBody - @ResponseStatus(value = HttpStatus.OK) - @PostMapping(value = REST_PATH + CHANGES_PATH, produces = MediaType.APPLICATION_JSON_VALUE) - Set changesSince(@RequestBody JSONPrimitive since); - - - @PostMapping(value = REST_PATH, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - Dossier addDossier(@RequestBody CreateOrUpdateDossierRequest dossierRequest); - - - @PostMapping(value = REST_PATH + DOSSIER_ID_PATH_PARAM, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - Dossier updateDossier(@RequestBody CreateOrUpdateDossierRequest dossierRequest, @PathVariable(DOSSIER_ID_PARAM) String dossierId); - - - @DeleteMapping(value = REST_PATH + DOSSIER_ID_PATH_PARAM) - void delete(@PathVariable(DOSSIER_ID_PARAM) String dossierId); - - - @GetMapping(value = REST_PATH, produces = MediaType.APPLICATION_JSON_VALUE) - List getAllDossiers(@RequestParam(name = INCLUDE_ARCHIVED_PARAM, defaultValue = "false", required = false) boolean includeArchived, - @RequestParam(name = INCLUDE_DELETED_PARAM, defaultValue = "false", required = false) boolean includeDeleted); - - - @GetMapping(value = REST_PATH + DOSSIER_TEMPLATE_PATH + DOSSIER_TEMPLATE_ID_PATH_PARAM, produces = MediaType.APPLICATION_JSON_VALUE) - List getAllDossiersForDossierTemplateId(@PathVariable(DOSSIER_TEMPLATE_ID_PARAM) String dossierTemplateId, - @RequestParam(name = INCLUDE_ARCHIVED_PARAM, defaultValue = "false", required = false) boolean includeArchived, - @RequestParam(name = INCLUDE_DELETED_PARAM, defaultValue = "false", required = false) boolean includeDeleted); - - - @PostMapping(value = INFO_PATH, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - DossierInformation getDossierInformation(@RequestBody List filteredDossierIds); - - - @GetMapping(value = REST_PATH + DOSSIER_ID_PATH_PARAM, produces = MediaType.APPLICATION_JSON_VALUE) - Dossier getDossierById(@PathVariable(DOSSIER_ID_PARAM) String dossierId, - @RequestParam(name = INCLUDE_ARCHIVED_PARAM, defaultValue = "false", required = false) boolean includeArchived, - @RequestParam(name = INCLUDE_DELETED_PARAM, defaultValue = "false", required = false) boolean includeDeleted); - - - @GetMapping(value = ARCHIVE_DOSSIERS_PATH, produces = MediaType.APPLICATION_JSON_VALUE) - List getArchivedDossiers(); - - - @GetMapping(value = ARCHIVE_DOSSIERS_PATH + DOSSIER_TEMPLATE_PATH + DOSSIER_TEMPLATE_ID_PATH_PARAM, produces = MediaType.APPLICATION_JSON_VALUE) - List getArchivedDossiersForDossierTemplateId(@PathVariable(DOSSIER_TEMPLATE_ID_PARAM) String dossierTemplateId); - - - @GetMapping(value = DELETED_DOSSIERS_PATH, produces = MediaType.APPLICATION_JSON_VALUE) - List getSoftDeletedDossiers(); - - - @DeleteMapping(value = DELETED_DOSSIERS_PATH + HARD_DELETE_PATH) - void hardDeleteDossiers(@RequestBody Set dossierIds); - - - @PostMapping(value = DELETED_DOSSIERS_PATH + UNDELETE_PATH) - void undeleteDossiers(@RequestBody Set dossierIds); - - - @PostMapping(value = ARCHIVE_DOSSIERS_PATH + ARCHIVE_PATH) - void archiveDossiers(@RequestBody Set dossierIds); - - - @PostMapping(value = ARCHIVE_DOSSIERS_PATH + UNARCHIVE_PATH) - void unarchiveDossiers(@RequestBody Set dossierIds); - -} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/DossierStatsResource.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/DossierStatsResource.java deleted file mode 100644 index ab4d3de93..000000000 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/DossierStatsResource.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.resources; - -import java.util.List; -import java.util.Set; - -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; - -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierStats; - -public interface DossierStatsResource { - - String REST_PATH = "/dossier-stats"; - - String DOSSIER_ID_PARAM = "dossierId"; - String DOSSIER_ID_PATH_PARAM = "/{" + DOSSIER_ID_PARAM + "}"; - - - @Deprecated - @GetMapping(value = REST_PATH + DOSSIER_ID_PATH_PARAM, produces = MediaType.APPLICATION_JSON_VALUE) - DossierStats getDossierStats(@PathVariable(DOSSIER_ID_PARAM) String dossierId); - - - @Deprecated - @PostMapping(value = REST_PATH, produces = MediaType.APPLICATION_JSON_VALUE) - List getDossierStats(@RequestBody Set dossierIds); - -} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/DossierTemplateResource.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/DossierTemplateResource.java deleted file mode 100644 index 0c587ef70..000000000 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/DossierTemplateResource.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.resources; - -import java.util.List; - -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.ResponseStatus; - -import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.CloneDossierTemplateRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.CreateOrUpdateDossierTemplateRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierTemplate; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.importexport.ExportDownloadRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.importexport.ImportDossierTemplateRequest; - -public interface DossierTemplateResource { - - String DOSSIER_TEMPLATE_PATH = "/dossier-template"; - - String DOSSIER_TEMPLATE_ID = "dossierTemplateId"; - String DOSSIER_TEMPLATE_ID_PATH_VARIABLE = "/{" + DOSSIER_TEMPLATE_ID + "}"; - - String USER_ID_PARAM = "userId"; - - String CLONE_PATH = "/clone"; - String EXPORT_PATH = "/export"; - String IMPORT_PATH = "/import"; - - - @ResponseBody - @ResponseStatus(HttpStatus.ACCEPTED) - @PostMapping(value = DOSSIER_TEMPLATE_PATH, consumes = MediaType.APPLICATION_JSON_VALUE) - DossierTemplate createOrUpdateDossierTemplate(@RequestBody CreateOrUpdateDossierTemplateRequest dossierTemplate); - - - @ResponseBody - @ResponseStatus(value = HttpStatus.OK) - @GetMapping(value = DOSSIER_TEMPLATE_PATH, produces = MediaType.APPLICATION_JSON_VALUE) - List getAllDossierTemplates(); - - - @ResponseBody - @ResponseStatus(value = HttpStatus.OK) - @GetMapping(value = DOSSIER_TEMPLATE_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) - DossierTemplate getDossierTemplate(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId); - - - @ResponseBody - @ResponseStatus(value = HttpStatus.NO_CONTENT) - @DeleteMapping(value = DOSSIER_TEMPLATE_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE) - void deleteDossierTemplate(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, @RequestParam(USER_ID_PARAM) String deletingUserId); - - - @ResponseBody - @ResponseStatus(HttpStatus.OK) - @PostMapping(value = DOSSIER_TEMPLATE_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE + CLONE_PATH, produces = MediaType.APPLICATION_JSON_VALUE) - DossierTemplate cloneDossierTemplate(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, @RequestBody CloneDossierTemplateRequest cloneDossierTemplateRequest); - - - @PostMapping(value = DOSSIER_TEMPLATE_PATH + EXPORT_PATH + "/prepare", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - JSONPrimitive prepareExportDownload(@RequestBody ExportDownloadRequest request); - - - @PostMapping(value = DOSSIER_TEMPLATE_PATH + EXPORT_PATH + "/create", consumes = MediaType.APPLICATION_JSON_VALUE) - void createExportDownload(@RequestParam String userId, @RequestParam String storageId); - - - @ResponseBody - @PostMapping(value = DOSSIER_TEMPLATE_PATH + IMPORT_PATH, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - DossierTemplate importDossierTemplate(@RequestBody ImportDossierTemplateRequest request); - -} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/DossierTemplateStatsResource.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/DossierTemplateStatsResource.java deleted file mode 100644 index 760eca233..000000000 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/DossierTemplateStatsResource.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.resources; - -import java.util.List; -import java.util.Set; - -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; - -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierTemplateDictionaryStats; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierTemplateStats; - -public interface DossierTemplateStatsResource { - - String REST_PATH = "/dossier-template-stats"; - - String DICTIONARY_PATH = "/dictionary"; - - String DOSSIER_TEMPLATE_ID = "dossierTemplateId"; - String DOSSIER_TEMPLATE_ID_PATH_VARIABLE = "/{" + DOSSIER_TEMPLATE_ID + "}"; - - - @PostMapping(value = REST_PATH + DICTIONARY_PATH, produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) - List getDossierTemplateDictionaryStats(@RequestBody Set dossierTemplateIds); - - - @PostMapping(value = REST_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) - DossierTemplateStats getDossierTemplateStats(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId); - - - @PostMapping(value = REST_PATH, produces = MediaType.APPLICATION_JSON_VALUE) - List getDossierTemplateStats(); - -} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/DownloadResource.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/DownloadResource.java deleted file mode 100644 index 20f5c8447..000000000 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/DownloadResource.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.resources; - -import java.util.List; - -import com.iqser.red.service.persistence.service.v1.api.model.download.DownloadWithOptionRequest; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.ResponseStatus; - -import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive; -import com.iqser.red.service.persistence.service.v1.api.model.download.DownloadRequest; -import com.iqser.red.service.persistence.service.v1.api.model.download.DownloadStatus; - -@ResponseStatus(value = HttpStatus.OK) -public interface DownloadResource { - - String REST_PATH = "/download"; - String USER_ID = "userId"; - - - @PostMapping(value = REST_PATH + "/prepare", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - JSONPrimitive prepareDownload(@RequestBody DownloadRequest request); - - @PostMapping(value = REST_PATH + "/prepare-option", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - JSONPrimitive prepareDownload(@RequestBody DownloadWithOptionRequest request); - - @GetMapping(value = REST_PATH + "/status/{" + USER_ID + "}", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - List getDownloadStatus(@PathVariable(USER_ID) String userId); - - - @PostMapping(value = REST_PATH + "/setDownloaded", consumes = MediaType.APPLICATION_JSON_VALUE) - void setDownloaded(@RequestBody JSONPrimitive setDownloadedRequest); - - - @PostMapping(value = REST_PATH + "/delete", consumes = MediaType.APPLICATION_JSON_VALUE) - void deleteDownloadStatus(@RequestBody JSONPrimitive setDownloadedRequest); - -} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/FileAttributesConfigResource.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/FileAttributesConfigResource.java deleted file mode 100644 index 6c1ac4203..000000000 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/FileAttributesConfigResource.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.resources; - -import java.util.List; - -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.ResponseStatus; - -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.FileAttributesGeneralConfiguration; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileAttributeConfig; - -public interface FileAttributesConfigResource { - - String FILE_ATTRIBUTES_PATH = "/fileAttributes"; - String FILE_ATTRIBUTE_PATH = "/fileAttribute"; - String BASE_CONFIG_PATH = "/baseConfig"; - - String DELETE_PATH = "/delete"; - - String DOSSIER_TEMPLATE_ID = "dossierTemplateId"; - String DOSSIER_TEMPLATE_ID_PATH_VARIABLE = "/{" + DOSSIER_TEMPLATE_ID + "}"; - - String FILE_ATTRIBUTE_ID = "fileAttributeId"; - String FILE_ATTRIBUTE_ID_PATH_VARIABLE = "/{" + FILE_ATTRIBUTE_ID + "}"; - - String UTF_ENCODING = "UTF-8"; - String ASCII_ENCODING = "ASCII"; - String ISO_ENCODING = "ISO"; - - @ResponseBody - @ResponseStatus(HttpStatus.OK) - @PutMapping(value = FILE_ATTRIBUTES_PATH + BASE_CONFIG_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - FileAttributesGeneralConfiguration setFileAttributesGeneralConfig(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, - @RequestBody FileAttributesGeneralConfiguration fileAttributesConfig); - - - @ResponseBody - @ResponseStatus(HttpStatus.OK) - @GetMapping(value = FILE_ATTRIBUTES_PATH + BASE_CONFIG_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) - FileAttributesGeneralConfiguration getFileAttributesGeneralConfig(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId); - - - @ResponseBody - @ResponseStatus(HttpStatus.OK) - @PostMapping(value = FILE_ATTRIBUTES_PATH + FILE_ATTRIBUTE_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - FileAttributeConfig addOrUpdateFileAttributeConfig(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, @RequestBody FileAttributeConfig fileAttributeConfig); - - - @ResponseBody - @ResponseStatus(HttpStatus.OK) - @PutMapping(value = FILE_ATTRIBUTES_PATH + FILE_ATTRIBUTE_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - List setFileAttributesConfig(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, @RequestBody List fileAttributesConfig); - - - @ResponseStatus(HttpStatus.NO_CONTENT) - @DeleteMapping(value = FILE_ATTRIBUTES_PATH + FILE_ATTRIBUTE_PATH + FILE_ATTRIBUTE_ID_PATH_VARIABLE) - void deleteFileAttributeConfigs(@PathVariable(FILE_ATTRIBUTE_ID) String fileAttributeId); - - - @ResponseStatus(HttpStatus.NO_CONTENT) - @PostMapping(value = FILE_ATTRIBUTES_PATH + FILE_ATTRIBUTE_PATH + DELETE_PATH) - void deleteFileAttributeConfigs(@RequestBody List fileAttributeIds); - - - @ResponseBody - @ResponseStatus(HttpStatus.OK) - @GetMapping(value = FILE_ATTRIBUTES_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) - List getFileAttributeConfigs(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId); - -} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/FileAttributesResource.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/FileAttributesResource.java deleted file mode 100644 index d2d04ed38..000000000 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/FileAttributesResource.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.resources; - -import java.util.Map; - -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; - -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.ImportCsvRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.ImportCsvResponse; - -public interface FileAttributesResource { - - String REST_PATH = "/fileAttributes"; - String CSV_IMPORT_PATH = "/csvImport"; - String SET_PATH = "/set"; - - String DOSSIER_ID_PARAM = "dossierId"; - String DOSSIER_ID_PATH_PARAM = "/{" + DOSSIER_ID_PARAM + "}"; - - String FILE_ID = "fileId"; - String FILE_ID_PATH_VARIABLE = "/{" + FILE_ID + "}"; - - - @PostMapping(value = REST_PATH + CSV_IMPORT_PATH + DOSSIER_ID_PATH_PARAM, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - ImportCsvResponse importCsv(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @RequestBody ImportCsvRequest importCsvRequest); - - - @PostMapping(value = REST_PATH + SET_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE) - void setFileAttributes(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody Map fileAttributes); - -} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/LicenseReportResource.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/LicenseReportResource.java deleted file mode 100644 index c3b19a6b7..000000000 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/LicenseReportResource.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.resources; - -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.ResponseStatus; - -import com.iqser.red.service.persistence.service.v1.api.model.license.LicenseReport; -import com.iqser.red.service.persistence.service.v1.api.model.license.LicenseReportRequest; - -public interface LicenseReportResource { - - @ResponseBody - @ResponseStatus(value = HttpStatus.OK) - @PostMapping(value = "/report/license", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - LicenseReport getLicenseReport(@RequestBody LicenseReportRequest licenseReportRequest, - @RequestParam(value = "offset", defaultValue = "0") int offset, - @RequestParam(value = "limit", defaultValue = "20") int limit); - -} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/ManualRedactionResource.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/ManualRedactionResource.java deleted file mode 100644 index a25f4af13..000000000 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/ManualRedactionResource.java +++ /dev/null @@ -1,179 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.resources; - -import java.util.List; - -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.ResponseStatus; - -import com.iqser.red.service.persistence.service.v1.api.model.annotations.AddRedactionRequest; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.Comment; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.CommentRequest; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.ForceRedactionRequest; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.ImageRecategorizationRequest; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.LegalBasisChangeRequest; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.ManualAddResponse; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.ManualRedactions; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.RemoveRedactionRequest; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.ResizeRedactionRequest; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.UpdateRedactionRequest; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.entitymapped.IdRemoval; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.entitymapped.ManualForceRedaction; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.entitymapped.ManualImageRecategorization; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.entitymapped.ManualLegalBasisChange; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.entitymapped.ManualRedactionEntry; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.entitymapped.ManualResizeRedaction; - -@ResponseStatus(value = HttpStatus.OK) -public interface ManualRedactionResource { - - String MANUAL_REDACTION_REST_PATH = "/manualRedaction"; - - String DOSSIER_ID = "dossierId"; - String DOSSIER_ID_PATH_PARAM = "/{" + DOSSIER_ID + "}"; - - String FILE_ID = "fileId"; - String FILE_ID_PATH_VARIABLE = "/{" + FILE_ID + "}"; - - String ANNOTATION_ID = "annotationId"; - String ANNOTATION_ID_PATH_VARIABLE = "/{" + ANNOTATION_ID + "}"; - - String COMMENT_ID = "commentId"; - String COMMENT_ID_PATH_VARIABLE = "/{" + COMMENT_ID + "}"; - - String DELETE_PATH = "/delete"; - - - @PostMapping(value = MANUAL_REDACTION_REST_PATH + "/add" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - List addAddRedaction(@PathVariable(DOSSIER_ID) String dossierId, - @PathVariable(FILE_ID) String fileId, - @RequestBody List addRedactionRequests); - - - @PostMapping(value = MANUAL_REDACTION_REST_PATH + "/remove" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - List addRemoveRedaction(@PathVariable(DOSSIER_ID) String dossierId, - @PathVariable(FILE_ID) String fileId, - @RequestBody List removeRedactionRequest); - - - @PostMapping(value = MANUAL_REDACTION_REST_PATH + "/force" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - List addForceRedaction(@PathVariable(DOSSIER_ID) String dossierId, - @PathVariable(FILE_ID) String fileId, - @RequestBody List forceRedactionRequests); - - - @PostMapping(value = MANUAL_REDACTION_REST_PATH + "/legalBasis" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - List addLegalBasisChange(@PathVariable(DOSSIER_ID) String dossierId, - @PathVariable(FILE_ID) String fileId, - @RequestBody List legalBasisChangeRequests); - - - @PostMapping(value = MANUAL_REDACTION_REST_PATH + "/recategorize" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - List addImageRecategorization(@PathVariable(DOSSIER_ID) String dossierId, - @PathVariable(FILE_ID) String fileId, - @RequestBody List imageRecategorizationRequests); - - - @PostMapping(value = MANUAL_REDACTION_REST_PATH + "/comment" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + ANNOTATION_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - Comment addComment(@PathVariable(DOSSIER_ID) String dossierId, - @PathVariable(FILE_ID) String fileId, - @PathVariable(ANNOTATION_ID) String annotationId, - @RequestBody CommentRequest comment); - - - @PostMapping(value = MANUAL_REDACTION_REST_PATH + "/resize" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - List addResizeRedaction(@PathVariable(DOSSIER_ID) String dossierId, - @PathVariable(FILE_ID) String fileId, - @RequestBody List resizeRedactionRequests); - - - @GetMapping(value = MANUAL_REDACTION_REST_PATH + "/add" + FILE_ID_PATH_VARIABLE + ANNOTATION_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) - ManualRedactionEntry getAddRedaction(@PathVariable(FILE_ID) String fileId, @PathVariable(ANNOTATION_ID) String annotationId); - - - @GetMapping(value = MANUAL_REDACTION_REST_PATH + "/remove" + FILE_ID_PATH_VARIABLE + ANNOTATION_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) - IdRemoval getRemoveRedaction(@PathVariable(FILE_ID) String fileId, @PathVariable(ANNOTATION_ID) String annotationId); - - - @GetMapping(value = MANUAL_REDACTION_REST_PATH + "/force" + FILE_ID_PATH_VARIABLE + ANNOTATION_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) - ManualForceRedaction getForceRedaction(@PathVariable(FILE_ID) String fileId, @PathVariable(ANNOTATION_ID) String annotationId); - - - @GetMapping(value = MANUAL_REDACTION_REST_PATH + "/legalBasis" + FILE_ID_PATH_VARIABLE + ANNOTATION_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) - ManualLegalBasisChange getLegalBasisChange(@PathVariable(FILE_ID) String fileId, @PathVariable(ANNOTATION_ID) String annotationId); - - - @GetMapping(value = MANUAL_REDACTION_REST_PATH + "/recategorize" + FILE_ID_PATH_VARIABLE + ANNOTATION_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) - ManualImageRecategorization getImageRecategorization(@PathVariable(FILE_ID) String fileId, @PathVariable(ANNOTATION_ID) String annotationId); - - - @GetMapping(value = MANUAL_REDACTION_REST_PATH + "/comment" + COMMENT_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) - Comment getComment(@PathVariable(COMMENT_ID) long commentId); - - - @GetMapping(value = MANUAL_REDACTION_REST_PATH + "/resize" + FILE_ID_PATH_VARIABLE + ANNOTATION_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) - ManualResizeRedaction getResizeRedaction(@PathVariable(FILE_ID) String fileId, @PathVariable(ANNOTATION_ID) String annotationId); - - - @PostMapping(MANUAL_REDACTION_REST_PATH + DELETE_PATH + "/add" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE) - void deleteAddRedaction(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody List annotationIds); - - - @PostMapping(MANUAL_REDACTION_REST_PATH + DELETE_PATH + "/remove" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE) - void deleteRemoveRedaction(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody List annotationIds); - - - @PostMapping(MANUAL_REDACTION_REST_PATH + DELETE_PATH + "/force" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE) - void deleteForceRedaction(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody List annotationIds); - - - @PostMapping(MANUAL_REDACTION_REST_PATH + DELETE_PATH + "/legalBasis" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE) - void deleteLegalBasisChange(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody List annotationIds); - - - @PostMapping(MANUAL_REDACTION_REST_PATH + DELETE_PATH + "/recategorize" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE) - void deleteImageRecategorization(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody List annotationIds); - - - @PostMapping(MANUAL_REDACTION_REST_PATH + DELETE_PATH + "/comment" + FILE_ID_PATH_VARIABLE) - void deleteComment(@PathVariable(FILE_ID) String fileId, @RequestBody List commentIds); - - - @PostMapping(MANUAL_REDACTION_REST_PATH + DELETE_PATH + "/resize" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE) - void deleteResizeRedaction(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody List annotationIds); - - - @PostMapping(value = MANUAL_REDACTION_REST_PATH + "/status/add" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE) - void updateAddRedactionStatus(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody UpdateRedactionRequest updateStatusRequest); - - - @PostMapping(value = MANUAL_REDACTION_REST_PATH + "/status/remove" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE) - void updateRemoveRedactionStatus(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody UpdateRedactionRequest updateStatusRequest); - - - @PostMapping(value = MANUAL_REDACTION_REST_PATH + "/status/force" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE) - void updateForceRedactionStatus(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody UpdateRedactionRequest updateStatusRequest); - - - @PostMapping(value = MANUAL_REDACTION_REST_PATH + "/status/legalBasis" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE) - void updateLegalBasisChangeStatus(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody UpdateRedactionRequest updateStatusRequest); - - - @PostMapping(value = MANUAL_REDACTION_REST_PATH + "/status/recategorize" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE) - void updateImageRecategorizationStatus(@PathVariable(DOSSIER_ID) String dossierId, - @PathVariable(FILE_ID) String fileId, - @RequestBody UpdateRedactionRequest updateStatusRequest); - - - @PostMapping(value = MANUAL_REDACTION_REST_PATH + "/status/resize" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE) - void updateResizeRedactionStatus(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody UpdateRedactionRequest updateStatusRequest); - - - @GetMapping(value = MANUAL_REDACTION_REST_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) - ManualRedactions getManualRedactions(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId); - -} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/NotificationPreferencesResource.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/NotificationPreferencesResource.java deleted file mode 100644 index 06491fcf1..000000000 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/NotificationPreferencesResource.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.resources; - -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.ResponseStatus; - -import com.iqser.red.service.persistence.service.v1.api.model.notification.NotificationPreferences; - -public interface NotificationPreferencesResource { - - String REST_PATH = "/notification-preferences"; - - String USER_ID_PARAM = "userId"; - String USER_ID_PATH_PARAM = "/{" + USER_ID_PARAM + "}"; - - - @PostMapping(value = REST_PATH + USER_ID_PATH_PARAM, consumes = MediaType.APPLICATION_JSON_VALUE) - void setNotificationPreferences(@PathVariable(USER_ID_PARAM) String userId, @RequestBody NotificationPreferences notificationRequest); - - - @ResponseStatus(value = HttpStatus.OK) - @GetMapping(value = REST_PATH + USER_ID_PATH_PARAM, produces = MediaType.APPLICATION_JSON_VALUE) - NotificationPreferences getNotificationPreferences(@PathVariable(USER_ID_PARAM) String userId); - - - @DeleteMapping(value = REST_PATH + USER_ID_PATH_PARAM, consumes = MediaType.APPLICATION_JSON_VALUE) - void deleteNotificationPreferences(@PathVariable(USER_ID_PARAM) String userId); - -} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/NotificationResource.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/NotificationResource.java deleted file mode 100644 index 8908cf013..000000000 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/NotificationResource.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.resources; - -import java.time.OffsetDateTime; -import java.util.List; - -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.ResponseStatus; - -import com.iqser.red.service.persistence.service.v1.api.model.audit.AddNotificationRequest; -import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive; -import com.iqser.red.service.persistence.service.v1.api.model.notification.Notification; - -@ResponseStatus(value = HttpStatus.OK) -public interface NotificationResource { - - String NOTIFICATION_PATH = "/notification"; - String TOGGLE_SEEN_PATH = "/toggle-seen"; - String TOGGLE_READ_PATH = "/toggle-read"; - String CHANGES_PATH = "/has-changes"; - - String USER_ID_PARAM = "userId"; - String USER_ID_PATH_PARAM = "/{" + USER_ID_PARAM + "}"; - - String INCLUDE_SEEN_PARAM = "includeSeen"; - String SET_SEEN_PARAM = "setSeen"; - String SET_READ_PARAM = "setRead"; - - - @ResponseBody - @ResponseStatus(value = HttpStatus.OK) - @PostMapping(value = NOTIFICATION_PATH + CHANGES_PATH + USER_ID_PATH_PARAM, produces = MediaType.APPLICATION_JSON_VALUE) - JSONPrimitive hasNewNotificationsSince(@PathVariable(USER_ID_PARAM) String userId, @RequestBody JSONPrimitive since); - - - @PostMapping(value = NOTIFICATION_PATH, consumes = MediaType.APPLICATION_JSON_VALUE) - void addNotification(@RequestBody AddNotificationRequest addNotificationRequest); - - - @PostMapping(value = NOTIFICATION_PATH + TOGGLE_SEEN_PATH + USER_ID_PATH_PARAM, consumes = MediaType.APPLICATION_JSON_VALUE) - void toggleSeen(@PathVariable(USER_ID_PARAM) String userId, @RequestBody List notificationIds, @RequestParam(SET_SEEN_PARAM) boolean setSeen); - - - @PostMapping(value = NOTIFICATION_PATH + TOGGLE_READ_PATH + USER_ID_PATH_PARAM, consumes = MediaType.APPLICATION_JSON_VALUE) - void toggleRead(@PathVariable(USER_ID_PARAM) String userId, @RequestBody List notificationIds, @RequestParam(SET_READ_PARAM) boolean setRead); - - - @DeleteMapping(value = NOTIFICATION_PATH + USER_ID_PATH_PARAM, consumes = MediaType.APPLICATION_JSON_VALUE) - void softDelete(@PathVariable(USER_ID_PARAM) String userId, @RequestBody List notificationIds); - - - @ResponseBody - @ResponseStatus(value = HttpStatus.OK) - @GetMapping(value = NOTIFICATION_PATH + USER_ID_PATH_PARAM, produces = MediaType.APPLICATION_JSON_VALUE) - List getNotifications(@PathVariable(USER_ID_PARAM) String userId, @RequestParam(INCLUDE_SEEN_PARAM) boolean includeSeen); - -} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/ReanalysisResource.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/ReanalysisResource.java deleted file mode 100644 index 8e8c3a188..000000000 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/ReanalysisResource.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.resources; - -import java.util.Set; - -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.ResponseStatus; - -import com.iqser.red.service.pdftron.redaction.v1.api.model.ByteContentDocument; -import com.iqser.red.service.pdftron.redaction.v1.api.model.highlights.TextHighlightConversionRequest; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.DeleteImportedRedactionsRequest; - -@ResponseStatus(value = HttpStatus.NO_CONTENT) -public interface ReanalysisResource { - - String REANALYZE_PATH = "/reanalyze"; - String IMPORT_REDACTIONS_PATH = "/import-redactions"; - String CONVERT_TEXT_HIGHLIGHTS_PATH = "/convert-texthighlights"; - String OCR_REANALYZE_PATH = "/ocr/reanalyze"; - String REINDEX_PATH = "/reindex"; - String DOSSIER_ID_PARAM = "dossierId"; - String DOSSIER_ID_PATH_PARAM = "/{" + DOSSIER_ID_PARAM + "}"; - String FILE_ID_PARAM = "fileId"; - String FILE_ID_PATH_PARAM = "/{" + FILE_ID_PARAM + "}"; - String BULK_REST_PATH = "/bulk"; - String FALSE = "false"; - - - @PostMapping(value = REANALYZE_PATH + DOSSIER_ID_PATH_PARAM) - void reanalyzeDossier(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @RequestParam(value = "force", required = false, defaultValue = FALSE) boolean force); - - - @PostMapping(value = REANALYZE_PATH + DOSSIER_ID_PATH_PARAM + BULK_REST_PATH) - void reanalyzeFiles(@PathVariable(DOSSIER_ID_PARAM) String dossierId, - @RequestBody Set fileIds, - @RequestParam(value = "force", required = false, defaultValue = FALSE) boolean force); - - - @PostMapping(value = OCR_REANALYZE_PATH + DOSSIER_ID_PATH_PARAM) - void ocrDossier(@PathVariable(DOSSIER_ID_PARAM) String dossierId); - - - @PostMapping(value = OCR_REANALYZE_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_PARAM) - void ocrFile(@PathVariable(DOSSIER_ID_PARAM) String dossierId, - @PathVariable(FILE_ID_PARAM) String fileId, - @RequestParam(value = "force", required = false, defaultValue = FALSE) boolean force); - - - @PostMapping(value = OCR_REANALYZE_PATH + DOSSIER_ID_PATH_PARAM + BULK_REST_PATH) - void ocrFiles(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @RequestBody Set fileIds); - - - @PostMapping(value = REINDEX_PATH) - void reindex(@RequestParam(value = DOSSIER_ID_PARAM, required = false) String dossierId, - @RequestParam(value = "dropIndex", required = false, defaultValue = FALSE) boolean dropIndex, - @RequestBody Set fileIds); - - - @PostMapping(value = IMPORT_REDACTIONS_PATH, consumes = MediaType.APPLICATION_JSON_VALUE) - void importRedactions(@RequestBody ByteContentDocument documentRequest); - - - @PostMapping(value = IMPORT_REDACTIONS_PATH + "/delete", consumes = MediaType.APPLICATION_JSON_VALUE) - void deleteImportedRedactions(@RequestBody DeleteImportedRedactionsRequest deleteImportedRedactionsRequest); - - - @PostMapping(value = CONVERT_TEXT_HIGHLIGHTS_PATH, consumes = MediaType.APPLICATION_JSON_VALUE) - void convertTextHighlights(@RequestBody TextHighlightConversionRequest textHighlightRequest); - -} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/RedactionLogResource.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/RedactionLogResource.java deleted file mode 100644 index 14b2b350a..000000000 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/RedactionLogResource.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.resources; - -import java.util.List; - -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.ResponseStatus; - -import com.iqser.red.service.persistence.service.v1.api.model.redactionlog.FilteredRedactionLogRequest; -import com.iqser.red.service.redaction.v1.model.RedactionLog; -import com.iqser.red.service.redaction.v1.model.SectionGrid; - -@ResponseStatus(value = HttpStatus.OK) -public interface RedactionLogResource { - - String REDACTION_LOG_PATH = "/redactionLog"; - String SECTION_GRID_PATH = "/sectionGrid"; - - String FILE_ID = "fileId"; - String FILE_ID_PATH_VARIABLE = "/{" + FILE_ID + "}"; - - String DOSSIER_ID_PARAM = "dossierId"; - String DOSSIER_ID_PATH_PARAM = "/{" + DOSSIER_ID_PARAM + "}"; - - - @GetMapping(value = REDACTION_LOG_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) - RedactionLog getRedactionLog(@PathVariable(DOSSIER_ID_PARAM) String dossierId, - @PathVariable(FILE_ID) String fileId, - @RequestParam(value = "excludedType", required = false) List excludedTypes, - @RequestParam(value = "withManualRedactions", required = false, defaultValue = "true") boolean withManualRedactions, - @RequestParam(value = "includeFalsePositives", required = false, defaultValue = "false") boolean includeFalsePositives); - - - @GetMapping(value = SECTION_GRID_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) - SectionGrid getSectionGrid(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId); - - - @PostMapping(value = REDACTION_LOG_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + "/filtered", produces = MediaType.APPLICATION_JSON_VALUE) - RedactionLog getFilteredRedactionLog(@PathVariable(DOSSIER_ID_PARAM) String dossierId, - @PathVariable(FILE_ID) String fileId, - @RequestBody FilteredRedactionLogRequest filteredRedactionLogRequest); - -} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/ReportTemplateResource.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/ReportTemplateResource.java deleted file mode 100644 index 8a0401e47..000000000 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/ReportTemplateResource.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.resources; - -import java.util.List; - -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; - -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.ReportTemplate; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.ReportTemplateDownload; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.ReportTemplateUpdateRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.ReportTemplateUploadRequest; - -public interface ReportTemplateResource { - - String REPORT_TEMPLATE_UPLOAD_PATH = "/templateUpload"; - - String DOSSIER_TEMPLATE_ID = "dossierTemplateId"; - String DOSSIER_TEMPLATE_ID_PATH_VARIABLE = "/{" + DOSSIER_TEMPLATE_ID + "}"; - - String TEMPLATE_ID = "templateId"; - String TEMPLATE_ID_PATH_VARIABLE = "/{" + TEMPLATE_ID + "}"; - - String DOWNLOAD_PATH = "download"; - String UPDATE_PATH = "update"; - - - @PostMapping(value = REPORT_TEMPLATE_UPLOAD_PATH, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - ReportTemplate uploadTemplate(@RequestBody ReportTemplateUploadRequest reportTemplateUploadRequest); - - - @GetMapping(value = REPORT_TEMPLATE_UPLOAD_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) - List getAvailableReportTemplates(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId); - - - @GetMapping(value = REPORT_TEMPLATE_UPLOAD_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE + TEMPLATE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) - ReportTemplate getReportTemplate(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, @PathVariable(TEMPLATE_ID) String templateId); - - - @GetMapping(value = REPORT_TEMPLATE_UPLOAD_PATH + DOWNLOAD_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE + TEMPLATE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) - ReportTemplateDownload downloadReportTemplate(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, @PathVariable(TEMPLATE_ID) String templateId); - - - @DeleteMapping(value = REPORT_TEMPLATE_UPLOAD_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE + TEMPLATE_ID_PATH_VARIABLE) - void deleteTemplate(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, @PathVariable(TEMPLATE_ID) String templateId); - - - @PutMapping(value = REPORT_TEMPLATE_UPLOAD_PATH + UPDATE_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE + TEMPLATE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE) - void updateTemplate(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, - @PathVariable(TEMPLATE_ID) String templateId, - @RequestBody ReportTemplateUpdateRequest reportTemplateUpdateRequest); - -} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/SMTPConfigurationResource.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/SMTPConfigurationResource.java deleted file mode 100644 index 842602eb9..000000000 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/SMTPConfigurationResource.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.resources; - -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.ResponseStatus; - -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.SMTPConfiguration; - -public interface SMTPConfigurationResource { - - String SMTP_PATH = "/smtp"; - - String TEST_PATH = "/test"; - - String TEST_EMAIL = "testEmail"; - - String MASK_PASSWORD = "maskPassword"; - - - @ResponseBody - @ResponseStatus(value = HttpStatus.OK) - @GetMapping(value = SMTP_PATH, produces = MediaType.APPLICATION_JSON_VALUE) - SMTPConfiguration getCurrentSMTPConfiguration(@RequestParam(value = MASK_PASSWORD, required = false, defaultValue = "true") boolean maskPassword); - - - @ResponseStatus(value = HttpStatus.NO_CONTENT) - @PostMapping(value = SMTP_PATH, consumes = MediaType.APPLICATION_JSON_VALUE) - void updateSMTPConfiguration(@RequestBody SMTPConfiguration smtpConfigurationModel); - - - @ResponseStatus(value = HttpStatus.OK) - @PostMapping(value = SMTP_PATH + TEST_PATH, consumes = MediaType.APPLICATION_JSON_VALUE) - void testSMTPConfiguration(@RequestParam(value = TEST_EMAIL, required = false) String testEmail, @RequestBody SMTPConfiguration smtpConfigurationModel); - - - @ResponseStatus(value = HttpStatus.NO_CONTENT) - @DeleteMapping(value = SMTP_PATH) - void clearSMTPConfiguration(); - -} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/StatusResource.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/StatusResource.java deleted file mode 100644 index 96a55e2de..000000000 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/StatusResource.java +++ /dev/null @@ -1,129 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.resources; - -import java.time.OffsetDateTime; -import java.util.List; -import java.util.Set; - -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.ResponseStatus; - -import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileModel; - -public interface StatusResource { - - String STATUS_PATH = "/status"; - String DELETED_PATH = "/softdeleted"; - String ALL_PATH = "/all"; - String DOSSIER_ID_PARAM = "dossierId"; - String DOSSIER_ID_PATH_PARAM = "/{" + DOSSIER_ID_PARAM + "}"; - - String FILE_ID = "fileId"; - String FILE_ID_PATH_VARIABLE = "/{" + FILE_ID + "}"; - - String CHANGES_PATH = "/has-changes"; - - String EXCLUDED_STATUS_PARAM = "excluded"; - - String EXCLUDED_FROM_AUTOMATIC_ANALYSIS_PARAM = "excludedFromAutomaticAnalysis"; - - String APPROVER_ID_REQUEST_PARAM = "approverId"; - String ASSIGNEE_ID_REQUEST_PARAM = "assigneeId"; - String USER_ID_REQUEST_PARAM = "userId"; - - - @ResponseBody - @ResponseStatus(value = HttpStatus.OK) - @PostMapping(value = STATUS_PATH + DOSSIER_ID_PATH_PARAM + CHANGES_PATH, produces = MediaType.APPLICATION_JSON_VALUE) - JSONPrimitive hasChangesSince(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @RequestBody JSONPrimitive since); - - - @ResponseBody - @ResponseStatus(value = HttpStatus.OK) - @GetMapping(value = STATUS_PATH + DOSSIER_ID_PATH_PARAM, produces = MediaType.APPLICATION_JSON_VALUE) - List getDossierStatus(@PathVariable(DOSSIER_ID_PARAM) String dossierId); - - - @ResponseBody - @ResponseStatus(value = HttpStatus.OK) - @GetMapping(value = STATUS_PATH + DOSSIER_ID_PATH_PARAM + ALL_PATH, produces = MediaType.APPLICATION_JSON_VALUE) - List getAllDossierStatus(@PathVariable(DOSSIER_ID_PARAM) String dossierId); - - - @ResponseBody - @ResponseStatus(value = HttpStatus.OK) - @GetMapping(value = STATUS_PATH + DELETED_PATH + DOSSIER_ID_PATH_PARAM, produces = MediaType.APPLICATION_JSON_VALUE) - List getSoftDeletedDossierStatus(@PathVariable(DOSSIER_ID_PARAM) String dossierId); - - - @ResponseBody - @ResponseStatus(value = HttpStatus.OK) - @GetMapping(value = STATUS_PATH + DELETED_PATH, produces = MediaType.APPLICATION_JSON_VALUE) - List getSoftDeletedForDossierList(@RequestBody List dossierIds); - - - @ResponseBody - @ResponseStatus(value = HttpStatus.OK) - @GetMapping(value = STATUS_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) - FileModel getFileStatus(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId); - - - @ResponseBody - @ResponseStatus(value = HttpStatus.ACCEPTED) - @PostMapping(value = STATUS_PATH + "/update-modification-date" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE) - void updateFileModificationDate(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId); - - - @PostMapping(value = STATUS_PATH + "/assignee" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE) - void setCurrentFileAssignee(@PathVariable(DOSSIER_ID_PARAM) String dossierId, - @PathVariable(FILE_ID) String fileId, - @RequestParam(value = ASSIGNEE_ID_REQUEST_PARAM, required = false) String assigneeId); - - - @PostMapping(value = STATUS_PATH + "/underreview" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE) - void setStatusUnderReview(@PathVariable(DOSSIER_ID_PARAM) String dossierId, - @PathVariable(FILE_ID) String fileId, - @RequestParam(value = USER_ID_REQUEST_PARAM, required = false) String userId); - - - @PostMapping(value = STATUS_PATH + "/underapproval" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE) - void setStatusUnderApproval(@PathVariable(DOSSIER_ID_PARAM) String dossierId, - @PathVariable(FILE_ID) String fileId, - @RequestParam(value = APPROVER_ID_REQUEST_PARAM, required = false) String approverId); - - - @PostMapping(value = STATUS_PATH + "/approved" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE) - void setStatusApproved(@PathVariable(DOSSIER_ID_PARAM) String dossierId, - @PathVariable(FILE_ID) String fileId, - @RequestParam(value = APPROVER_ID_REQUEST_PARAM, required = false) String approverId); - - - @PostMapping(value = STATUS_PATH + "/new" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE) - void setStatusNew(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId); - - - @PostMapping(value = STATUS_PATH + "/toggle-analysis" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE) - void toggleExclusion(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestParam(EXCLUDED_STATUS_PARAM) boolean excluded); - - - @PostMapping(value = STATUS_PATH + "/toggle-automatic-analysis" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE) - void toggleAutomaticAnalysis(@PathVariable(DOSSIER_ID_PARAM) String dossierId, - @PathVariable(FILE_ID) String fileId, - @RequestParam(EXCLUDED_STATUS_PARAM) boolean excludedFromAutomaticAnalysis); - - - @PostMapping(value = STATUS_PATH + "/exclude-pages" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE) - void excludePages(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody Set pages); - - - @PostMapping(value = STATUS_PATH + "/include-pages" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE) - void includePages(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody Set pages); - -} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/TenantsResource.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/TenantsResource.java deleted file mode 100644 index b66581c84..000000000 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/TenantsResource.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.resources; - -import java.util.List; - -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.ResponseStatus; - -import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive; -import com.iqser.red.service.persistence.service.v1.api.model.multitenancy.TenantRequest; -import com.iqser.red.service.persistence.service.v1.api.model.multitenancy.TenantResponse; - -@ResponseStatus(value = HttpStatus.OK) -public interface TenantsResource { - - String TENANT_ID_PARAM = "tenantId"; - String TENANT_ID_PATH_PARAM = "/{" + TENANT_ID_PARAM + "}"; - - - @PostMapping(value = "/tenants", consumes = MediaType.APPLICATION_JSON_VALUE) - void createTenant(@RequestBody TenantRequest tenantRequest); - - - @GetMapping(value = "/tenants", produces = MediaType.APPLICATION_JSON_VALUE) - List getTenants(); - - - @GetMapping(value = "/tenants" + TENANT_ID_PATH_PARAM, produces = MediaType.APPLICATION_JSON_VALUE) - TenantResponse getTenant(@PathVariable(TENANT_ID_PARAM) String tenantId); - - - @GetMapping(value = "/deploymentKey" + TENANT_ID_PATH_PARAM, produces = MediaType.APPLICATION_JSON_VALUE) - JSONPrimitive getDeploymentKey(@PathVariable(TENANT_ID_PARAM) String tenantId); - -} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/UploadResource.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/UploadResource.java deleted file mode 100644 index 9cb12d85f..000000000 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/UploadResource.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.resources; - -import java.util.Set; - -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.ResponseStatus; - -import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.AddFileRequest; - -@ResponseStatus(value = HttpStatus.OK) -public interface UploadResource { - - String REST_PATH = "/file"; - - String DELETE_PATH = REST_PATH + "/delete"; - String UPLOAD_PATH = REST_PATH + "/upload"; - String HARD_DELETE_PATH = REST_PATH + "/hardDelete"; - String UNDELETE_PATH = REST_PATH + "/undelete"; - - String FILE_ID = "fileId"; - String FILE_ID_PATH_VARIABLE = "/{" + FILE_ID + "}"; - - String DOSSIER_ID_PARAM = "dossierId"; - String DOSSIER_ID_PATH_PARAM = "/{" + DOSSIER_ID_PARAM + "}"; - - - @PostMapping(value = UPLOAD_PATH, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - JSONPrimitive upload(@RequestBody AddFileRequest request, - @RequestParam(value = "keepManualRedactions", required = false, defaultValue = "false") boolean keepManualRedactions); - - - @DeleteMapping(value = DELETE_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE) - void deleteFile(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId); - - - @DeleteMapping(value = HARD_DELETE_PATH + DOSSIER_ID_PATH_PARAM) - void hardDeleteFiles(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @RequestBody Set fileIds); - - - @PostMapping(value = UNDELETE_PATH + DOSSIER_ID_PATH_PARAM) - void undeleteFiles(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @RequestBody Set fileIds); - -} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/UserPreferenceResource.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/UserPreferenceResource.java deleted file mode 100644 index 153a8332f..000000000 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/UserPreferenceResource.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.resources; - -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.ResponseStatus; - -import com.fasterxml.jackson.databind.JsonNode; - -public interface UserPreferenceResource { - - String PREFERENCES_PATH = "/preferences"; - - String KEY_PARAMETER_NAME = "key"; - String KEY_PATH_VARIABLE = "/{" + KEY_PARAMETER_NAME + "}"; - - String USER_ID_PARAMETER_NAME = "userId"; - String USER_ID_PATH_VARIABLE = "/{" + USER_ID_PARAMETER_NAME + "}"; - - - @ResponseStatus(HttpStatus.NO_CONTENT) - @PutMapping(value = PREFERENCES_PATH + USER_ID_PATH_VARIABLE + KEY_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE) - void savePreferences(@PathVariable(USER_ID_PARAMETER_NAME) String userId, @PathVariable(KEY_PARAMETER_NAME) String key, @RequestBody JsonNode jsonNode); - - - @ResponseBody - @ResponseStatus(value = HttpStatus.OK) - @GetMapping(value = PREFERENCES_PATH + USER_ID_PATH_VARIABLE + KEY_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) - JsonNode getPreferences(@PathVariable(USER_ID_PARAMETER_NAME) String userId, @PathVariable(KEY_PARAMETER_NAME) String key); - - - @ResponseBody - @ResponseStatus(value = HttpStatus.NO_CONTENT) - @DeleteMapping(value = PREFERENCES_PATH + USER_ID_PATH_VARIABLE + KEY_PATH_VARIABLE) - void deletePreferences(@PathVariable(USER_ID_PARAMETER_NAME) String userId, @PathVariable(KEY_PARAMETER_NAME) String key); - -} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/ViewedPagesResource.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/ViewedPagesResource.java deleted file mode 100644 index 14aa70e50..000000000 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/ViewedPagesResource.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.resources; - -import java.util.List; - -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.ResponseStatus; - -import com.iqser.red.service.persistence.service.v1.api.model.annotations.ViewedPage; - -@ResponseStatus(value = HttpStatus.OK) -public interface ViewedPagesResource { - - String REST_PATH = "/viewedPages"; - - String FILE_ID = "fileId"; - String FILE_ID_PATH_VARIABLE = "/{" + FILE_ID + "}"; - - String ROLE = "role"; - String ROLE_PATH_VARIABLE = "/{" + ROLE + "}"; - - - @PostMapping(value = REST_PATH + FILE_ID_PATH_VARIABLE + ROLE_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE) - void addPage(@PathVariable(FILE_ID) String fileId, @PathVariable(ROLE) String role, @RequestBody Integer page); - - - @DeleteMapping(value = REST_PATH + FILE_ID_PATH_VARIABLE + ROLE_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE) - void removePage(@PathVariable(FILE_ID) String fileId, @PathVariable(ROLE) String role, @RequestBody Integer page); - - - @GetMapping(value = REST_PATH + FILE_ID_PATH_VARIABLE + ROLE_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) - List getViewedPages(@PathVariable(FILE_ID) String fileId, @PathVariable(ROLE) String role); - -} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/WatermarkResource.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/WatermarkResource.java deleted file mode 100644 index 378bd0791..000000000 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/WatermarkResource.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.resources; - -import java.util.List; - -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.ResponseStatus; - -import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.Watermark; - -@ResponseStatus(value = HttpStatus.OK) -public interface WatermarkResource { - - String WATERMARK_PATH = "/watermark"; - String CHECK_USED_REST_PATH = "/used"; - String WATERMARK_ID_PARAMETER_NAME = "watermarkId"; - String WATERMARK_ID_PATH_VARIABLE = "/{" + WATERMARK_ID_PARAMETER_NAME + "}"; - - String DOSSIER_TEMPLATE_ID_PARAMETER_NAME = "dossierTemplateId"; - - - @ResponseStatus(HttpStatus.OK) - @PostMapping(value = WATERMARK_PATH, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - Watermark createOrUpdateWatermark(@RequestBody Watermark watermark); - - - @GetMapping(value = WATERMARK_PATH + WATERMARK_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) - Watermark getWatermark(@PathVariable(WATERMARK_ID_PARAMETER_NAME) long watermarkId); - - - @GetMapping(value = WATERMARK_PATH, produces = MediaType.APPLICATION_JSON_VALUE) - List getWatermarksForDossierTemplateId(@RequestParam(DOSSIER_TEMPLATE_ID_PARAMETER_NAME) String dossierTemplateId); - - - @ResponseStatus(HttpStatus.NO_CONTENT) - @DeleteMapping(value = WATERMARK_PATH + WATERMARK_ID_PATH_VARIABLE) - void deleteWatermark(@PathVariable(WATERMARK_ID_PARAMETER_NAME) long watermarkId); - - - @ResponseStatus(value = HttpStatus.OK) - @GetMapping(value = WATERMARK_PATH + CHECK_USED_REST_PATH, produces = MediaType.APPLICATION_JSON_VALUE) - JSONPrimitive isWatermarkUsed(@RequestParam(WATERMARK_ID_PARAMETER_NAME) long watermarkId); - -} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/pom.xml b/persistence-service-v1/persistence-service-external-api-impl-v1/pom.xml new file mode 100644 index 000000000..bee778fff --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/pom.xml @@ -0,0 +1,33 @@ + + + + + persistence-service-v1 + com.iqser.red.service + 1.0-SNAPSHOT + + + 4.0.0 + + persistence-service-external-api-impl-v1 + + 1.7.30 + UTF-8 + + + + + com.iqser.red.service + persistence-service-processor-v1 + ${project.version} + + + + org.springdoc + springdoc-openapi-ui + + + + diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/PersistenceServiceExternalApiConfiguration.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/PersistenceServiceExternalApiConfiguration.java new file mode 100644 index 000000000..b766c71fb --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/PersistenceServiceExternalApiConfiguration.java @@ -0,0 +1,11 @@ +package com.iqser.red.persistence.service.v1.external.api.impl; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + + +@Configuration +@ComponentScan +public class PersistenceServiceExternalApiConfiguration { + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/cache/PersistenceServiceExternalApiCacheConfiguration.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/cache/PersistenceServiceExternalApiCacheConfiguration.java new file mode 100644 index 000000000..c738ae7bf --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/cache/PersistenceServiceExternalApiCacheConfiguration.java @@ -0,0 +1,42 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.cache; + +import static com.iqser.red.persistence.service.v1.external.api.impl.service.OneTimeTokenCacheService.OTT_CACHE; + +import java.time.Duration; + +import org.springframework.boot.autoconfigure.cache.RedisCacheManagerBuilderCustomizer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.cache.RedisCacheConfiguration; +import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer; +import org.springframework.data.redis.serializer.RedisSerializationContext; + +@Configuration +public class PersistenceServiceExternalApiCacheConfiguration { + + public static final String RATE_LIMITER_CACHE = "buckets"; + public static final String ACL_CACHE = "acl"; + + + @Bean + public RedisCacheConfiguration cacheConfiguration() { + + return RedisCacheConfiguration.defaultCacheConfig() + .entryTtl(Duration.ofMinutes(1)) + .disableCachingNullValues() + .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())); + } + + + @Bean + public RedisCacheManagerBuilderCustomizer redisCacheManagerBuilderCustomizer() { + + return (builder) -> builder.withCacheConfiguration(RATE_LIMITER_CACHE, RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(60))) + .withCacheConfiguration(ACL_CACHE, RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(1)).serializeValuesWith( + RedisSerializationContext.SerializationPair.fromSerializer(new JdkSerializationRedisSerializer())) + ) + .withCacheConfiguration(OTT_CACHE, RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofSeconds(10))); + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ApplicationConfigurationController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ApplicationConfigurationController.java new file mode 100644 index 000000000..5fa62e395 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ApplicationConfigurationController.java @@ -0,0 +1,45 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.controller; + +import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_APP_CONFIG; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_APP_CONFIG; + +import javax.validation.Valid; + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.ApplicationConfigurationEntity; +import com.iqser.red.service.persistence.management.v1.processor.service.ApplicationConfigService; +import com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter; +import com.iqser.red.service.persistence.service.v1.api.external.resource.ApplicationConfigurationResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.ApplicationConfig; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RestController +@RequiredArgsConstructor +public class ApplicationConfigurationController implements ApplicationConfigurationResource { + + private final ApplicationConfigService applicationConfigService; + + + @Override + @PreAuthorize("hasAuthority('" + WRITE_APP_CONFIG + "')") + public ApplicationConfig createOrUpdateAppConfig(@Valid @RequestBody ApplicationConfig appConfig) { + + return MagicConverter.convert(applicationConfigService.saveApplicationConfiguration(MagicConverter.convert(appConfig, ApplicationConfigurationEntity.class)), + ApplicationConfig.class); + } + + + @Override + @PreAuthorize("hasAuthority('" + READ_APP_CONFIG + "')") + public ApplicationConfig getCurrentApplicationConfig() { + + return MagicConverter.convert(applicationConfigService.getApplicationConfig(), ApplicationConfig.class); + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/AuditController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/AuditController.java new file mode 100644 index 000000000..b1674e124 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/AuditController.java @@ -0,0 +1,56 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.controller; + +import static com.iqser.red.keycloak.commons.roles.ActionRoles.SEARCH_AUDIT_LOG; +import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; + +import java.util.List; + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import com.iqser.red.keycloak.commons.KeycloakSecurity; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; +import com.iqser.red.service.persistence.service.v1.api.external.resource.AuditResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; +import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditResponse; +import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditSearchRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.CategoryModel; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RestController +@RequiredArgsConstructor +public class AuditController implements AuditResource { + + private final AuditPersistenceService auditPersistenceService; + + + @Override + @PreAuthorize("hasAuthority('" + SEARCH_AUDIT_LOG + "')") + public AuditResponse searchAuditLog(@RequestBody AuditSearchRequest auditSearchRequest) { + + var auditModels = convert(auditPersistenceService.search(auditSearchRequest), AuditModel.class); + auditPersistenceService.insertRecord(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(auditSearchRequest.getObjectId()) + .category(AuditCategory.AUDIT.name()) + .message("Audit Log has been viewed.") + .build()); + + return new AuditResponse(auditModels.getElements(), auditModels.getTotalHits(), auditModels.getPage(), auditModels.getPageSize()); + } + + + @Override + @PreAuthorize("hasAuthority('" + SEARCH_AUDIT_LOG + "')") + public List getAuditCategories() { + + return auditPersistenceService.getCategories(); + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/CustomPermissionMappingController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/CustomPermissionMappingController.java new file mode 100644 index 000000000..e136ef769 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/CustomPermissionMappingController.java @@ -0,0 +1,65 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.controller; + +import static com.iqser.red.keycloak.commons.roles.ActionRoles.MANAGE_ACL_PERMISSIONS; + +import java.util.List; +import java.util.Set; + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import com.iqser.red.service.persistence.management.v1.processor.acl.custom.service.CustomPermissionService; +import com.iqser.red.service.persistence.service.v1.api.external.resource.CustomPermissionMappingResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.permission.CustomPermissionMappingModel; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequiredArgsConstructor +public class CustomPermissionMappingController implements CustomPermissionMappingResource { + + private final CustomPermissionService customPermissionService; + + + @Override + @PreAuthorize("hasAuthority('" + MANAGE_ACL_PERMISSIONS + "')") + public List getCustomPermissionMappings(@PathVariable(TARGET_OBJECT_NAME) String targetObject) { + + return customPermissionService.getCustomPermissionMappings(targetObject); + } + + + @Override + @PreAuthorize("hasAuthority('" + MANAGE_ACL_PERMISSIONS + "')") + public void saveCustomPermissionMappings(@PathVariable(TARGET_OBJECT_NAME) String targetObject, @RequestBody List customPermissionMappingModels) { + + customPermissionService.saveCustomPermissionMappings(targetObject, customPermissionMappingModels); + } + + + @Override + @PreAuthorize("hasAuthority('" + MANAGE_ACL_PERMISSIONS + "')") + public List getValidMapping(@PathVariable(TARGET_OBJECT_NAME) String targetObject) { + + return customPermissionService.getExistingPermissions(targetObject); + } + + + @Override + @PreAuthorize("hasAuthority('" + MANAGE_ACL_PERMISSIONS + "')") + public Set getAllSupportedTargetObjects() { + + return customPermissionService.getAllSupportedTargetObjects(); + } + + + @Override + @PreAuthorize("hasAuthority('" + MANAGE_ACL_PERMISSIONS + "')") + public void syncAllCustomPermissions() { + + customPermissionService.syncAllCustomPermissions(); + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DictionaryController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DictionaryController.java new file mode 100644 index 000000000..cfd4f5974 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DictionaryController.java @@ -0,0 +1,330 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.controller; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import javax.validation.Valid; + +import org.springframework.core.io.InputStreamResource; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import com.iqser.red.keycloak.commons.KeycloakSecurity; +import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; +import com.iqser.red.service.persistence.management.v1.processor.service.DictionaryService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter; +import com.iqser.red.service.persistence.management.v1.processor.utils.StringEncodingUtils; +import com.iqser.red.service.persistence.management.v1.processor.utils.TypeValueMapper; +import com.iqser.red.service.persistence.service.v1.api.external.resource.DictionaryResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; +import com.iqser.red.service.persistence.service.v1.api.shared.model.CreateTypeValue; +import com.iqser.red.service.persistence.service.v1.api.shared.model.Dictionary; +import com.iqser.red.service.persistence.service.v1.api.shared.model.TypeResponse; +import com.iqser.red.service.persistence.service.v1.api.shared.model.TypeValue; +import com.iqser.red.service.persistence.service.v1.api.shared.model.UpdateTypeValue; +import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.Colors; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionaryEntryType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.Type; + +import feign.FeignException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RestController +@RequiredArgsConstructor +public class DictionaryController implements DictionaryResource { + + private final DictionaryService dictionaryService; + private final AuditPersistenceService auditClient; + + + @Override + public void addEntry(@PathVariable(TYPE_PARAMETER_NAME) String type, + @PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, + @RequestBody List entries, + @RequestParam(name = REMOVE_CURRENT_REQUEST_PARAM, defaultValue = "false", required = false) boolean removeCurrent, + @RequestParam(value = DOSSIER_ID_PARAMETER_NAME, required = false) String dossierId, + @RequestParam(value = DICTIONARY_ENTRY_TYPE_PARAM, required = false, defaultValue = DEFAULT_DICTIONARY_ENTRY_TYPE) DictionaryEntryType dictionaryEntryType) { + + addEntries(type, dossierTemplateId, entries, removeCurrent, dossierId, dictionaryEntryType); + auditClient.insertRecord(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(dossierTemplateId) + .category(AuditCategory.DICTIONARY.name()) + .message("Dictionary entries were added.") + .details(Map.of("Type", type, "Number", entries.size())) + .build()); + } + + + private void addEntries(String type, String dossierTemplateId, List entries, boolean removeCurrent, String dossierId, DictionaryEntryType dictionaryEntryType) { + + if (dossierId == null) { + dictionaryService.addGlobalEntries(type, dossierTemplateId, entries, removeCurrent, dictionaryEntryType); + } else { + dictionaryService.addDossierEntries(type, dossierTemplateId, entries, removeCurrent, dossierId, dictionaryEntryType); + } + } + + + @Override + public void deleteEntry(@PathVariable(TYPE_PARAMETER_NAME) String type, + @PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, + @PathVariable(ENTRY_PARAMETER_NAME) String entry, + @RequestParam(value = DOSSIER_ID_PARAMETER_NAME, required = false) String dossierId, + @RequestParam(value = DICTIONARY_ENTRY_TYPE_PARAM, required = false, defaultValue = DEFAULT_DICTIONARY_ENTRY_TYPE) DictionaryEntryType dictionaryEntryType) { + + deleteEntries(type, dossierTemplateId, Arrays.asList(entry), dossierId, dictionaryEntryType); + auditClient.insertRecord(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(dossierTemplateId) + .category(AuditCategory.DICTIONARY.name()) + .message("Dictionary entry was deleted.") + .details(Map.of("Type", type, "Value", entry)) + .build()); + } + + + @Override + public void deleteEntries(@PathVariable(TYPE_PARAMETER_NAME) String type, + @PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, + @RequestBody List entries, + @RequestParam(value = DOSSIER_ID_PARAMETER_NAME, required = false) String dossierId, + @RequestParam(value = DICTIONARY_ENTRY_TYPE_PARAM, required = false, defaultValue = DEFAULT_DICTIONARY_ENTRY_TYPE) DictionaryEntryType dictionaryEntryType) { + + if (dossierId == null) { + dictionaryService.deleteGlobalEntries(type, dossierTemplateId, entries, dictionaryEntryType); + } else { + dictionaryService.deleteDossierEntries(type, dossierTemplateId, entries, dossierId, dictionaryEntryType); + } + + auditClient.insertRecord(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(dossierTemplateId) + .category(AuditCategory.DICTIONARY.name()) + .message("Dictionary entries were deleted.") + .details(Map.of("Type", type, "Number", entries.size())) + .build()); + } + + + @Override + public void updateType(@PathVariable(TYPE_PARAMETER_NAME) String type, + @PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, + @RequestBody UpdateTypeValue typeValue, + @RequestParam(value = DOSSIER_ID_PARAMETER_NAME, required = false) String dossierId) { + + if (dossierId == null) { + dictionaryService.updateGlobalType(type, dossierTemplateId, typeValue); + } else { + dictionaryService.updateDossierType(type, dossierTemplateId, typeValue, dossierId); + } + + auditClient.insertRecord(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(dossierTemplateId) + .category(AuditCategory.DICTIONARY.name()) + .message("Dictionary type was updated.") + .details(Map.of("Type", type)) + .build()); + } + + + @Override + public TypeValue addType(@Valid @RequestBody CreateTypeValue typeValue, @RequestParam(value = DOSSIER_ID_PARAMETER_NAME, required = false) String dossierId) { + + Type result; + + if (dossierId == null) { + result = dictionaryService.addGlobalType(typeValue); + } else { + result = dictionaryService.addDossierType(typeValue, dossierId); + } + + auditClient.insertRecord(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(typeValue.getDossierTemplateId()) + .category(AuditCategory.DICTIONARY.name()) + .message("Dictionary type was added.") + .details(Map.of("Type", typeValue.getType())) + .build()); + + var converted = MagicConverter.convert(result, TypeValue.class, new TypeValueMapper()); + return converted; + } + + + @Override + public void deleteType(@PathVariable(TYPE_PARAMETER_NAME) String type, + @PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, + @RequestParam(value = DOSSIER_ID_PARAMETER_NAME, required = false) String dossierId) { + + if (dossierId == null) { + dictionaryService.deleteGlobalType(type, dossierTemplateId); + } else { + dictionaryService.deleteDossierType(type, dossierTemplateId, dossierId); + } + + auditClient.insertRecord(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(dossierTemplateId) + .category(AuditCategory.DICTIONARY.name()) + .message("Dictionary type was deleted.") + .details(Map.of("Type", type)) + .build()); + } + + + @Override + public void deleteTypes(@RequestBody List types, + @PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, + @RequestParam(value = DOSSIER_ID_PARAMETER_NAME, required = false) String dossierId) { + + List errorIds = new ArrayList<>(); + + for (var type : types) { + try { + if (dossierId == null) { + dictionaryService.deleteGlobalType(type, dossierTemplateId); + } else { + dictionaryService.deleteDossierType(type, dossierTemplateId, dossierId); + } + + auditClient.insertRecord(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(dossierTemplateId) + .category(AuditCategory.DICTIONARY.name()) + .message("Dictionary type was deleted.") + .details(Map.of("Type", type)) + .build()); + } catch (FeignException e) { + errorIds.add(type); + } + } + + if (errorIds.size() > 0) { + throw new BadRequestException("Failed to delete dictionary types: " + errorIds); + } + } + + + @Override + public TypeResponse getAllTypes(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, + @RequestParam(value = DOSSIER_ID_PARAMETER_NAME, required = false) String dossierId, + @RequestParam(value = INCLUDE_DELETED_PARAMETER_NAME, required = false, defaultValue = "false") boolean includeDeleted) { + + return dictionaryService.getAllTypes(dossierTemplateId, dossierId, includeDeleted); + } + + + @Override + public Colors getColors(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId) { + + return dictionaryService.getColors(dossierTemplateId); + } + + + @Override + public void uploadDictionary(@RequestPart(name = "file", required = false) MultipartFile file, + @PathVariable(TYPE_PARAMETER_NAME) String type, + @PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, + @RequestParam(value = DOSSIER_ID_PARAMETER_NAME, required = false) String dossierId, + @RequestParam(value = DICTIONARY_ENTRY_TYPE_PARAM, required = false, defaultValue = DEFAULT_DICTIONARY_ENTRY_TYPE) DictionaryEntryType dictionaryEntryType) { + + validateFile(file); + + try { + addEntries(type, dossierTemplateId, new String(file.getBytes(), StandardCharsets.UTF_8).lines().collect(Collectors.toList()), true, dossierId, dictionaryEntryType); + } catch (IOException e) { + log.debug(e.getMessage(), e); + throw new BadRequestException("Could not upload file.", e); + } + + auditClient.insertRecord(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(dossierTemplateId) + .category(AuditCategory.DICTIONARY.name()) + .message("Dictionary has been uploaded.") + .details(Map.of("Type", type)) + .build()); + } + + + private void validateFile(@RequestPart(name = "file", required = false) MultipartFile file) { + + if (file == null || file.isEmpty()) { + throw new BadRequestException("File cannot be null or empty"); + } + } + + + @Override + public ResponseEntity downloadDictionary(@PathVariable(TYPE_PARAMETER_NAME) String type, + @PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, + @RequestParam(value = DOSSIER_ID_PARAMETER_NAME, required = false) String dossierId, + @RequestParam(value = DICTIONARY_ENTRY_TYPE_PARAM, required = false, defaultValue = DEFAULT_DICTIONARY_ENTRY_TYPE) DictionaryEntryType dictionaryEntryType) { + + byte[] data = null; + switch (dictionaryEntryType) { + case ENTRY: + data = String.join("\n", getDictionaryForType(type, dossierTemplateId, dossierId).getEntries()).getBytes(); + break; + case FALSE_POSITIVE: + data = String.join("\n", getDictionaryForType(type, dossierTemplateId, dossierId).getFalsePositiveEntries()).getBytes(); + break; + case FALSE_RECOMMENDATION: + data = String.join("\n", getDictionaryForType(type, dossierTemplateId, dossierId).getFalseRecommendationEntries()).getBytes(); + break; + } + + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setContentType(MediaType.TEXT_PLAIN); + + httpHeaders.add("Content-Disposition", "attachment; filename*=utf-8''" + StringEncodingUtils.urlEncode(type) + ".txt"); + InputStream is = new ByteArrayInputStream(data); + + return new ResponseEntity<>(new InputStreamResource(is), httpHeaders, HttpStatus.OK); + } + + + @Override + public Dictionary getDictionaryForType(@PathVariable(TYPE_PARAMETER_NAME) String type, + @PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, + @RequestParam(value = DOSSIER_ID_PARAMETER_NAME, required = false) String dossierId) { + + return dictionaryService.getDictionaryForType(type, dossierTemplateId, dossierId); + } + + + @Override + public void setColors(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, @RequestBody Colors colors) { + + dictionaryService.setColors(dossierTemplateId, colors); + + auditClient.insertRecord(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(dossierTemplateId) + .category(AuditCategory.DOSSIER_TEMPLATE.name()) + .message("Colors have been changed.") + .build()); + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DigitalSignatureController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DigitalSignatureController.java new file mode 100644 index 000000000..1a4ebbedd --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DigitalSignatureController.java @@ -0,0 +1,213 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.controller; + +import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_DIGITAL_SIGNATURE; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_DIGITAL_SIGNATURE; + +import java.nio.charset.StandardCharsets; + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.util.Base64Utils; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import com.iqser.red.keycloak.commons.KeycloakSecurity; +import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.DigitalSignatureEntity; +import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.DigitalSignatureKmsEntity; +import com.iqser.red.service.persistence.management.v1.processor.service.DigitalSignatureKmsService; +import com.iqser.red.service.persistence.management.v1.processor.service.DigitalSignatureService; +import com.iqser.red.service.persistence.management.v1.processor.service.DigitalSignatureTypeService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; +import com.iqser.red.service.persistence.service.v1.api.external.resource.DigitalSignatureResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DigitalSignatureKms; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DigitalSignatureKmsViewModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DigitalSignatureViewModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.DigitalSignature; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.DigitalSignatureType; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequiredArgsConstructor +public class DigitalSignatureController implements DigitalSignatureResource { + + private static final String DIGITAL_SIGNATURE_AUDIT_ID = "DigitalSignature"; + private final DigitalSignatureTypeService digitalSignatureTypeService; + private final DigitalSignatureService digitalSignatureService; + private final DigitalSignatureKmsService digitalSignatureKmsService; + private final AuditPersistenceService auditPersistenceService; + + + @Override + @PreAuthorize("hasAuthority('" + READ_DIGITAL_SIGNATURE + "')") + public DigitalSignatureType getActiveDigitalSignatureType() { + + return digitalSignatureTypeService.getActiveDigitalSignatureType(); + } + + + @Override + @PreAuthorize("hasAuthority('" + WRITE_DIGITAL_SIGNATURE + "')") + public void setActiveDigitalSignatureType(DigitalSignatureType digitalSignatureType) { + + digitalSignatureTypeService.setActiveDigitalSignatureType(digitalSignatureType); + auditPersistenceService.insertRecord(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(DIGITAL_SIGNATURE_AUDIT_ID) + .category(AuditCategory.SETTINGS.name()) + .message("Digital signature type has been updated.") + .build()); + } + + + @Override + @PreAuthorize("hasAuthority('" + WRITE_DIGITAL_SIGNATURE + "')") + public DigitalSignatureViewModel saveDigitalSignature(@RequestBody DigitalSignature digitalSignatureModel) { + + DigitalSignatureViewModel digitalSignatureViewModel = convertToView(digitalSignatureService.saveDigitalSignature(convert(digitalSignatureModel))); + auditPersistenceService.insertRecord(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(DIGITAL_SIGNATURE_AUDIT_ID) + .category(AuditCategory.SETTINGS.name()) + .message("Digital signature has been saved.") + .build()); + return digitalSignatureViewModel; + + } + + + @Override + @PreAuthorize("hasAuthority('" + WRITE_DIGITAL_SIGNATURE + "')") + public void updateDigitalSignature(@RequestBody DigitalSignatureViewModel digitalSignatureModel) { + + digitalSignatureService.updateDigitalSignature(convert(digitalSignatureModel)); + auditPersistenceService.insertRecord(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(DIGITAL_SIGNATURE_AUDIT_ID) + .category(AuditCategory.SETTINGS.name()) + .message("Digital signature has been updated.") + .build()); + } + + + @Override + @PreAuthorize("hasAuthority('" + READ_DIGITAL_SIGNATURE + "')") + public DigitalSignatureViewModel getDigitalSignature() { + + return convertToView(digitalSignatureService.getDigitalSignature()); + } + + + @Override + @PreAuthorize("hasAuthority('" + WRITE_DIGITAL_SIGNATURE + "')") + public void deleteDigitalSignature() { + + digitalSignatureService.deleteDigitalSignature(); + auditPersistenceService.insertRecord(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(DIGITAL_SIGNATURE_AUDIT_ID) + .category(AuditCategory.SETTINGS.name()) + .message("Digital signature has been deleted.") + .build()); + } + + + @Override + @PreAuthorize("hasAuthority('" + WRITE_DIGITAL_SIGNATURE + "')") + public DigitalSignatureKmsViewModel saveDigitalSignatureKms(@RequestBody DigitalSignatureKms digitalSignature) { + + DigitalSignatureKmsViewModel result = convert(digitalSignatureKmsService.saveDigitalSignature(convert(digitalSignature))); + auditPersistenceService.insertRecord(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(DIGITAL_SIGNATURE_AUDIT_ID) + .category(AuditCategory.SETTINGS.name()) + .message("Digital KMS signature has been saved.") + .build()); + return result; + } + + + @Override + @PreAuthorize("hasAuthority('" + READ_DIGITAL_SIGNATURE + "')") + public DigitalSignatureKmsViewModel getDigitalSignatureKms() { + + return convert(digitalSignatureKmsService.getDigitalSignature()); + } + + + @Override + @PreAuthorize("hasAuthority('" + WRITE_DIGITAL_SIGNATURE + "')") + public void deleteDigitalSignatureKms() { + + digitalSignatureKmsService.deleteDigitalSignature(); + auditPersistenceService.insertRecord(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(DIGITAL_SIGNATURE_AUDIT_ID) + .category(AuditCategory.SETTINGS.name()) + .message("Digital KMS signature has been deleted.") + .build()); + } + + + private DigitalSignatureKmsViewModel convert(DigitalSignatureKmsEntity digitalSignature) { + + return DigitalSignatureKmsViewModel.builder() + .kmsAccessKey(digitalSignature.getKmsAccessKey()) + .kmsKeyId(digitalSignature.getKmsKeyId()) + .kmsRegion(digitalSignature.getKmsRegion()) + .kmsServiceEndpoint(digitalSignature.getKmsServiceEndpoint()) + .certificateName(digitalSignature.getCertificateName()) + .build(); + } + + + private DigitalSignatureKmsEntity convert(DigitalSignatureKms digitalSignatureKms) { + + return DigitalSignatureKmsEntity.builder() + .certificate(digitalSignatureKms.getCertificate().getBytes(StandardCharsets.UTF_8)) + .kmsAccessKey(digitalSignatureKms.getKmsAccessKey()) + .kmsKeyId(digitalSignatureKms.getKmsKeyId()) + .kmsRegion(digitalSignatureKms.getKmsRegion()) + .kmsSecretKey(digitalSignatureKms.getKmsSecretKey()) + .kmsServiceEndpoint(digitalSignatureKms.getKmsServiceEndpoint()) + .certificateName(digitalSignatureKms.getCertificateName()) + .build(); + } + + + private DigitalSignatureEntity convert(DigitalSignatureViewModel digitalSignature) { + + return DigitalSignatureEntity.builder() + .certificateName(digitalSignature.getCertificateName()) + .contactInfo(digitalSignature.getContactInfo()) + .location(digitalSignature.getLocation()) + .reason(digitalSignature.getReason()) + .build(); + } + + + public DigitalSignatureViewModel convertToView(DigitalSignatureEntity model) { + + return DigitalSignatureViewModel.builder() + .certificateName(model.getCertificateName()) + .contactInfo(model.getContactInfo()) + .location(model.getLocation()) + .reason(model.getReason()) + .build(); + } + + + public DigitalSignatureEntity convert(DigitalSignature digitalSignature) { + + return DigitalSignatureEntity.builder() + .certificateName(digitalSignature.getCertificateName()) + .contactInfo(digitalSignature.getContactInfo()) + .location(digitalSignature.getLocation()) + .password(digitalSignature.getPassword()) + .reason(digitalSignature.getReason()) + .privateKey(Base64Utils.decodeFromString(digitalSignature.getPrivateKey())) + .build(); + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierAttributesController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierAttributesController.java new file mode 100644 index 000000000..db854f671 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierAttributesController.java @@ -0,0 +1,178 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.controller; + +import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_DOSSIER_ATTRIBUTES; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_DOSSIER_ATTRIBUTES_CONFIG; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_DOSSIER_ATTRIBUTES; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_DOSSIER_ATTRIBUTES_CONFIG; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_FILE_ATTRIBUTES; + +import java.util.List; +import java.util.Map; + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.iqser.red.keycloak.commons.KeycloakSecurity; +import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierAttributeConfigEntity; +import com.iqser.red.service.persistence.management.v1.processor.service.AccessControlService; +import com.iqser.red.service.persistence.management.v1.processor.service.DossierAttributesManagementService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierAttributeConfigPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter; +import com.iqser.red.service.persistence.service.v1.api.external.resource.DossierAttributesResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierAttributes; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierAttributesConfig; +import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierAttributeConfig; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.DossierAttribute; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequiredArgsConstructor +public class DossierAttributesController implements DossierAttributesResource { + + private final DossierAttributeConfigPersistenceService dossierAttributeConfigPersistenceService; + private final AuditPersistenceService auditPersistenceService; + private final DossierAttributesManagementService dossierAttributesManagementService; + private final AccessControlService accessControlService; + + + @Override + @PreAuthorize("hasAuthority('" + WRITE_DOSSIER_ATTRIBUTES_CONFIG + "')") + public DossierAttributesConfig setDossierAttributesConfig(String dossierTemplateId, DossierAttributesConfig dossierAttributesConfig) { + + var result = MagicConverter.convert(dossierAttributeConfigPersistenceService.setDossierAttributesConfig(dossierTemplateId, + MagicConverter.convert(dossierAttributesConfig.getDossierAttributeConfigs(), DossierAttributeConfigEntity.class)), DossierAttributeConfig.class); + auditPersistenceService.insertRecord(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(dossierTemplateId) + .category(AuditCategory.DOSSIER_TEMPLATE.name()) + .message("Changed dossier attributes base configuration.") + .build()); + return new DossierAttributesConfig(result); + + } + + + @Override + @PreAuthorize("hasAuthority('" + WRITE_DOSSIER_ATTRIBUTES_CONFIG + "')") + public DossierAttributeConfig addOrUpdateDossierAttributeConfig(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, + @RequestBody DossierAttributeConfig dossierAttribute) { + + var result = MagicConverter.convert(dossierAttributeConfigPersistenceService.addOrUpdateDossierAttribute(dossierTemplateId, + MagicConverter.convert(dossierAttribute, DossierAttributeConfigEntity.class)), DossierAttributeConfig.class); + auditPersistenceService.insertRecord(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(dossierTemplateId) + .category(AuditCategory.DOSSIER_TEMPLATE.name()) + .message("Dossier attributes added/updated") + .build()); + + return result; + } + + + @Override + @PreAuthorize("hasAuthority('" + WRITE_DOSSIER_ATTRIBUTES_CONFIG + "')") + public void deleteDossierAttributeConfig(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, @PathVariable(DOSSIER_ATTRIBUTE_ID) String dossierAttributeId) { + + dossierAttributeConfigPersistenceService.deleteDossierAttribute(dossierAttributeId); + auditPersistenceService.insertRecord(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(dossierTemplateId) + .category(AuditCategory.DOSSIER_TEMPLATE.name()) + .message("Dossier attributes removed") + .details(Map.of("DossierAttributeId", dossierAttributeId)) + .build()); + } + + + @Override + @PreAuthorize("hasAuthority('" + WRITE_DOSSIER_ATTRIBUTES_CONFIG + "')") + public void deleteDossierAttributesConfig(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, @RequestParam(DOSSIER_ATTRIBUTE_IDS) List dossierAttributeIds) { + + dossierAttributeConfigPersistenceService.deleteDossierAttributes(dossierAttributeIds); + auditPersistenceService.insertRecord(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(dossierTemplateId) + .category(AuditCategory.DOSSIER_TEMPLATE.name()) + .message("Dossier attributes removed") + .details(Map.of("DossierAttributeId", dossierAttributeIds)) + .build()); + } + + + @PreAuthorize("hasAuthority('" + READ_DOSSIER_ATTRIBUTES_CONFIG + "')") + public DossierAttributesConfig getDossierAttributesConfig(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId) { + + var result = dossierAttributeConfigPersistenceService.getDossierAttributes(dossierTemplateId); + return new DossierAttributesConfig(MagicConverter.convert(result, DossierAttributeConfig.class)); + } + + + @PreAuthorize("hasAuthority('" + WRITE_FILE_ATTRIBUTES + "')") + public DossierAttributes setDossierAttributes(@PathVariable(DOSSIER_ID) String dossierId, @RequestBody DossierAttributes dossierAttributes) { + + accessControlService.verifyUserIsDossierOwner(dossierId); + var result = dossierAttributesManagementService.setDossierAttributes(dossierId, dossierAttributes.getDossierAttributeList()); + auditPersistenceService.insertRecord(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(dossierId) + .category(AuditCategory.DOSSIER.name()) + .message("Changed dossier attributes.") + .build()); + return new DossierAttributes(result); + + } + + + @PreAuthorize("hasAuthority('" + WRITE_DOSSIER_ATTRIBUTES + "')") + public DossierAttributes addOrUpdateDossierAttribute(String dossierId, DossierAttribute dossierAttribute) { + + accessControlService.verifyUserIsDossierOwner(dossierId); + DossierAttribute result = dossierAttributesManagementService.addOrUpdateDossierAttribute(dossierId, dossierAttribute); + auditPersistenceService.insertRecord(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(dossierId) + .category(AuditCategory.DOSSIER.name()) + .message("Added or updated dossier attributes.") + .build()); + return new DossierAttributes(List.of(result)); // TODO should be single Object??? + } + + + @PreAuthorize("hasAuthority('" + READ_DOSSIER_ATTRIBUTES + "')") + public DossierAttributes getDossierAttributes(String dossierId) { + + var result = dossierAttributesManagementService.getDossierAttributes(dossierId); + auditPersistenceService.insertRecord(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(dossierId) + .category(AuditCategory.DOSSIER.name()) + .message("Got dossier attributes.") + .build()); + return new DossierAttributes(result); + + } + + + @PreAuthorize("hasAuthority('" + WRITE_DOSSIER_ATTRIBUTES + "')") + public void deleteDossierAttribute(String dossierId, String dossierAttributeId) { + + accessControlService.verifyUserIsDossierOwner(dossierId); + dossierAttributesManagementService.deleteDossierAttribute(dossierId, dossierAttributeId); + auditPersistenceService.insertRecord(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(dossierId) + .category(AuditCategory.DOSSIER.name()) + .message("Changed dossier attributes.") + .build()); + + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierController.java new file mode 100644 index 000000000..1769a0cab --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierController.java @@ -0,0 +1,507 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.controller; + +import static com.iqser.red.keycloak.commons.roles.ActionRoles.ADD_UPDATE_DOSSIER; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.ARCHIVE_DOSSIER; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.DELETE_DOSSIER; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_DOSSIER; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.UNARCHIVE_DOSSIER; + +import java.time.OffsetDateTime; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.TreeSet; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PostAuthorize; +import org.springframework.security.access.prepost.PostFilter; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.security.access.prepost.PreFilter; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.google.common.collect.Lists; +import com.iqser.red.keycloak.commons.KeycloakSecurity; +import com.iqser.red.keycloak.commons.model.User; +import com.iqser.red.keycloak.commons.roles.ApplicationRoles; +import com.iqser.red.service.persistence.management.v1.processor.acl.custom.dossier.DossierACLService; +import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; +import com.iqser.red.service.persistence.management.v1.processor.service.AccessControlService; +import com.iqser.red.service.persistence.management.v1.processor.service.DossierManagementService; +import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusManagementService; +import com.iqser.red.service.persistence.management.v1.processor.service.UserService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.NotificationPersistenceService; +import com.iqser.red.service.persistence.service.v1.api.external.resource.DossierResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierChangeEntry; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierInformation; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AddNotificationRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.CreateOrUpdateDossierRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.Dossier; +import com.iqser.red.service.persistence.service.v1.api.shared.model.notification.NotificationType; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RestController +@RequiredArgsConstructor +public class DossierController implements DossierResource { + + private static final Set VALID_MEMBER_ROLES = Set.of(ApplicationRoles.RED_USER_ROLE, ApplicationRoles.RED_MANAGER_ROLE); + + private final DossierManagementService dossierManagementService; + private final UserService userService; + private final FileStatusManagementService fileStatusManagementService; + private final AuditPersistenceService auditPersistenceService; + private final NotificationPersistenceService notificationPersistenceService; + private final AccessControlService accessControlService; + private final DossierACLService dossierACLService; + + + @Override + @PreAuthorize("hasAuthority('" + READ_DOSSIER + "')") + public DossierInformation getDossierInformation() { + + return dossierManagementService.getDossierInformation(dossierACLService.getDossierIdsWithViewPermission()); + } + + + @Override + @PreAuthorize("hasAuthority('" + READ_DOSSIER + "')") + @PostFilter("hasPermission(filterObject.dossierId, 'Dossier', 'VIEW_OBJECT')") + public List changesSince(@RequestBody JSONPrimitive since) { + + return dossierManagementService.changesSince(since) + .stream() + .map(d -> new DossierChangeEntry(d.getDossierId(), d.isDossierChanges(), d.isFileChanges())) + .collect(Collectors.toList()); + } + + + @Override + @PreAuthorize("hasAuthority('" + ADD_UPDATE_DOSSIER + "') && (#dossierRequest.dossierId == null || hasPermission(#dossierRequest.dossierId, 'Dossier', 'ACCESS_OBJECT') )") + public ResponseEntity createDossierOrUpdateDossier(@RequestBody DossierRequest dossierRequest) { + + if (dossierRequest.getDossierId() != null && dossierRequest.getOwnerId() == null) { + throw new BadRequestException("Owner must be set for any update"); + } + + // this code always executes - members, approvers and owner must be valid + String ownerId = getAndValidateOwnerId(dossierRequest.getOwnerId()); + Set members = getAndValidateMembers(ownerId, dossierRequest.getMemberIds()); + Set approvers = getAndValidateMembers(ownerId, dossierRequest.getApproverIds()); + members.addAll(approvers); + + if ((dossierRequest.getDownloadFileTypes() == null || dossierRequest.getDownloadFileTypes() + .isEmpty()) && (dossierRequest.getReportTemplateIds() == null || dossierRequest.getReportTemplateIds().isEmpty())) { + throw new BadRequestException("Download and report types cannot both be empty"); + } + + // if dossierId is set - load dossier + if (StringUtils.isNotEmpty(dossierRequest.getDossierId())) { + + Dossier existingDossier = dossierACLService.enhanceDossierWithACLData(dossierManagementService.getDossierById(dossierRequest.getDossierId(), true, false)); + + if (existingDossier.getArchivedTime() != null) { + checkValidityForArchivedDossierUpdateRequest(dossierRequest, existingDossier); + } + + // update using data from request and computed owner/members/approvers + Dossier updatedDossier = dossierManagementService.updateDossier(CreateOrUpdateDossierRequest.builder() + .dossierName(dossierRequest.getDossierName()) + .description(dossierRequest.getDescription()) + .dossierTemplateId(dossierRequest.getDossierTemplateId()) + .downloadFileTypes(dossierRequest.getDownloadFileTypes()) + .dueDate(dossierRequest.getDueDate()) + .reportTemplateIds(new ArrayList<>(dossierRequest.getReportTemplateIds())) + .watermarkId(dossierRequest.getWatermarkId()) + .previewWatermarkId(dossierRequest.getPreviewWatermarkId()) + .dossierStatusId(dossierRequest.getDossierStatusId()) + .build(), existingDossier.getId()); + + dossierACLService.updateDossierACL(members, approvers, ownerId, updatedDossier.getId()); + dossierACLService.enhanceDossierWithACLData(updatedDossier); + + updateFileStatusForDossierFiles(updatedDossier.getId(), members); + + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(updatedDossier.getId()) + .category(AuditCategory.DOSSIER.name()) + .message("Dossier has been updated.") + .build()); + + if (existingDossier.getOwnerId() == null || !existingDossier.getOwnerId().equals(ownerId)) { + if (ownerId != null && !ownerId.equals(KeycloakSecurity.getUserId())) { + notificationPersistenceService.insertNotification(AddNotificationRequest.builder() + .userId(ownerId) + .issuerId(KeycloakSecurity.getUserId()) + .notificationType(NotificationType.DOSSIER_OWNER_SET.name()) + .target(Map.of("dossierId", dossierRequest.getDossierId())) + .build()); + } + if (existingDossier.getOwnerId() != null && !existingDossier.getOwnerId().equals(KeycloakSecurity.getUserId())) { + notificationPersistenceService.insertNotification(AddNotificationRequest.builder() + .userId(existingDossier.getOwnerId()) + .issuerId(KeycloakSecurity.getUserId()) + .notificationType(NotificationType.DOSSIER_OWNER_REMOVED.name()) + .target(Map.of("dossierId", dossierRequest.getDossierId())) + .build()); + } + } + + Stream.concat(members.stream(), approvers.stream()) + .filter(member -> !member.equals(ownerId) && !member.equals(KeycloakSecurity.getUserId()) && (existingDossier.getMemberIds() == null || !existingDossier.getMemberIds() + .contains(member))) + .forEach(member -> notificationPersistenceService.insertNotification(AddNotificationRequest.builder() + .userId(member) + .issuerId(KeycloakSecurity.getUserId()) + .notificationType(NotificationType.USER_BECOMES_DOSSIER_MEMBER.name()) + .target(Map.of("dossierId", dossierRequest.getDossierId())) + .build())); + + if (existingDossier.getMemberIds() != null) { + existingDossier.getMemberIds() + .stream() + .filter(member -> !members.contains(member) && !approvers.contains(member) && !member.equals(KeycloakSecurity.getUserId())) + .forEach(member -> notificationPersistenceService.insertNotification(AddNotificationRequest.builder() + .userId(member) + .issuerId(KeycloakSecurity.getUserId()) + .notificationType(NotificationType.USER_REMOVED_AS_DOSSIER_MEMBER.name()) + .target(Map.of("dossierId", dossierRequest.getDossierId())) + .build())); + } + + approvers.stream() + .filter(approver -> !KeycloakSecurity.getUserId().equals(approver) && existingDossier.getMemberIds() != null && existingDossier.getMemberIds() + .contains(approver) && (existingDossier.getApproverIds() == null || !existingDossier.getApproverIds().contains(approver))) + .forEach(approver -> notificationPersistenceService.insertNotification(AddNotificationRequest.builder() + .userId(approver) + .issuerId(KeycloakSecurity.getUserId()) + .notificationType(NotificationType.USER_PROMOTED_TO_APPROVER.name()) + .target(Map.of("dossierId", dossierRequest.getDossierId())) + .build())); + + members.stream() + .filter(member -> !member.equals(KeycloakSecurity.getUserId()) && existingDossier.getApproverIds() != null && existingDossier.getApproverIds() + .contains(member) && !approvers.contains(member)) + .forEach(member -> notificationPersistenceService.insertNotification(AddNotificationRequest.builder() + .userId(member) + .issuerId(KeycloakSecurity.getUserId()) + .notificationType(NotificationType.USER_DEGRADED_TO_REVIEWER.name()) + .target(Map.of("dossierId", dossierRequest.getDossierId())) + .build())); + + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setContentType(MediaType.APPLICATION_JSON); + return new ResponseEntity<>(updatedDossier, httpHeaders, HttpStatus.OK); + + } else { + Dossier created = createNewDossier(dossierRequest, ownerId, members, approvers); + + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(created.getId()) + .category(AuditCategory.DOSSIER.name()) + .message("Dossier has been created.") + .build()); + + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setContentType(MediaType.APPLICATION_JSON); + return new ResponseEntity<>(created, httpHeaders, HttpStatus.CREATED); + } + + } + + + private String getAndValidateOwnerId(String ownerId) { + + String currentUserId = KeycloakSecurity.getUserId(); + // quick check if self, just proceed + if (currentUserId.equals(ownerId)) { + return currentUserId; + } + + String actualOwnerId = ownerId == null ? currentUserId : ownerId; + + var user = userService.getUserById(actualOwnerId); + if (user.isEmpty()) { + userService.removeDeletedUsers(Collections.singleton(ownerId)); + actualOwnerId = null; + } + + // check he has a manager role, thus he can be the owner + if (user.isPresent() && user.get().getRoles().stream().noneMatch(ApplicationRoles.RED_MANAGER_ROLE::equals)) { + throw new BadRequestException("Make sure provided user id has the manager role."); + } + + return actualOwnerId; + + } + + + private Set getAndValidateMembers(String ownerId, Set memberIds) { + + Set actualMemberIds = memberIds == null ? new TreeSet<>() : memberIds; + if (actualMemberIds.stream().anyMatch(Objects::isNull)) { + throw new BadRequestException("Member IDs cannot be null"); + } + + // add owner automatically + if (ownerId != null) { + actualMemberIds.add(ownerId); + } + + List users = userService.getUsersByIds(actualMemberIds); + if (users.size() != actualMemberIds.size()) { + Set deletedUserIds = userService.removeDeletedUsers(actualMemberIds); + actualMemberIds.removeAll(deletedUserIds); + } + if (users.stream().anyMatch(u -> u.getRoles().stream().noneMatch(VALID_MEMBER_ROLES::contains))) { + throw new BadRequestException("Make sure each provided member id has the permission to be a member of a dossier."); + } + return actualMemberIds; + } + + + private void checkValidityForArchivedDossierUpdateRequest(DossierRequest updatedDossier, Dossier existingDossier) { + //these must not be editted for archived dossiers + checkEquality(updatedDossier.getDossierTemplateId(), existingDossier.getDossierTemplateId(), "dossier template id"); + checkEquality(updatedDossier.getDossierName(), existingDossier.getDossierName(), "dossier name"); + checkEquality(updatedDossier.getDescription(), existingDossier.getDescription(), "the description"); + checkEquality(updatedDossier.getDueDate(), existingDossier.getDueDate(), "the due date"); + checkEquality(updatedDossier.getDossierStatusId(), existingDossier.getDossierStatusId(), "dossier status id"); + } + + + private void updateFileStatusForDossierFiles(String dossierId, Collection members) { + + fileStatusManagementService.getDossierStatus(dossierId).stream().filter(fileStatus -> !fileStatus.isSoftOrHardDeleted()).forEach(f -> { + + if (f.getAssignee() != null && !members.contains(f.getAssignee())) { + fileStatusManagementService.setCurrentFileAssignee(dossierId, f.getId(), null); + } + }); + + } + + + private Dossier createNewDossier(DossierRequest dossier, String ownerId, Set members, Set approvers) { + + Dossier newDossier = dossierManagementService.addDossier(CreateOrUpdateDossierRequest.builder() + .dossierName(dossier.getDossierName()) + .description(dossier.getDescription()) + .dossierTemplateId(dossier.getDossierTemplateId()) + .downloadFileTypes(dossier.getDownloadFileTypes()) + .dueDate(dossier.getDueDate()) + .reportTemplateIds(dossier.getReportTemplateIds() != null ? new ArrayList<>(dossier.getReportTemplateIds()) : Lists.newArrayList()) + .watermarkId(dossier.getWatermarkId()) + .previewWatermarkId(dossier.getPreviewWatermarkId()) + .dossierStatusId(dossier.getDossierStatusId()) + .build()); + + dossierACLService.updateDossierACL(members, approvers, ownerId, newDossier.getId()); + dossierACLService.enhanceDossierWithACLData(newDossier); + + return newDossier; + + } + + + private void checkEquality(T updatedValue, T existingValue, String message) { + + if (updatedValue == null && existingValue != null || updatedValue != null && existingValue == null) { + throw new BadRequestException(String.format("You cannot edit %s in an archived dossier.", message)); + } + if (updatedValue == null && existingValue == null) { + return; + } + + if (!updatedValue.equals(existingValue)) { + throw new BadRequestException(String.format("You cannot edit %s in an archived dossier.", message)); + } + } + + + + + @PreAuthorize("hasAuthority('" + DELETE_DOSSIER + "') && hasPermission(#dossierId, 'Dossier', 'ACCESS_OBJECT')") + public void deleteDossier(@PathVariable(DOSSIER_ID_PARAM) String dossierId) { + + var dossierToBeDeleted = dossierACLService.enhanceDossierWithACLData(dossierManagementService.getDossierById(dossierId, true, false)); + + dossierManagementService.delete(dossierId); + + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(dossierId) + .category(AuditCategory.DOSSIER.name()) + .message("Dossier moved to trash.") + .build()); + + dossierToBeDeleted.getMemberIds() + .stream() + .filter(m -> !KeycloakSecurity.getUserId().equals(m)) + .forEach(member -> notificationPersistenceService.insertNotification(AddNotificationRequest.builder() + .userId(member) + .issuerId(KeycloakSecurity.getUserId()) + .notificationType(NotificationType.DOSSIER_DELETED.name()) + .target(Map.of("dossierId", dossierId, "dossierName", dossierToBeDeleted.getDossierName())) + .build())); + + } + + + @PreAuthorize("hasAuthority('" + READ_DOSSIER + "')") + @PostAuthorize("hasPermission(#dossierId, 'Dossier', 'VIEW_OBJECT')") + public Dossier getDossier(@PathVariable(DOSSIER_ID_PARAM) String dossierId, + @RequestParam(name = INCLUDE_ARCHIVED_PARAM, defaultValue = "false", required = false) boolean includeArchived, + @RequestParam(name = INCLUDE_DELETED_PARAM, defaultValue = "false", required = false) boolean includeDeleted) { + + return dossierACLService.enhanceDossierWithACLData(dossierManagementService.getDossierById(dossierId, includeArchived, includeDeleted)); + } + + + @PreAuthorize("hasAuthority('" + READ_DOSSIER + "')") + @PostFilter("hasPermission(filterObject.id, 'Dossier', 'VIEW_OBJECT')") + public List getDossiers(@RequestParam(name = INCLUDE_ARCHIVED_PARAM, defaultValue = "false", required = false) boolean includeArchived, + @RequestParam(name = INCLUDE_DELETED_PARAM, defaultValue = "false", required = false) boolean includeDeleted) { + + return dossierManagementService.getAllDossiers(includeArchived, includeDeleted).stream().map(dossierACLService::enhanceDossierWithACLData).collect(Collectors.toList()); + } + + + @PreAuthorize("hasAuthority('" + READ_DOSSIER + "')") + @PostFilter("hasPermission(filterObject.id, 'Dossier', 'VIEW_OBJECT')") + public List getDossiersForDossierTemplate(@PathVariable(DOSSIER_TEMPLATE_ID_PARAM) String dossierTemplateId, + @RequestParam(name = INCLUDE_ARCHIVED_PARAM, defaultValue = "false", required = false) boolean includeArchived, + @RequestParam(name = INCLUDE_DELETED_PARAM, defaultValue = "false", required = false) boolean includeDeleted) { + + return dossierManagementService.getAllDossiersForDossierTemplateId(dossierTemplateId, includeArchived, includeDeleted) + .stream() + .map(dossierACLService::enhanceDossierWithACLData) + .collect(Collectors.toList()); + } + + + @PreAuthorize("hasAuthority('" + READ_DOSSIER + "')") + @PostFilter("hasPermission(filterObject.id, 'Dossier', 'VIEW_OBJECT')") + public List getSoftDeletedDossiers() { + + return dossierManagementService.getSoftDeletedDossiers().stream().map(dossierACLService::enhanceDossierWithACLData).collect(Collectors.toList()); + + } + + + @PreAuthorize("hasAuthority('" + READ_DOSSIER + "')") + @PostFilter("hasPermission(filterObject.id, 'Dossier', 'VIEW_OBJECT')") + public List getArchivedDossiers() { + + return dossierManagementService.getArchivedDossiers().stream().map(dossierACLService::enhanceDossierWithACLData).collect(Collectors.toList()); + } + + + @PreAuthorize("hasAuthority('" + READ_DOSSIER + "')") + @PostFilter("hasPermission(filterObject.id, 'Dossier', 'VIEW_OBJECT')") + public List getArchivedDossiersForDossierTemplate(@PathVariable(DOSSIER_TEMPLATE_ID_PARAM) String dossierTemplateId) { + + return dossierManagementService.getArchivedDossiersForDossierTemplateId(dossierTemplateId) + .stream() + .map(dossierACLService::enhanceDossierWithACLData) + .collect(Collectors.toList()); + } + + + @PreAuthorize("hasAuthority('" + ARCHIVE_DOSSIER + "')") + @PreFilter("hasPermission(filterObject, 'Dossier', 'ACCESS_OBJECT')") + public void archiveDossiers(@RequestBody Set dossierIds) { + + for (String dossierId : dossierIds) { + accessControlService.verifyUserIsDossierOwner(dossierId); + } + dossierManagementService.archiveDossiers(dossierIds); + + for (String dossierId : dossierIds) { + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(dossierId) + .category(AuditCategory.DOSSIER.name()) + .message("Dossier archived.") + .build()); + } + } + + + @PreAuthorize("hasAuthority('" + UNARCHIVE_DOSSIER + "')") + public void unarchiveDossiers(@RequestBody Set dossierIds) { + + dossierManagementService.unarchiveDossiers(dossierIds); + + for (String dossierId : dossierIds) { + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(dossierId) + .category(AuditCategory.DOSSIER.name()) + .message("Dossier restored from archive.") + .build()); + } + } + + + @PreAuthorize("hasAuthority('" + DELETE_DOSSIER + "')") + @PreFilter("hasPermission(filterObject, 'Dossier', 'ACCESS_OBJECT')") + public void hardDeleteDossiers(@RequestParam(DOSSIER_ID_PARAM) Set dossierIds) { + + for (String dossierId : dossierIds) { + accessControlService.verifyUserIsDossierOwner(dossierId); + } + dossierManagementService.hardDeleteDossiers(dossierIds); + + for (String dossierId : dossierIds) { + + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(dossierId) + .category(AuditCategory.DOSSIER.name()) + .message("Dossier permanently deleted.") + .build()); + + } + } + + + @PreAuthorize("hasAuthority('" + DELETE_DOSSIER + "')") + @PreFilter("hasPermission(filterObject, 'Dossier', 'ACCESS_OBJECT')") + public void undeleteDossiers(@RequestBody Set dossierIds) { + + dossierManagementService.undeleteDossiers(dossierIds); + for (String dossierId : dossierIds) { + + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(dossierId) + .category(AuditCategory.DOSSIER.name()) + .message("Dossier restored from trash.") + .build()); + + } + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierStatsController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierStatsController.java new file mode 100644 index 000000000..f880671e2 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierStatsController.java @@ -0,0 +1,47 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.controller; + +import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_DOSSIER; + +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.security.access.prepost.PreFilter; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import com.iqser.red.service.persistence.management.v1.processor.service.DossierStatsService; +import com.iqser.red.service.persistence.service.v1.api.external.resource.DossierStatsResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierStats; + +import feign.FeignException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RestController +@RequiredArgsConstructor +public class DossierStatsController implements DossierStatsResource { + + private final DossierStatsService dossierStatsService; + + + @Override + @PreAuthorize("hasAuthority('" + READ_DOSSIER + "') && hasPermission(#dossierId, 'Dossier', 'VIEW_OBJECT')") + public DossierStats getDossierStats(@PathVariable(DOSSIER_ID_PARAM) String dossierId) { + + return dossierStatsService.getDossierStats(dossierId); + } + + + @Override + @PreAuthorize("hasAuthority('" + READ_DOSSIER + "')") + @PreFilter("hasPermission(filterObject, 'Dossier', 'ACCESS_OBJECT')") + public List getDossierStats(@RequestBody Set dossierIds) { + + return dossierIds.stream().map(dossierStatsService::getDossierStats).collect(Collectors.toList()); + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierStatusController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierStatusController.java new file mode 100644 index 000000000..412904122 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierStatusController.java @@ -0,0 +1,105 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.controller; + +import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_DOSSIER_STATUS; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_DOSSIER_STATUS; + +import java.util.List; +import java.util.stream.Collectors; + +import javax.transaction.Transactional; + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierStatusPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.utils.ColorUtils; +import com.iqser.red.service.persistence.management.v1.processor.utils.DossierStatusMapper; +import com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter; +import com.iqser.red.service.persistence.service.v1.api.external.resource.DossierStatusResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierStatusRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.CreateOrUpdateDossierStatusRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.DossierStatusInfo; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RestController +@RequiredArgsConstructor +public class DossierStatusController implements DossierStatusResource { + + private final DossierStatusPersistenceService dossierStatusPersistenceService; + + + @Override + @PreAuthorize("hasAuthority('" + WRITE_DOSSIER_STATUS + "')") + public DossierStatusInfo createOrUpdateDossierStatus(@RequestBody DossierStatusRequest dossierStatusRequest) { + + if (dossierStatusRequest.getDossierTemplateId() == null) { + throw new BadRequestException("Dossier Template must be set for creation"); + } + if (dossierStatusRequest.getName() == null || dossierStatusRequest.getName().isEmpty()) { + throw new BadRequestException("Dossier status name must be set"); + } + //validate color + ColorUtils.validateColor(dossierStatusRequest.getColor()); + //validate rank + if (dossierStatusRequest.getRank() < 0) { + throw new BadRequestException("The rank must not be negative"); + } + var response = dossierStatusPersistenceService.createOrUpdateDossierStatus(CreateOrUpdateDossierStatusRequest.builder() + .dossierStatusId(dossierStatusRequest.getDossierStatusId()) + .name(dossierStatusRequest.getName()) + .description(dossierStatusRequest.getDescription()) + .dossierTemplateId(dossierStatusRequest.getDossierTemplateId()) + .rank(dossierStatusRequest.getRank()) + .color(dossierStatusRequest.getColor()) + .build()); + return MagicConverter.convert(response, DossierStatusInfo.class); + } + + + @Override + @PreAuthorize("hasAuthority('" + READ_DOSSIER_STATUS + "')") + public List getAllDossierStatusForTemplate(@PathVariable("dossierTemplateId") String dossierTemplateId) { + + return dossierStatusPersistenceService.getAllDossierStatusForTemplate(dossierTemplateId) + .stream() + .map(d -> MagicConverter.convert(d, DossierStatusInfo.class)) + .collect(Collectors.toList()); + } + + + @Override + @PreAuthorize("hasAuthority('" + READ_DOSSIER_STATUS + "')") + public List getAllDossierStatuses(@RequestBody List dossierTemplateIds) { + + return dossierStatusPersistenceService.getAllDossierStatuses(dossierTemplateIds) + .stream() + .map(d -> MagicConverter.convert(d, DossierStatusInfo.class)) + .collect(Collectors.toList()); + } + + + @Override + @Transactional + @PreAuthorize("hasAuthority('" + READ_DOSSIER_STATUS + "')") + public DossierStatusInfo getDossierStatus(@PathVariable("dossierStatusId") String dossierStatusId) { + + return MagicConverter.convert(dossierStatusPersistenceService.getDossierStatus(dossierStatusId), DossierStatusInfo.class, new DossierStatusMapper()); + } + + + @Override + @PreAuthorize("hasAuthority('" + WRITE_DOSSIER_STATUS + "')") + public void deleteDossierStatus(@PathVariable("dossierStatusId") String dossierStatusId, + @RequestParam(value = DOSSIER_STATUS_REPLACE_ID, required = false) String replaceDossierStatusId) { + + dossierStatusPersistenceService.deleteDossierStatus(dossierStatusId, replaceDossierStatusId); + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierTemplateController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierTemplateController.java new file mode 100644 index 000000000..f217de344 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierTemplateController.java @@ -0,0 +1,307 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.controller; + +import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_DOSSIER_TEMPLATES; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_DOSSIER_TEMPLATES; +import static com.iqser.red.service.persistence.management.v1.processor.service.FeignExceptionHandler.processFeignException; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import javax.annotation.PostConstruct; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import com.iqser.red.keycloak.commons.KeycloakSecurity; +import com.iqser.red.service.persistence.management.v1.processor.acl.custom.dossier.DossierACLService; +import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; +import com.iqser.red.service.persistence.management.v1.processor.exception.ConflictException; +import com.iqser.red.service.persistence.management.v1.processor.service.DossierManagementService; +import com.iqser.red.service.persistence.management.v1.processor.service.DossierTemplateManagementService; +import com.iqser.red.service.persistence.management.v1.processor.service.DossierTemplateStatsService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; +import com.iqser.red.service.persistence.service.v1.api.external.resource.DossierTemplateResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierTemplateModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DownloadResponse; +import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.CloneDossierTemplateRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.CreateOrUpdateDossierTemplateRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierTemplate; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierTemplateStats; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierTemplateStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.Dossier; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.importexport.ExportDownloadRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.importexport.ImportDossierTemplateRequest; + +import feign.FeignException; +import io.micrometer.core.annotation.Timed; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RestController +@RequiredArgsConstructor +public class DossierTemplateController implements DossierTemplateResource { + + private final DossierTemplateManagementService dossierTemplateManagementService; + private final DossierTemplateStatsService dossierTemplateStatsService; + private final AuditPersistenceService auditPersistenceService; + private final DossierManagementService dossierManagementService; + private final DossierACLService dossierACLService; + + + @Override + @PreAuthorize("hasAuthority('" + WRITE_DOSSIER_TEMPLATES + "')") + public DossierTemplateModel createOrUpdateDossierTemplate(@RequestBody DossierTemplateModel dossierTemplateModel) { + + String userId = KeycloakSecurity.getUserId(); + dossierTemplateModel.setCreatedBy(userId); + dossierTemplateModel.setModifiedBy(userId); + var dossierTemplate = new CreateOrUpdateDossierTemplateRequest(); + BeanUtils.copyProperties(dossierTemplateModel, dossierTemplate); + try { + DossierTemplateModel response = convert(dossierTemplateManagementService.createOrUpdateDossierTemplate(dossierTemplate)); + + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(response.getDossierTemplateId()) + .category(AuditCategory.DOSSIER_TEMPLATE.name()) + .message("Dossier Template has been added or updated") + .build()); + return response; + } catch (FeignException e) { + throw processFeignException(e); + } + + } + + + @Override + @PreAuthorize("hasAuthority('" + READ_DOSSIER_TEMPLATES + "')") + public List getAllDossierTemplates() { + + return dossierTemplateManagementService.getAllDossierTemplates().stream().map(this::convert).collect(Collectors.toList()); + } + + + @Override + @PreAuthorize("hasAuthority('" + READ_DOSSIER_TEMPLATES + "')") + public DossierTemplateModel getDossierTemplate(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId) { + + try { + return convert(dossierTemplateManagementService.getDossierTemplate(dossierTemplateId)); + } catch (FeignException e) { + throw processFeignException(e); + } + } + + + @Override + @PreAuthorize("hasAuthority('" + READ_DOSSIER_TEMPLATES + "')") + public void deleteDossierTemplate(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId) { + + String userId = KeycloakSecurity.getUserId(); + + List dossiers = dossierManagementService.getAllDossiers(true, false); + if (dossiers != null && dossiers.stream().anyMatch(dossier -> dossier.getDossierTemplateId().equals(dossierTemplateId))) { + throw new ConflictException("Can not delete dossier template because there are dossiers based on it"); + } + + dossierTemplateManagementService.deleteDossierTemplate(dossierTemplateId, userId); + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(dossierTemplateId) + .category(AuditCategory.DOSSIER_TEMPLATE.name()) + .message("Dossier Template has been deleted") + .build()); + } + + + @Override + @PreAuthorize("hasAuthority('" + READ_DOSSIER_TEMPLATES + "')") + public void deleteDossierTemplates(@RequestBody List dossierTemplateIds) { + + String userId = KeycloakSecurity.getUserId(); + List errorIds = new ArrayList<>(); + + for (String dossierTemplateId : dossierTemplateIds) { + try { + List dossiers = dossierManagementService.getAllDossiers(true, false); + if (dossiers != null && dossiers.stream().anyMatch(dossier -> dossier.getDossierTemplateId().equals(dossierTemplateId))) { + throw new ConflictException("Can not delete dossier template because there are dossiers based on it"); + } + + dossierTemplateManagementService.deleteDossierTemplate(dossierTemplateId, userId); + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(dossierTemplateId) + .category(AuditCategory.DOSSIER_TEMPLATE.name()) + .message("Dossier template has been deleted") + .build()); + } catch (FeignException e) { + errorIds.add(dossierTemplateId); + } + } + + if (!errorIds.isEmpty()) { + throw new BadRequestException("Failed to delete dossier templates with ids: " + errorIds); + } + } + + + @Override + @PreAuthorize("hasAuthority('" + WRITE_DOSSIER_TEMPLATES + "')") + public DossierTemplateModel cloneDossierTemplate(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, + @RequestBody CloneDossierTemplateRequest cloneDossierTemplateRequest) { + + String userId = KeycloakSecurity.getUserId(); + + try { + + DossierTemplateModel response = convert(dossierTemplateManagementService.cloneDossierTemplate(dossierTemplateId, cloneDossierTemplateRequest)); + auditPersistenceService.audit(AuditRequest.builder() + .userId(userId) + .objectId(response.getDossierTemplateId()) + .category(AuditCategory.DOSSIER_TEMPLATE.name()) + .message("Dossier Template has been cloned") + .build()); + return response; + } catch (FeignException e) { + throw processFeignException(e); + } + } + + + @Override + @PreAuthorize("hasAuthority('" + READ_DOSSIER_TEMPLATES + "')") + public DossierTemplateStats getDossierTemplateStats(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId) { + + try { + var stats = dossierTemplateStatsService.getDossierTemplateStats(dossierTemplateId); + enhanceDossierTemplateStatsWithACLMemberDetails(stats); + return stats; + } catch (FeignException e) { + throw processFeignException(e); + } + } + + + @Override + @PreAuthorize("hasAuthority('" + READ_DOSSIER_TEMPLATES + "')") + public List getDossierTemplateStats() { + + try { + var statsList = dossierTemplateStatsService.getDossierTemplateStats(); + statsList.forEach(this::enhanceDossierTemplateStatsWithACLMemberDetails); + return statsList; + } catch (FeignException e) { + throw processFeignException(e); + } + } + + + @PreAuthorize("hasAuthority('" + READ_DOSSIER_TEMPLATES + "')") + public DownloadResponse prepareExportDownload(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId) { + + try { + ExportDownloadRequest request = ExportDownloadRequest.builder().dossierTemplateId(dossierTemplateId).userId(KeycloakSecurity.getUserId()).build(); + var response = dossierTemplateManagementService.prepareExportDownload(request); + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(response.getValue()) + .category(AuditCategory.DOWNLOAD.name()) + .message("Export Download was prepared") + .details(Map.of("dossierTemplateId", request.getDossierTemplateId())) + .build()); + return new DownloadResponse(response.getValue()); + } catch (FeignException e) { + throw processFeignException(e); + } + } + + + @Timed + @PreAuthorize("hasAuthority('" + WRITE_DOSSIER_TEMPLATES + "')") + public DossierTemplateModel importDossierTemplate(@RequestPart(name = "file") MultipartFile file, + @RequestParam(value = DOSSIER_TEMPLATE_ID, required = false) String dossierTemplateId, + @RequestParam(value = "updateExistingDossierTemplate", required = false, defaultValue = "false") boolean updateExistingDossierTemplate) { + + String originalFileName = file.getOriginalFilename(); + if (originalFileName == null || originalFileName.isEmpty()) { + throw new BadRequestException("Could not upload file, no filename provided."); + } + var extension = originalFileName.substring(originalFileName.lastIndexOf(".") + 1).toLowerCase(); + if ("zip".equalsIgnoreCase(extension)) { + if (StringUtils.isEmpty(dossierTemplateId) && updateExistingDossierTemplate) { + throw new BadRequestException("Could not update with dossier template empty"); + } + try { + if (dossierTemplateId != null && updateExistingDossierTemplate) { + dossierTemplateManagementService.getDossierTemplate(dossierTemplateId); //check if the dossierTemplate to update exists + } + + ImportDossierTemplateRequest request = ImportDossierTemplateRequest.builder() + .dossierTemplateId(dossierTemplateId) + .updateExistingDossierTemplate(updateExistingDossierTemplate) + .userId(KeycloakSecurity.getUserId()) + .archive(file.getBytes()) + .build(); + DossierTemplate loadedDossierTemplate = dossierTemplateManagementService.importDossierTemplate(request); + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(loadedDossierTemplate.getId()) + .category(AuditCategory.DOSSIER_TEMPLATE.name()) + .message("Dossier template was imported") + .details(Map.of("dossierTemplateId", loadedDossierTemplate.getId())) + .build()); + return convert(loadedDossierTemplate); + } catch (IOException e) { + throw new BadRequestException(e.getMessage(), e); + } catch (FeignException e) { + throw processFeignException(e); + } + } else { + throw new BadRequestException("Invalid extension"); + } + } + + + private void enhanceDossierTemplateStatsWithACLMemberDetails(DossierTemplateStats stats) { + + Set members = new HashSet<>(); + stats.getDossiersInTemplate().forEach(d -> members.addAll(dossierACLService.getMembers(d))); + stats.setNumberOfPeople(members.size()); + } + + + private DossierTemplateModel convert(DossierTemplate dossierTemplate) { + + return DossierTemplateModel.builder() + .dossierTemplateId(dossierTemplate.getId()) + .name(dossierTemplate.getName()) + .description(dossierTemplate.getDescription()) + .dateAdded(dossierTemplate.getDateAdded()) + .dateModified(dossierTemplate.getDateModified()) + .createdBy(dossierTemplate.getCreatedBy()) + .modifiedBy(dossierTemplate.getModifiedBy()) + .validFrom(dossierTemplate.getValidFrom()) + .validTo(dossierTemplate.getValidTo()) + .downloadFileTypes(dossierTemplate.getDownloadFileTypes()) + .dossierTemplateStatus(DossierTemplateStatus.valueOf(dossierTemplate.getDossierTemplateStatus().name())) + .build(); + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierTemplateStatsController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierTemplateStatsController.java new file mode 100644 index 000000000..c7f9c886f --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierTemplateStatsController.java @@ -0,0 +1,33 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.controller; + +import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_DOSSIER_TEMPLATES; + +import java.util.List; +import java.util.Set; + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.RestController; + +import com.iqser.red.service.persistence.management.v1.processor.service.DossierTemplateStatsService; +import com.iqser.red.service.persistence.service.v1.api.external.resource.DossierTemplateStatsResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierTemplateDictionaryStats; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RestController +@RequiredArgsConstructor +public class DossierTemplateStatsController implements DossierTemplateStatsResource { + + private final DossierTemplateStatsService dossierTemplateStatsService; + + + @Override + @PreAuthorize("hasAuthority('" + READ_DOSSIER_TEMPLATES + "')") + public List getDossierTemplateStats(Set dossierTemplateIds) { + + return dossierTemplateStatsService.getDossierTemplateStats(dossierTemplateIds); + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DownloadController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DownloadController.java new file mode 100644 index 000000000..07e8be157 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DownloadController.java @@ -0,0 +1,283 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.controller; + +import static com.iqser.red.keycloak.commons.roles.ActionRoles.PROCESS_DOWNLOAD; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_DOWNLOAD_STATUS; +import static com.iqser.red.service.persistence.management.v1.processor.utils.DownloadBufferUtils.fileProxyStreamForDownload; + +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.io.FileSystemResource; +import org.springframework.core.io.InputStreamResource; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.iqser.red.keycloak.commons.KeycloakSecurity; +import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; +import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; +import com.iqser.red.service.persistence.management.v1.processor.service.AccessControlService; +import com.iqser.red.service.persistence.management.v1.processor.service.DossierManagementService; +import com.iqser.red.service.persistence.management.v1.processor.service.DownloadService; +import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.utils.StringEncodingUtils; +import com.iqser.red.service.persistence.service.v1.api.external.resource.DownloadResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DownloadResponse; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DownloadStatusResponse; +import com.iqser.red.service.persistence.service.v1.api.shared.model.PrepareDownloadRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.PrepareDownloadWithOptionRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.RemoveDownloadRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DownloadFileType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.download.DownloadRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.download.DownloadStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.download.DownloadWithOptionRequest; +import com.iqser.red.storage.commons.service.StorageService; + +import com.iqser.red.persistence.service.v1.external.api.impl.service.OneTimeTokenService; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RestController +@RequiredArgsConstructor +public class DownloadController implements DownloadResource { + + private static final Pattern COLOR_PATTERN = Pattern.compile("^#[\\da-f]{6,6}$"); + + private final DossierManagementService dossierService; + private final FileStatusService fileStatusService; + private final DownloadService downloadService; + private final StorageService storageService; + private final AuditPersistenceService auditPersistenceService; + private final OneTimeTokenService oneTimeTokenDownloadService; + private final AccessControlService accessControlService; + + @Value("${storage.backend:s3}") + private String storageBackend; + + + @PreAuthorize("hasAuthority('" + PROCESS_DOWNLOAD + "')") + public DownloadResponse prepareDownload(@RequestBody PrepareDownloadRequest request) { + + // check the user is non-member or reviewer + accessControlService.verifyUserIsDossierOwnerOrApprover(request.getDossierId()); + var response = downloadService.prepareDownload(convert(request)); + auditPersistenceService.insertRecord(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(response.getValue()) + .category(AuditCategory.DOWNLOAD.name()) + .message("Download was prepared") + .details(Map.of("dossierId", request.getDossierId())) + .build()); + return new DownloadResponse(response.getValue()); + } + + + @PreAuthorize("hasAuthority('" + PROCESS_DOWNLOAD + "')") + public DownloadResponse prepareDownload(@RequestBody PrepareDownloadWithOptionRequest request) { + + validateDossierId(request.getDossierId()); + + validateAndFilterFileIds(request); + + if ((request.getDownloadFileTypes() == null || request.getDownloadFileTypes().isEmpty()) && (request.getReportTemplateIds() == null || request.getReportTemplateIds() + .isEmpty())) { + throw new BadRequestException("Download and report types cannot both be empty"); + } + + if (request.getRedactionPreviewColor() != null && !COLOR_PATTERN.matcher(request.getRedactionPreviewColor()).matches()) { + throw new BadRequestException("The specified redaction-preview-color is malformed."); + } + + var response = downloadService.prepareDownload(convert(request)); + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(response.getValue()) + .category(AuditCategory.DOWNLOAD.name()) + .message("Download was prepared") + .details(Map.of("dossierId", request.getDossierId())) + .build()); + return new DownloadResponse(response.getValue()); + } + + + private void validateDossierId(String dossierId) { + + if (StringUtils.isBlank(dossierId)) { + throw new BadRequestException("Empty dossier id"); + } + dossierService.getDossierById(dossierId, true, true); + accessControlService.verifyUserIsDossierOwnerOrApprover(dossierId); + } + + + private void validateAndFilterFileIds(PrepareDownloadWithOptionRequest request) { + + List validFiles = fileStatusService.getDossierStatus(request.getDossierId()); + var fileIds = request.getFileIds(); + if (fileIds != null && !fileIds.isEmpty()) { // validate the ids provided + validFiles = validFiles.stream().filter(f -> fileIds.contains(f.getId())).collect(Collectors.toList()); + if (validFiles.isEmpty()) { + throw new NotFoundException("No file id provided is found"); + } + } // otherwise consider the files from dossier + + var validFilesAndNotProcessed = validFiles.stream().filter(f -> !(f.getAnalysisVersion() > 0 && f.getNumberOfAnalyses() > 0)).collect(Collectors.toList()); + if (!validFilesAndNotProcessed.isEmpty()) { + throw new BadRequestException("At least a file is in its initial analysis process"); + } + + request.setFileIds(validFiles.stream().map(FileModel::getId).collect(Collectors.toList())); + var approvedFiles = validFiles.stream() + .filter(f -> f.getWorkflowStatus().equals(WorkflowStatus.APPROVED)) + .toList(); + // special corner case: unapproved files, no reports and only REDACTED type selected + if (approvedFiles.isEmpty() && (request.getReportTemplateIds() == null || request.getReportTemplateIds() + .isEmpty()) && request.getDownloadFileTypes() != null && request.getDownloadFileTypes().size() == 1 && request.getDownloadFileTypes() + .contains(DownloadFileType.REDACTED)) { + throw new BadRequestException("Unapproved files in redacted state with no reports cannot be included"); + } + } + + + private DownloadWithOptionRequest convert(PrepareDownloadWithOptionRequest request) { + + return DownloadWithOptionRequest.builder() + .dossierId(request.getDossierId()) + .userId(KeycloakSecurity.getUserId()) + .fileIds(request.getFileIds()) + .downloadFileTypes(request.getDownloadFileTypes()) + .reportTemplateIds(request.getReportTemplateIds()) + .redactionPreviewColor(request.getRedactionPreviewColor()) + .build(); + } + + + @Override + @PreAuthorize("hasAuthority('" + PROCESS_DOWNLOAD + "')") + public void deleteDownloadStatus(@RequestBody RemoveDownloadRequest removeDownloadRequest) { + + removeDownloadRequest.getStorageIds().forEach(storageId -> { + downloadService.deleteDownloadStatus(JSONPrimitive.of(storageId)); + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(storageId) + .category(AuditCategory.DOWNLOAD.name()) + .message("Remove Prepared Download") + .build()); + }); + + } + + + @PreAuthorize("hasAuthority('" + READ_DOWNLOAD_STATUS + "')") + public DownloadStatusResponse getDownloadStatus() { + + var resp = downloadService.getDownloadStatus(KeycloakSecurity.getUserId()); + return new DownloadStatusResponse(resp); + } + + + @PreAuthorize("hasAuthority('" + PROCESS_DOWNLOAD + "')") + public ResponseEntity downloadFile(@RequestParam(STORAGE_ID) String storageId, + @RequestParam(value = "inline", required = false, defaultValue = FALSE) boolean inline) { + + var userId = KeycloakSecurity.getUserId(); + + var downloadStatus = getDownloadStatus(storageId, userId); + var fileDownloadStream = getFileForDownload(storageId, userId); + + return getResponseEntity(inline, fileDownloadStream, downloadStatus.getFilename(), MediaType.parseMediaType("application/zip")); + } + + + private DownloadStatus getDownloadStatus(String storageId, String userId) { + // TODO Add endpoint to get single download status for userId and storageId. + var downloadStatusResponse = downloadService.getDownloadStatus(userId); + Optional downloadStatusOptional = downloadStatusResponse.stream().filter(ds -> ds.getStorageId().equals(storageId)).findFirst(); + + return downloadStatusOptional.orElseThrow(() -> new NotFoundException("Download status not found for this user")); + } + + + private InputStreamResource getFileForDownload(String storageId, String userId) { + + try { + var response = storageService.getObject(storageId); + + auditPersistenceService.audit(AuditRequest.builder() + .userId(userId) + .objectId(storageId) + .category(AuditCategory.DOWNLOAD.name()) + .message("File was downloaded.") + .build()); + downloadService.setDownloaded(JSONPrimitive.of(storageId)); + + return response; + } catch (Exception e) { + throw new NotFoundException(e.getMessage(), e); + } + } + + + @SneakyThrows + private ResponseEntity getResponseEntity(boolean inline, InputStreamResource resource, String filename, MediaType mediaType) { + + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setContentType(mediaType); + if (filename != null) { + httpHeaders.add("Content-Disposition", inline ? "inline" : "attachment" + "; filename*=utf-8''" + StringEncodingUtils.urlEncode(filename)); + } + + return new ResponseEntity<>(fileProxyStreamForDownload(resource.getInputStream()), httpHeaders, HttpStatus.OK); + + } + + + @Override + @PreAuthorize("hasAuthority('" + PROCESS_DOWNLOAD + "')") + public JSONPrimitive generateOneTimeToken(@RequestBody JSONPrimitive storageIdWrapper) { + + log.debug("Generate one time token"); + return JSONPrimitive.of(oneTimeTokenDownloadService.createToken(storageIdWrapper.getValue(), KeycloakSecurity.getUserId()).getTokenId()); + } + + + @Override + public ResponseEntity downloadFileUsingOTT(@PathVariable(OTT) String oneTimeToken, + @RequestParam(value = "inline", required = false, defaultValue = FALSE) boolean inline) { + + log.debug("downloadFileUsingOTT '{}'", oneTimeToken); + var token = oneTimeTokenDownloadService.getToken(oneTimeToken); + var downloadStatus = getDownloadStatus(token.getStorageId(), token.getUserId()); + var fileDownloadStream = getFileForDownload(token.getStorageId(), token.getUserId()); + + return getResponseEntity(inline, fileDownloadStream, downloadStatus.getFilename(), MediaType.parseMediaType("application/zip")); + + } + + + private DownloadRequest convert(PrepareDownloadRequest request) { + + return DownloadRequest.builder().dossierId(request.getDossierId()).userId(KeycloakSecurity.getUserId()).fileIds(request.getFileIds()).build(); + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ExternalControllerAdvice.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ExternalControllerAdvice.java new file mode 100644 index 000000000..5451851e8 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ExternalControllerAdvice.java @@ -0,0 +1,134 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.controller; + +import java.time.OffsetDateTime; +import java.util.stream.Collectors; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpStatus; +import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.WebDataBinder; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.InitBinder; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.multipart.support.MissingServletRequestPartException; + +import com.fasterxml.jackson.databind.exc.InvalidFormatException; +import com.iqser.red.commons.spring.ErrorMessage; +import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; +import com.iqser.red.service.persistence.management.v1.processor.exception.ConflictException; +import com.iqser.red.service.persistence.management.v1.processor.exception.NotAllowedException; +import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; + +@RestControllerAdvice +@Order(Ordered.HIGHEST_PRECEDENCE) +public class ExternalControllerAdvice { + + @ResponseBody + @ResponseStatus(value = HttpStatus.NOT_FOUND) + @ExceptionHandler(value = NotFoundException.class) + public ErrorMessage handleContentNotFoundException(NotFoundException e) { + + return new ErrorMessage(OffsetDateTime.now(), e.getMessage()); + } + + + /* error handling */ + + + @ResponseBody + @ResponseStatus(value = HttpStatus.BAD_REQUEST) + @ExceptionHandler(value = BadRequestException.class) + public ErrorMessage handleBadRequestException(BadRequestException e) { + + return new ErrorMessage(OffsetDateTime.now(), e.getMessage()); + } + + + @ResponseBody + @ResponseStatus(value = HttpStatus.CONFLICT) + @ExceptionHandler(value = {ConflictException.class}) + protected ErrorMessage handleConflictException(ConflictException e) { + + return new ErrorMessage(OffsetDateTime.now(), e.getMessage()); + } + + + @ResponseBody + @ResponseStatus(value = HttpStatus.FORBIDDEN) + @ExceptionHandler({AccessDeniedException.class}) + public ErrorMessage handleAccessDeniedException(AccessDeniedException e) { + + return new ErrorMessage(OffsetDateTime.now(), e.getMessage()); + } + + + @ResponseBody + @ResponseStatus(value = HttpStatus.FORBIDDEN) + @ExceptionHandler({NotAllowedException.class}) + public ErrorMessage handleNotAllowedException(NotAllowedException e) { + + return new ErrorMessage(OffsetDateTime.now(), e.getMessage()); + } + + + @ResponseBody + @ResponseStatus(value = HttpStatus.BAD_REQUEST) + @ExceptionHandler({MethodArgumentNotValidException.class}) + public ErrorMessage handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { + + var errorList = e.getFieldErrors(); + String errorListAsString = errorList.stream().map(fieldError -> fieldError.getField() + ": " + fieldError.getDefaultMessage()).collect(Collectors.joining(", ")); + return new ErrorMessage(OffsetDateTime.now(), String.format("You have empty/wrong formatted parameters: %s", errorListAsString)); + } + + + @ResponseBody + @ResponseStatus(value = HttpStatus.BAD_REQUEST) + @ExceptionHandler({MissingServletRequestPartException.class}) + public ErrorMessage handleMissingServletRequestPartException(MissingServletRequestPartException e) { + + return new ErrorMessage(OffsetDateTime.now(), e.getMessage()); + } + + + @ResponseBody + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler({HttpMessageNotReadableException.class}) + public ErrorMessage handleHttpMessageNotReadableException(HttpMessageNotReadableException e) { + + var cause = e.getCause(); + if (cause instanceof InvalidFormatException) { + InvalidFormatException invalidFormatException = (InvalidFormatException) cause; + + Class targetType = invalidFormatException.getTargetType(); + if (targetType != null && targetType.isEnum()) { + return new ErrorMessage(OffsetDateTime.now(), String.format("Unsupported value for %s", targetType.getSimpleName())); + } + + return new ErrorMessage(OffsetDateTime.now(), cause.getMessage()); + } + + return new ErrorMessage(OffsetDateTime.now(), e.getMessage()); + } + + + @Order(10000) + public static class BinderControllerAdvice { + + @InitBinder + public void setAllowedFields(WebDataBinder dataBinder) { + // This code protects Spring Core from a "Remote Code Execution" attack (dubbed "Spring4Shell"). + // By applying this mitigation, you prevent the "Class Loader Manipulation" attack vector from firing. + // For more details, see this post: https://www.lunasec.io/docs/blog/spring-rce-vulnerabilities/ + String[] denylist = new String[]{"class.*", "Class.*", "*.class.*", "*.Class.*"}; + dataBinder.setDisallowedFields(denylist); + } + + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/FileAttributesController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/FileAttributesController.java new file mode 100644 index 000000000..08d977a65 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/FileAttributesController.java @@ -0,0 +1,167 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.controller; + +import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_FILE_ATTRIBUTES_CONFIG; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_FILE_ATTRIBUTES; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_FILE_ATTRIBUTES_CONFIG; + +import java.util.List; +import java.util.Map; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import com.iqser.red.keycloak.commons.KeycloakSecurity; +import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.FileAttributesGeneralConfigurationEntity; +import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileAttributeConfigEntity; +import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; +import com.iqser.red.service.persistence.management.v1.processor.exception.NotAllowedException; +import com.iqser.red.service.persistence.management.v1.processor.service.AccessControlService; +import com.iqser.red.service.persistence.management.v1.processor.service.FileAttributesManagementService; +import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileAttributeConfigPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter; +import com.iqser.red.service.persistence.service.v1.api.external.resource.FileAttributesResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; +import com.iqser.red.service.persistence.service.v1.api.shared.model.FileAttributes; +import com.iqser.red.service.persistence.service.v1.api.shared.model.FileAttributesConfig; +import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.FileAttributesGeneralConfiguration; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileAttributeConfig; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RestController +@RequiredArgsConstructor +public class FileAttributesController implements FileAttributesResource { + + private final FileAttributesManagementService fileAttributesManagementService; + private final FileAttributeConfigPersistenceService fileAttributeConfigPersistenceService; + private final AuditPersistenceService auditPersistenceService; + private final FileStatusService fileStatusService; + private final AccessControlService accessControlService; + + + @Override + @PreAuthorize("hasAuthority('" + WRITE_FILE_ATTRIBUTES_CONFIG + "')") + public FileAttributesConfig setFileAttributesConfig(String dossierTemplateId, FileAttributesConfig fileAttributesConfig) { + + if (StringUtils.isEmpty(fileAttributesConfig.getEncoding()) || !encodingList.contains(fileAttributesConfig.getEncoding().trim())) { + throw new BadRequestException("Invalid encoding setting"); + } + fileAttributeConfigPersistenceService.setFileAttributesGeneralConfig(dossierTemplateId, + MagicConverter.convert(fileAttributesConfig, FileAttributesGeneralConfigurationEntity.class)); + var result = fileAttributeConfigPersistenceService.setFileAttributesConfig(dossierTemplateId, + MagicConverter.convert(fileAttributesConfig.getFileAttributeConfigs(), FileAttributeConfigEntity.class)); + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(dossierTemplateId) + .category(AuditCategory.DOSSIER_TEMPLATE.name()) + .message("Changed file attributes base configuration & attribute configuration ( CSV Import )") + .build()); + return FileAttributesConfig.builder() + .filenameMappingColumnHeaderName(fileAttributesConfig.getFilenameMappingColumnHeaderName()) + .delimiter(fileAttributesConfig.getDelimiter()) + .encoding(fileAttributesConfig.getEncoding()) + .fileAttributeConfigs(MagicConverter.convert(result, FileAttributeConfig.class)) + .build(); + + } + + + @Override + @PreAuthorize("hasAuthority('" + WRITE_FILE_ATTRIBUTES_CONFIG + "')") + public FileAttributeConfig addOrUpdateFileAttribute(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, @RequestBody FileAttributeConfig fileAttribute) { + + var result = fileAttributeConfigPersistenceService.addOrUpdateFileAttribute(dossierTemplateId, MagicConverter.convert(fileAttribute, FileAttributeConfigEntity.class)); + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(dossierTemplateId) + .category(AuditCategory.DOSSIER_TEMPLATE.name()) + .message("File attributes added/updated") + .details(Map.of("FileAttributeName", fileAttribute.getLabel() != null ? fileAttribute.getLabel() : "", "dossierTemplateId", dossierTemplateId)) + .build()); + + return MagicConverter.convert(result, FileAttributeConfig.class); + } + + + @Override + @PreAuthorize("hasAuthority('" + WRITE_FILE_ATTRIBUTES_CONFIG + "')") + public void deleteFileAttribute(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, @PathVariable(FILE_ATTRIBUTE_ID) String fileAttributeId) { + + fileAttributeConfigPersistenceService.deleteFileAttribute(fileAttributeId); + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(dossierTemplateId) + .category(AuditCategory.DOSSIER_TEMPLATE.name()) + .message("File attributes removed") + .details(Map.of("FileAttributeId", fileAttributeId)) + .build()); + } + + + @Override + @PreAuthorize("hasAuthority('" + WRITE_FILE_ATTRIBUTES_CONFIG + "')") + public void deleteFileAttributes(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, @RequestBody List fileAttributeIds) { + + fileAttributeConfigPersistenceService.deleteFileAttributes(fileAttributeIds); + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(dossierTemplateId) + .category(AuditCategory.DOSSIER_TEMPLATE.name()) + .message("File attributes removed") + .details(Map.of("FileAttributeId", fileAttributeIds)) + .build()); + } + + + @PreAuthorize("hasAuthority('" + READ_FILE_ATTRIBUTES_CONFIG + "')") + public FileAttributesConfig getFileAttributesConfiguration(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId) { + + var fileAttributeConfigs = fileAttributeConfigPersistenceService.getFileAttributes(dossierTemplateId); + FileAttributesGeneralConfiguration generalConfig = new FileAttributesGeneralConfiguration(); + try { + generalConfig = MagicConverter.convert(fileAttributeConfigPersistenceService.getFileAttributesGeneralConfiguration(dossierTemplateId), + FileAttributesGeneralConfiguration.class); + } catch (Exception e) { + log.debug("No general config defined", e); + } + return FileAttributesConfig.builder() + .filenameMappingColumnHeaderName(generalConfig.getFilenameMappingColumnHeaderName()) + .delimiter(generalConfig.getDelimiter()) + .encoding(generalConfig.getEncoding()) + .fileAttributeConfigs(MagicConverter.convert(fileAttributeConfigs, FileAttributeConfig.class)) + .build(); + } + + + @PreAuthorize("hasAuthority('" + WRITE_FILE_ATTRIBUTES + "')") + public void setFileAttributes(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody FileAttributes fileAttributes) { + + var file = fileStatusService.getStatus(fileId); + + if (file.getWorkflowStatus().equals(WorkflowStatus.APPROVED)) { + throw new NotAllowedException("File is approved. File attributes are not editable anymore."); + } + if (file.getWorkflowStatus().equals(WorkflowStatus.UNDER_APPROVAL)) { + accessControlService.verifyUserIsApprover(dossierId); + } + accessControlService.verifyUserIsMemberOrApprover(dossierId); + fileAttributesManagementService.setFileAttributes(dossierId, fileId, fileAttributes.getAttributeIdToValue()); + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(fileId) + .category(AuditCategory.DOCUMENT.name()) + .message("File attributes has been edited for a document.") + .build()); + + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/FileManagementController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/FileManagementController.java new file mode 100644 index 000000000..af5462851 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/FileManagementController.java @@ -0,0 +1,238 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.controller; + +import static com.iqser.red.keycloak.commons.roles.ActionRoles.DELETE_FILE; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.DOWNLOAD_ORIGINAL_FILE; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.ROTATE_PAGE; +import static com.iqser.red.service.persistence.management.v1.processor.service.FeignExceptionHandler.processFeignException; +import static com.iqser.red.service.persistence.management.v1.processor.utils.DownloadBufferUtils.fileProxyStreamForDownload; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.springframework.core.io.InputStreamResource; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.google.common.collect.Sets; +import com.iqser.red.keycloak.commons.KeycloakSecurity; +import com.iqser.red.service.persistence.management.v1.processor.client.pdftronredactionservice.PDFTronClient; +import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; +import com.iqser.red.service.persistence.management.v1.processor.exception.NotAllowedException; +import com.iqser.red.service.persistence.management.v1.processor.service.AccessControlService; +import com.iqser.red.service.persistence.management.v1.processor.service.FileService; +import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusManagementService; +import com.iqser.red.service.persistence.management.v1.processor.service.ReanalysisService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.utils.StorageIdUtils; +import com.iqser.red.service.persistence.management.v1.processor.utils.StringEncodingUtils; +import com.iqser.red.service.persistence.service.v1.api.external.resource.FileManagementResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; +import com.iqser.red.service.persistence.service.v1.api.shared.model.RotatePagesRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; +import com.iqser.red.storage.commons.service.StorageService; + +import feign.FeignException; +import io.micrometer.core.annotation.Timed; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RestController +@RequiredArgsConstructor +public class FileManagementController implements FileManagementResource { + + private static final String DOWNLOAD_HEADER_NAME = "Content-Disposition"; + + private final FileService fileService; + private final AuditPersistenceService auditPersistenceService; + private final AccessControlService accessControlService; + private final PDFTronClient pdfTronClient; + private final ReanalysisService reanalysisService; + private final StorageService storageService; + private final FileStatusManagementService fileStatusManagementService; + + + @Timed + @Override + @PreAuthorize("hasAuthority('" + DELETE_FILE + "')") + public void deleteFile(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId) { + + fileService.deleteFile(dossierId, fileId); + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(dossierId) + .category(AuditCategory.DOSSIER.name()) + .message("File has been deleted.") + .details(Map.of("fileId", fileId)) + .build()); + } + + + @Timed + @Override + @PreAuthorize("hasAuthority('" + DELETE_FILE + "')") + public void deleteFiles(@PathVariable(DOSSIER_ID) String dossierId, @RequestBody List fileIds) { + + List errorIds = new ArrayList<>(); + for (String fileId : fileIds) { + try { + fileService.deleteFile(dossierId, fileId); + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(dossierId) + .category(AuditCategory.DOSSIER.name()) + .message("Files have been deleted.") + .details(Map.of("Size", fileIds.size())) + .build()); + } catch (Exception e) { + errorIds.add(fileId); + } + } + if (!errorIds.isEmpty()) { + throw new BadRequestException("Failed to delete files with ids: " + errorIds); + } + } + + + @Timed + @Override + @PreAuthorize("hasAuthority('" + DOWNLOAD_ORIGINAL_FILE + "')") + public ResponseEntity downloadOriginal(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestParam(value = "inline", required = false, defaultValue = FALSE) boolean inline) { + + try { + + var file = fileStatusManagementService.getFileStatus(fileId); + var untouchedFileStream = storageService.getObject(StorageIdUtils.getStorageId(dossierId, fileId, FileType.ORIGIN)); + return getResponseEntity(inline, untouchedFileStream, file.getFilename(), MediaType.APPLICATION_PDF); + } catch (FeignException e) { + if (e.status() == HttpStatus.NOT_FOUND.value()) { + return new ResponseEntity<>(e.getMessage(), HttpStatus.NOT_FOUND); + } + log.debug(e.getMessage(), e); + return new ResponseEntity<>(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + + @SneakyThrows + private ResponseEntity getResponseEntity(boolean inline, InputStreamResource resource, String filename, MediaType mediaType) { + + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setContentType(mediaType); + + if (filename != null) { + httpHeaders.add(DOWNLOAD_HEADER_NAME, inline ? "inline" : "attachment" + "; filename*=utf-8''" + StringEncodingUtils.urlEncode(filename)); + } + + return new ResponseEntity<>(fileProxyStreamForDownload(resource.getInputStream()), httpHeaders, HttpStatus.OK); + + } + + + @Override + @PreAuthorize("hasAuthority('" + DELETE_FILE + "')") + public void hardDeleteFiles(@PathVariable(DOSSIER_ID) String dossierId, @RequestParam(FILE_IDS) Set fileIds) { + + for (String fileId : fileIds) { + if (fileStatusManagementService.getFileStatus(fileId).getAssignee() != null) { + accessControlService.verifyUserIsReviewerOrApprover(dossierId, fileId); + } + } + fileService.hardDeleteFiles(dossierId, fileIds); + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(dossierId) + .category(AuditCategory.DOSSIER.name()) + .message("Files has been hard deleted.") + .details(Map.of("FileIds", fileIds)) + .build()); + } + + + @Override + @PreAuthorize("hasAuthority('" + DELETE_FILE + "')") + public void restoreFiles(@PathVariable(DOSSIER_ID) String dossierId, @RequestBody Set fileIds) { + + verifyUserIsDossierOwnerOrApproverOrAssignedReviewer(dossierId, fileIds); + fileService.undeleteFiles(dossierId, fileIds); + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(dossierId) + .category(AuditCategory.DOSSIER.name()) + .message("Files has been restored.") + .details(Map.of("FileIds", fileIds)) + .build()); + } + + + @Override + @PreAuthorize("hasAuthority('" + ROTATE_PAGE + "')") + public void rotatePages(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody RotatePagesRequest rotatePagesRequest) { + + accessControlService.verifyFileIsNotApproved(dossierId, fileId); + accessControlService.verifyUserIsReviewer(dossierId, fileId); + + try { + pdfTronClient.rotate(com.iqser.red.service.pdftron.redaction.v1.api.model.RotatePagesRequest.builder() + .dossierId(dossierId) + .fileId(fileId) + .pages(rotatePagesRequest.getPages()) + .build()); + + fileStatusManagementService.updateFileModificationDate(fileId); + + FileModel fileModel = fileStatusManagementService.getFileStatus(fileId); + + if (!fileModel.isExcludedFromAutomaticAnalysis()) { + if (fileModel.getOcrStartTime() != null || fileModel.getOcrEndTime() != null) { + reanalysisService.ocrFile(dossierId, fileId, true); + } else { + reanalysisService.reanalyzeFiles(dossierId, Sets.newHashSet(fileId), true); + } + } + + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(dossierId) + .category(AuditCategory.DOCUMENT.name()) + .message("Pages have been rotated.") + .details(Map.of("Pages", rotatePagesRequest.getPages().keySet())) + .build()); + + } catch (FeignException e) { + throw processFeignException(e); + } + } + + + private void verifyUserIsDossierOwnerOrApproverOrAssignedReviewer(String dossierId, Set fileIds) { + + try { + accessControlService.verifyUserIsDossierOwnerOrApprover(dossierId); + } catch (AccessDeniedException e1) { + try { + for (String fileId : fileIds) { + accessControlService.verifyUserIsReviewer(dossierId, fileId); + } + } catch (NotAllowedException e2) { + throw new NotAllowedException("User must be dossier owner, approver or assigned reviewer of the file."); + } + } + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/GeneralSettingsController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/GeneralSettingsController.java new file mode 100644 index 000000000..35d1d79db --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/GeneralSettingsController.java @@ -0,0 +1,40 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.controller; + +import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_GENERAL_CONFIGURATION; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_GENERAL_CONFIGURATION; + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import com.iqser.red.service.persistence.service.v1.api.external.resource.GeneralSettingsResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.GeneralConfigurationModel; + +import com.iqser.red.persistence.service.v1.external.api.impl.service.GeneralConfigurationService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RestController +@RequiredArgsConstructor +public class GeneralSettingsController implements GeneralSettingsResource { + + private final GeneralConfigurationService generalConfigurationService; + + + @Override + @PreAuthorize("hasAuthority('" + READ_GENERAL_CONFIGURATION + "')") + public GeneralConfigurationModel getGeneralConfigurations() { + + return generalConfigurationService.getGeneralConfigurations(); + } + + + @Override + @PreAuthorize("hasAuthority('" + WRITE_GENERAL_CONFIGURATION + "')") + public void updateGeneralConfigurations(@RequestBody GeneralConfigurationModel generalConfigurationModel) { + + generalConfigurationService.updateGeneralConfigurations(generalConfigurationModel); + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/HighlightsController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/HighlightsController.java new file mode 100644 index 000000000..a8ad67830 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/HighlightsController.java @@ -0,0 +1,93 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.controller; + +import static com.iqser.red.keycloak.commons.roles.ActionRoles.*; +import static com.iqser.red.service.persistence.management.v1.processor.service.FeignExceptionHandler.processFeignException; +import static com.iqser.red.service.persistence.management.v1.processor.utils.StorageIdUtils.getStorageId; + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.iqser.red.service.pdftron.redaction.v1.api.model.highlights.Highlights; +import com.iqser.red.service.pdftron.redaction.v1.api.model.highlights.TextHighlightConversionOperation; +import com.iqser.red.service.pdftron.redaction.v1.api.model.highlights.TextHighlightConversionRequest; +import com.iqser.red.service.persistence.management.v1.processor.service.AccessControlService; +import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusService; +import com.iqser.red.service.persistence.management.v1.processor.service.ReanalysisService; +import com.iqser.red.service.persistence.service.v1.api.external.resource.HighlightsResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.AnnotationIds; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.DeleteImportedRedactionsRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; +import com.iqser.red.storage.commons.service.StorageService; + +import feign.FeignException; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; + +@RestController +@RequiredArgsConstructor +public class HighlightsController implements HighlightsResource { + + private final StorageService storageService; + private final ObjectMapper objectMapper; + private final AccessControlService accessControlService; + private final FileStatusService fileStatusService; + private final ReanalysisService reanalysisService; + + + @SneakyThrows + @PreAuthorize("hasAuthority('" + GET_HIGHLIGHTS + "')") + public Highlights getHighlights(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId) { + + fileStatusService.getStatus(fileId); + + if (storageService.objectExists(getStorageId(dossierId, fileId, FileType.TEXT_HIGHLIGHTS))) { + return objectMapper.readValue(storageService.getObject(getStorageId(dossierId, fileId, FileType.TEXT_HIGHLIGHTS)).getInputStream(), Highlights.class); + } + + return new Highlights(); + } + + @PreAuthorize("hasAuthority('" + CONVERT_HIGHLIGHTS + "')") + public void convertHighlights(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody AnnotationIds annotationIds) { + + try { + accessControlService.verifyUserIsReviewerOrApprover(dossierId, fileId); + accessControlService.verifyFileIsNotApproved(dossierId, fileId); + + reanalysisService.convertTextHighlights(new TextHighlightConversionRequest(dossierId, fileId, annotationIds.getIds(), TextHighlightConversionOperation.CONVERT)); + } catch (FeignException e) { + throw processFeignException(e); + } + } + + @PreAuthorize("hasAuthority('" + DELETE_HIGHLIGHTS + "')") + public void deleteHighlights(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody AnnotationIds annotationIds) { + + try { + accessControlService.verifyUserIsReviewerOrApprover(dossierId, fileId); + accessControlService.verifyFileIsNotApproved(dossierId, fileId); + + reanalysisService.convertTextHighlights(new TextHighlightConversionRequest(dossierId, fileId, annotationIds.getIds(), TextHighlightConversionOperation.REMOVE)); + } catch (FeignException e) { + throw processFeignException(e); + } + + } + + @PreAuthorize("hasAuthority('" + DELETE_IMPORTED_REDACTIONS + "')") + public void deleteImportedRedactions(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody AnnotationIds annotationIds) { + + try { + accessControlService.verifyUserIsReviewerOrApprover(dossierId, fileId); + accessControlService.verifyFileIsNotApproved(dossierId, fileId); + + reanalysisService.deleteImportedRedactions(new DeleteImportedRedactionsRequest(dossierId, fileId, annotationIds.getIds())); + } catch (FeignException e) { + throw processFeignException(e); + } + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/LegalBasisMappingController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/LegalBasisMappingController.java new file mode 100644 index 000000000..69c9cc4aa --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/LegalBasisMappingController.java @@ -0,0 +1,81 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.controller; + +import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_LEGAL_BASIS; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_LEGAL_BASIS; + +import java.util.List; + +import javax.transaction.Transactional; + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import com.iqser.red.keycloak.commons.KeycloakSecurity; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.LegalBasisMappingPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter; +import com.iqser.red.service.persistence.service.v1.api.external.resource.LegalBasisMappingResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; +import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.legalbasis.LegalBasis; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequiredArgsConstructor +public class LegalBasisMappingController implements LegalBasisMappingResource { + + private final LegalBasisMappingPersistenceService legalBasisMappingPersistenceService; + private final AuditPersistenceService auditPersistenceService; + + + @Override + @PreAuthorize("hasAuthority('" + WRITE_LEGAL_BASIS + "')") + public void deleteLegalBasis(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, @RequestBody List legalBasisNames) { + + legalBasisMappingPersistenceService.deleteLegalBasis(dossierTemplateId, legalBasisNames); + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(dossierTemplateId) + .category(AuditCategory.DOSSIER_TEMPLATE.name()) + .message("Legal basis mapping has been changed.") + .build()); + } + + + @Override + @PreAuthorize("hasAuthority('" + WRITE_LEGAL_BASIS + "')") + public void addOrUpdateLegalBasis(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, @RequestBody LegalBasis legalBasis) { + + legalBasisMappingPersistenceService.addOrUpdateLegalBasis(dossierTemplateId, legalBasis); + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(dossierTemplateId) + .category(AuditCategory.DOSSIER_TEMPLATE.name()) + .message("Legal basis mapping has been changed.") + .build()); + } + + + @PreAuthorize("hasAuthority('" + WRITE_LEGAL_BASIS + "')") + public void setLegalBasisMapping(@RequestBody List legalBasisMapping, @PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId) { + + legalBasisMappingPersistenceService.setLegalBasisMapping(dossierTemplateId, legalBasisMapping); + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(dossierTemplateId) + .category(AuditCategory.DOSSIER_TEMPLATE.name()) + .message("Legal basis mapping has been changed.") + .build()); + } + + @Transactional + @PreAuthorize("hasAuthority('" + READ_LEGAL_BASIS + "')") + public List getLegalBasisMapping(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId) { + + return MagicConverter.convert(legalBasisMappingPersistenceService.getLegalBasisMapping(dossierTemplateId), LegalBasis.class); + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/LicenseController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/LicenseController.java new file mode 100644 index 000000000..fd329eeb9 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/LicenseController.java @@ -0,0 +1,133 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.controller; + +import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_LICENSE; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.UPDATE_LICENSE; + +import java.time.OffsetDateTime; +import java.time.temporal.ChronoUnit; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.core.env.Environment; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.RestController; + +import com.iqser.red.service.persistence.service.v1.api.external.resource.LicenseResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.license.Feature; +import com.iqser.red.service.persistence.service.v1.api.shared.model.license.FeatureType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.license.License; +import com.iqser.red.service.persistence.service.v1.api.shared.model.license.RedactionLicenseModel; +import com.iqser.red.storage.commons.service.StorageService; + +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RestController +@RequiredArgsConstructor +public class LicenseController implements LicenseResource { + + private static final String LICENSE_OBJECT_ID = "license/redact-manager-license.json"; + private static final String DEMO_PDFTRON_LICENSE = "demo:1650351709282:7bd235e003000000004ec28a6743e1163a085e2115de2536ab6e2cfe5a"; + private static final String LICENSE_CUSTOMER = "LICENSE_CUSTOMER"; + private static final String LICENSE_START = "LICENSE_START"; + private static final String LICENSE_END = "LICENSE_END"; + private static final String LICENSE_PAGE_COUNT = "LICENSE_PAGE_COUNT"; + private static final String PDFTRON_FRONTEND_LICENSE = "PDFTRON_FRONTEND_LICENSE"; + private static final String PDFTRON_FEATURE = "pdftron"; + private static final String PROCESSING_PAGES_FEATURE = "processingPages"; + private static final String DEFAULT_PROCESSING_PAGES = "200000"; + private final StorageService storageService; + private final Environment environment; + + + @Override + @SneakyThrows + @PreAuthorize("hasAuthority('" + UPDATE_LICENSE + "')") + public void updateLicense(RedactionLicenseModel licenseModel) { + + storageService.storeJSONObject(LICENSE_OBJECT_ID, licenseModel); + } + + + @Override + @PreAuthorize("hasAuthority('" + READ_LICENSE + "')") + public RedactionLicenseModel getLicense() { + + if (storageService.objectExists(LICENSE_OBJECT_ID)) { + try { + return storageService.readJSONObject(LICENSE_OBJECT_ID, RedactionLicenseModel.class); + } catch (Exception e) { + return generateDemoLicense(); + } + } else { + return generateDemoLicense(); + } + } + + + private RedactionLicenseModel generateDemoLicense() { + + License demo = new License(); + demo.setId("RedactManager"); + demo.setName("RedactManager License"); + demo.setProduct("RedactManager"); + + var licensedTo = environment.getProperty(LICENSE_CUSTOMER, "RedactManager Demo License"); + demo.setLicensedTo(licensedTo); + + var licenseStartDate = parseDate(environment.getProperty(LICENSE_START)); + var start = licenseStartDate != null ? licenseStartDate : OffsetDateTime.now().withDayOfYear(1).withHour(0).withMinute(0).withSecond(0).truncatedTo(ChronoUnit.SECONDS); + demo.setValidFrom(start); + + var licenseEndDate = parseDate(environment.getProperty(LICENSE_END)); + var end = licenseEndDate != null ? licenseEndDate : OffsetDateTime.now() + .withMonth(12) + .withDayOfMonth(31) + .withHour(0) + .withMinute(0) + .withSecond(0) + .truncatedTo(ChronoUnit.SECONDS); + demo.setValidUntil(end); + + var pdftronLicense = environment.getProperty(PDFTRON_FRONTEND_LICENSE, DEMO_PDFTRON_LICENSE); + demo.getFeatures().add(Feature.builder().name(PDFTRON_FEATURE).type(FeatureType.STRING).value(pdftronLicense).build()); + + var pageCount = Long.parseLong(environment.getProperty(LICENSE_PAGE_COUNT, DEFAULT_PROCESSING_PAGES)); + demo.getFeatures().add(Feature.builder().name(PROCESSING_PAGES_FEATURE).type(FeatureType.NUMBER).value(pageCount).build()); + + var demoLicense = new RedactionLicenseModel(); + demoLicense.setActiveLicense("RedactManager"); + demoLicense.getLicenses().add(demo); + + return demoLicense; + } + + + private OffsetDateTime parseDate(String date) { + + if (StringUtils.isEmpty(date)) { + return null; + } + var parts = date.split("-"); + if (parts.length != 3) { + return null; + } + + try { + return OffsetDateTime.now() + .withYear(Integer.parseInt(parts[2])) + .withMonth(Integer.parseInt(parts[1])) + .withDayOfMonth(Integer.parseInt(parts[0])) + .withHour(0) + .withMinute(0) + .withSecond(0) + .truncatedTo(ChronoUnit.SECONDS); + } catch (Exception e) { + log.debug("Failed to parse date: {}", date); + return null; + } + + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/LicenseReportController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/LicenseReportController.java new file mode 100644 index 000000000..9c5eae9aa --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/LicenseReportController.java @@ -0,0 +1,47 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.controller; + +import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_LICENSE_REPORT; + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.iqser.red.keycloak.commons.KeycloakSecurity; +import com.iqser.red.service.persistence.management.v1.processor.service.LicenseReportService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; +import com.iqser.red.service.persistence.service.v1.api.external.resource.LicenseReportResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; +import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.license.LicenseReport; +import com.iqser.red.service.persistence.service.v1.api.shared.model.license.LicenseReportRequest; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequiredArgsConstructor +public class LicenseReportController implements LicenseReportResource { + + private static final String LICENSE_AUDIT_KEY = "License"; + private final AuditPersistenceService auditPersistenceService; + + private final LicenseReportService licenseReportService; + + + @Override + @PreAuthorize("hasAuthority('" + READ_LICENSE_REPORT + "')") + public LicenseReport getReport(@RequestBody LicenseReportRequest reportRequest, + @RequestParam(value = "offset", defaultValue = "0") int offset, + @RequestParam(value = "limit", defaultValue = "20") int limit) { + + LicenseReport licenseReport = licenseReportService.getLicenseReport(reportRequest, offset, limit); + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(LICENSE_AUDIT_KEY) + .category(AuditCategory.LICENSE.name()) + .message("License report has been viewed.") + .build()); + return licenseReport; + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ManualRedactionController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ManualRedactionController.java new file mode 100644 index 000000000..668f3b580 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ManualRedactionController.java @@ -0,0 +1,1133 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.controller; + +import static com.iqser.red.keycloak.commons.roles.ActionRoles.*; +import static com.iqser.red.service.persistence.management.v1.processor.utils.TypeIdUtils.toTypeId; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import com.iqser.red.keycloak.commons.KeycloakSecurity; +import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; +import com.iqser.red.service.persistence.management.v1.processor.service.AccessControlService; +import com.iqser.red.service.persistence.management.v1.processor.service.DossierManagementService; +import com.iqser.red.service.persistence.management.v1.processor.service.ManualRedactionService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; +import com.iqser.red.service.persistence.service.v1.api.external.resource.ManualRedactionResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; +import com.iqser.red.service.persistence.service.v1.api.shared.model.CommentResponse; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.CommentRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ManualAddResponse; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ManualRedactions; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.IdRemoval; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualForceRedaction; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualImageRecategorization; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualLegalBasisChange; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualRedactionEntry; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualResizeRedaction; +import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.AddCommentRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.AddRedactionRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.ApproveRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.ForceRedactionRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.ImageRecategorizationRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.LegalBasisChangeRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.ManualRedactionWrapper; +import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.RemoveRedactionRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.ResizeRedactionRequest; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RestController +@RequiredArgsConstructor +public class ManualRedactionController implements ManualRedactionResource { + + private static final String FILE_ID = "fileId"; + private static final String DOSSIER_ID = "dossierId"; + private static final String ANNOTATION_ID = "annotationId"; + private final ManualRedactionService manualRedactionService; + private final DossierManagementService dossierManagementService; + private final AuditPersistenceService auditPersistenceService; + private final AccessControlService accessControlService; + + + /* Reviewer Operations*/ + + + @Deprecated + @Override + @PreAuthorize("hasAuthority('" + REQUEST_MANUAL_REDACTION + "')") + public ManualAddResponse requestAddRedaction(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody AddRedactionRequest addRedactionRequest) { + + return requestBulkAddRedaction(dossierId, fileId, Set.of(addRedactionRequest)).get(0); + } + + + @Override + @PreAuthorize("hasAuthority('" + REQUEST_MANUAL_REDACTION + "')") + public List requestBulkAddRedaction(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody Set addRedactionRequests) { + + var dossier = dossierManagementService.getDossierById(dossierId, false, false); + accessControlService.verifyFileIsNotApproved(dossierId, fileId); + accessControlService.verifyUserIsReviewer(dossierId, fileId); + + List requests = new ArrayList<>(); + + for (var addRedactionRequest : addRedactionRequests) { + + var addRedactionRequestBuilder = com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AddRedactionRequest.builder() + .user(KeycloakSecurity.getUserId()) + .typeId(toTypeId(addRedactionRequest.getType(), dossier.getDossierTemplateId(), addRedactionRequest.isAddToDossierDictionary() ? dossierId : null)) + .value(addRedactionRequest.getValue()) + .reason(addRedactionRequest.getReason()) + .legalBasis(addRedactionRequest.getLegalBasis()) + .addToDictionary(addRedactionRequest.isAddToDictionary()) + .status(AnnotationStatus.REQUESTED) + .section(addRedactionRequest.getSection()) + .positions(addRedactionRequest.getPositions()) + .comment(addRedactionRequest.getComment() != null ? addRedactionRequest.getComment().getText() : null) + .addToDossierDictionary(addRedactionRequest.isAddToDossierDictionary()) + .forceAddToDictionary(addRedactionRequest.isForceAddToDictionary()) + .rectangle(addRedactionRequest.isRectangle()) + .dictionaryEntryType(addRedactionRequest.getDictionaryEntryType()) + .sourceId(addRedactionRequest.getSourceId()); + + requests.add(addRedactionRequestBuilder.build()); + } + List responseList = new ArrayList<>(); + responseList = manualRedactionService.addAddRedaction(dossierId, fileId, requests); + responseList.forEach(response -> auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(fileId) + .category(AuditCategory.DOCUMENT.name()) + .message("Manual redaction was requested.") + .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, response.getAnnotationId())) + .build())); + return responseList; + + } + + + @Deprecated + @Override + @PreAuthorize("hasAuthority('" + REQUEST_MANUAL_REDACTION + "')") + public ManualAddResponse requestRemoveRedaction(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody RemoveRedactionRequest removeRedactionRequest) { + + return processRequestRemoveRedactionBulk(dossierId, fileId, Set.of(removeRedactionRequest)).get(0); + } + + + private List processRequestRemoveRedactionBulk(String dossierId, String fileId, Set removeRedactionRequests) { + + accessControlService.verifyFileIsNotApproved(dossierId, fileId); + accessControlService.verifyUserIsReviewer(dossierId, fileId); + + List requests = removeRedactionRequests.stream() + .map(removeRedactionRequest -> com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.RemoveRedactionRequest.builder() + .annotationId(removeRedactionRequest.getAnnotationId()) + .user(KeycloakSecurity.getUserId()) + .status(AnnotationStatus.REQUESTED) + .removeFromDictionary(removeRedactionRequest.isRemoveFromDictionary()) + .comment(removeRedactionRequest.getComment()) + .build()) + .collect(Collectors.toList()); + + List responseList = manualRedactionService.addRemoveRedaction(dossierId, fileId, requests); + + responseList.forEach(response -> auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(fileId) + .category(AuditCategory.DOCUMENT.name()) + .message("Manual removed redaction was requested.") + .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, response.getAnnotationId())) + .build())); + + return responseList; + } + + + @Override + @PreAuthorize("hasAuthority('" + REQUEST_MANUAL_REDACTION + "')") + public List requestBulkRemoveRedaction(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody Set removeRedactionRequests) { + + return processRequestRemoveRedactionBulk(dossierId, fileId, removeRedactionRequests); + } + + + @Deprecated + @Override + @PreAuthorize("hasAuthority('" + REQUEST_MANUAL_REDACTION + "')") + public ManualAddResponse requestForceRedaction(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody ForceRedactionRequest forceRedactionRequest) { + + return processRequestForceRedactionBulk(dossierId, fileId, Set.of(forceRedactionRequest)).get(0); + } + + + private List processRequestForceRedactionBulk(String dossierId, String fileId, Set forceRedactionRequests) { + + accessControlService.verifyFileIsNotApproved(dossierId, fileId); + accessControlService.verifyUserIsReviewer(dossierId, fileId); + + List requests = forceRedactionRequests.stream() + .map(forceRedactionRequest -> com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ForceRedactionRequest.builder() + .annotationId(forceRedactionRequest.getAnnotationId()) + .user(KeycloakSecurity.getUserId()) + .status(AnnotationStatus.REQUESTED) + .comment(forceRedactionRequest.getComment()) + .legalBasis(forceRedactionRequest.getLegalBasis()) + .build()) + .collect(Collectors.toList()); + + List responseList = manualRedactionService.addForceRedaction(dossierId, fileId, requests); + + responseList.forEach(response -> auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(fileId) + .category(AuditCategory.DOCUMENT.name()) + .message("Manual force redaction was requested.") + .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, response.getAnnotationId())) + .build())); + + return responseList; + } + + + @PreAuthorize("hasAuthority('" + REQUEST_MANUAL_REDACTION + "')") + public List requestBulkForceRedaction(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody Set forceRedactionRequests) { + + return processRequestForceRedactionBulk(dossierId, fileId, forceRedactionRequests); + } + + + @Deprecated + @PreAuthorize("hasAuthority('" + REQUEST_MANUAL_REDACTION + "')") + public ManualAddResponse requestLegalBasisChange(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody LegalBasisChangeRequest legalBasisChangeRequest) { + + return processRequestLegalBasisChangeBulk(dossierId, fileId, Set.of(legalBasisChangeRequest)).get(0); + } + + + private List processRequestLegalBasisChangeBulk(String dossierId, String fileId, Set legalBasisChangeRequests) { + + accessControlService.verifyFileIsNotApproved(dossierId, fileId); + accessControlService.verifyUserIsReviewer(dossierId, fileId); + + List requests = legalBasisChangeRequests.stream() + .map(legalBasisChangeRequest -> com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.LegalBasisChangeRequest.builder() + .annotationId(legalBasisChangeRequest.getAnnotationId()) + .user(KeycloakSecurity.getUserId()) + .status(AnnotationStatus.REQUESTED) + .section(legalBasisChangeRequest.getSection()) + .comment(legalBasisChangeRequest.getComment()) + .legalBasis(legalBasisChangeRequest.getLegalBasis()) + .value(legalBasisChangeRequest.getValue()) + .build()) + .collect(Collectors.toList()); + + List responseList = manualRedactionService.addLegalBasisChange(dossierId, fileId, requests); + + responseList.forEach(response -> auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(fileId) + .category(AuditCategory.DOCUMENT.name()) + .message("Manual force redaction was requested.") + .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, response.getAnnotationId())) + .build())); + + return responseList; + } + + + @PreAuthorize("hasAuthority('" + REQUEST_MANUAL_REDACTION + "')") + public List requestBulkLegalBasisChange(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody Set legalBasisChangeRequests) { + + return processRequestLegalBasisChangeBulk(dossierId, fileId, legalBasisChangeRequests); + } + + + @Deprecated + @PreAuthorize("hasAuthority('" + REQUEST_MANUAL_REDACTION + "')") + public ManualAddResponse requestImageRecategorization(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody ImageRecategorizationRequest imageRecategorizationRequest) { + + return processRequestImageRecategorizationBulk(dossierId, fileId, Set.of(imageRecategorizationRequest)).get(0); + } + + + private List processRequestImageRecategorizationBulk(String dossierId, String fileId, Set imageRecategorizationRequests) { + + accessControlService.verifyFileIsNotApproved(dossierId, fileId); + accessControlService.verifyUserIsReviewer(dossierId, fileId); + var dossier = dossierManagementService.getDossierById(dossierId, false, false); + + List requests = imageRecategorizationRequests.stream() + .map(imageRecategorizationRequest -> com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ImageRecategorizationRequest.builder() + .annotationId(imageRecategorizationRequest.getAnnotationId()) + .user(KeycloakSecurity.getUserId()) + .status(AnnotationStatus.REQUESTED) + .typeId(toTypeId(imageRecategorizationRequest.getType(), dossier.getDossierTemplateId())) + .comment(imageRecategorizationRequest.getComment()) + .build()) + .collect(Collectors.toList()); + + List responseList = manualRedactionService.addImageRecategorization(dossierId, fileId, requests); + + responseList.forEach(response -> auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(fileId) + .category(AuditCategory.DOCUMENT.name()) + .message("Image recategorization was requested.") + .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, response.getAnnotationId())) + .build())); + + return responseList; + } + + + @PreAuthorize("hasAuthority('" + REQUEST_MANUAL_REDACTION + "')") + public List requestBulkImageRecategorization(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody Set imageRecategorizationRequests) { + + return processRequestImageRecategorizationBulk(dossierId, fileId, imageRecategorizationRequests); + } + + + @Deprecated + @Override + @PreAuthorize("hasAuthority('" + REQUEST_MANUAL_REDACTION + "')") + public ManualAddResponse requestResizeRedaction(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody ResizeRedactionRequest resizeRedactionRequest) { + + return processRequestResizeRedactionBulk(dossierId, fileId, Set.of(resizeRedactionRequest)).get(0); + } + + + private List processRequestResizeRedactionBulk(String dossierId, String fileId, Set resizeRedactionRequests) { + + accessControlService.verifyFileIsNotApproved(dossierId, fileId); + accessControlService.verifyUserIsReviewer(dossierId, fileId); + + List requests = resizeRedactionRequests.stream() + .map(resizeRedactionRequest -> com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ResizeRedactionRequest.builder() + .annotationId(resizeRedactionRequest.getAnnotationId()) + .user(KeycloakSecurity.getUserId()) + .status(AnnotationStatus.REQUESTED) + .comment(resizeRedactionRequest.getComment()) + .positions(resizeRedactionRequest.getPositions()) + .value(resizeRedactionRequest.getValue()) + .updateDictionary(resizeRedactionRequest.getUpdateDictionary()) + .build()) + .collect(Collectors.toList()); + + List responseList = manualRedactionService.addResizeRedaction(dossierId, fileId, requests); + + responseList.forEach(response -> auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(fileId) + .category(AuditCategory.DOCUMENT.name()) + .message("Manual resize redaction was requested.") + .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, response.getAnnotationId())) + .build())); + + return responseList; + } + + + @PreAuthorize("hasAuthority('" + REQUEST_MANUAL_REDACTION + "')") + public List requestBulkResizeRedaction(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody Set resizeRedactionRequests) { + + return processRequestResizeRedactionBulk(dossierId, fileId, resizeRedactionRequests); + } + + + @Deprecated + @Override + @PreAuthorize("hasAuthority('" + DELETE_MANUAL_REDACTION + "')") + public void undo(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @PathVariable(ANNOTATION_ID) String annotationId) { + + accessControlService.verifyFileIsNotApproved(dossierId, fileId); + accessControlService.verifyUserIsReviewer(dossierId, fileId); + + ManualRedactions manualRedactions = manualRedactionService.getManualRedactions(fileId); + + ManualRedactionWrapper manualRedactionWrapper = getLatestManualRedactionForAnnotationId(manualRedactions, annotationId); + + if (manualRedactionWrapper == null) { + throw new NotFoundException(String.format("ManualRedaction with annotationId %s could not be found.", annotationId)); + } + + if (manualRedactionWrapper.getItem() instanceof ManualRedactionEntry) { + + manualRedactionService.deleteAddRedaction(dossierId, fileId, List.of(annotationId)); + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(fileId) + .category(AuditCategory.DOCUMENT.name()) + .message("Undo of manual add redaction was done.") + .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, annotationId)) + .build()); + } else if (manualRedactionWrapper.getItem() instanceof IdRemoval) { + + manualRedactionService.deleteRemoveRedaction(dossierId, fileId, List.of(annotationId)); + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(fileId) + .category(AuditCategory.DOCUMENT.name()) + .message("Undo of manual remove redaction was done.") + .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, annotationId)) + .build()); + } else if (manualRedactionWrapper.getItem() instanceof ManualForceRedaction) { + + manualRedactionService.deleteForceRedaction(dossierId, fileId, List.of(annotationId)); + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(fileId) + .category(AuditCategory.DOCUMENT.name()) + .message("Undo of manual force redaction was done.") + .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, annotationId)) + .build()); + } else if (manualRedactionWrapper.getItem() instanceof ManualImageRecategorization) { + + manualRedactionService.deleteImageRecategorization(dossierId, fileId, List.of(annotationId)); + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(fileId) + .category(AuditCategory.DOCUMENT.name()) + .message("Undo of manual image recategorization was done.") + .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, annotationId)) + .build()); + } else if (manualRedactionWrapper.getItem() instanceof ManualLegalBasisChange) { + + manualRedactionService.deleteLegalBasisChange(dossierId, fileId, List.of(annotationId)); + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(fileId) + .category(AuditCategory.DOCUMENT.name()) + .message("Undo of legal basis change was done.") + .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, annotationId)) + .build()); + } else if (manualRedactionWrapper.getItem() instanceof ManualResizeRedaction) { + + manualRedactionService.deleteResizeRedaction(dossierId, fileId, List.of(annotationId)); + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(fileId) + .category(AuditCategory.DOCUMENT.name()) + .message("Undo of manual resize redaction was done.") + .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, annotationId)) + .build()); + } + } + + + private ManualRedactionWrapper getLatestManualRedactionForAnnotationId(ManualRedactions manualRedactions, String annotationId) { + + final List manualRedactionWrappers = new ArrayList<>(); + + manualRedactions.getEntriesToAdd() + .stream() + .filter(item -> item.getSoftDeletedTime() == null && item.getAnnotationId().equals(annotationId)) + .forEach(item -> manualRedactionWrappers.add(new ManualRedactionWrapper(item.getAnnotationId(), item.getRequestDate(), item))); + + manualRedactions.getImageRecategorization() + .stream() + .filter(item -> item.getSoftDeletedTime() == null && item.getAnnotationId().equals(annotationId)) + .forEach(item -> manualRedactionWrappers.add(new ManualRedactionWrapper(item.getAnnotationId(), item.getRequestDate(), item))); + + manualRedactions.getIdsToRemove() + .stream() + .filter(item -> item.getSoftDeletedTime() == null && item.getAnnotationId().equals(annotationId)) + .forEach(item -> manualRedactionWrappers.add(new ManualRedactionWrapper(item.getAnnotationId(), item.getRequestDate(), item))); + + manualRedactions.getForceRedactions() + .stream() + .filter(item -> item.getSoftDeletedTime() == null && item.getAnnotationId().equals(annotationId)) + .forEach(item -> manualRedactionWrappers.add(new ManualRedactionWrapper(item.getAnnotationId(), item.getRequestDate(), item))); + + manualRedactions.getLegalBasisChanges() + .stream() + .filter(item -> item.getSoftDeletedTime() == null && item.getAnnotationId().equals(annotationId)) + .forEach(item -> manualRedactionWrappers.add(new ManualRedactionWrapper(item.getAnnotationId(), item.getRequestDate(), item))); + + manualRedactions.getResizeRedactions() + .stream() + .filter(item -> item.getSoftDeletedTime() == null && item.getAnnotationId().equals(annotationId)) + .forEach(item -> manualRedactionWrappers.add(new ManualRedactionWrapper(item.getAnnotationId(), item.getRequestDate(), item))); + + var sortedManualRedactionWrappers = manualRedactionWrappers.stream() + .sorted(Comparator.comparing(ManualRedactionWrapper::getDate, Comparator.nullsLast(Comparator.reverseOrder()))) + .collect(Collectors.toList()); + + return sortedManualRedactionWrappers.isEmpty() ? null : sortedManualRedactionWrappers.get(0); + } + + + @Override + @PreAuthorize("hasAuthority('" + DELETE_MANUAL_REDACTION + "')") + public void undo(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody Set annotationIds) { + + accessControlService.verifyFileIsNotApproved(dossierId, fileId); + accessControlService.verifyUserIsReviewer(dossierId, fileId); + + ManualRedactions manualRedactions = manualRedactionService.getManualRedactions(fileId); + + Map manualRedactionWrappers = getLatestManualRedactionsForAnnotationIds(manualRedactions, annotationIds); + + if (manualRedactionWrappers.isEmpty()) { + throw new NotFoundException(String.format("ManualRedaction with annotationIds %s could not be found.", annotationIds)); + } + + List manualRedactionEntries = manualRedactionWrappers.values() + .stream() + .filter(manualRedactionWrapper -> manualRedactionWrapper.getItem() instanceof ManualRedactionEntry) + .map(ManualRedactionWrapper::getId) + .collect(Collectors.toList()); + if (!manualRedactionEntries.isEmpty()) { + manualRedactionService.deleteAddRedaction(dossierId, fileId, manualRedactionEntries); + manualRedactionEntries.forEach(annotationId -> auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(fileId) + .category(AuditCategory.DOCUMENT.name()) + .message("Undo of manual add redaction was done.") + .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, annotationId)) + .build())); + } + + List idRemovals = manualRedactionWrappers.values() + .stream() + .filter(manualRedactionWrapper -> manualRedactionWrapper.getItem() instanceof IdRemoval) + .map(ManualRedactionWrapper::getId) + .collect(Collectors.toList()); + if (!idRemovals.isEmpty()) { + + manualRedactionService.deleteRemoveRedaction(dossierId, fileId, idRemovals); + idRemovals.forEach(annotationId -> auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(fileId) + .category(AuditCategory.DOCUMENT.name()) + .message("Undo of manual remove redaction was done.") + .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, annotationId)) + .build())); + } + + List manualForceRedactions = manualRedactionWrappers.values() + .stream() + .filter(manualRedactionWrapper -> manualRedactionWrapper.getItem() instanceof ManualForceRedaction) + .map(ManualRedactionWrapper::getId) + .collect(Collectors.toList()); + if (!manualForceRedactions.isEmpty()) { + + manualRedactionService.deleteForceRedaction(dossierId, fileId, manualForceRedactions); + manualForceRedactions.forEach(annotationId -> auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(fileId) + .category(AuditCategory.DOCUMENT.name()) + .message("Undo of manual force redaction was done.") + .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, annotationId)) + .build())); + } + + List manualImageRecategorizations = manualRedactionWrappers.values() + .stream() + .filter(manualRedactionWrapper -> manualRedactionWrapper.getItem() instanceof ManualImageRecategorization) + .map(ManualRedactionWrapper::getId) + .collect(Collectors.toList()); + if (!manualImageRecategorizations.isEmpty()) { + + manualRedactionService.deleteImageRecategorization(dossierId, fileId, manualImageRecategorizations); + manualImageRecategorizations.forEach(annotationId -> auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(fileId) + .category(AuditCategory.DOCUMENT.name()) + .message("Undo of manual image recategorization was done.") + .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, annotationId)) + .build())); + } + + List manualLegalBasisChanges = manualRedactionWrappers.values() + .stream() + .filter(manualRedactionWrapper -> manualRedactionWrapper.getItem() instanceof ManualLegalBasisChange) + .map(ManualRedactionWrapper::getId) + .collect(Collectors.toList()); + if (!manualLegalBasisChanges.isEmpty()) { + + manualRedactionService.deleteLegalBasisChange(dossierId, fileId, manualLegalBasisChanges); + manualLegalBasisChanges.forEach(annotationId -> auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(fileId) + .category(AuditCategory.DOCUMENT.name()) + .message("Undo of legal basis change was done.") + .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, annotationId)) + .build())); + } + + List manualResizeRedactions = manualRedactionWrappers.values() + .stream() + .filter(manualRedactionWrapper -> manualRedactionWrapper.getItem() instanceof ManualResizeRedaction) + .map(ManualRedactionWrapper::getId) + .collect(Collectors.toList()); + if (!manualResizeRedactions.isEmpty()) { + + manualRedactionService.deleteResizeRedaction(dossierId, fileId, manualResizeRedactions); + manualResizeRedactions.forEach(annotationId -> auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(fileId) + .category(AuditCategory.DOCUMENT.name()) + .message("Undo of manual resize redaction was done.") + .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, annotationId)) + .build())); + } + } + + + private Map getLatestManualRedactionsForAnnotationIds(ManualRedactions manualRedactions, Set annotationIds) { + + Map result = new HashMap<>(); + annotationIds.forEach(annotationId -> { + var last = getLatestManualRedactionForAnnotationId(manualRedactions, annotationId); + if (last != null) { + result.put(annotationId, last); + } + }); + + return result; + } + + + @Override + @PreAuthorize("hasAuthority('" + DELETE_COMMENT + "')") + public void undoComment(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @PathVariable(ANNOTATION_ID) String annotationId, + @PathVariable(COMMENT_ID) String commentId) { + + accessControlService.verifyFileIsNotApproved(dossierId, fileId); + accessControlService.verifyUserIsReviewerOrApprover(dossierId, fileId); + + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(fileId) + .category(AuditCategory.DOCUMENT.name()) + .message("Comment was removed.") + .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, annotationId)) + .build()); + manualRedactionService.deleteComment(fileId, List.of(Long.valueOf(commentId))); + + } + + + @Deprecated + @Override + @PreAuthorize("hasAuthority('" + PROCESS_MANUAL_REDACTION_REQUEST + "')") + public void declineRequest(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @PathVariable(ANNOTATION_ID) String annotationId) { + + declineRequestBulk(dossierId, fileId, Set.of(annotationId)); + } + + + /* Approver Operations*/ + + @PreAuthorize("hasAuthority('" + PROCESS_MANUAL_REDACTION_REQUEST + "')") + public void declineRequestBulk(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody Set annotationIds) { + + accessControlService.verifyFileIsNotApproved(dossierId, fileId); + accessControlService.verifyUserIsApprover(dossierId); + + updateAnnotationStatus(dossierId, fileId, annotationIds, AnnotationStatus.DECLINED); + + annotationIds.forEach(annotationId -> auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(fileId) + .category(AuditCategory.DOCUMENT.name()) + .message("Suggestion was declined") + .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, annotationId)) + .build())); + } + + + private void updateAnnotationStatus(String dossierId, String fileId, Set annotationIds, AnnotationStatus status) { + + accessControlService.verifyFileIsNotApproved(dossierId, fileId); + ManualRedactions manualRedactions = manualRedactionService.getManualRedactions(fileId); + + Map manualRedactionWrappers = getLatestManualRedactionsForAnnotationIds(manualRedactions, annotationIds); + + if (manualRedactionWrappers.isEmpty()) { + throw new NotFoundException(String.format("ManualRedaction with annotationIds %s could not be found.", annotationIds)); + } + + List manualRedactionEntries = manualRedactionWrappers.values() + .stream() + .filter(manualRedactionWrapper -> manualRedactionWrapper.getItem() instanceof ManualRedactionEntry) + .map(ManualRedactionWrapper::getId) + .collect(Collectors.toList()); + if (!manualRedactionEntries.isEmpty()) { + manualRedactionService.updateAddRedactionStatus(dossierId, fileId, manualRedactionEntries, status); + manualRedactionEntries.forEach(annotationId -> auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(fileId) + .category(AuditCategory.DOCUMENT.name()) + .message("Undo of manual add redaction was done.") + .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, annotationId)) + .build())); + } + + List idRemovals = manualRedactionWrappers.values() + .stream() + .filter(manualRedactionWrapper -> manualRedactionWrapper.getItem() instanceof IdRemoval) + .map(ManualRedactionWrapper::getId) + .collect(Collectors.toList()); + if (!idRemovals.isEmpty()) { + + manualRedactionService.updateRemoveRedactionStatus(dossierId, fileId, idRemovals, status); + idRemovals.forEach(annotationId -> auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(fileId) + .category(AuditCategory.DOCUMENT.name()) + .message("Undo of manual remove redaction was done.") + .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, annotationId)) + .build())); + } + + List manualForceRedactions = manualRedactionWrappers.values() + .stream() + .filter(manualRedactionWrapper -> manualRedactionWrapper.getItem() instanceof ManualForceRedaction) + .map(ManualRedactionWrapper::getId) + .collect(Collectors.toList()); + if (!manualForceRedactions.isEmpty()) { + + manualRedactionService.updateForceRedactionStatus(dossierId, fileId, manualForceRedactions, status); + manualForceRedactions.forEach(annotationId -> auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(fileId) + .category(AuditCategory.DOCUMENT.name()) + .message("Undo of manual force redaction was done.") + .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, annotationId)) + .build())); + } + + List manualImageRecategorizations = manualRedactionWrappers.values() + .stream() + .filter(manualRedactionWrapper -> manualRedactionWrapper.getItem() instanceof ManualImageRecategorization) + .map(ManualRedactionWrapper::getId) + .collect(Collectors.toList()); + if (!manualImageRecategorizations.isEmpty()) { + + manualRedactionService.updateImageRecategorizationStatus(dossierId, fileId, manualImageRecategorizations, status); + manualImageRecategorizations.forEach(annotationId -> auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(fileId) + .category(AuditCategory.DOCUMENT.name()) + .message("Undo of manual image recategorization was done.") + .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, annotationId)) + .build())); + } + + List manualLegalBasisChanges = manualRedactionWrappers.values() + .stream() + .filter(manualRedactionWrapper -> manualRedactionWrapper.getItem() instanceof ManualLegalBasisChange) + .map(ManualRedactionWrapper::getId) + .collect(Collectors.toList()); + if (!manualLegalBasisChanges.isEmpty()) { + + manualRedactionService.updateLegalBasisChangeStatus(dossierId, fileId, manualLegalBasisChanges, status); + manualLegalBasisChanges.forEach(annotationId -> auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(fileId) + .category(AuditCategory.DOCUMENT.name()) + .message("Undo of legal basis change was done.") + .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, annotationId)) + .build())); + } + + List manualResizeRedactions = manualRedactionWrappers.values() + .stream() + .filter(manualRedactionWrapper -> manualRedactionWrapper.getItem() instanceof ManualResizeRedaction) + .map(ManualRedactionWrapper::getId) + .collect(Collectors.toList()); + if (!manualResizeRedactions.isEmpty()) { + + manualRedactionService.updateResizeRedactionStatus(dossierId, fileId, manualResizeRedactions, status); + manualResizeRedactions.forEach(annotationId -> auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(fileId) + .category(AuditCategory.DOCUMENT.name()) + .message("Undo of manual resize redaction was done.") + .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, annotationId)) + .build())); + } + } + + + @Override + @PreAuthorize("hasAuthority('" + READ_MANUAL_REDACTIONS + "')") + public ManualRedactions getManualRedactions(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId) { + + return manualRedactionService.getManualRedactions(fileId); + } + + + @Override + @PreAuthorize("hasAuthority('" + ADD_COMMENT + "')") + public CommentResponse addComment(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @PathVariable(ANNOTATION_ID) String annotationId, + @RequestBody AddCommentRequest addCommentRequest) { + + accessControlService.verifyFileIsNotApproved(dossierId, fileId); + accessControlService.verifyUserIsReviewerOrApprover(dossierId, fileId); + + var response = manualRedactionService.addComment(fileId, + annotationId, + CommentRequest.builder().user(KeycloakSecurity.getUserId()).text(addCommentRequest.getText()).build()); + + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(fileId) + .category(AuditCategory.DOCUMENT.name()) + .message("Comment was added.") + .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, annotationId)) + .build()); + + return new CommentResponse(String.valueOf(response.getId())); + } + + + @Deprecated + @Override + @PreAuthorize("hasAuthority('" + PROCESS_MANUAL_REDACTION_REQUEST + "')") + public void approveRequest(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @PathVariable(ANNOTATION_ID) String annotationId, + @RequestBody ApproveRequest approveRequest) { + + approveRequestBulk(dossierId, fileId, Set.of(annotationId)); + } + + @PreAuthorize("hasAuthority('" + PROCESS_MANUAL_REDACTION_REQUEST + "')") + public void approveRequestBulk(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody Set annotationIds) { + + accessControlService.verifyFileIsNotApproved(dossierId, fileId); + accessControlService.verifyUserIsApprover(dossierId); + + updateAnnotationStatus(dossierId, fileId, annotationIds, AnnotationStatus.APPROVED); + + annotationIds.forEach(annotationId -> auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(fileId) + .category(AuditCategory.DOCUMENT.name()) + .message("Suggestion was approved") + .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, annotationId)) + .build())); + } + + + @Deprecated + @Override + @PreAuthorize("hasAuthority('" + DO_MANUAL_REDACTION + "')") + public ManualAddResponse addRedaction(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody AddRedactionRequest addRedactionRequest) { + + return addRedactionBulk(dossierId, fileId, Set.of(addRedactionRequest)).get(0); + } + + + @Override + @PreAuthorize("hasAuthority('" + DO_MANUAL_REDACTION + "')") + public List addRedactionBulk(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody Set addRedactionRequests) { + + var dossier = dossierManagementService.getDossierById(dossierId, false, false); + accessControlService.verifyFileIsNotApproved(dossierId, fileId); + accessControlService.verifyUserIsApprover(dossierId); + + List requests = new ArrayList<>(); + + for (var addRedactionRequest : addRedactionRequests) { + + var addRedactionRequestBuilder = com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AddRedactionRequest.builder() + .value(addRedactionRequest.getValue()) + .legalBasis(addRedactionRequest.getLegalBasis()) + .user(KeycloakSecurity.getUserId()) + .typeId(toTypeId(addRedactionRequest.getType(), dossier.getDossierTemplateId(), addRedactionRequest.isAddToDossierDictionary() ? dossierId : null)) + .reason(addRedactionRequest.getReason()) + .addToDictionary(addRedactionRequest.isAddToDictionary()) + .status(AnnotationStatus.APPROVED) + .comment(addRedactionRequest.getComment() != null ? addRedactionRequest.getComment().getText() : null) + .section(addRedactionRequest.getSection()) + .rectangle(addRedactionRequest.isRectangle()) + .addToDossierDictionary(addRedactionRequest.isAddToDossierDictionary()) + .forceAddToDictionary(addRedactionRequest.isForceAddToDictionary()) + .positions(addRedactionRequest.getPositions()) + .sourceId(addRedactionRequest.getSourceId()) + .dictionaryEntryType(addRedactionRequest.getDictionaryEntryType()); + + requests.add(addRedactionRequestBuilder.build()); + } + List responseList = manualRedactionService.addAddRedaction(dossierId, fileId, requests); + responseList.forEach(response -> auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(fileId) + .category(AuditCategory.DOCUMENT.name()) + .message("Manual redaction was added.") + .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, response.getAnnotationId())) + .build())); + return responseList; + } + + + @Deprecated + @Override + @PreAuthorize("hasAuthority('" + DO_MANUAL_REDACTION + "')") + public ManualAddResponse removeRedaction(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody RemoveRedactionRequest removeRedactionRequest) { + + return removeRedactionBulk(dossierId, fileId, Set.of(removeRedactionRequest)).get(0); + } + + @PreAuthorize("hasAuthority('" + DO_MANUAL_REDACTION + "')") + public List removeRedactionBulk(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody Set removeRedactionRequests) { + + accessControlService.verifyFileIsNotApproved(dossierId, fileId); + accessControlService.verifyUserIsApprover(dossierId); + + List requests = new ArrayList<>(); + + for (var removeRedactionRequest : removeRedactionRequests) { + var removeRedactionRequestBuilder = com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.RemoveRedactionRequest.builder() + .annotationId(removeRedactionRequest.getAnnotationId()) + .user(KeycloakSecurity.getUserId()) + .status(AnnotationStatus.APPROVED) + .removeFromDictionary(removeRedactionRequest.isRemoveFromDictionary()); + + if (removeRedactionRequest.getComment() != null) { + removeRedactionRequestBuilder.comment(removeRedactionRequest.getComment()); + } + + requests.add(removeRedactionRequestBuilder.build()); + } + try { + List responseList = manualRedactionService.addRemoveRedaction(dossierId, fileId, requests); + + responseList.forEach(response -> auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(fileId) + .category(AuditCategory.DOCUMENT.name()) + .message("Redaction was manually removed") + .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, response.getAnnotationId())) + .build())); + + return responseList; + }catch (Exception e){ + e.printStackTrace();; + return null; + } + } + + + @Deprecated + @Override + @PreAuthorize("hasAuthority('" + DO_MANUAL_REDACTION + "')") + public ManualAddResponse forceRedaction(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody ForceRedactionRequest forceRedactionRequest) { + + return forceRedactionBulk(dossierId, fileId, Set.of(forceRedactionRequest)).get(0); + } + + @PreAuthorize("hasAuthority('" + DO_MANUAL_REDACTION + "')") + public List forceRedactionBulk(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody Set forceRedactionRequests) { + + accessControlService.verifyFileIsNotApproved(dossierId, fileId); + accessControlService.verifyUserIsApprover(dossierId); + + List requests = forceRedactionRequests.stream() + .map(forceRedactionRequest -> com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ForceRedactionRequest.builder() + .annotationId(forceRedactionRequest.getAnnotationId()) + .user(KeycloakSecurity.getUserId()) + .status(AnnotationStatus.APPROVED) + .legalBasis(forceRedactionRequest.getLegalBasis()) + .comment(forceRedactionRequest.getComment()) + .build()) + .collect(Collectors.toList()); + List responseList = manualRedactionService.addForceRedaction(dossierId, fileId, requests); + + responseList.forEach(response -> auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(fileId) + .category(AuditCategory.DOCUMENT.name()) + .message("Skipped redaction was forced to be redacted") + .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, response.getAnnotationId())) + .build())); + + return responseList; + } + + + @Deprecated + @PreAuthorize("hasAuthority('" + DO_MANUAL_REDACTION + "')") + public ManualAddResponse legalBasisChange(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody LegalBasisChangeRequest legalBasisChangeRequest) { + + return legalBasisChangeBulk(dossierId, fileId, Set.of(legalBasisChangeRequest)).get(0); + } + + @PreAuthorize("hasAuthority('" + DO_MANUAL_REDACTION + "')") + public List legalBasisChangeBulk(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody Set legalBasisChangeRequests) { + + accessControlService.verifyFileIsNotApproved(dossierId, fileId); + accessControlService.verifyUserIsApprover(dossierId); + + List requests = legalBasisChangeRequests.stream() + .map(legalBasisChangeRequest -> com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.LegalBasisChangeRequest.builder() + .annotationId(legalBasisChangeRequest.getAnnotationId()) + .user(KeycloakSecurity.getUserId()) + .status(AnnotationStatus.APPROVED) + .section(legalBasisChangeRequest.getSection()) + .legalBasis(legalBasisChangeRequest.getLegalBasis()) + .comment(legalBasisChangeRequest.getComment()) + .value(legalBasisChangeRequest.getValue()) + .build()) + .collect(Collectors.toList()); + + List responseList = manualRedactionService.addLegalBasisChange(dossierId, fileId, requests); + + responseList.forEach(response -> auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(fileId) + .category(AuditCategory.DOCUMENT.name()) + .message("Legal basis reason was changed") + .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, response.getAnnotationId())) + .build())); + + return responseList; + } + + + @Deprecated + @PreAuthorize("hasAuthority('" + DO_MANUAL_REDACTION + "')") + public ManualAddResponse recategorizeImage(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody ImageRecategorizationRequest imageRecategorizationRequest) { + + return recategorizeImageBulk(dossierId, fileId, Set.of(imageRecategorizationRequest)).get(0); + } + + @PreAuthorize("hasAuthority('" + DO_MANUAL_REDACTION + "')") + public List recategorizeImageBulk(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody Set imageRecategorizationRequests) { + + var dossier = dossierManagementService.getDossierById(dossierId, false, false); + accessControlService.verifyFileIsNotApproved(dossierId, fileId); + accessControlService.verifyUserIsApprover(dossierId); + + List requests = imageRecategorizationRequests.stream() + .map(imageRecategorizationRequest -> com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ImageRecategorizationRequest.builder() + .annotationId(imageRecategorizationRequest.getAnnotationId()) + .user(KeycloakSecurity.getUserId()) + .status(AnnotationStatus.APPROVED) + .typeId(toTypeId(imageRecategorizationRequest.getType(), dossier.getDossierTemplateId())) + .comment(imageRecategorizationRequest.getComment()) + .build()) + .collect(Collectors.toList()); + + List responseList = manualRedactionService.addImageRecategorization(dossierId, fileId, requests); + + responseList.forEach(response -> auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(fileId) + .category(AuditCategory.DOCUMENT.name()) + .message("Image was recategorized") + .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, response.getAnnotationId())) + .build())); + + return responseList; + } + + + @Deprecated + @Override + @PreAuthorize("hasAuthority('" + DO_MANUAL_REDACTION + "')") + public ManualAddResponse resizeRedaction(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody ResizeRedactionRequest resizeRedactionRequest) { + + return resizeRedactionBulk(dossierId, fileId, Set.of(resizeRedactionRequest)).get(0); + } + + @PreAuthorize("hasAuthority('" + DO_MANUAL_REDACTION + "')") + public List resizeRedactionBulk(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody Set resizeRedactionRequests) { + + accessControlService.verifyFileIsNotApproved(dossierId, fileId); + accessControlService.verifyUserIsApprover(dossierId); + + List requests = resizeRedactionRequests.stream() + .map(resizeRedactionRequest -> com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ResizeRedactionRequest.builder() + .annotationId(resizeRedactionRequest.getAnnotationId()) + .user(KeycloakSecurity.getUserId()) + .status(AnnotationStatus.APPROVED) + .positions(resizeRedactionRequest.getPositions()) + .value(resizeRedactionRequest.getValue()) + .comment(resizeRedactionRequest.getComment()) + .updateDictionary(resizeRedactionRequest.getUpdateDictionary()) + .build()) + .collect(Collectors.toList()); + + List responseList = manualRedactionService.addResizeRedaction(dossierId, fileId, requests); + + responseList.forEach(response -> auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(fileId) + .category(AuditCategory.DOCUMENT.name()) + .message("Skipped redaction was resized to be redacted") + .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, response.getAnnotationId())) + .build())); + + return responseList; + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/NotificationController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/NotificationController.java new file mode 100644 index 000000000..444fb4547 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/NotificationController.java @@ -0,0 +1,77 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.controller; + +import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_NOTIFICATIONS; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.UPDATE_NOTIFICATIONS; + +import java.time.OffsetDateTime; +import java.util.List; + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.iqser.red.keycloak.commons.KeycloakSecurity; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.NotificationPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter; +import com.iqser.red.service.persistence.service.v1.api.external.resource.NotificationResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.NotificationResponse; +import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; +import com.iqser.red.service.persistence.service.v1.api.shared.model.notification.Notification; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequiredArgsConstructor +public class NotificationController implements NotificationResource { + + private final NotificationPersistenceService notificationPersistenceService; + + + @Override + @PreAuthorize("hasAuthority('" + READ_NOTIFICATIONS + "')") + public JSONPrimitive hasNewNotificationsSince(@RequestBody JSONPrimitive since) { + + return JSONPrimitive.of(notificationPersistenceService.hasNewNotificationsSince(KeycloakSecurity.getUserId(), since.getValue())); + } + + @PreAuthorize("hasAuthority('" + UPDATE_NOTIFICATIONS + "')") + public void toggleNotificationSeen(@RequestBody List notificationIds, @RequestParam(SET_SEEN_PARAM) boolean setSeen) { + + notificationIds.stream().map(Long::valueOf).forEach(notificationId -> { + if (setSeen) { + notificationPersistenceService.setSeenDate(KeycloakSecurity.getUserId(), notificationId, OffsetDateTime.now()); + } else { + notificationPersistenceService.setSeenDate(KeycloakSecurity.getUserId(), notificationId, null); + } + }); + } + + @PreAuthorize("hasAuthority('" + UPDATE_NOTIFICATIONS + "')") + public void toggleNotificationRead(@RequestBody List notificationIds, @RequestParam(SET_READ_PARAM) boolean setRead) { + + notificationIds.stream().map(Long::valueOf).forEach(notificationId -> { + if (setRead) { + notificationPersistenceService.setReadDate(KeycloakSecurity.getUserId(), notificationId, OffsetDateTime.now()); + } else { + notificationPersistenceService.setReadDate(KeycloakSecurity.getUserId(), notificationId, null); + } + }); + } + + @PreAuthorize("hasAuthority('" + UPDATE_NOTIFICATIONS + "')") + public void delete(@RequestBody List notificationIds) { + + notificationIds.stream().map(Long::valueOf).forEach(notificationId -> { + notificationPersistenceService.softDelete(KeycloakSecurity.getUserId(), notificationId); + }); + } + + @PreAuthorize("hasAuthority('" + READ_NOTIFICATIONS + "')") + public NotificationResponse getNotifications(@RequestParam(INCLUDE_SEEN_PARAM) boolean includeSeen) { + + var notifications = MagicConverter.convert(notificationPersistenceService.getNotifications(KeycloakSecurity.getUserId(), includeSeen), Notification.class); + return NotificationResponse.builder().notifications(notifications).build(); + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/NotificationPreferencesController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/NotificationPreferencesController.java new file mode 100644 index 000000000..4cb20a8fa --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/NotificationPreferencesController.java @@ -0,0 +1,49 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.controller; + +import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_NOTIFICATIONS; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.UPDATE_NOTIFICATIONS; + + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import com.iqser.red.keycloak.commons.KeycloakSecurity; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.NotificationPreferencesPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter; +import com.iqser.red.service.persistence.service.v1.api.external.resource.NotificationPreferencesResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.notification.NotificationPreferences; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequiredArgsConstructor +public class NotificationPreferencesController implements NotificationPreferencesResource { + + private final NotificationPreferencesPersistenceService notificationPreferencesPersistenceService; + + + @Override + @PreAuthorize("hasAuthority('" + READ_NOTIFICATIONS + "')") + public NotificationPreferences getNotificationPreferences() { + return notificationPreferencesPersistenceService.getOrCreateNotificationPreferences(KeycloakSecurity.getUserId()); + } + + + @Override + @PreAuthorize("hasAuthority('" + UPDATE_NOTIFICATIONS + "')") + public void setNotificationPreferences(@RequestBody NotificationPreferences notificationPreferences) { + + notificationPreferencesPersistenceService.setNotificationPreference(KeycloakSecurity.getUserId(), notificationPreferences); + } + + + @Override + @PreAuthorize("hasAuthority('" + UPDATE_NOTIFICATIONS + "')") + public void deleteNotificationPreferences() { + + notificationPreferencesPersistenceService.deleteNotificationPreferences(KeycloakSecurity.getUserId()); + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/RSSController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/RSSController.java new file mode 100644 index 000000000..6c525ed3c --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/RSSController.java @@ -0,0 +1,138 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.controller; + +import static com.iqser.red.keycloak.commons.roles.ActionRoles.GET_RSS; + +import java.util.Map; +import java.util.stream.Collectors; + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.iqser.red.keycloak.commons.KeycloakSecurity; +import com.iqser.red.service.persistence.management.v1.processor.client.redactionreportservice.RssReportClient; +import com.iqser.red.service.persistence.management.v1.processor.service.ComponentOverrideService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; +import com.iqser.red.service.persistence.service.v1.api.external.resource.RSSResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; +import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.component.ComponentsOverrides; +import com.iqser.red.service.persistence.service.v1.api.shared.model.component.RevertOverrideRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.rss.RSSFileResponse; +import com.iqser.red.service.persistence.service.v1.api.shared.model.rss.RSSResponse; +import com.iqser.red.service.redaction.report.v1.api.model.rss.DetailedRSSResponse; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequiredArgsConstructor +public class RSSController implements RSSResource { + + private final RssReportClient rssReportClient; + private final ComponentOverrideService componentOverrideService; + private final AuditPersistenceService auditPersistenceService; + + + @PreAuthorize("hasAuthority('" + GET_RSS + "')") + public RSSResponse getRSS(@PathVariable(DOSSIER_ID) String dossierId, @RequestParam(value = "fileId", required = false) String fileId) { + + return convert(rssReportClient.getRSS(dossierId, fileId)); + + } + + + @PreAuthorize("hasAuthority('" + GET_RSS + "')") + private RSSResponse convert(com.iqser.red.service.redaction.report.v1.api.model.rss.RSSResponse rssResponse) { + + return new RSSResponse(rssResponse.getFiles().stream().map(this::convert).collect(Collectors.toList())); + } + + + @PreAuthorize("hasAuthority('" + GET_RSS + "')") + private RSSFileResponse convert(com.iqser.red.service.redaction.report.v1.api.model.rss.RSSFileResponse rssFileResponse) { + + return new RSSFileResponse(rssFileResponse.getFilename(), rssFileResponse.getResult()); + + } + + + @PreAuthorize("hasAuthority('" + GET_RSS + "')") + public DetailedRSSResponse getDetailedRSS(@PathVariable(DOSSIER_ID) String dossierId, @RequestParam(value = "fileId", required = false) String fileId) { + + return rssReportClient.getDetailedRSS(dossierId, fileId); + } + + + @PreAuthorize("hasAuthority('" + GET_RSS + "')") + public void addOverrides(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody ComponentsOverrides componentsOverrides) { + + var rssReport = rssReportClient.getDetailedRSS(dossierId, fileId); + var components = rssReport.getFiles().get(0).getResult(); + + componentOverrideService.addOverrides(dossierId, fileId, componentsOverrides); + + componentsOverrides.getComponentOverrides() + .forEach((key, value) -> auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(fileId) + .category(AuditCategory.DOCUMENT.name()) + .message("The component is overwritten with value") + .details(Map.of(DOSSIER_ID, + dossierId, + FILE_ID, + fileId, + "ComponentName", + key, + "Action", + "MODIFY", + "OriginalValue", + components.get(key).getOriginalValue(), + "OldValue", + components.get(key).getValue() != null ? components.get(key).getValue() : components.get(key).getOriginalValue(), + "NewValue", + value)) + .build())); + } + + + @PreAuthorize("hasAuthority('" + GET_RSS + "')") + public ComponentsOverrides getOverrides(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId) { + + return componentOverrideService.getOverrides(dossierId, fileId); + } + + + @PreAuthorize("hasAuthority('" + GET_RSS + "')") + public void revertOverrides(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody RevertOverrideRequest revertOverrideRequest) { + + var rssReport = rssReportClient.getDetailedRSS(dossierId, fileId); + var components = rssReport.getFiles().get(0).getResult(); + + componentOverrideService.revertOverrides(dossierId, fileId, revertOverrideRequest); + + revertOverrideRequest.getComponents() + .forEach(component -> auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(fileId) + .category(AuditCategory.DOCUMENT.name()) + .message("The component override for was reverted") + .details(Map.of(DOSSIER_ID, + dossierId, + FILE_ID, + fileId, + "ComponentName", + component, + "Action", + "REVERT", + "OriginalValue", + components.get(component).getOriginalValue(), + "OldValue", + components.get(component).getValue() != null ? components.get(component).getValue() : components.get(component).getOriginalValue(), + "NewValue", + components.get(component).getOriginalValue())) + .build())); + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ReanalysisController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ReanalysisController.java new file mode 100644 index 000000000..1fb50fa56 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ReanalysisController.java @@ -0,0 +1,312 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.controller; + +import static com.iqser.red.keycloak.commons.roles.ActionRoles.*; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.google.common.collect.Sets; +import com.iqser.red.keycloak.commons.KeycloakSecurity; +import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; +import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; +import com.iqser.red.service.persistence.management.v1.processor.service.AccessControlService; +import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusManagementService; +import com.iqser.red.service.persistence.management.v1.processor.service.ReanalysisService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; +import com.iqser.red.service.persistence.service.v1.api.external.resource.ReanalysisResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; +import com.iqser.red.service.persistence.service.v1.api.shared.model.PageExclusionRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus; + +import feign.FeignException; +import lombok.RequiredArgsConstructor; + +@RestController +@RequiredArgsConstructor +public class ReanalysisController implements ReanalysisResource { + + private static final String DOSSIER_ID = "dossierId"; + private final ReanalysisService reanalysisService; + private final FileStatusManagementService fileStatusManagementService; + private final AuditPersistenceService auditPersistenceService; + private final AccessControlService accessControlService; + + @PreAuthorize("hasAuthority('" + REANALYZE_DOSSIER + "')") + public void reanalyzeDossier(@PathVariable(DOSSIER_ID) String dossierId, @RequestParam(value = FORCE_PARAM, required = false, defaultValue = FALSE) boolean force) { + + try { + accessControlService.verifyUserHasViewPermissions(dossierId); + } catch (AccessDeniedException e) { + throw new NotFoundException("Object not found"); + } + + accessControlService.verifyUserHasAccessPermissions(dossierId); + reanalysisService.reanalyzeDossier(dossierId, force); + + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(dossierId) + .category(AuditCategory.DOSSIER.name()) + .message("Reanalyse dossier was triggered") + .build()); + + } + + @PreAuthorize("hasAuthority('" + REANALYZE_FILE + "')") + public void reanalyzeFile(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestParam(value = FORCE_PARAM, required = false, defaultValue = FALSE) boolean force) { + + reanalysisService.reanalyzeFiles(dossierId, Sets.newHashSet(fileId), force); + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(dossierId) + .category(AuditCategory.DOCUMENT.name()) + .message("Reanalyse file was triggered") + .details(Map.of(DOSSIER_ID, dossierId)) + .build()); + } + + + @Override + @PreAuthorize("hasAuthority('" + REANALYZE_FILE + "')") + public void reanalyzeFilesForDossier(@PathVariable(DOSSIER_ID) String dossierId, + @RequestBody List fileIds, + @RequestParam(value = FORCE_PARAM, required = false, defaultValue = FALSE) boolean force) { + + reanalysisService.reanalyzeFiles(dossierId, new HashSet<>(fileIds), force); + + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(dossierId) + .category(AuditCategory.DOCUMENT.name()) + .message("Reanalyse files was triggered") + .details(Map.of(DOSSIER_ID, dossierId, "number", fileIds.size())) + .build()); + + } + + + @Override + @PreAuthorize("hasAuthority('" + REANALYZE_DOSSIER + "')") + public void ocrDossier(@PathVariable(DOSSIER_ID) String dossierId) { + + try { + accessControlService.verifyUserHasViewPermissions(dossierId); + } catch (AccessDeniedException e) { + throw new NotFoundException("Object not found"); + } + + accessControlService.verifyUserHasAccessPermissions(dossierId); + reanalysisService.ocrDossier(dossierId); + + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(dossierId) + .category(AuditCategory.DOSSIER.name()) + .message("OCR and reanalyse dossier was triggered") + .build()); + + } + + + @Override + @PreAuthorize("hasAuthority('" + REANALYZE_FILE + "')") + public void ocrFile(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestParam(value = FORCE_PARAM, required = false, defaultValue = FALSE) boolean force) { + + validateOCR(dossierId, fileId); + reanalysisService.ocrFile(dossierId, fileId, force); + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(dossierId) + .category(AuditCategory.DOCUMENT.name()) + .message("OCR and reanalyse file was triggered") + .details(Map.of(DOSSIER_ID, dossierId)) + .build()); + + } + + + @Override + @PreAuthorize("hasAuthority('" + REANALYZE_FILE + "')") + public void ocrFiles(@PathVariable(DOSSIER_ID) String dossierId, @RequestBody Set fileIds) { + + fileIds.forEach(fileId -> validateOCR(dossierId, fileId)); + reanalysisService.ocrFiles(dossierId, fileIds); + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(dossierId) + .category(AuditCategory.DOCUMENT.name()) + .message("OCR and reanalyse was triggered") + .details(Map.of(DOSSIER_ID, dossierId, "number", fileIds.size())) + .build()); + + } + + @PreAuthorize("hasAuthority('" + EXCLUDE_INCLUDE_FILE + "')") + public void toggleAutomaticAnalysis(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestParam(EXCLUDED_STATUS_PARAM) boolean excludedFromAutomaticAnalysis) { + + accessControlService.verifyUserIsReviewer(dossierId, fileId); + fileStatusManagementService.toggleAutomaticAnalysis(dossierId, fileId, excludedFromAutomaticAnalysis); + + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(fileId) + .category(AuditCategory.DOCUMENT.name()) + .message("Toggle Exclusion status: File excluded from automatic analysis: " + excludedFromAutomaticAnalysis) + .build()); + + } + + + @Override + @PreAuthorize("hasAuthority('" + EXCLUDE_INCLUDE_FILE + "')") + public void toggleExclusion(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestParam(name = EXCLUDED_STATUS_PARAM, required = false, defaultValue = "false") boolean excluded) { + + var status = fileStatusManagementService.getFileStatus(fileId); + if (!(status.getAssignee() == null && status.isExcluded())) { // Needed to include documents after 3.0 migration. + accessControlService.verifyUserIsReviewer(dossierId, fileId); + } + fileStatusManagementService.toggleExclusion(dossierId, fileId, excluded); + + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(fileId) + .category(AuditCategory.DOCUMENT.name()) + .message("Toggle Exclusion status: File excluded from analysis: " + excluded) + .build()); + + } + + @PreAuthorize("hasAuthority('" + EXCLUDE_INCLUDE_FILE + "')") + public void toggleAutomaticAnalysisForList(@PathVariable(DOSSIER_ID) String dossierId, + @RequestBody Set fileIds, + @RequestParam(EXCLUDED_STATUS_PARAM) boolean excludedFromAutomaticAnalysis) { + + List errorIds = new ArrayList<>(); + for (var fileId : fileIds) { + try { + this.toggleAutomaticAnalysis(dossierId, fileId, excludedFromAutomaticAnalysis); + } catch (FeignException e) { + errorIds.add(fileId); + } + } + if (!errorIds.isEmpty()) { + throw new BadRequestException("Failed to delete files with ids: " + errorIds); + } + } + + @PreAuthorize("hasAuthority('" + EXCLUDE_INCLUDE_FILE + "')") + public void toggleExclusionForList(@PathVariable(DOSSIER_ID) String dossierId, + @RequestBody Set fileIds, + @RequestParam(name = EXCLUDED_STATUS_PARAM, required = false, defaultValue = "false") boolean excluded) { + + List errorIds = new ArrayList<>(); + for (var fileId : fileIds) { + try { + this.toggleExclusion(dossierId, fileId, excluded); + } catch (FeignException e) { + errorIds.add(fileId); + } + } + if (!errorIds.isEmpty()) { + throw new BadRequestException("Failed to delete files with ids: " + errorIds); + } + } + + + @Override + @PreAuthorize("hasAuthority('" + EXCLUDE_INCLUDE_PAGES + "')") + public void excludePages(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody PageExclusionRequest pageExclusionRequest) { + + accessControlService.verifyUserIsReviewerOrApprover(dossierId, fileId); + + Set excludedPages = new HashSet<>(); + for (var pageRange : pageExclusionRequest.getPageRanges()) { + for (int i = pageRange.getStartPage(); i <= pageRange.getEndPage(); i++) { + excludedPages.add(i); + } + } + fileStatusManagementService.excludePages(dossierId, fileId, excludedPages); + + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(fileId) + .category(AuditCategory.DOCUMENT.name()) + .message("Page exclusions added for file") + .build()); + + } + + + @Override + @PreAuthorize("hasAuthority('" + EXCLUDE_INCLUDE_PAGES + "')") + public void includePages(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody PageExclusionRequest pageInclusionRequest) { + + accessControlService.verifyUserIsReviewerOrApprover(dossierId, fileId); + + Set includePages = new HashSet<>(); + for (var pageRange : pageInclusionRequest.getPageRanges()) { + for (int i = pageRange.getStartPage(); i <= pageRange.getEndPage(); i++) { + includePages.add(i); + } + } + fileStatusManagementService.includePages(dossierId, fileId, includePages); + + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(fileId) + .category(AuditCategory.DOCUMENT.name()) + .message("Page inclusions added for file") + .build()); + } + + + @PreAuthorize("hasAuthority('" + REINDEX + "')") + public void reindex(@RequestParam(value = "dossierId", required = false) String dossierId, + @RequestParam(value = "dropIndex", required = false, defaultValue = FALSE) boolean dropIndex, + @RequestBody List fileIds) { + + reanalysisService.reindex(dossierId, dropIndex, new HashSet<>(fileIds)); + + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId("redaction") + .category(AuditCategory.INDEX.name()) + .message("Reindexing has been triggered" + (dropIndex ? " (with drop index)." : ".")) + .build()); + + } + + + private void validateOCR(String dossierId, String fileId) { + + var status = fileStatusManagementService.getFileStatus(fileId); + if (status.getWorkflowStatus() == WorkflowStatus.APPROVED) { + throw new BadRequestException("Cannot OCR approved file"); + } + if (status.getAssignee() == null) { + accessControlService.verifyUserIsMemberOrApprover(dossierId); + } else { + accessControlService.verifyUserIsReviewer(dossierId, fileId); + } + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/RedactionLogController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/RedactionLogController.java new file mode 100644 index 000000000..2a3402108 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/RedactionLogController.java @@ -0,0 +1,173 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.controller; + +import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_REDACTION_LOG; +import static com.iqser.red.service.persistence.management.v1.processor.service.FeignExceptionHandler.processFeignException; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.List; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusService; +import com.iqser.red.service.persistence.management.v1.processor.service.RedactionLogService; +import com.iqser.red.service.persistence.management.v1.processor.utils.StringEncodingUtils; +import com.iqser.red.service.persistence.service.v1.api.external.resource.RedactionLogResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.FilteredRedactionLogRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLog; +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.section.SectionGrid; +import com.iqser.red.storage.commons.exception.StorageObjectDoesNotExist; +import com.iqser.red.storage.commons.service.StorageService; + +import feign.FeignException; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; + +@RestController +@RequiredArgsConstructor +public class RedactionLogController implements RedactionLogResource { + + private final RedactionLogService redactionLogService; + private final StorageService storageService; + private final FileStatusService fileStatusService; + + + @PreAuthorize("hasAuthority('" + READ_REDACTION_LOG + "')") + public RedactionLog getRedactionLog(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestParam(value = "excludedType", required = false) List excludedTypes, + @RequestParam(value = "withManualRedactions", required = false, defaultValue = "true") boolean withManualRedactions, + @RequestParam(value = "includeFalsePositives", required = false, defaultValue = "false") boolean includeFalsePositives) { + + try { + return redactionLogService.getRedactionLog(dossierId, fileId, excludedTypes, withManualRedactions, includeFalsePositives); + } catch (FeignException e) { + throw processFeignException(e); + } + } + + + @PreAuthorize("hasAuthority('" + READ_REDACTION_LOG + "')") + public SectionGrid getSectionGrid(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId) { + + try { + return redactionLogService.getSectionGrid(dossierId, fileId); + } catch (FeignException e) { + throw processFeignException(e); + } + } + + + @SneakyThrows + @PreAuthorize("hasAuthority('" + READ_REDACTION_LOG + "')") + public ResponseEntity getSectionText(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId) { + + try { + + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setContentType(MediaType.parseMediaType("application/zip")); + + var fileStatus = fileStatusService.getStatus(fileId); + String filename = fileStatus.getFilename(); + if (filename != null) { + var index = filename.lastIndexOf("."); + String prefix = filename.substring(0, index); + filename = prefix + ".json"; + httpHeaders.add("Content-Disposition", "attachment; filename=" + prefix + ".zip"); + } + + byte[] zipBytes = getZippedBytes(dossierId, fileId, filename, FileType.TEXT); + return new ResponseEntity<>(zipBytes, httpHeaders, HttpStatus.OK); + + } catch (FeignException e) { + throw processFeignException(e); + } + } + + + @SneakyThrows + @PreAuthorize("hasAuthority('" + READ_REDACTION_LOG + "')") + public ResponseEntity getSimplifiedSectionText(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId) { + + try { + + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setContentType(MediaType.parseMediaType("application/zip")); + + var fileStatus = fileStatusService.getStatus(fileId); + String filename = fileStatus.getFilename(); + if (filename != null) { + var index = filename.lastIndexOf("."); + String prefix = filename.substring(0, index); + filename = prefix + ".json"; + httpHeaders.add("Content-Disposition", "attachment; filename*=utf-8''" + StringEncodingUtils.urlEncode(prefix) + ".zip"); + } + + byte[] zipBytes = getZippedBytes(dossierId, fileId, filename, FileType.SIMPLIFIED_TEXT); + return new ResponseEntity<>(zipBytes, httpHeaders, HttpStatus.OK); + + } catch (StorageObjectDoesNotExist e) { + throw new RuntimeException("Simplified Text is not available", e); + } catch (FeignException e) { + throw processFeignException(e); + } + } + + + @PreAuthorize("hasAuthority('" + READ_REDACTION_LOG + "')") + public RedactionLog getFilteredRedactionLog(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody FilteredRedactionLogRequest filteredRedactionLogRequest) { + + try { + + return redactionLogService.getFilteredRedactionLog(dossierId, fileId, filteredRedactionLogRequest); + + } catch (FeignException e) { + throw processFeignException(e); + } + + } + + + private byte[] getZippedBytes(String dossierId, String fileId, String filename, FileType fileType) throws IOException { + + try { + String objectId = dossierId + "/" + fileId + "." + fileType.name() + fileType.getExtension(); + var inputStreamResource = storageService.getObject(objectId); + + try (var inputStream = inputStreamResource.getInputStream()) { + return zipBytes(filename, inputStream.readAllBytes()); + } + + } catch (StorageObjectDoesNotExist e) { + throw new RuntimeException(String.format("%s is not available", fileType.name()), e); + } + } + + + public static byte[] zipBytes(String filename, byte[] input) throws IOException { + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + ZipOutputStream zos = new ZipOutputStream(baos); + ZipEntry entry = new ZipEntry(filename); + entry.setSize(input.length); + zos.putNextEntry(entry); + zos.write(input); + zos.closeEntry(); + zos.close(); + return baos.toByteArray(); + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ReportTemplateController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ReportTemplateController.java new file mode 100644 index 000000000..9e4b5c0bf --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ReportTemplateController.java @@ -0,0 +1,208 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.controller; + +import static com.iqser.red.keycloak.commons.roles.ActionRoles.DELETE_REPORT_TEMPLATE; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.DOWNLOAD_REPORT_TEMPLATE; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.GET_REPORT_TEMPLATES; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.UPLOAD_REPORT_TEMPLATE; +import static com.iqser.red.service.persistence.management.v1.processor.service.FeignExceptionHandler.processFeignException; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.commons.io.IOUtils; +import org.springframework.core.io.InputStreamResource; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import com.iqser.red.keycloak.commons.KeycloakSecurity; +import com.iqser.red.service.persistence.management.v1.processor.client.redactionreportservice.PlaceholderClient; +import com.iqser.red.service.persistence.management.v1.processor.client.redactionreportservice.ReportTemplatePlaceholderClient; +import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; +import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; +import com.iqser.red.service.persistence.management.v1.processor.service.ReportTemplateService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierAttributeConfigPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileAttributeConfigPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.ReportTemplatePersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter; +import com.iqser.red.service.persistence.management.v1.processor.utils.StringEncodingUtils; +import com.iqser.red.service.persistence.service.v1.api.external.resource.ReportTemplateResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; +import com.iqser.red.service.persistence.service.v1.api.shared.model.PlaceholdersResponse; +import com.iqser.red.service.persistence.service.v1.api.shared.model.ReportTemplateUpdateRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.ReportTemplate; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.ReportTemplateUploadRequest; +import com.iqser.red.storage.commons.exception.StorageObjectDoesNotExist; +import com.iqser.red.storage.commons.service.StorageService; + +import feign.FeignException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RestController +@RequiredArgsConstructor +public class ReportTemplateController implements ReportTemplateResource { + + private final ReportTemplatePlaceholderClient reportTemplatePlaceholderClient; + private final PlaceholderClient placeholderClient; + private final AuditPersistenceService auditPersistenceService; + private final DossierAttributeConfigPersistenceService dossierAttributeConfigPersistenceService; + private final FileAttributeConfigPersistenceService fileAttributeConfigPersistenceService; + private final StorageService storageService; + private final ReportTemplatePersistenceService reportTemplatePersistenceService; + private final ReportTemplateService reportTemplateService; + + + @Override + @PreAuthorize("hasAuthority('" + GET_REPORT_TEMPLATES + "')") + public List getReportTemplatesByPlaceholder(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, @RequestBody JSONPrimitive placeholder) { + + try { + // TODO MIGRATION *** +// return reportTemplatePlaceholderClient.getReportTemplatesByPlaceholder(dossierTemplateId, placeholder); + return null; + } catch (FeignException e) { + throw processFeignException(e); + } + } + + + @Override + @PreAuthorize("hasAuthority('" + UPLOAD_REPORT_TEMPLATE + "')") + public ReportTemplate uploadTemplate(@RequestPart(name = "file") MultipartFile file, + @PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, + @RequestParam(value = MULTI_FILE_REPORT, required = false, defaultValue = "false") boolean multiFileReport, + @RequestParam(value = ACTIVE_BY_DEFAULT, required = false, defaultValue = "false") boolean activeByDefault) { + + try { + if (file.getOriginalFilename() != null) { + + ReportTemplateUploadRequest reportTemplateUploadRequest = ReportTemplateUploadRequest.builder() + .template(file.getBytes()) + .fileName(file.getOriginalFilename()) + .dossierTemplateId(dossierTemplateId) + .activeByDefault(activeByDefault) + .multiFileReport(multiFileReport) + .build(); + var reportTemplate = reportTemplateService.uploadTemplate(reportTemplateUploadRequest); + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(reportTemplate.getTemplateId()) + .category(AuditCategory.DOSSIER_TEMPLATE.name()) + .message("Report template was uploaded.") + .details(Map.of("DossierTemplateId", dossierTemplateId)) + .build()); + return reportTemplate; + } else { + throw new BadRequestException("Could not upload file, no filename provided."); + } + } catch (IOException e) { + throw new BadRequestException(e.getMessage(), e); + } + + } + + + @Override + @PreAuthorize("hasAuthority('" + GET_REPORT_TEMPLATES + "')") + public List getAvailableReportTemplates(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId) { + + return MagicConverter.convert(reportTemplatePersistenceService.findByDossierTemplateId(dossierTemplateId), ReportTemplate.class); + } + + + @Override + @PreAuthorize("hasAuthority('" + DOWNLOAD_REPORT_TEMPLATE + "')") + public ResponseEntity downloadReportTemplate(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, @PathVariable(TEMPLATE_ID) String templateId) { + + try { + var reportTemplate = reportTemplatePersistenceService.find(templateId); + byte[] file = IOUtils.toByteArray(storageService.getObject(reportTemplate.getStorageId()).getInputStream()); + return getResponseEntity(file, reportTemplate.getFileName(), MediaType.APPLICATION_OCTET_STREAM); + } catch (StorageObjectDoesNotExist | IOException e) { + throw new NotFoundException("Template does not exist"); + } + } + + + private ResponseEntity getResponseEntity(byte[] file, String filename, MediaType mediaType) { + + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setContentType(mediaType); + + if (filename != null) { + httpHeaders.add("Content-Disposition", "attachment; filename*=utf-8''" + StringEncodingUtils.urlEncode(filename)); + } + InputStream is = new ByteArrayInputStream(file); + + return new ResponseEntity<>(new InputStreamResource(is), httpHeaders, HttpStatus.OK); + + } + + + @Override + @PreAuthorize("hasAuthority('" + DELETE_REPORT_TEMPLATE + "')") + public void deleteTemplate(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, @PathVariable(TEMPLATE_ID) String templateId) { + + var storageId = reportTemplatePersistenceService.find(templateId).getStorageId(); + storageService.deleteObject(storageId); + reportTemplatePersistenceService.delete(templateId); + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(templateId) + .category(AuditCategory.DOSSIER_TEMPLATE.name()) + .message("Report template was deleted.") + .details(Map.of("DossierTemplateId", dossierTemplateId)) + .build()); + } + + + @Override + public PlaceholdersResponse getAvailablePlaceholders(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId) { + + PlaceholdersResponse availablePlaceholders = new PlaceholdersResponse(); + + List dossierPlaceholders = new ArrayList<>(); + for (var dossierAttributeConfig : dossierAttributeConfigPersistenceService.getDossierAttributes(dossierTemplateId)) { + dossierPlaceholders.add(dossierAttributeConfig.getPlaceholder()); + } + availablePlaceholders.setDossierAttributePlaceholders(dossierPlaceholders); + + List filePlaceholders = new ArrayList<>(); + for (var fileAttributeConfig : fileAttributeConfigPersistenceService.getFileAttributes(dossierTemplateId)) { + filePlaceholders.add(fileAttributeConfig.getPlaceholder()); + } + availablePlaceholders.setFileAttributePlaceholders(filePlaceholders); + + List generalPlaceholders = placeholderClient.getPlaceholders(); + availablePlaceholders.setGeneralPlaceholders(generalPlaceholders); + + return availablePlaceholders; + + } + + @PreAuthorize("hasAuthority('" + UPLOAD_REPORT_TEMPLATE + "')") + public void updateTemplate(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, + @PathVariable(TEMPLATE_ID) String templateId, + @RequestBody ReportTemplateUpdateRequest updateRequest) { + + reportTemplatePersistenceService.updateTemplate(dossierTemplateId, templateId, updateRequest); + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/RulesController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/RulesController.java new file mode 100644 index 000000000..1088f8a77 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/RulesController.java @@ -0,0 +1,111 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.controller; + +import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_RULES; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_RULES; +import static com.iqser.red.service.persistence.management.v1.processor.service.FeignExceptionHandler.processFeignException; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; + +import org.springframework.core.io.InputStreamResource; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import com.iqser.red.keycloak.commons.KeycloakSecurity; +import com.iqser.red.service.persistence.management.v1.processor.client.redactionservice.RedactionClient; +import com.iqser.red.service.persistence.management.v1.processor.exception.FileUploadException; +import com.iqser.red.service.persistence.management.v1.processor.exception.InvalidRulesException; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.RulesPersistenceService; +import com.iqser.red.service.persistence.service.v1.api.external.resource.RulesResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; +import com.iqser.red.service.persistence.service.v1.api.shared.model.Rules; +import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; + +import feign.FeignException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RestController +@RequiredArgsConstructor +public class RulesController implements RulesResource { + + private static final String DOWNLOAD_FILE_NAME = "rules.drl"; + + private final RulesPersistenceService rulesPersistenceService; + private final RedactionClient redactionServiceClient; + private final AuditPersistenceService auditPersistenceService; + + + @Override + @PreAuthorize("hasAuthority('" + WRITE_RULES + "')") + public void upload(@RequestBody Rules rules) { + + try { + redactionServiceClient.testRules(rules.getRules()); + } catch (FeignException e) { + if (e.status() == HttpStatus.BAD_REQUEST.value()) { + throw new InvalidRulesException("Rules could not be updated, validation check failed: " + e.getMessage()); + } + throw processFeignException(e); + } + rulesPersistenceService.setRules(rules.getRules(), rules.getDossierTemplateId()); + + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(rules.getDossierTemplateId()) + .category(AuditCategory.DOSSIER_TEMPLATE.name()) + .message("Rules have been updated") + .build()); + } + + + @Override + @PreAuthorize("hasAuthority('" + READ_RULES + "')") + public Rules download(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId) { + + return new Rules(rulesPersistenceService.getRules(dossierTemplateId).getValue(), dossierTemplateId); + + } + + + @Override + @PreAuthorize("hasAuthority('" + WRITE_RULES + "')") + public void uploadFile(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, @RequestPart(name = "file") MultipartFile file) { + + try { + upload(new Rules(new String(file.getBytes(), StandardCharsets.UTF_8), dossierTemplateId)); + } catch (IOException e) { + throw new FileUploadException("Could not upload file.", e); + } + + } + + + @Override + @PreAuthorize("hasAuthority('" + READ_RULES + "')") + public ResponseEntity downloadFile(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId) { + + byte[] data = download(dossierTemplateId).getRules().getBytes(StandardCharsets.UTF_8); + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setContentType(MediaType.TEXT_PLAIN); + + httpHeaders.add("Content-Disposition", "attachment; filename*=utf-8\"" + DOWNLOAD_FILE_NAME + "\""); + InputStream is = new ByteArrayInputStream(data); + + return new ResponseEntity<>(new InputStreamResource(is), httpHeaders, HttpStatus.OK); + + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/SMTPConfigurationController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/SMTPConfigurationController.java new file mode 100644 index 000000000..f2633bcf0 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/SMTPConfigurationController.java @@ -0,0 +1,99 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.controller; + +import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_SMTP_CONFIGURATION; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_SMTP_CONFIGURATION; + +import java.util.HashMap; +import java.util.Map; + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.iqser.red.keycloak.commons.KeycloakSecurity; +import com.iqser.red.keycloak.commons.RealmService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.SMTPConfigurationService; +import com.iqser.red.service.persistence.service.v1.api.external.resource.SMTPConfigurationResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.SMTPConfiguration; + +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RestController +@RequiredArgsConstructor +public class SMTPConfigurationController implements SMTPConfigurationResource { + + private final RealmService realmService; + + private final SMTPConfigurationService smtpConfigurationService; + + private final ObjectMapper objectMapper; + + + @Override + @PreAuthorize("hasAuthority('" + READ_SMTP_CONFIGURATION + "')") + public SMTPConfiguration getCurrentSMTPConfiguration() { + + return smtpConfigurationService.getCurrentSMTPConfiguration(true); + + } + + + @Override + @PreAuthorize("hasAuthority('" + WRITE_SMTP_CONFIGURATION + "')") + public void updateSMTPConfiguration(@RequestBody SMTPConfiguration smtpConfigurationModel) { + + smtpConfigurationService.updateSMTPConfiguration(smtpConfigurationModel); + + // also update in KC + var realmRepresentation = realmService.realm().toRepresentation(); + var propertiesMap = convertSMTPConfigurationModelToMap(smtpConfigurationModel); + realmRepresentation.setSmtpServer(propertiesMap); + realmService.realm().update(realmRepresentation); + + } + + + private Map convertSMTPConfigurationModelToMap(SMTPConfiguration smtpConfigurationModel) { + + Map propertiesMap = objectMapper.convertValue(smtpConfigurationModel, Map.class); + Map stringPropertiesMap = new HashMap<>(); + propertiesMap.forEach((key, value) -> { + if (value != null) { + stringPropertiesMap.put(key, value.toString()); + } else { + stringPropertiesMap.put(key, ""); + } + }); + return stringPropertiesMap; + } + + + @SneakyThrows + @Override + @PreAuthorize("hasAuthority('" + WRITE_SMTP_CONFIGURATION + "')") + public void testSMTPConfiguration(@RequestBody SMTPConfiguration smtpConfigurationModel) { + + var currentUserEmail = realmService.realm().users().get(KeycloakSecurity.getUserId()).toRepresentation().getEmail(); + + smtpConfigurationService.testSMTPConfiguration(currentUserEmail, smtpConfigurationModel); + } + + + @Override + @PreAuthorize("hasAuthority('" + WRITE_SMTP_CONFIGURATION + "')") + public void clearSMTPConfiguration() { + + smtpConfigurationService.deleteConfiguration(); + + // also update in KC + var realmRepresentation = realmService.realm().toRepresentation(); + realmRepresentation.setSmtpServer(new HashMap<>()); + realmService.realm().update(realmRepresentation); + + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/SearchController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/SearchController.java new file mode 100644 index 000000000..fbc8590ea --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/SearchController.java @@ -0,0 +1,38 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.controller; + +import static com.iqser.red.keycloak.commons.roles.ActionRoles.SEARCH; + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import com.iqser.red.service.persistence.management.v1.processor.client.searchservice.SearchClient; +import com.iqser.red.service.persistence.service.v1.api.external.resource.SearchResource; +import com.iqser.red.service.search.v1.model.SearchRequest; +import com.iqser.red.service.search.v1.model.SearchResult; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequiredArgsConstructor +public class SearchController implements SearchResource { + + private final SearchClient searchClient; + + + @PreAuthorize("hasAuthority('" + SEARCH + "')") + public SearchResult search(@RequestBody SearchRequest searchRequest) { + + return searchClient.getDossierStatus(searchRequest); + } + + + @Deprecated + @PreAuthorize("hasAuthority('" + SEARCH + "')") + public SearchResult searchDeprecated(@RequestBody SearchRequest searchRequest) { + + searchRequest.setPage(searchRequest.getPage() - 1); + return searchClient.getDossierStatus(searchRequest); + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/StatusController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/StatusController.java new file mode 100644 index 000000000..e8149cbbb --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/StatusController.java @@ -0,0 +1,486 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.controller; + +import static com.iqser.red.keycloak.commons.roles.ActionRoles.*; + +import java.time.OffsetDateTime; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import javax.transaction.Transactional; + +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.iqser.red.keycloak.commons.KeycloakSecurity; +import com.iqser.red.keycloak.commons.roles.ApplicationRoles; +import com.iqser.red.service.persistence.management.v1.processor.acl.custom.dossier.DossierACLService; +import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; +import com.iqser.red.service.persistence.management.v1.processor.exception.NotAllowedException; +import com.iqser.red.service.persistence.management.v1.processor.service.AccessControlService; +import com.iqser.red.service.persistence.management.v1.processor.service.DossierManagementService; +import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusManagementService; +import com.iqser.red.service.persistence.management.v1.processor.service.UserService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.NotificationPersistenceService; +import com.iqser.red.service.persistence.service.v1.api.external.resource.StatusResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; +import com.iqser.red.service.persistence.service.v1.api.shared.model.FileAttributes; +import com.iqser.red.service.persistence.service.v1.api.shared.model.FileStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AddNotificationRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.ProcessingStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.notification.NotificationType; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RestController +@RequiredArgsConstructor +public class StatusController implements StatusResource { + + private static final Set VALID_MEMBER_ROLES = Set.of(ApplicationRoles.RED_USER_ROLE, ApplicationRoles.RED_MANAGER_ROLE); + private static final String DOSSIER_ID = "dossierId"; + private static final String FILE_ID = "fileId"; + private static final String FILE_NAME = "fileName"; + private final FileStatusManagementService fileStatusManagementService; + private final UserService userService; + private final DossierManagementService dossierManagementService; + private final AuditPersistenceService auditPersistenceService; + private final AccessControlService accessControlService; + private final NotificationPersistenceService notificationPersistenceService; + private final DossierACLService dossierACLService; + + + @Override + @PreAuthorize("hasAuthority('" + READ_FILE_STATUS + "')") + public JSONPrimitive hasChangesSince(@PathVariable(DOSSIER_ID) String dossierId, @RequestBody JSONPrimitive since) { + + try { + accessControlService.verifyUserHasViewPermissions(dossierId); + } catch (AccessDeniedException e) { + return JSONPrimitive.of(false); + } + return fileStatusManagementService.hasChangesSince(dossierId, since); + } + + + @Override + @PreAuthorize("hasAuthority('" + READ_FILE_STATUS + "')") + public Map> getDossierStatus(@RequestBody List dossierIds) { + + Map> response = new HashMap<>(); + for (String dossierId : dossierIds) { + try { + accessControlService.verifyUserHasViewPermissions(dossierId); + List statusList = fileStatusManagementService.getDossierStatus(dossierId) + .stream() + .filter(fileStatus -> !fileStatus.isSoftOrHardDeleted()) + .map(this::convert) + .collect(Collectors.toList()); + response.put(dossierId, statusList); + } catch (AccessDeniedException e) { + continue; + } + } + + return response; + } + + + @Override + @PreAuthorize("hasAuthority('" + READ_FILE_STATUS + "')") + @Transactional + public Map> getSoftDeletedFilesForDossiers(@RequestBody List dossierIds) { + + List statusList; + List dossiersWithViewPermissions = new ArrayList<>(); + for (var dossierId : dossierIds) { + try { + accessControlService.verifyUserHasViewPermissions(dossierId); + dossiersWithViewPermissions.add(dossierId); + } catch (AccessDeniedException e) { + continue; + } + } + if (dossiersWithViewPermissions.isEmpty()) { + return new HashMap<>(); + } + statusList = fileStatusManagementService.getSoftDeletedForDossierList(dossiersWithViewPermissions).stream().map(this::convert).collect(Collectors.toList()); + + return statusList.stream().collect(Collectors.groupingBy(FileStatus::getDossierId, Collectors.toList())); + } + + + @PreAuthorize("hasAuthority('" + READ_FILE_STATUS + "')") + public List getDossierStatus(@PathVariable(DOSSIER_ID) String dossierId) { + + try { + + accessControlService.verifyUserHasViewPermissions(dossierId); + return fileStatusManagementService.getDossierStatus(dossierId) + .stream() + .filter(fileStatus -> !fileStatus.isSoftOrHardDeleted()) + .map(this::convert) + .collect(Collectors.toList()); + + } catch (AccessDeniedException e) { + return new ArrayList<>(); + } + + } + + @PreAuthorize("hasAuthority('" + READ_FILE_STATUS + "')") + public FileStatus getFileStatus(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId) { + + return convert(fileStatusManagementService.getFileStatus(fileId)); + } + + + @Override + @PreAuthorize("hasAuthority('" + SET_REVIEWER + "')") + public void setCurrentFileAssignee(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestParam(name = ASSIGNEE_ID_REQUEST_PARAM, required = false) String assigneeId) { + + accessControlService.verifyUserIsMemberOrApprover(dossierId); + + log.debug("Requested [setFileReviewer] for dossier: {} / file: {} / reviewer: {}", dossierId, fileId, assigneeId); + + if (assigneeId != null) { + var user = userService.getUserById(assigneeId); + if (user.isEmpty()) { + userService.removeDeletedUsers(Collections.singleton(assigneeId)); + throw new BadRequestException("Unknown user=" + assigneeId); + } + // check he has a manager role, thus he can be the owner + if (user.get().getRoles().stream().noneMatch(VALID_MEMBER_ROLES::contains)) { + throw new BadRequestException("Make sure each provided member id has the permission to be a member of a dossier."); + } + // check assignee is a member + accessControlService.verifyUserIsMemberOrApprover(dossierId, assigneeId); + } else { + // check if file is already unassigned (cannot unassign an unassigned file) + if (fileStatusManagementService.getFileStatus(fileId).getAssignee() == null) { + throw new BadRequestException("File is already unassigned!"); + } + } + + var fileStatus = fileStatusManagementService.getFileStatus(fileId); + + log.debug("Obtained status: {}", fileStatus); + + fileStatusManagementService.setCurrentFileAssignee(dossierId, fileId, assigneeId); + if (assigneeId == null) { + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(fileId) + .category(AuditCategory.DOCUMENT.name()) + .message("Reviewer was unassigned from document") + .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, FILE_NAME, fileStatus.getFilename())) + .build()); + } else { + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(fileId) + .category(AuditCategory.DOCUMENT.name()) + .message("Reviewer was assigned to document") + .details(Map.of(DOSSIER_ID, dossierId, "reviewer", assigneeId)) + .build()); + } + + if (assigneeId != null && !assigneeId.equals(KeycloakSecurity.getUserId())) { + notificationPersistenceService.insertNotification(AddNotificationRequest.builder() + .userId(assigneeId) + .issuerId(KeycloakSecurity.getUserId()) + .notificationType(NotificationType.ASSIGN_REVIEWER.name()) + .target(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, FILE_NAME, fileStatus.getFilename())) + .build()); + } + + if (assigneeId == null || fileStatus.getAssignee() != null && !fileStatus.getAssignee().equals(assigneeId) && !KeycloakSecurity.getUserId() + .equals(fileStatus.getAssignee())) { + notificationPersistenceService.insertNotification(AddNotificationRequest.builder() + .userId(fileStatus.getAssignee()) + .issuerId(KeycloakSecurity.getUserId()) + .notificationType(NotificationType.UNASSIGNED_FROM_FILE.name()) + .target(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, FILE_NAME, fileStatus.getFilename())) + .build()); + } + + } + + @PreAuthorize("hasAuthority('" + SET_REVIEWER + "')") + public void setStatusUnderReview(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestParam(value = ASSIGNEE_ID_REQUEST_PARAM, required = false) String assigneeId) { + + var fileStatus = fileStatusManagementService.getFileStatus(fileId); + + setStatusUnderReviewForFile(dossierId, fileId, assigneeId); + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(fileId) + .category(AuditCategory.DOCUMENT.name()) + .message("Document status was changed to Under Review") + .details(Map.of(DOSSIER_ID, dossierId)) + .build()); + + if (assigneeId != null && !assigneeId.equals(KeycloakSecurity.getUserId())) { + notificationPersistenceService.insertNotification(AddNotificationRequest.builder() + .userId(assigneeId) + .issuerId(KeycloakSecurity.getUserId()) + .notificationType(NotificationType.ASSIGN_REVIEWER.name()) + .target(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, FILE_NAME, fileStatus.getFilename())) + .build()); + } + + generatePossibleUnassignedFromFileNotification(dossierId, fileId, fileStatus, assigneeId); + } + + @PreAuthorize("hasAuthority('" + SET_STATUS_UNDER_APPROVAL + "')") + public void setStatusUnderApproval(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestParam(name = ASSIGNEE_ID_REQUEST_PARAM, required = false) String assigneeId) { + + var fileStatus = fileStatusManagementService.getFileStatus(fileId); + + setStatusUnderApprovalForFile(dossierId, fileId, assigneeId); + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(fileId) + .category(AuditCategory.DOCUMENT.name()) + .message("Document status was changed to Under Approval") + .details(Map.of(DOSSIER_ID, dossierId)) + .build()); + + if (assigneeId != null && !assigneeId.equals(KeycloakSecurity.getUserId())) { + + notificationPersistenceService.insertNotification(AddNotificationRequest.builder() + .userId(assigneeId) + .issuerId(KeycloakSecurity.getUserId()) + .notificationType(NotificationType.ASSIGN_APPROVER.name()) + .target(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, FILE_NAME, fileStatus.getFilename())) + .build()); + } + + generatePossibleUnassignedFromFileNotification(dossierId, fileId, fileStatus, assigneeId); + } + + @PreAuthorize("hasAuthority('" + SET_STATUS_APPROVED + "')") + public void setStatusApproved(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId) { + + accessControlService.verifyUserIsApprover(dossierId); + setStatusApprovedForFile(dossierId, fileId); + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(fileId) + .category(AuditCategory.DOCUMENT.name()) + .message("Document status was changed to Approved") + .details(Map.of(DOSSIER_ID, dossierId)) + .build()); + + var dossier = dossierACLService.enhanceDossierWithACLData(dossierManagementService.getDossierById(dossierId, false, false)); + if (!dossier.getOwnerId().equals(KeycloakSecurity.getUserId())) { + + var fileStatus = fileStatusManagementService.getFileStatus(fileId); + + notificationPersistenceService.insertNotification(AddNotificationRequest.builder() + .userId(dossier.getOwnerId()) + .issuerId(KeycloakSecurity.getUserId()) + .notificationType(NotificationType.DOCUMENT_APPROVED.name()) + .target(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, FILE_NAME, fileStatus.getFilename())) + .build()); + } + } + + + @Override + @PreAuthorize("hasAuthority('" + SET_REVIEWER + "')") + public void setAssigneeForList(@PathVariable(DOSSIER_ID) String dossierId, + @RequestParam(value = ASSIGNEE_ID_REQUEST_PARAM, required = false) String assigneeId, + @RequestBody List fileIds) { + + fileIds.forEach(fileId -> setCurrentFileAssignee(dossierId, fileId, assigneeId)); + } + + + @Override + @PreAuthorize("hasAuthority('" + SET_REVIEWER + "')") + public void setStatusUnderReviewForList(@PathVariable(DOSSIER_ID) String dossierId, + @RequestBody List fileIds, + @RequestParam(value = ASSIGNEE_ID_REQUEST_PARAM, required = false) String assigneeId) { + + fileIds.forEach(fileId -> setStatusUnderReview(dossierId, fileId, assigneeId)); + + } + + + private void setStatusUnderReviewForFile(String dossierId, String fileId, String assigneeId) { + + accessControlService.verifyUserIsMemberOrApprover(dossierId); + fileStatusManagementService.setStatusUnderReview(dossierId, fileId, assigneeId); + } + + + private void generatePossibleUnassignedFromFileNotification(String dossierId, String fileId, FileModel oldFileStatus, String newAssigneeId) { + + if (oldFileStatus.getAssignee() != null && !oldFileStatus.getAssignee().equals(newAssigneeId) && !KeycloakSecurity.getUserId().equals(oldFileStatus.getAssignee())) { + notificationPersistenceService.insertNotification(AddNotificationRequest.builder() + .userId(oldFileStatus.getAssignee()) + .issuerId(KeycloakSecurity.getUserId()) + .notificationType(NotificationType.UNASSIGNED_FROM_FILE.name()) + .target(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, FILE_NAME, oldFileStatus.getFilename())) + .build()); + } + } + + + @Override + @PreAuthorize("hasAuthority('" + SET_STATUS_UNDER_APPROVAL + "')") + public void setStatusUnderApprovalForList(@PathVariable(DOSSIER_ID) String dossierId, + @RequestBody List fileIds, + @RequestParam(value = ASSIGNEE_ID_REQUEST_PARAM, required = false) String assigneeId) { + + fileIds.forEach(fileId -> setStatusUnderApproval(dossierId, fileId, assigneeId)); + + } + + + private void setStatusUnderApprovalForFile(String dossierId, String fileId, String assigneeId) { + + accessControlService.verifyUserIsReviewerOrApprover(dossierId, fileId); + + var dossier = dossierACLService.enhanceDossierWithACLData(dossierManagementService.getDossierById(dossierId, false, false)); + + if (assigneeId != null && !dossier.getApproverIds().contains(assigneeId)) { + throw new BadRequestException("Approver is not valid"); + } + + fileStatusManagementService.setStatusUnderApproval(dossierId, fileId, assigneeId); + } + + + @Override + @PreAuthorize("hasAuthority('" + SET_STATUS_APPROVED + "')") + public void setStatusApprovedForList(String dossierId, List fileIds) { + + accessControlService.verifyUserIsApprover(dossierId); + + dossierManagementService.getDossierById(dossierId, false, false); + + fileIds.forEach(fileId -> setStatusApproved(dossierId, fileId)); + } + + @PreAuthorize("hasAuthority('" + SET_REVIEWER + "')") + public void setStatusNewForList(@PathVariable(DOSSIER_ID) String dossierId, @RequestBody List fileIds) { + + for (var fileId : fileIds) { + accessControlService.verifyUserIsReviewerOrApprover(dossierId, fileId); + var fileStatus = fileStatusManagementService.getFileStatus(fileId); + if (!WorkflowStatus.UNDER_REVIEW.equals(fileStatus.getWorkflowStatus())) { + log.debug("Transition to NEW status is not possible from: " + fileStatus.getWorkflowStatus()); + break; + } else { + fileStatusManagementService.setCurrentFileAssignee(dossierId, fileId, null); + fileStatusManagementService.setStatusNew(dossierId, fileId); + generatePossibleUnassignedFromFileNotification(dossierId, fileId, fileStatus, null); + } + } + + } + + @PreAuthorize("hasAuthority('" + READ_FILE_STATUS + "')") + public List getSoftDeletedDossierStatus(@PathVariable(DOSSIER_ID) String dossierId) { + + try { + accessControlService.verifyUserHasViewPermissions(dossierId); + return fileStatusManagementService.getSoftDeletedDossierStatus(dossierId).stream().map(this::convert).collect(Collectors.toList()); + + } catch (AccessDeniedException e) { + return new ArrayList<>(); + } + } + + + private void setStatusApprovedForFile(String dossierId, String fileId) { + + var fileStatus = getFileStatus(dossierId, fileId); + if (fileStatus.isHasSuggestions()) { + throw new NotAllowedException("File contains unapproved requests."); + } + if (!fileStatus.getProcessingStatus().equals(ProcessingStatus.PROCESSED)) { + throw new NotAllowedException("File is not processed."); + } + fileStatusManagementService.setStatusApproved(dossierId, fileId, KeycloakSecurity.getUserId()); + } + + + private FileStatus convert(FileModel status) { + + return FileStatus.builder() + .dossierId(status.getDossierId()) + .dossierArchived(status.isDossierArchived()) + .dossierStatusId(status.getDossierStatusId()) + .dossierTemplateId(status.getDossierTemplateId()) + .fileId(status.getId()) + .filename(status.getFilename()) + .processingStatus(ProcessingStatus.valueOf(status.getProcessingStatus().name())) + .workflowStatus(WorkflowStatus.valueOf(status.getWorkflowStatus().name())) + .numberOfPages(status.getNumberOfPages()) + .added(status.getAdded()) + .lastUpdated(status.getLastUpdated()) + .numberOfAnalyses(status.getNumberOfAnalyses()) + .assignee(status.getAssignee()) + .lastReviewer(status.getLastReviewer()) + .lastApprover(status.getLastApprover()) + .hasUpdates(status.isHasUpdates()) + .hasImages(status.isHasImages()) + .hasRequests(status.isHasSuggestions()) + .hasSuggestions(status.isHasSuggestions()) + .excludedFromAutomaticAnalysis(status.isExcludedFromAutomaticAnalysis()) + .hasHints(status.isHasHints()) + .hasRedactions(status.isHasRedactions()) + .ocrEndTime(status.getOcrEndTime()) + .ocrStartTime(status.getOcrStartTime()) + .numberOfOCRedPages(status.getNumberOfOCRedPages() != null ? status.getNumberOfOCRedPages() : 0) + .numberOfPagesToOCR(status.getNumberOfPagesToOCR() != null ? status.getNumberOfPagesToOCR() : 0) + .hasAnnotationComments(status.isHasAnnotationComments()) + .uploader(status.getUploader()) + .dictionaryVersion(status.getDictionaryVersion()) + .rulesVersion(status.getRulesVersion()) + .legalBasisVersion(status.getLegalBasisVersion()) + .lastProcessed(status.getLastProcessed()) + .approvalDate(status.getApprovalDate()) + .lastUploaded(status.getLastUploaded()) + .analysisDuration(status.getAnalysisDuration()) + .fileAttributes(new FileAttributes(status.getFileAttributes())) + .dossierDictionaryVersion(status.getDossierDictionaryVersion()) + .excluded(status.isExcluded()) + .excludedPages(status.getExcludedPages()) + .softDeletedTime(status.getDeleted()) + .analysisRequired(status.isAnalysisRequired()) + .lastFileAttributeChange(status.getLastFileAttributeChange()) + .redactionModificationDate(status.getRedactionModificationDate()) + .fileManipulationDate(status.getFileManipulationDate()) + .lastManualChangeDate(status.getLastManualChangeDate()) + .hasHighlights(status.isHasHighlights()) + .lastIndexed(status.getLastIndexed()) + .fileSize(status.getFileSize()) + .build(); + + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/StatusReportController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/StatusReportController.java new file mode 100644 index 000000000..14be2625e --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/StatusReportController.java @@ -0,0 +1,74 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.controller; + + +import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_DOSSIER; +import static com.iqser.red.service.persistence.management.v1.processor.service.FeignExceptionHandler.processFeignException; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; + +import org.springframework.core.io.InputStreamResource; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +import com.iqser.red.service.persistence.management.v1.processor.client.redactionreportservice.StatusReportClient; +import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; +import com.iqser.red.service.persistence.management.v1.processor.service.AccessControlService; +import com.iqser.red.service.persistence.management.v1.processor.utils.StringEncodingUtils; +import com.iqser.red.service.persistence.service.v1.api.external.resource.StatusReportResource; +import com.iqser.red.service.redaction.report.v1.api.model.StatusReportResponse; + +import feign.FeignException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RestController +@RequiredArgsConstructor +public class StatusReportController implements StatusReportResource { + + private final StatusReportClient statusReportClient; + private final AccessControlService accessControlService; + + + @Override + @PreAuthorize("hasAuthority('" + READ_DOSSIER + "')") + public ResponseEntity generateStatusReport(@PathVariable(DOSSIER_ID) String dossierId) { + + try { + accessControlService.verifyUserHasViewPermissions(dossierId); + } catch (AccessDeniedException e) { + throw new NotFoundException("Object not found"); + } + + try { + StatusReportResponse statusReportResponse = statusReportClient.generateStatusReport(dossierId); + return getResponseEntity(statusReportResponse.getReport(), statusReportResponse.getFilename(), MediaType.APPLICATION_OCTET_STREAM); + } catch (FeignException e) { + throw processFeignException(e); + } + + } + + + private ResponseEntity getResponseEntity(byte[] file, String filename, MediaType mediaType) { + + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setContentType(mediaType); + + if (filename != null) { + httpHeaders.add("Content-Disposition", "attachment; filename*=utf-8''" + StringEncodingUtils.urlEncode(filename)); + } + InputStream is = new ByteArrayInputStream(file); + + return new ResponseEntity<>(new InputStreamResource(is), httpHeaders, HttpStatus.OK); + + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/TenantsController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/TenantsController.java new file mode 100644 index 000000000..4bb89e416 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/TenantsController.java @@ -0,0 +1,56 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.controller; + +import static com.iqser.red.keycloak.commons.roles.ActionRoles.*; + +import java.util.List; + +import javax.validation.Valid; + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; +import com.iqser.red.service.persistence.management.v1.processor.service.DeploymentKeyService; +import com.iqser.red.service.persistence.management.v1.processor.service.TenantManagementService; +import com.iqser.red.service.persistence.service.v1.api.external.resource.TenantsResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; +import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.TenantRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.TenantResponse; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequiredArgsConstructor +public class TenantsController implements TenantsResource { + + private final TenantManagementService tenantManagementService; + private final DeploymentKeyService deploymentKeyService; + + + @PreAuthorize("hasAuthority('" + CREATE_TENANT + "')") + public void createTenant(@Valid @RequestBody TenantRequest tenantRequest) { + + try { + tenantManagementService.createTenant(tenantRequest); + } catch (IllegalArgumentException e) { + throw new BadRequestException(e.getMessage(), e); + } + } + + + @PreAuthorize("hasAuthority('" + GET_TENANTS + "')") + public List getTenants() { + + return tenantManagementService.getTenants(); + } + + + @PreAuthorize("hasAuthority('" + DEPLOYMENT_INFO + "')") + public JSONPrimitive getDeploymentKey(@PathVariable(TENANT_ID_PARAM) String tenantId) { + + return JSONPrimitive.of(deploymentKeyService.getDeploymentKey(tenantId)); + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/UploadController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/UploadController.java new file mode 100644 index 000000000..e0af8b37d --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/UploadController.java @@ -0,0 +1,264 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.controller; + +import static com.iqser.red.service.persistence.management.v1.processor.service.FeignExceptionHandler.processFeignException; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; + +import org.apache.commons.compress.archivers.zip.ZipArchiveEntry; +import org.apache.commons.compress.archivers.zip.ZipFile; +import org.apache.commons.io.IOUtils; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import com.iqser.red.keycloak.commons.KeycloakSecurity; +import com.iqser.red.service.pdftron.redaction.v1.api.model.ByteContentDocument; +import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; +import com.iqser.red.service.persistence.management.v1.processor.service.AccessControlService; +import com.iqser.red.service.persistence.management.v1.processor.service.ReanalysisService; +import com.iqser.red.service.persistence.management.v1.processor.service.UploadService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.utils.FileUtils; +import com.iqser.red.service.persistence.service.v1.api.external.resource.UploadResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; +import com.iqser.red.service.persistence.service.v1.api.shared.model.FileUploadResult; +import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; + +import feign.FeignException; +import io.micrometer.core.annotation.Timed; +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import lombok.experimental.FieldDefaults; +import lombok.extern.slf4j.Slf4j; + +@RestController +@RequiredArgsConstructor +@Slf4j +public class UploadController implements UploadResource { + + private static final int THRESHOLD_ENTRIES = 10000; + private static final int THRESHOLD_SIZE = 1000000000; // 1 GB + private static final double THRESHOLD_RATIO = 10; + + private static final List VALID_FILE_EXTENSIONS = List.of("pdf", "docx", "doc", "xls", "xlsx", "ppt", "pptx"); + + private final UploadService uploadService; + private final ReanalysisService reanalysisService; + private final AccessControlService accessControlService; + private final AuditPersistenceService auditPersistenceService; + + + @Timed + @Override + public FileUploadResult upload(@RequestPart(name = "file") MultipartFile file, + @PathVariable(DOSSIER_ID) String dossierId, + @RequestParam(value = "keepManualRedactions", required = false, defaultValue = "false") boolean keepManualRedactions) { + + if (file.getOriginalFilename() == null) { + throw new BadRequestException("Could not upload file, no filename provided."); + } + + var extension = getExtension(file.getOriginalFilename()); + + try { + switch (extension) { + case "zip": + return handleZip(dossierId, file.getBytes(), keepManualRedactions); + case "csv": + return uploadService.importCsv(dossierId, file.getBytes()); + default: + if (VALID_FILE_EXTENSIONS.contains(extension)) { + return uploadService.processSingleFile(dossierId, file.getOriginalFilename(), file.getBytes(), keepManualRedactions); + } else { + throw new BadRequestException("Invalid file uploaded"); + } + } + } catch (IOException e) { + throw new BadRequestException(e.getMessage(), e); + } + + } + + + public void importRedactions(@RequestPart(name = "file") MultipartFile file, + @PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestParam(value = "pageInclusionRequest", required = false) Set pageInclusionRequest) { + + accessControlService.verifyFileIsNotApproved(dossierId, fileId); + accessControlService.verifyUserIsReviewerOrApprover(dossierId, fileId); + + try { + + reanalysisService.importRedactions(ByteContentDocument.builder().dossierId(dossierId).fileId(fileId).document(file.getBytes()).pages(pageInclusionRequest).build()); + + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(fileId) + .category(AuditCategory.DOCUMENT.name()) + .message("Redactions were imported") + .details(Map.of("dossierId", dossierId)) + .build()); + } catch (IOException e) { + throw new BadRequestException(e.getMessage(), e); + } catch (FeignException e) { + throw processFeignException(e); + } + } + + + private String getExtension(String fileName) { + + return fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase(); + } + + + private FileUploadResult handleZip(String dossierId, byte[] fileContent, boolean keepManualRedactions) throws IOException { + + File tempFile = FileUtils.createTempFile(UUID.randomUUID().toString(), ".zip"); + try (var fileOutputStream = new FileOutputStream(tempFile)) { + IOUtils.write(fileContent, fileOutputStream); + } + + try { + checkForSymlinks(tempFile); + + var zipData = unzip(tempFile, dossierId, keepManualRedactions); + + if (zipData.csvBytes != null) { + try { + var importResult = uploadService.importCsv(dossierId, zipData.csvBytes); + zipData.fileUploadResult.getProcessedAttributes().addAll(importResult.getProcessedAttributes()); + zipData.fileUploadResult.getProcessedFileIds().addAll(importResult.getProcessedFileIds()); + } catch (Exception e) { + log.debug("CSV file inside ZIP failed", e); + // TODO return un-processed files to client + } + } + + return zipData.fileUploadResult; + + } finally { + boolean isDeleted = tempFile.delete(); + if (!isDeleted) { + log.warn("tempFile could not be deleted"); + } + } + } + + + private void checkForSymlinks(File tempFile) throws IOException { + + try (var fis = new FileInputStream(tempFile); var zipFile = new ZipFile(fis.getChannel())) { + for (var entryEnum = zipFile.getEntries(); entryEnum.hasMoreElements(); ) { + var ze = entryEnum.nextElement(); + if (ze.isUnixSymlink()) { + throw new BadRequestException("ZIP-files with symlinks are not allowed"); + } + } + } + } + + + private ZipData unzip(File tempFile, String dossierId, boolean keepManualRedactions) throws IOException { + + var zipData = new ZipData(); + + try (var fis = new FileInputStream(tempFile); var zipFile = new ZipFile(fis.getChannel())) { + + for (var entryEnum = zipFile.getEntries(); entryEnum.hasMoreElements(); ) { + var ze = entryEnum.nextElement(); + zipData.totalEntryArchive++; + + if (!ze.isDirectory()) { + processFileZipEntry(ze, zipFile, dossierId, keepManualRedactions, zipData); + } + } + } + return zipData; + } + + + private void processFileZipEntry(ZipArchiveEntry ze, ZipFile zipFile, String dossierId, boolean keepManualRedactions, ZipData zipData) throws IOException { + + var extension = getExtension(ze.getName()); + final String fileName; + if (ze.getName().lastIndexOf("/") >= 0) { + fileName = ze.getName().substring(ze.getName().lastIndexOf("/") + 1); + } else { + fileName = ze.getName(); + } + + if (fileName.startsWith(".")) { + return; + } + + var entryAsBytes = readCurrentZipEntry(ze, zipFile); + zipData.totalSizeArchive += entryAsBytes.length; + + // 1. the uncompressed data size is too much for the application resource capacity + // 2. too many entries in the archive can lead to inode exhaustion of the file-system + if (zipData.totalSizeArchive > THRESHOLD_SIZE || zipData.totalEntryArchive > THRESHOLD_ENTRIES) { + throw new BadRequestException("ZIP-Bomb detected."); + } + + if ("csv".equals(extension)) { + zipData.csvBytes = entryAsBytes; + } else if (VALID_FILE_EXTENSIONS.contains(extension)) { + try { + var result = uploadService.processSingleFile(dossierId, fileName, entryAsBytes, keepManualRedactions); + zipData.fileUploadResult.getFileIds().addAll(result.getFileIds()); + } catch (Exception e) { + log.debug("PDF File inside ZIP failed", e); + // TODO return un-processed files to client + } + } + } + + + private byte[] readCurrentZipEntry(ZipArchiveEntry ze, ZipFile zipFile) throws IOException { + + var bos = new ByteArrayOutputStream(); + + try (var entryStream = zipFile.getInputStream(ze)) { + var buffer = new byte[2048]; + var nBytes = 0; + int totalSizeEntry = 0; + + while ((nBytes = entryStream.read(buffer)) > 0) { + bos.write(buffer, 0, nBytes); + totalSizeEntry += nBytes; + + double compressionRatio = (float) totalSizeEntry / ze.getCompressedSize(); + if (compressionRatio > THRESHOLD_RATIO) { + // ratio between compressed and uncompressed data is highly suspicious, looks like a Zip Bomb Attack + throw new BadRequestException("ZIP-Bomb detected."); + } + } + } + + return bos.toByteArray(); + } + + + @FieldDefaults(level = AccessLevel.PUBLIC) + private static final class ZipData { + + byte[] csvBytes; + int totalSizeArchive; + int totalEntryArchive; + FileUploadResult fileUploadResult = new FileUploadResult(); + + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/UserController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/UserController.java new file mode 100644 index 000000000..7ee004aa7 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/UserController.java @@ -0,0 +1,147 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.controller; + +import static com.iqser.red.keycloak.commons.roles.ActionRoles.*; + +import java.util.List; +import java.util.stream.Collectors; + +import javax.validation.Valid; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.iqser.red.keycloak.commons.KeyCloakSettings; +import com.iqser.red.keycloak.commons.model.User; +import com.iqser.red.service.persistence.management.v1.processor.exception.AuthenticationFailedException; +import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; +import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; +import com.iqser.red.service.persistence.management.v1.processor.service.UserService; +import com.iqser.red.service.persistence.service.v1.api.external.resource.UserResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.CreateUserRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.ResetPasswordRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.UpdateMyProfileRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.UpdateProfileRequest; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RestController +@RequiredArgsConstructor +public class UserController implements UserResource { + + private final UserService userService; + private final KeyCloakSettings keyCloakSettings; + + + @Override + @PreAuthorize("hasAuthority('" + READ_USERS + "')") + public List getAllRedUsers(@RequestParam(name = REFRESH_CACHE_PARAM, defaultValue = "false", required = false) boolean bypassCache) { + + if (bypassCache) { + userService.evictUserCache(); + } + + return userService.getAllUsers() + .stream() + .filter(user -> user.getRoles().stream().anyMatch(r -> r.startsWith(keyCloakSettings.getRolePrefix()))) + .collect(Collectors.toList()); + } + + + @Override + @PreAuthorize("hasAuthority('" + READ_ALL_USERS + "')") + public List getAllUsers(@RequestParam(name = REFRESH_CACHE_PARAM, defaultValue = "false", required = false) boolean bypassCache) { + + if (bypassCache) { + userService.evictUserCache(); + } + + return userService.getAllUsers(); + } + + + @Override + @PreAuthorize("hasAuthority('" + WRITE_USERS + "')") + public void updateProfile(@PathVariable(USER_ID) String userId, @RequestBody UpdateProfileRequest updateProfileRequest) { + + this.userService.updateProfile(userId, updateProfileRequest); + } + + + @Override + @PreAuthorize("hasAuthority('" + UPDATE_MY_PROFILE + "')") + public void updateMyProfile(@Valid @RequestBody UpdateMyProfileRequest updateProfileRequest) { + + try { + this.userService.updateMyProfile(updateProfileRequest); + } catch (AuthenticationFailedException e) { + throw new BadRequestException(e.getMessage(), e); + } + } + + + @Override + @PreAuthorize("hasAuthority('" + WRITE_USERS + "')") + public void deleteUsers(@RequestParam(USER_ID) List userIds) { + + userIds.forEach(this::deleteUser); + } + + + @Override + @PreAuthorize("hasAuthority('" + WRITE_USERS + "')") + public void deleteUser(@PathVariable(USER_ID) String userId) { + + userService.deleteUser(userId); + } + + + @Override + @PreAuthorize("hasAuthority('" + WRITE_USERS + "')") + public User createUser(@RequestBody CreateUserRequest user) { + + return this.userService.createUser(user); + } + + + @Override + @PreAuthorize("hasAuthority('" + READ_USERS + "')") + public User getUserById(@PathVariable(USER_ID) String userId) { + + if (StringUtils.isEmpty(userId)) { + throw new BadRequestException("The userId should not be empty."); + } + return userService.getUserById(userId).orElseThrow(() -> new NotFoundException("User not found")); + } + + + @Override + @PreAuthorize("hasAuthority('" + WRITE_USERS + "')") + public void setRoles(@PathVariable(USER_ID) String userId, @RequestBody List roles) { + + userService.setRoles(userId, roles); + } + + + @Override + @PreAuthorize("hasAuthority('" + WRITE_USERS + "')") + public void resetPassword(@PathVariable(USER_ID) String userId, @RequestBody ResetPasswordRequest resetPasswordRequest) { + + this.userService.resetPassword(userId, resetPasswordRequest); + } + + + @Override + @PreAuthorize("hasAuthority('" + WRITE_USERS + "')") + public User activateProfile(@PathVariable(USER_ID) String userId, @RequestParam(IS_ACTIVE_PARAM) boolean isActive) { + + return this.userService.activateProfile(userId, isActive); + + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/UserPreferenceController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/UserPreferenceController.java new file mode 100644 index 000000000..ea90a1fdf --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/UserPreferenceController.java @@ -0,0 +1,78 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.controller; + +import static com.iqser.red.keycloak.commons.roles.ActionRoles.MANAGE_USER_PREFERENCES; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +import com.iqser.red.keycloak.commons.KeycloakSecurity; +import com.iqser.red.service.persistence.management.v1.processor.service.UserService; +import com.iqser.red.service.persistence.service.v1.api.external.resource.UserPreferenceResource; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequiredArgsConstructor +public class UserPreferenceController implements UserPreferenceResource { + + private final UserService userService; + + + @Override + @PreAuthorize("hasAuthority('" + MANAGE_USER_PREFERENCES + "')") + public Map> getAllUserAttributes() { + + String userId = KeycloakSecurity.getUserId(); + + var userResource = userService.getUserResource(userId); + var userRepresentation = userResource.toRepresentation(); + + var attributes = userRepresentation.getAttributes(); + + return attributes != null ? attributes : new HashMap<>(); + } + + + @Override + @PreAuthorize("hasAuthority('" + MANAGE_USER_PREFERENCES + "')") + public void setAttribute(@PathVariable(KEY_PARAMETER_NAME) String key, List values) { + + String userId = KeycloakSecurity.getUserId(); + + var userResource = userService.getUserResource(userId); + var userRepresentation = userResource.toRepresentation(); + + var attributes = userRepresentation.getAttributes(); + if (attributes == null) { + attributes = new HashMap<>(); + } + attributes.put(key, values); + userRepresentation.setAttributes(attributes); + + userResource.update(userRepresentation); + + } + + + @Override + @PreAuthorize("hasAuthority('" + MANAGE_USER_PREFERENCES + "')") + public void deleteAttribute(@PathVariable(KEY_PARAMETER_NAME) String key) { + + String userId = KeycloakSecurity.getUserId(); + + var userResource = userService.getUserResource(userId); + var userRepresentation = userResource.toRepresentation(); + if (userRepresentation.getAttributes() != null) { + userRepresentation.getAttributes().remove(key); + } + + userResource.update(userRepresentation); + + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/VersionsController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/VersionsController.java new file mode 100644 index 000000000..c3426cec8 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/VersionsController.java @@ -0,0 +1,51 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.controller; + +import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_VERSIONS; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.iqser.red.service.persistence.management.v1.processor.service.DictionaryManagementService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DictionaryPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.RulesPersistenceService; +import com.iqser.red.service.persistence.service.v1.api.external.resource.VersionsResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.VersionsResponse; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequiredArgsConstructor +public class VersionsController implements VersionsResource { + + private final DictionaryPersistenceService dictionaryPersistenceService; + private final RulesPersistenceService rulesPersistenceService; + + + @Override + @PreAuthorize("hasAuthority('" + READ_VERSIONS + "')") + public Map getVersions(@RequestParam(DOSSIER_TEMPLATE_PARAMETER_NAME) List dossierTemplateIds) { + + var result = new HashMap(); + dossierTemplateIds.forEach(rsId -> { + VersionsResponse response = new VersionsResponse(dictionaryPersistenceService.getVersion(rsId), rulesPersistenceService.getRules(rsId).getVersion()); + result.put(rsId, response); + }); + + return result; + } + + + @Override + @PreAuthorize("hasAuthority('" + READ_VERSIONS + "')") + public Long getDossierDictionaryVersion(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, @PathVariable(DOSSIER_ID_PARAM) String dossierId) { + + return dictionaryPersistenceService.getVersionForDossier(dossierId); + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ViewedPagesController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ViewedPagesController.java new file mode 100644 index 000000000..c1df7d4cc --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ViewedPagesController.java @@ -0,0 +1,71 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.controller; + +import static com.iqser.red.keycloak.commons.roles.ActionRoles.MANAGE_VIEWED_PAGES; +import static com.iqser.red.service.persistence.management.v1.processor.service.FeignExceptionHandler.processFeignException; + +import java.util.HashSet; + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import com.iqser.red.keycloak.commons.KeycloakSecurity; +import com.iqser.red.service.persistence.management.v1.processor.service.AccessControlService; +import com.iqser.red.service.persistence.management.v1.processor.service.AnalysisFlagsCalculationService; +import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.ViewedPagesPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter; +import com.iqser.red.service.persistence.service.v1.api.external.resource.ViewedPagesResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.ViewedPages; +import com.iqser.red.service.persistence.service.v1.api.shared.model.ViewedPagesRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ViewedPage; + +import feign.FeignException; +import lombok.RequiredArgsConstructor; + +@RestController +@RequiredArgsConstructor +public class ViewedPagesController implements ViewedPagesResource { + + private final AccessControlService accessControlService; + + private final ViewedPagesPersistenceService viewedPagesPersistenceService; + private final FileStatusService fileStatusService; + private final AnalysisFlagsCalculationService analysisFlagsCalculationService; + + + @PreAuthorize("hasAuthority('" + MANAGE_VIEWED_PAGES + "')") + public void addPage(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody ViewedPagesRequest viewedPagesRequest) { + + accessControlService.verifyUserIsReviewer(dossierId, fileId); + viewedPagesPersistenceService.insertPage(fileId, KeycloakSecurity.getUserId(), viewedPagesRequest.getPage()); + var file = fileStatusService.getStatus(fileId); + analysisFlagsCalculationService.calculateFlags(file.getDossierId(), fileId); + } + + + @PreAuthorize("hasAuthority('" + MANAGE_VIEWED_PAGES + "')") + public void removePage(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @PathVariable(PAGE) int page) { + + accessControlService.verifyUserIsReviewer(dossierId, fileId); + viewedPagesPersistenceService.removePage(fileId, KeycloakSecurity.getUserId(), page); + var file = fileStatusService.getStatus(fileId); + analysisFlagsCalculationService.calculateFlags(file.getDossierId(), fileId); + + } + + + @PreAuthorize("hasAuthority('" + MANAGE_VIEWED_PAGES + "')") + public ViewedPages getViewedPages(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId) { + + accessControlService.verifyUserIsReviewer(dossierId, fileId); + try { + var pages = MagicConverter.convert(viewedPagesPersistenceService.findViewedPages(fileId, KeycloakSecurity.getUserId()), ViewedPage.class); + return ViewedPages.builder().pages(new HashSet<>(pages)).build(); + } catch (FeignException e) { + throw processFeignException(e); + } + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/WatermarkController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/WatermarkController.java new file mode 100644 index 000000000..8e08410ff --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/WatermarkController.java @@ -0,0 +1,90 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.controller; + +import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_WATERMARK; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_WATERMARK; + +import java.util.List; + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.iqser.red.keycloak.commons.KeycloakSecurity; +import com.iqser.red.service.persistence.management.v1.processor.service.WatermarkService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter; +import com.iqser.red.service.persistence.service.v1.api.external.resource.WatermarkResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; +import com.iqser.red.service.persistence.service.v1.api.shared.model.WatermarkModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; + +import feign.FeignException; +import lombok.RequiredArgsConstructor; + +@RestController +@RequiredArgsConstructor +public class WatermarkController implements WatermarkResource { + + private final WatermarkService watermarkService; + private final AuditPersistenceService auditPersistenceService; + + + @Override + @PreAuthorize("hasAuthority('" + WRITE_WATERMARK + "')") + public WatermarkModel saveWatermark(@RequestBody WatermarkModel watermark) { + + String userId = KeycloakSecurity.getUserId(); + watermark.setCreatedBy(userId); + WatermarkModel result = MagicConverter.convert(watermarkService.createOrUpdateWatermark(watermark), WatermarkModel.class); + auditPersistenceService.audit(AuditRequest.builder() + .userId(userId) + .objectId(result.getDossierTemplateId()) + .category(AuditCategory.DOSSIER_TEMPLATE.name()) + .message("Watermark has been changed.") + .build()); + return result; + } + + + @Override + @PreAuthorize("hasAuthority('" + READ_WATERMARK + "')") + public WatermarkModel getWatermark(@PathVariable(WATERMARK_ID_PARAMETER_NAME) long watermarkId) { + + return MagicConverter.convert(watermarkService.getWatermark(watermarkId), WatermarkModel.class); + } + + + @Override + @PreAuthorize("hasAuthority('" + READ_WATERMARK + "')") + public List getWatermarksForDossierTemplateId(@RequestParam(DOSSIER_TEMPLATE_ID_PARAMETER_NAME) String dossierTemplateId) { + + return MagicConverter.convert(watermarkService.getWatermarksForDossierTemplateId(dossierTemplateId), WatermarkModel.class); + } + + + @Override + @PreAuthorize("hasAuthority('" + WRITE_WATERMARK + "')") + public void deleteWatermark(@PathVariable(WATERMARK_ID_PARAMETER_NAME) long watermarkId) { + + String dossierTemplateId = watermarkService.getWatermark(watermarkId).getDossierTemplateId(); + watermarkService.deleteWatermark(watermarkId); + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(dossierTemplateId) + .category(AuditCategory.DOSSIER_TEMPLATE.name()) + .message("Watermark has been deleted.") + .build()); + + } + + + @PreAuthorize("hasAuthority('" + READ_WATERMARK + "')") + public JSONPrimitive isWatermarkUsed(@RequestParam(WATERMARK_ID_PARAMETER_NAME) long watermarkId) { + + return JSONPrimitive.of(watermarkService.isWatermarkUsed(watermarkId)); + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/initializer/RealmInitializer.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/initializer/RealmInitializer.java new file mode 100644 index 000000000..4c574dc44 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/initializer/RealmInitializer.java @@ -0,0 +1,30 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.initializer; + +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.stereotype.Service; + +import com.iqser.red.persistence.service.v1.external.api.impl.service.GeneralConfigurationService; +import com.iqser.red.service.persistence.management.v1.processor.settings.FileManagementServiceSettings; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Service +@RequiredArgsConstructor +public class RealmInitializer implements ApplicationRunner { + + private final GeneralConfigurationService generalConfigurationService; + private final FileManagementServiceSettings fileManagementServiceSettings; + + + @Override + public void run(ApplicationArguments args) throws Exception { + + var generalConfiguration = generalConfigurationService.getGeneralConfigurations(); + log.info("Currently Configured Application Name: {}, default name: {}", generalConfiguration.getDisplayName(), fileManagementServiceSettings.getApplicationName()); + generalConfigurationService.updateGeneralConfigurations(generalConfigurationService.getGeneralConfigurations()); + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/interceptors/DownloadTempFileInterceptor.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/interceptors/DownloadTempFileInterceptor.java new file mode 100644 index 000000000..5446970b2 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/interceptors/DownloadTempFileInterceptor.java @@ -0,0 +1,32 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.interceptors; + +import static com.iqser.red.service.persistence.management.v1.processor.utils.DownloadBufferUtils.DOWNLOAD_TEMP_FILE_BUFFER_LOCATION; + +import java.io.File; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerInterceptor; + +import lombok.extern.slf4j.Slf4j; + +@Component +@Slf4j +public class DownloadTempFileInterceptor implements HandlerInterceptor { + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { + + String tempFileLocation = (String) request.getAttribute(DOWNLOAD_TEMP_FILE_BUFFER_LOCATION); + if (tempFileLocation != null && tempFileLocation.length() > 0) { + var file = new File(tempFileLocation); + if (file.exists() && !file.delete()) { + log.debug("Failed to delete file: {}", file.getAbsolutePath()); + } + } + + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/interceptors/DownloadTempFileInterceptorConfig.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/interceptors/DownloadTempFileInterceptorConfig.java new file mode 100644 index 000000000..4eecd7eb2 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/interceptors/DownloadTempFileInterceptorConfig.java @@ -0,0 +1,23 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.interceptors; + +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import lombok.RequiredArgsConstructor; +//import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; + +@Component +@RequiredArgsConstructor +public class DownloadTempFileInterceptorConfig implements WebMvcConfigurer { + + private final DownloadTempFileInterceptor tempFileInterceptor; + + + @Override + public void addInterceptors(InterceptorRegistry registry) { + + registry.addInterceptor(tempFileInterceptor).addPathPatterns("/async/download/**"); + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/model/OneTimeToken.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/model/OneTimeToken.java new file mode 100644 index 000000000..b3f97f2d9 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/model/OneTimeToken.java @@ -0,0 +1,19 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.model; + +import java.io.Serializable; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class OneTimeToken implements Serializable { + + private String tokenId; + private long creationTimestamp; + private String storageId; + private String userId; + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/service/GeneralConfigurationService.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/service/GeneralConfigurationService.java new file mode 100644 index 000000000..22b649b82 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/service/GeneralConfigurationService.java @@ -0,0 +1,79 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.service; + +import org.apache.commons.lang3.StringUtils; +import org.keycloak.representations.idm.RealmRepresentation; +import org.springframework.stereotype.Service; + +import com.iqser.red.keycloak.commons.KeyCloakSettings; +import com.iqser.red.keycloak.commons.RealmService; +import com.iqser.red.service.persistence.management.v1.processor.settings.FileManagementServiceSettings; +import com.iqser.red.service.persistence.service.v1.api.shared.model.GeneralConfigurationModel; + +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +public class GeneralConfigurationService { + + private final RealmService realmService; + private final FileManagementServiceSettings fileManagementServiceSettings; + private final KeyCloakSettings keyCloakSettings; + + + public GeneralConfigurationModel getGeneralConfigurations() { + + var realm = realmService.realm().toRepresentation(); + var auxiliaryName = realm.getDisplayNameHtml(); + + if (!fileManagementServiceSettings.getApplicationName().equals(auxiliaryName)) { + + auxiliaryName = StringUtils.replaceOnce(auxiliaryName, fileManagementServiceSettings.getApplicationName(), ""); + auxiliaryName = StringUtils.replaceOnce(auxiliaryName, " (", ""); + auxiliaryName = StringUtils.reverse(StringUtils.replaceOnce(StringUtils.reverse(auxiliaryName), ")", "")); + + } else { + auxiliaryName = null; + } + + return GeneralConfigurationModel.builder() + .auxiliaryName(auxiliaryName) + .displayName(realm.getDisplayNameHtml()) + .forgotPasswordFunctionEnabled(realm.isResetPasswordAllowed()) + .build(); + } + + + public void updateGeneralConfigurations(GeneralConfigurationModel generalConfigurationModel) { + + var realm = realmService.realm(); + + var clientRepresentations = realm.clients().findByClientId(keyCloakSettings.getClientId()); + for (var client : clientRepresentations) { + client.setDirectAccessGrantsEnabled(true); + var clientResource = realm.clients().get(client.getId()); + clientResource.update(client); + } + + var realmRepresentation = realm.toRepresentation(); + realmRepresentation.setResetPasswordAllowed(generalConfigurationModel.isForgotPasswordFunctionEnabled()); + if (!StringUtils.isEmpty(generalConfigurationModel.getAuxiliaryName())) { + setDisplayName(realmRepresentation, fileManagementServiceSettings.getApplicationName() + " (" + generalConfigurationModel.getAuxiliaryName() + ")"); + } else { + setDisplayName(realmRepresentation, fileManagementServiceSettings.getApplicationName()); + } + + try { + realm.update(realmRepresentation); + } catch (Exception e) { + throw new RuntimeException("Could not update realm"); + } + } + + + private void setDisplayName(RealmRepresentation realmRepresentation, String value) { + + realmRepresentation.setDisplayName(value); + realmRepresentation.setDisplayNameHtml(value); + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/service/OneTimeTokenCacheService.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/service/OneTimeTokenCacheService.java new file mode 100644 index 000000000..8dd860ba6 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/service/OneTimeTokenCacheService.java @@ -0,0 +1,34 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.service; + +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import com.iqser.red.persistence.service.v1.external.api.impl.model.OneTimeToken; + +@Service +public class OneTimeTokenCacheService { + + public static final String OTT_CACHE = "ott"; + + + @Cacheable(value = OTT_CACHE, key = "#tokenId") + public OneTimeToken cacheOTT(String tokenId, OneTimeToken token) { + // empty + return token; + } + + + @Cacheable(value = OTT_CACHE, key = "#tokenId") + public OneTimeToken getToken(String tokenId) { + // proxy for hazelcast + return null; + } + + + @CacheEvict(value = OTT_CACHE, key = "#tokenId") + public void evictToken(String tokenId) { + // empty + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/service/OneTimeTokenService.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/service/OneTimeTokenService.java new file mode 100644 index 000000000..91266bc05 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/service/OneTimeTokenService.java @@ -0,0 +1,44 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.service; + +import java.util.UUID; + +import org.springframework.stereotype.Service; + +import com.iqser.red.persistence.service.v1.external.api.impl.model.OneTimeToken; +import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; + +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +public class OneTimeTokenService { + + private final OneTimeTokenCacheService oneTimeTokenCacheService; + + + public OneTimeToken createToken(String storageId, String userId) { + + var ott = new OneTimeToken(UUID.randomUUID().toString(), System.currentTimeMillis(), storageId, userId); + oneTimeTokenCacheService.cacheOTT(ott.getTokenId(), ott); + return ott; + } + + + public OneTimeToken getToken(String tokenId) { + + var token = oneTimeTokenCacheService.getToken(tokenId); + if (token != null) { + // older than 10 seconds + if (System.currentTimeMillis() - token.getCreationTimestamp() > 10_000) { + throw new BadRequestException("Invalid token: " + tokenId); + } + + // evict token from cache on read ( one time use, duh ) + oneTimeTokenCacheService.evictToken(tokenId); + return token; + } else { + throw new BadRequestException("Invalid token: " + tokenId); + } + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/swagger/SwaggerAutoConfiguration.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/swagger/SwaggerAutoConfiguration.java new file mode 100644 index 000000000..f578a86df --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/swagger/SwaggerAutoConfiguration.java @@ -0,0 +1,137 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.swagger; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + +import org.keycloak.adapters.springboot.KeycloakSpringBootProperties; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.actuate.autoconfigure.endpoint.web.CorsEndpointProperties; +import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties; +import org.springframework.boot.actuate.autoconfigure.web.server.ManagementPortType; +import org.springframework.boot.actuate.endpoint.ExposableEndpoint; +import org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver; +import org.springframework.boot.actuate.endpoint.web.EndpointMapping; +import org.springframework.boot.actuate.endpoint.web.EndpointMediaTypes; +import org.springframework.boot.actuate.endpoint.web.ExposableWebEndpoint; +import org.springframework.boot.actuate.endpoint.web.WebEndpointsSupplier; +import org.springframework.boot.actuate.endpoint.web.annotation.ControllerEndpointsSupplier; +import org.springframework.boot.actuate.endpoint.web.annotation.ServletEndpointsSupplier; +import org.springframework.boot.actuate.endpoint.web.servlet.WebMvcEndpointHandlerMapping; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; +import org.springframework.util.StringUtils; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.CorsConfigurationSource; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; + +import io.swagger.v3.oas.annotations.OpenAPIDefinition; +import io.swagger.v3.oas.models.Components; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Info; +import io.swagger.v3.oas.models.security.OAuthFlow; +import io.swagger.v3.oas.models.security.OAuthFlows; +import io.swagger.v3.oas.models.security.SecurityRequirement; +import io.swagger.v3.oas.models.security.SecurityScheme; + +@OpenAPIDefinition +@Configuration +@EnableWebMvc +@EnableConfigurationProperties(SwaggerProperties.class) +@ConditionalOnProperty(value = "swagger.enabled", havingValue = "true") +public class SwaggerAutoConfiguration { + + private static final String TITLE = "API Documentation for Redaction Gateway"; + private static final String DESCRIPTION = "Description for redaction"; + private static final String VERSION = "1.0"; + private static final String OAUTH_NAME = "RED-OAUTH"; + + private static final String PROTOCOL_URL_FORMAT = "/auth/realms/%s/protocol/openid-connect"; + + @Autowired + private KeycloakSpringBootProperties keycloakProperties; + + + @Bean + public WebMvcEndpointHandlerMapping webEndpointServletHandlerMapping(WebEndpointsSupplier webEndpointsSupplier, + ServletEndpointsSupplier servletEndpointsSupplier, + ControllerEndpointsSupplier controllerEndpointsSupplier, + EndpointMediaTypes endpointMediaTypes, + CorsEndpointProperties corsProperties, + WebEndpointProperties webEndpointProperties, + Environment environment) { + + List> allEndpoints = new ArrayList<>(); + Collection webEndpoints = webEndpointsSupplier.getEndpoints(); + allEndpoints.addAll(webEndpoints); + allEndpoints.addAll(servletEndpointsSupplier.getEndpoints()); + allEndpoints.addAll(controllerEndpointsSupplier.getEndpoints()); + String basePath = webEndpointProperties.getBasePath(); + EndpointMapping endpointMapping = new EndpointMapping(basePath); + boolean shouldRegisterLinksMapping = this.shouldRegisterLinksMapping(webEndpointProperties, environment, basePath); + return new WebMvcEndpointHandlerMapping(endpointMapping, + webEndpoints, + endpointMediaTypes, + corsProperties.toCorsConfiguration(), + new EndpointLinksResolver(allEndpoints, basePath), + shouldRegisterLinksMapping, + null); + } + + + private boolean shouldRegisterLinksMapping(WebEndpointProperties webEndpointProperties, Environment environment, String basePath) { + + return webEndpointProperties.getDiscovery().isEnabled() && (StringUtils.hasText(basePath) || ManagementPortType.get(environment).equals(ManagementPortType.DIFFERENT)); + } + + + @Bean + public CorsConfigurationSource corsConfigurationSource() { + + CorsConfiguration configuration = new CorsConfiguration(); + configuration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "HEAD")); + configuration.applyPermitDefaultValues(); + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + source.registerCorsConfiguration("/**", configuration); + return source; + } + + + @Bean + public OpenAPI customOpenApi() { + + return new OpenAPI().info(new Info().title(TITLE).version(VERSION).description(DESCRIPTION)) + .components(new Components().addSecuritySchemes(OAUTH_NAME, createOAuthScheme())) + .addSecurityItem(new SecurityRequirement().addList(OAUTH_NAME)); + } + + + private SecurityScheme createOAuthScheme() { + + OAuthFlows flows = createOAuthFlows(); + + return new SecurityScheme().type(SecurityScheme.Type.OAUTH2).flows(flows); + } + + + private OAuthFlows createOAuthFlows() { + + OAuthFlow flow = createAuthorizationCodeFlow(); + + return new OAuthFlows().authorizationCode(flow); + } + + + private OAuthFlow createAuthorizationCodeFlow() { + + var protocolUrl = String.format(PROTOCOL_URL_FORMAT, keycloakProperties.getRealm()); + + return new OAuthFlow().authorizationUrl(protocolUrl + "/auth").tokenUrl(protocolUrl + "/token"); + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/swagger/SwaggerHomeController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/swagger/SwaggerHomeController.java new file mode 100644 index 000000000..28b4129ae --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/swagger/SwaggerHomeController.java @@ -0,0 +1,38 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.swagger; + +import java.io.IOException; + +import javax.annotation.PostConstruct; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Controller +@ConditionalOnProperty(value = "swagger.enabled", havingValue = "true") +public class SwaggerHomeController { + + @Value("${server.servlet.context-path:}") + private String contextPath; + + + @PostConstruct + protected void pc() { + + log.warn("SWAGGER HERE"); + } + + + @GetMapping({"/api", "/"}) + public void home(HttpServletRequest request, HttpServletResponse response) throws IOException { + + response.sendRedirect(contextPath + "/api/docs/swagger-ui"); + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/swagger/SwaggerProperties.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/swagger/SwaggerProperties.java new file mode 100644 index 000000000..ec420e631 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/swagger/SwaggerProperties.java @@ -0,0 +1,19 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.swagger; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import lombok.Data; + +@Data +@ConfigurationProperties("swagger") +public class SwaggerProperties { + + @JsonProperty("auth-server-url") + protected String authServerUrl = ""; + private boolean enabled; + private boolean securityEnabled; + private String defaultClientId; + +} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/test/java/com/iqser/red/persistence/service/v1/external/api/impl/IdentityTest.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/test/java/com/iqser/red/persistence/service/v1/external/api/impl/IdentityTest.java new file mode 100644 index 000000000..9a6921905 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/test/java/com/iqser/red/persistence/service/v1/external/api/impl/IdentityTest.java @@ -0,0 +1,16 @@ +package com.iqser.red.persistence.service.v1.external.api.impl; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.Test; + +public class IdentityTest { + + @Test + public void mockTest() { + + int i = 1; + assertThat(i).isEqualTo(1); + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-v1/pom.xml b/persistence-service-v1/persistence-service-external-api-v1/pom.xml new file mode 100644 index 000000000..5ca684762 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-v1/pom.xml @@ -0,0 +1,147 @@ + + + + + persistence-service-v1 + com.iqser.red.service + 1.0-SNAPSHOT + + + 4.0.0 + + persistence-service-external-api-v1 + + + + + com.iqser.red.service + persistence-service-internal-api-v1 + ${project.version} + + + com.iqser.red.service + redaction-service-api-v1 + + + com.iqser.red.service + pdftron-redaction-service-api-v1 + + + + + + com.iqser.red.service + pdftron-redaction-service-api-v1 + + + com.iqser.red.service + redaction-service-api-v1 + + + com.iqser.red.service + persistence-service-api-v1 + + + + + + com.iqser.red.service + redaction-service-api-v1 + + + com.iqser.red.service + pdftron-redaction-service-api-v1 + + + com.iqser.red.service + persistence-service-api-v1 + + + + + + com.iqser.red.service + redaction-report-service-api-v1 + + + com.iqser.red.service + persistence-service-api-v1 + + + + + + com.iqser.red.service + search-service-api-v1 + + + + org.springdoc + springdoc-openapi-ui + provided + + + + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + 2.13.4 + + + + com.google.guava + guava + + + + + io.github.openfeign + feign-core + provided + + + + org.springframework + spring-web + provided + + + + org.springframework.boot + spring-boot-starter-security + + + + org.springframework.boot + spring-boot-starter-validation + + + + + com.iqser.red.commons + jackson-commons + + + + + com.iqser.red.commons + test-commons + test + + + com.iqser.red.service + persistence-service-shared-api-v1 + 1.0-SNAPSHOT + compile + + + com.iqser.red.service + keycloak-commons + 1.0-SNAPSHOT + compile + + + + diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/lombok.config b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/model/lombok.config similarity index 100% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/lombok.config rename to persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/model/lombok.config diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/ApplicationConfigurationResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/ApplicationConfigurationResource.java new file mode 100644 index 000000000..a2b516b1e --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/ApplicationConfigurationResource.java @@ -0,0 +1,39 @@ +package com.iqser.red.service.persistence.service.v1.api.external.resource; + +import javax.validation.Valid; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.ApplicationConfig; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; + +public interface ApplicationConfigurationResource { + + String APPLICATION_CONFIG_PATH = ExternalApi.BASE_PATH + "/app-config"; + + + @ResponseBody + @ResponseStatus(value = HttpStatus.CREATED) + @PostMapping(value = APPLICATION_CONFIG_PATH, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Creates or updated the application configuration.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK.")}) + ApplicationConfig createOrUpdateAppConfig(@Valid @RequestBody ApplicationConfig appConfig); + + + @ResponseBody + @ResponseStatus(value = HttpStatus.OK) + @GetMapping(value = APPLICATION_CONFIG_PATH, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Retrieves the current application configuration.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK.")}) + ApplicationConfig getCurrentApplicationConfig(); + +} diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/AuditResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/AuditResource.java new file mode 100644 index 000000000..10c16e426 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/AuditResource.java @@ -0,0 +1,40 @@ +package com.iqser.red.service.persistence.service.v1.api.external.resource; + +import java.util.List; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditResponse; +import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditSearchRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.CategoryModel; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; + +@ResponseStatus(value = HttpStatus.OK) +public interface AuditResource { + + String PATH = ExternalApi.BASE_PATH + "/audit"; + + + @Operation(summary = "Search the audit-log based on some entries the digital signature used to sign PDF's", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "403", description = "Forbidden.")}) + @ResponseBody + @PostMapping(value = PATH + "/search", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + AuditResponse searchAuditLog(@RequestBody AuditSearchRequest auditSearchRequest); + + + @Operation(summary = "Get a list of available categories for the audit-log", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "403", description = "Forbidden.")}) + @ResponseBody + @GetMapping(value = PATH + "/categories", produces = MediaType.APPLICATION_JSON_VALUE) + List getAuditCategories(); + +} diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/CustomPermissionMappingResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/CustomPermissionMappingResource.java new file mode 100644 index 000000000..d852405a1 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/CustomPermissionMappingResource.java @@ -0,0 +1,63 @@ +package com.iqser.red.service.persistence.service.v1.api.external.resource; + +import java.util.List; +import java.util.Set; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.permission.CustomPermissionMappingModel; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; + +@ResponseStatus(value = HttpStatus.OK) +public interface CustomPermissionMappingResource { + + String PERMISSION_REST_PATH = ExternalApi.BASE_PATH + "/permissions"; + String TARGET_OBJECT_REST_PATH = "/target-object"; + String SYNC_REST_PATH = "/sync"; + String MAPPING_PERMISSIONS_PATH = "/mapping"; + + String TARGET_OBJECT_NAME = "targetObject"; + String TARGET_OBJECT_VARIABLE = "/{" + TARGET_OBJECT_NAME + "}"; + + + @GetMapping(value = PERMISSION_REST_PATH + TARGET_OBJECT_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Get custom permission mappings for a specific object type.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Successfully returned the mappings")}) + List getCustomPermissionMappings(@PathVariable(TARGET_OBJECT_NAME) String targetObject); + + + @ResponseStatus(HttpStatus.NO_CONTENT) + + @PostMapping(value = PERMISSION_REST_PATH + TARGET_OBJECT_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Saves the custom permission mappings for a specific object type, overriding existing mappings.", description = "None") + void saveCustomPermissionMappings(@PathVariable(TARGET_OBJECT_NAME) String targetObject, @RequestBody List customPermissionMappingModels); + + + @GetMapping(value = PERMISSION_REST_PATH + TARGET_OBJECT_VARIABLE + MAPPING_PERMISSIONS_PATH, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Returns the required existing permissions defined for a target object, mapped to possible granting permissions.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Successfully returned the valid mapping")}) + List getValidMapping(@PathVariable(TARGET_OBJECT_NAME) String targetObject); + + + @GetMapping(value = PERMISSION_REST_PATH + TARGET_OBJECT_REST_PATH, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Returns all supported target objects ( I.E. dossier, file, etc. )", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Successfully returned the target objects")}) + Set getAllSupportedTargetObjects(); + + + @ResponseStatus(HttpStatus.NO_CONTENT) + @PostMapping(value = PERMISSION_REST_PATH + SYNC_REST_PATH) + @Operation(summary = "Sync all custom permissions", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Successfully synced all permissions")}) + void syncAllCustomPermissions(); + +} diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/DictionaryResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/DictionaryResource.java new file mode 100644 index 000000000..75fe735d7 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/DictionaryResource.java @@ -0,0 +1,192 @@ +package com.iqser.red.service.persistence.service.v1.api.external.resource; + +import java.util.List; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.multipart.MultipartFile; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.CreateTypeValue; +import com.iqser.red.service.persistence.service.v1.api.shared.model.Dictionary; +import com.iqser.red.service.persistence.service.v1.api.shared.model.TypeResponse; +import com.iqser.red.service.persistence.service.v1.api.shared.model.TypeValue; +import com.iqser.red.service.persistence.service.v1.api.shared.model.UpdateTypeValue; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.Colors; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionaryEntryType; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; + +@ResponseStatus(value = HttpStatus.OK) +public interface DictionaryResource { + + String DICTIONARY_REST_PATH = ExternalApi.BASE_PATH + "/dictionary"; + String TYPE_PATH = DICTIONARY_REST_PATH + "/type"; + + String TYPE_PARAMETER_NAME = "type"; + String TYPE_PATH_VARIABLE = "/{" + TYPE_PARAMETER_NAME + "}"; + + String REMOVE_CURRENT_REQUEST_PARAM = "removeCurrent"; + + String ENTRY_PARAMETER_NAME = "entry"; + String ENTRY_PATH_VARIABLE = "/{" + ENTRY_PARAMETER_NAME + "}"; + + String DOSSIER_TEMPLATE_PARAMETER_NAME = "dossierTemplateId"; + String DOSSIER_TEMPLATE_PATH_VARIABLE = "/{dossierTemplateId}"; + + String UPLOAD = "/upload"; + String DOWNLOAD = "/download"; + String DELETE = "/delete"; + + String COLOR_REST_PATH = ExternalApi.BASE_PATH + "/color"; + + String DOSSIER_ID_PARAMETER_NAME = "dossierId"; + + String INCLUDE_DELETED_PARAMETER_NAME = "includeDeleted"; + + String DICTIONARY_ENTRY_TYPE_PARAM = "dictionaryEntryType"; + String DEFAULT_DICTIONARY_ENTRY_TYPE = "ENTRY"; + + + @ResponseStatus(HttpStatus.NO_CONTENT) + @PostMapping(value = DICTIONARY_REST_PATH + TYPE_PATH_VARIABLE + DOSSIER_TEMPLATE_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Add dictionary entries with entry type.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "Successfully added the dictionary entries."), @ApiResponse(responseCode = "400", description = "Request contains error."), @ApiResponse(responseCode = "404", description = "The " + "entry type is not found.")}) + void addEntry(@PathVariable(TYPE_PARAMETER_NAME) String type, + @PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, + @RequestBody List entries, + @RequestParam(name = REMOVE_CURRENT_REQUEST_PARAM, defaultValue = "false", required = false) boolean removeCurrent, + @RequestParam(value = DOSSIER_ID_PARAMETER_NAME, required = false) String dossierId, + @RequestParam(value = DICTIONARY_ENTRY_TYPE_PARAM, required = false, defaultValue = DEFAULT_DICTIONARY_ENTRY_TYPE) DictionaryEntryType dictionaryEntryType); + + + @ResponseStatus(HttpStatus.NO_CONTENT) + @PostMapping(value = DICTIONARY_REST_PATH + DELETE + TYPE_PATH_VARIABLE + DOSSIER_TEMPLATE_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Delete dictionary entries with entry type.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "Successfully deleted the dictionary entries."), @ApiResponse(responseCode = "400", description = "Request contains error."), @ApiResponse(responseCode = "404", description = "The " + "entry type is not found.")}) + void deleteEntries(@PathVariable(TYPE_PARAMETER_NAME) String type, + @PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, + @RequestBody List entries, + @RequestParam(value = DOSSIER_ID_PARAMETER_NAME, required = false) String dossierId, + @RequestParam(value = DICTIONARY_ENTRY_TYPE_PARAM, required = false, defaultValue = DEFAULT_DICTIONARY_ENTRY_TYPE) DictionaryEntryType dictionaryEntryType); + + + @ResponseStatus(HttpStatus.NO_CONTENT) + @DeleteMapping(value = DICTIONARY_REST_PATH + TYPE_PATH_VARIABLE + DOSSIER_TEMPLATE_PATH_VARIABLE + ENTRY_PATH_VARIABLE) + @Operation(summary = "Delete dictionary entry with entry type.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "Successfully deleted the dictionary entry."), @ApiResponse(responseCode = "400", description = "Request contains error."), @ApiResponse(responseCode = "404", description = "The " + "entry type is not found.")}) + void deleteEntry(@PathVariable(TYPE_PARAMETER_NAME) String type, + @PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, + @PathVariable(ENTRY_PARAMETER_NAME) String entry, + @RequestParam(value = DOSSIER_ID_PARAMETER_NAME, required = false) String dossierId, + @RequestParam(value = DICTIONARY_ENTRY_TYPE_PARAM, required = false, defaultValue = DEFAULT_DICTIONARY_ENTRY_TYPE) DictionaryEntryType dictionaryEntryType); + + + @ResponseStatus(HttpStatus.NO_CONTENT) + @PostMapping(value = TYPE_PATH + TYPE_PATH_VARIABLE + DOSSIER_TEMPLATE_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Updates colors, hint and caseInsensitive of an entry type. Only label, colors and description are updatable for system managed entry types", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "Successfully updated the colors, hint and caseInsensitive of entry type"), @ApiResponse(responseCode = "400", description = "Request contains error."), @ApiResponse(responseCode = "404", description = "The entry type is not found.")}) + void updateType(@PathVariable(TYPE_PARAMETER_NAME) String type, + @PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, + @RequestBody UpdateTypeValue typeValue, + @RequestParam(value = DOSSIER_ID_PARAMETER_NAME, required = false) String dossierId); + + + @ResponseStatus(HttpStatus.OK) + @PostMapping(value = TYPE_PATH, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Creates entry type with colors, hint and caseInsensitive", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "Successfully created the entry type with colors, hint " + "and caseInsensitive"), @ApiResponse(responseCode = "400", description = "Request contains error."), @ApiResponse(responseCode = "409", description = "The entry type already exists, could not be added again.")}) + TypeValue addType(@RequestBody CreateTypeValue typeValue, @RequestParam(value = DOSSIER_ID_PARAMETER_NAME, required = false) String dossierId); + + + @ResponseStatus(HttpStatus.NO_CONTENT) + @DeleteMapping(value = TYPE_PATH + TYPE_PATH_VARIABLE + DOSSIER_TEMPLATE_PATH_VARIABLE) + @Operation(summary = "Deletes entry type", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "Successfully deleted the entry type with value and all its entries"), @ApiResponse(responseCode = "400", description = "Request contains error."), @ApiResponse(responseCode = "404", description = "The entry type is not found.")}) + void deleteType(@PathVariable(TYPE_PARAMETER_NAME) String type, + @PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, + @RequestParam(value = DOSSIER_ID_PARAMETER_NAME, required = false) String dossierId); + + + @ResponseStatus(HttpStatus.NO_CONTENT) + @PostMapping(value = TYPE_PATH + DOSSIER_TEMPLATE_PATH_VARIABLE + DELETE) + @Operation(summary = "Deletes entry types", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "Successfully deleted the entry types with value and all their entries"), @ApiResponse(responseCode = "400", description = "Request contains error."), @ApiResponse(responseCode = "404", description = "The entry type is not found.")}) + void deleteTypes(@RequestBody List types, + @PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, + @RequestParam(value = DOSSIER_ID_PARAMETER_NAME, required = false) String dossierId); + + + @GetMapping(value = TYPE_PATH + DOSSIER_TEMPLATE_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Retrieve all entry types", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Successfully retrieved all the entry types")}) + TypeResponse getAllTypes(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, + @RequestParam(value = DOSSIER_ID_PARAMETER_NAME, required = false) String dossierId, + @RequestParam(value = INCLUDE_DELETED_PARAMETER_NAME, required = false, defaultValue = "false") boolean includeDeleted); + + + @GetMapping(value = DICTIONARY_REST_PATH + TYPE_PATH_VARIABLE + DOSSIER_TEMPLATE_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Retrieves all dictionary entries of an entry type", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Successfully retrieved all the dictionary entries of " + "the entry type."), @ApiResponse(responseCode = "400", description = "Request contains error."), @ApiResponse(responseCode = "404", description = "The entry type is not found.")}) + Dictionary getDictionaryForType(@PathVariable(TYPE_PARAMETER_NAME) String type, + @PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, + @RequestParam(value = DOSSIER_ID_PARAMETER_NAME, required = false) String dossierId); + + + /** + * Upload dictionary for given type as file to be used by redaction service. + * + * @param file Text file containing dictionary entries as plain text. + * @param type Type of dictionary entries inside given file. + */ + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @PostMapping(value = DICTIONARY_REST_PATH + UPLOAD + TYPE_PATH_VARIABLE + DOSSIER_TEMPLATE_PATH_VARIABLE, consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + @Operation(summary = "Upload a text-file with 1 entry per line and add each line as an entry to a dictionary for a specific type") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "Dictionary upload successful."), @ApiResponse(responseCode = "400", description = "Dictionary could not be uploaded.")}) + void uploadDictionary(@RequestPart(name = "file", required = false) MultipartFile file, + @PathVariable(TYPE_PARAMETER_NAME) String type, + @PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, + @RequestParam(value = DOSSIER_ID_PARAMETER_NAME, required = false) String dossierId, + @RequestParam(value = DICTIONARY_ENTRY_TYPE_PARAM, required = false, defaultValue = DEFAULT_DICTIONARY_ENTRY_TYPE) DictionaryEntryType dictionaryEntryType); + + + /** + * Download dictionary for given type as file. + * + * @param type Type of dictionary entries inside requested file. + */ + @ResponseBody + @Operation(summary = "Returns file containing the the dictionary entries for given type..") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + @GetMapping(value = DICTIONARY_REST_PATH + DOWNLOAD + TYPE_PATH_VARIABLE + DOSSIER_TEMPLATE_PATH_VARIABLE) + ResponseEntity downloadDictionary(@PathVariable(TYPE_PARAMETER_NAME) String type, + @PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, + @RequestParam(value = DOSSIER_ID_PARAMETER_NAME, required = false) String dossierId, + @RequestParam(value = DICTIONARY_ENTRY_TYPE_PARAM, required = false, defaultValue = DEFAULT_DICTIONARY_ENTRY_TYPE) DictionaryEntryType dictionaryEntryType); + + + @ResponseStatus(HttpStatus.NO_CONTENT) + @Operation(summary = "Set system colors for redaction") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "System colors update successful."), @ApiResponse(responseCode = "400", description = "System colors request contains error.")}) + @PostMapping(value = COLOR_REST_PATH + DOSSIER_TEMPLATE_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE) + void setColors(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, @RequestBody Colors colors); + + + @ResponseBody + @Operation(summary = "Retrieves system colors for redaction.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Successfully retrieved system colors for redaction."), @ApiResponse(responseCode = "404", description = "The system colors is not found.")}) + @GetMapping(value = COLOR_REST_PATH + DOSSIER_TEMPLATE_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) + Colors getColors(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId); + +} diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/DigitalSignatureResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/DigitalSignatureResource.java new file mode 100644 index 000000000..576cdff36 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/DigitalSignatureResource.java @@ -0,0 +1,93 @@ +package com.iqser.red.service.persistence.service.v1.api.external.resource; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.DigitalSignatureKms; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DigitalSignatureKmsViewModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DigitalSignatureViewModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.DigitalSignature; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.DigitalSignatureType; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; + +@ResponseStatus(value = HttpStatus.OK) +public interface DigitalSignatureResource { + + String DIGITAL_SIGNATURE_PATH = ExternalApi.BASE_PATH + "/digital-signature"; + String DIGITAL_SIGNATURE_KMS_PATH = DIGITAL_SIGNATURE_PATH + "/kms"; + String DIGITAL_SIGNATURE_TYPE_PATH = DIGITAL_SIGNATURE_PATH + "/type"; + + String DIGITAL_SIGNATURE_TYPE = "digitalSignatureType"; + String DIGITAL_SIGNATURE_TYPE_VARIABLE = "/{" + DIGITAL_SIGNATURE_TYPE + "}"; + + + @Operation(summary = "Gets which digital signature is used to sign PDF's", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "201", description = "OK"), @ApiResponse(responseCode = "403", description = "Forbidden.")}) + @GetMapping(value = DIGITAL_SIGNATURE_TYPE_PATH, produces = MediaType.APPLICATION_JSON_VALUE) + DigitalSignatureType getActiveDigitalSignatureType(); + + + @Operation(summary = "Sets which digital signature is used to sign PDF's", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK"), @ApiResponse(responseCode = "400", description = "Invalid Data."), @ApiResponse(responseCode = "403", description = "Forbidden.")}) + @ResponseStatus(HttpStatus.NO_CONTENT) + @PostMapping(value = DIGITAL_SIGNATURE_TYPE_PATH + DIGITAL_SIGNATURE_TYPE_VARIABLE) + void setActiveDigitalSignatureType(@PathVariable(DIGITAL_SIGNATURE_TYPE) DigitalSignatureType digitalSignatureType); + + + @Operation(summary = "Save a new digital signature used to sign PDF's", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "201", description = "OK"), @ApiResponse(responseCode = "400", description = "Invalid Digital Signature Data."), @ApiResponse(responseCode = "403", description = "Forbidden.")}) + @ResponseStatus(HttpStatus.CREATED) + @PostMapping(value = DIGITAL_SIGNATURE_PATH, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + DigitalSignatureViewModel saveDigitalSignature(@RequestBody DigitalSignature digitalSignatureModel); + + + @Operation(summary = "Update the digital signature used to sign PDF's", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "201", description = "OK"), @ApiResponse(responseCode = "400", description = "Invalid Digital Signature Data."), @ApiResponse(responseCode = "403", description = "Forbidden.")}) + @ResponseStatus(HttpStatus.CREATED) + @PutMapping(value = DIGITAL_SIGNATURE_PATH, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + void updateDigitalSignature(@RequestBody DigitalSignatureViewModel digitalSignatureModel); + + + @Operation(summary = "Get the current digital signature", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "403", description = "Forbidden.")}) + @GetMapping(value = DIGITAL_SIGNATURE_PATH, produces = MediaType.APPLICATION_JSON_VALUE) + DigitalSignatureViewModel getDigitalSignature(); + + + @Operation(summary = "Remove the digital signature", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK"), @ApiResponse(responseCode = "403", description = "Forbidden.")}) + @ResponseStatus(HttpStatus.NO_CONTENT) + @DeleteMapping(value = DIGITAL_SIGNATURE_PATH) + void deleteDigitalSignature(); + + + @Operation(summary = "Save a new digital KMS signature used to sign PDF's", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "201", description = "OK"), @ApiResponse(responseCode = "400", description = "Invalid Digital Signature Data."), @ApiResponse(responseCode = "403", description = "Forbidden.")}) + @ResponseStatus(HttpStatus.CREATED) + @PostMapping(value = DIGITAL_SIGNATURE_KMS_PATH, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + DigitalSignatureKmsViewModel saveDigitalSignatureKms(@RequestBody DigitalSignatureKms digitalSignature); + + + @Operation(summary = "Get the current digital KMS signature", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "403", description = "Forbidden.")}) + @GetMapping(value = DIGITAL_SIGNATURE_KMS_PATH, produces = MediaType.APPLICATION_JSON_VALUE) + DigitalSignatureKmsViewModel getDigitalSignatureKms(); + + + @Operation(summary = "Remove the digital KMS signature", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK"), @ApiResponse(responseCode = "403", description = "Forbidden.")}) + @ResponseStatus(HttpStatus.NO_CONTENT) + @DeleteMapping(value = DIGITAL_SIGNATURE_KMS_PATH) + void deleteDigitalSignatureKms(); + +} diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/DossierAttributesResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/DossierAttributesResource.java new file mode 100644 index 000000000..2abaa7846 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/DossierAttributesResource.java @@ -0,0 +1,119 @@ +package com.iqser.red.service.persistence.service.v1.api.external.resource; + +import java.util.List; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierAttributes; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierAttributesConfig; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierAttributeConfig; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.DossierAttribute; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; + +public interface DossierAttributesResource { + + String DOSSIER_ATTRIBUTES_PATH = ExternalApi.BASE_PATH + "/dossier-attributes"; + String CONFIG_PATH = "/config"; + String SET_PATH = "/set"; + String UPDATE_PATH = "/update"; + + String DOSSIER_TEMPLATE_ID = "dossierTemplateId"; + String DOSSIER_TEMPLATE_ID_PATH_VARIABLE = "/{" + DOSSIER_TEMPLATE_ID + "}"; + + String DOSSIER_ATTRIBUTE_ID = "dossierAttributeId"; + String DOSSIER_ATTRIBUTE_IDS = "dossierAttributeIds"; + String DOSSIER_ATTRIBUTE_ID_PATH = "/{" + DOSSIER_ATTRIBUTE_ID + "}"; + + String DELETE_PATH = "/delete"; + + String DOSSIER_ID = "dossierId"; + String DOSSIER_ID_PATH_VARIABLE = "/{" + DOSSIER_ID + "}"; + + + @ResponseBody + @ResponseStatus(HttpStatus.OK) + @Operation(summary = "Set dossier attributes base configuration.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + + @PutMapping(value = DOSSIER_ATTRIBUTES_PATH + CONFIG_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + DossierAttributesConfig setDossierAttributesConfig(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, @RequestBody DossierAttributesConfig dossierAttributesConfig); + + + @ResponseBody + @ResponseStatus(HttpStatus.OK) + @Operation(summary = "Add or update a dossier attribute in base configuration.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + @PostMapping(value = DOSSIER_ATTRIBUTES_PATH + CONFIG_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + DossierAttributeConfig addOrUpdateDossierAttributeConfig(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, @RequestBody DossierAttributeConfig dossierAttributes); + + + @ResponseBody + @ResponseStatus(HttpStatus.NO_CONTENT) + @Operation(summary = "Delete a specific dossier attribute.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "NO_CONTENT")}) + @DeleteMapping(value = DOSSIER_ATTRIBUTES_PATH + CONFIG_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE + DOSSIER_ATTRIBUTE_ID_PATH) + void deleteDossierAttributeConfig(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, @PathVariable(DOSSIER_ATTRIBUTE_ID) String dossierAttributeId); + + + @ResponseBody + @ResponseStatus(HttpStatus.NO_CONTENT) + @Operation(summary = "Bulk delete dossier attributes.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "NO_CONTENT")}) + @PostMapping(value = DOSSIER_ATTRIBUTES_PATH + CONFIG_PATH + DELETE_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE) + void deleteDossierAttributesConfig(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, @RequestParam(DOSSIER_ATTRIBUTE_IDS) List dossierAttributeIds); + + + @ResponseStatus(HttpStatus.OK) + @Operation(summary = "Get the dossier attributes configuration.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + + @GetMapping(value = DOSSIER_ATTRIBUTES_PATH + CONFIG_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) + DossierAttributesConfig getDossierAttributesConfig(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId); + + + @Operation(summary = "Set dossier attributes to an existing dossier", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + + @PostMapping(value = DOSSIER_ATTRIBUTES_PATH + SET_PATH + DOSSIER_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + DossierAttributes setDossierAttributes(@PathVariable(DOSSIER_ID) String dossierId, @RequestBody DossierAttributes dossierAttributes); + + + @ResponseBody + @ResponseStatus(HttpStatus.OK) + @Operation(summary = "Add or update a dossier attribute in existing dossier.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + + @PostMapping(value = DOSSIER_ATTRIBUTES_PATH + UPDATE_PATH + DOSSIER_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + DossierAttributes addOrUpdateDossierAttribute(@PathVariable(DOSSIER_ID) String dossierId, @RequestBody DossierAttribute dossierAttribute); + + + @ResponseStatus(HttpStatus.OK) + @Operation(summary = "Get the dossier attributes.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + + @GetMapping(value = DOSSIER_ATTRIBUTES_PATH + DOSSIER_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) + DossierAttributes getDossierAttributes(@PathVariable(DOSSIER_ID) String dossierId); + + + @ResponseBody + @ResponseStatus(HttpStatus.NO_CONTENT) + @Operation(summary = "Delete a specific dossier attribute.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "NO_CONTENT")}) + + @DeleteMapping(value = DOSSIER_ATTRIBUTES_PATH + SET_PATH + DOSSIER_ID_PATH_VARIABLE + DOSSIER_ATTRIBUTE_ID_PATH) + void deleteDossierAttribute(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(DOSSIER_ATTRIBUTE_ID) String dossierAttributeId); + +} diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/DossierResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/DossierResource.java new file mode 100644 index 000000000..c71fe11c8 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/DossierResource.java @@ -0,0 +1,160 @@ +package com.iqser.red.service.persistence.service.v1.api.external.resource; + +import java.time.OffsetDateTime; +import java.util.List; +import java.util.Set; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierChangeEntry; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierInformation; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.Dossier; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; + +public interface DossierResource { + + String DOSSIER_REST_PATH = ExternalApi.BASE_PATH + "/dossier"; + String DOSSIER_TEMPLATE_PATH = "/dossier-template"; + String DOSSIER_INFO_PATH = "/info"; + String DELETED_DOSSIERS_PATH = ExternalApi.BASE_PATH + "/deleted-dossiers"; + String CHANGES_DETAILS_PATH = "/changes/details"; + String HARD_DELETE_PATH = "/hard-delete"; + String UNDELETE_PATH = "/restore"; + + String ARCHIVE_DOSSIERS_PATH = ExternalApi.BASE_PATH + "/archived-dossiers"; + String ARCHIVE_PATH = "/archive"; + String UNARCHIVE_PATH = "/unarchive"; + + String DOSSIER_ID_PARAM = "dossierId"; + String DOSSIER_ID_PATH_PARAM = "/{" + DOSSIER_ID_PARAM + "}"; + String DOSSIER_TEMPLATE_ID_PARAM = "dossierTemplateId"; + String DOSSIER_TEMPLATE_ID_PATH_PARAM = "/{" + DOSSIER_TEMPLATE_ID_PARAM + "}"; + + String INCLUDE_DELETED_PARAM = "includeDeleted"; + String INCLUDE_ARCHIVED_PARAM = "includeArchived"; + + + @ResponseBody + @PostMapping(value = DOSSIER_REST_PATH + DOSSIER_INFO_PATH, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Get information regarding the count of dossiers", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Success")}) + DossierInformation getDossierInformation(); + + + @ResponseBody + @PostMapping(value = DOSSIER_REST_PATH + CHANGES_DETAILS_PATH, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "See if there are changes to dossiers since param", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Success")}) + List changesSince(@RequestBody JSONPrimitive since); + + + @ResponseBody + @PostMapping(value = DOSSIER_REST_PATH, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Creates or updates a dossier.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "201", description = "Successfully saved the dossier."), @ApiResponse(responseCode = "400", description = "Incorrect dossier ID provided or attempted to change dossier-template for a dossier with files."), @ApiResponse(responseCode = "409", description = "Duplicate")}) + ResponseEntity createDossierOrUpdateDossier(@RequestBody DossierRequest dossier); + + + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @DeleteMapping(value = DOSSIER_REST_PATH + DOSSIER_ID_PATH_PARAM) + @Operation(summary = "Deletes an existing dossier.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "Successfully deleted the dossier."), @ApiResponse(responseCode = "404", description = "Not found")}) + void deleteDossier(@PathVariable(DOSSIER_ID_PARAM) String dossierId); + + + @ResponseStatus(value = HttpStatus.OK) + @ResponseBody + @GetMapping(value = DOSSIER_REST_PATH + DOSSIER_ID_PATH_PARAM, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Gets an existing dossier.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not found")}) + Dossier getDossier(@PathVariable(DOSSIER_ID_PARAM) String dossierId, + @RequestParam(name = INCLUDE_ARCHIVED_PARAM, defaultValue = "false", required = false) boolean includeArchived, + @RequestParam(name = INCLUDE_DELETED_PARAM, defaultValue = "false", required = false) boolean includeDeleted); + + + @ResponseStatus(value = HttpStatus.OK) + @ResponseBody + @GetMapping(value = DOSSIER_REST_PATH, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Gets all existing dossiers.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + List getDossiers(@RequestParam(name = INCLUDE_ARCHIVED_PARAM, defaultValue = "false", required = false) boolean includeArchived, + @RequestParam(name = INCLUDE_DELETED_PARAM, defaultValue = "false", required = false) boolean includeDeleted); + + + @ResponseStatus(value = HttpStatus.OK) + @ResponseBody + @GetMapping(value = DOSSIER_REST_PATH + DOSSIER_TEMPLATE_PATH + DOSSIER_TEMPLATE_ID_PATH_PARAM, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Gets all existing dossiers for the given dossier template id.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + List getDossiersForDossierTemplate(@PathVariable(DOSSIER_TEMPLATE_ID_PARAM) String dossierTemplateId, + @RequestParam(name = INCLUDE_ARCHIVED_PARAM, defaultValue = "false", required = false) boolean includeArchived, + @RequestParam(name = INCLUDE_DELETED_PARAM, defaultValue = "false", required = false) boolean includeDeleted); + + + @ResponseStatus(value = HttpStatus.OK) + @ResponseBody + @GetMapping(value = DELETED_DOSSIERS_PATH, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Gets all deleted dossiers.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + List getSoftDeletedDossiers(); + + + @ResponseStatus(value = HttpStatus.OK) + @ResponseBody + @GetMapping(value = ARCHIVE_DOSSIERS_PATH, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Gets all archived dossiers.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + List getArchivedDossiers(); + + + @ResponseStatus(value = HttpStatus.OK) + @ResponseBody + @GetMapping(value = ARCHIVE_DOSSIERS_PATH + DOSSIER_TEMPLATE_PATH + DOSSIER_TEMPLATE_ID_PATH_PARAM, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Gets all archived dossiers for the given dossier template id.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + List getArchivedDossiersForDossierTemplate(@PathVariable(DOSSIER_TEMPLATE_ID_PARAM) String dossierTemplateId); + + + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @PostMapping(value = ARCHIVE_DOSSIERS_PATH + ARCHIVE_PATH) + @Operation(summary = "Archives an existing dossier.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "Successfully archived the dossier."), @ApiResponse(responseCode = "400", description = "Incorrect dossier ID entered to archive dossier."), @ApiResponse(responseCode = "403", description = "Forbidden operation while archiving."), @ApiResponse(responseCode = "404", description = "Dossier not found")}) + void archiveDossiers(@RequestBody Set dossierIds); + + + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @PostMapping(value = ARCHIVE_DOSSIERS_PATH + UNARCHIVE_PATH, consumes = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Restores archived dossiers.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "Successfully restored the dossiers."), @ApiResponse(responseCode = "400", description = "Incorrect dossier ID entered to restore dossier."), @ApiResponse(responseCode = "403", description = "Forbidden operation while restoring."), @ApiResponse(responseCode = "404", description = "Dossier not found"), @ApiResponse(responseCode = "409", description = "Conflict occurred while restoring.")}) + void unarchiveDossiers(@RequestBody Set dossierIds); + + + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @DeleteMapping(value = DELETED_DOSSIERS_PATH + HARD_DELETE_PATH) + @Operation(summary = "Hard deletes existing dossiers.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "Successfully hard deleted the dossier."), @ApiResponse(responseCode = "404", description = "Not found")}) + void hardDeleteDossiers(@RequestParam(DOSSIER_ID_PARAM) Set dossierIds); + + + @ResponseBody + @PostMapping(value = DELETED_DOSSIERS_PATH + UNDELETE_PATH, consumes = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Restores dossiers.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "201", description = "Successfully restored the dossiers."), @ApiResponse(responseCode = "400", description = "Incorrect dossier ID entered to restore dossier."), @ApiResponse(responseCode = "403", description = "Forbidden operation while restoring."), @ApiResponse(responseCode = "409", description = "Conflict occurred while restoring.")}) + void undeleteDossiers(@RequestBody Set dossierIds); + +} diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/DossierStatsResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/DossierStatsResource.java new file mode 100644 index 000000000..c624f8778 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/DossierStatsResource.java @@ -0,0 +1,46 @@ +package com.iqser.red.service.persistence.service.v1.api.external.resource; + +import java.util.List; +import java.util.Set; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierStats; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; + +@ResponseStatus(HttpStatus.OK) +public interface DossierStatsResource { + + String DOSSIER_STATS_REST_PATH = ExternalApi.BASE_PATH + "/dossier-stats"; + String DOSSIER_ID_PARAM = "dossierId"; + String DOSSIER_ID_PATH_PARAM = "/{" + DOSSIER_ID_PARAM + "}"; + + + @Deprecated + @ResponseBody + @ResponseStatus(value = HttpStatus.OK) + @GetMapping(value = DOSSIER_STATS_REST_PATH + DOSSIER_ID_PATH_PARAM, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Get stats for a specific Dossier ID", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The Dossier Stats."), @ApiResponse(responseCode = "404", description = "The Dossier is not found.")}) + DossierStats getDossierStats(@PathVariable(DOSSIER_ID_PARAM) String dossierId); + + + @Deprecated + @ResponseBody + @ResponseStatus(value = HttpStatus.OK) + @PostMapping(value = DOSSIER_STATS_REST_PATH, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Get stats for a specific list of Dossier IDs", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The Dossier Stats Map."), @ApiResponse(responseCode = "404", description = "The Dossier is not found.")}) + List getDossierStats(@RequestBody Set dossierIds); + +} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/DossierStatusResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/DossierStatusResource.java similarity index 52% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/DossierStatusResource.java rename to persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/DossierStatusResource.java index 2f5d94c7b..9ca74f5a5 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/DossierStatusResource.java +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/DossierStatusResource.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.resources; +package com.iqser.red.service.persistence.service.v1.api.external.resource; import java.util.List; @@ -13,14 +13,18 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.CreateOrUpdateDossierStatusRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierStatusInfo; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierStatusRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.DossierStatusInfo; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; + +@ResponseStatus(value = HttpStatus.OK) public interface DossierStatusResource { - String DOSSIER_STATUS_PATH = "/dossier-status"; + String DOSSIER_STATUS_PATH = ExternalApi.BASE_PATH + "/dossier-status"; String DOSSIER_TEMPLATE_PATH = "/dossier-template"; - String DOSSIER_TEMPLATE_ID = "dossierTemplateId"; String DOSSIER_TEMPLATE_ID_PATH_VARIABLE = "/{" + DOSSIER_TEMPLATE_ID + "}"; @@ -30,30 +34,41 @@ public interface DossierStatusResource { String DOSSIER_STATUS_REPLACE_ID = "replaceDossierStatusId"; + @Operation(summary = "Creates or updates dossier status", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Dossier status updated"), @ApiResponse(responseCode = "404", description = "The dossier status not found.")}) + @ResponseBody - @ResponseStatus(HttpStatus.ACCEPTED) - @PostMapping(value = DOSSIER_STATUS_PATH, consumes = MediaType.APPLICATION_JSON_VALUE) - DossierStatusInfo createOrUpdateDossierStatus(@RequestBody CreateOrUpdateDossierStatusRequest dossierStatusRequest); + @ResponseStatus(value = HttpStatus.OK) + @PostMapping(value = DOSSIER_STATUS_PATH, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + DossierStatusInfo createOrUpdateDossierStatus(@RequestBody DossierStatusRequest dossierStatusRequest); + @Operation(summary = "Retrieves all dossier status for a dossier template", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Dossier status list retrieved")}) @ResponseBody @ResponseStatus(value = HttpStatus.OK) @GetMapping(value = DOSSIER_STATUS_PATH + DOSSIER_TEMPLATE_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) List getAllDossierStatusForTemplate(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId); + @Operation(summary = "Retrieves all dossier status for a dossier template", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Dossier status list retrieved")}) @ResponseBody @ResponseStatus(value = HttpStatus.OK) - @PostMapping(value = DOSSIER_STATUS_PATH + DOSSIER_TEMPLATE_PATH, produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) - List getAllDossierStatuses(@RequestBody List dossierTemplateId); + @PostMapping(value = DOSSIER_STATUS_PATH + DOSSIER_TEMPLATE_PATH, produces = MediaType.APPLICATION_JSON_VALUE) + List getAllDossierStatuses(@RequestBody List dossierTemplateIds); + @Operation(summary = "Retrieves dossier status", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Dossier status retrieved")}) @ResponseBody @ResponseStatus(value = HttpStatus.OK) @GetMapping(value = DOSSIER_STATUS_PATH + DOSSIER_STATUS_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) DossierStatusInfo getDossierStatus(@PathVariable(DOSSIER_STATUS_ID) String dossierStatusId); + @Operation(summary = "Delete dossier status and update dossiers with a new status", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "Successfully deleted the dossier status."), @ApiResponse(responseCode = "404", description = "Not found")}) @ResponseBody @ResponseStatus(value = HttpStatus.NO_CONTENT) @DeleteMapping(value = DOSSIER_STATUS_PATH + DOSSIER_STATUS_ID_PATH_VARIABLE) diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/DossierTemplateResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/DossierTemplateResource.java new file mode 100644 index 000000000..a184e90bc --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/DossierTemplateResource.java @@ -0,0 +1,103 @@ +package com.iqser.red.service.persistence.service.v1.api.external.resource; + +import java.util.List; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.multipart.MultipartFile; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierTemplateModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DownloadResponse; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.CloneDossierTemplateRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierTemplateStats; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; + +@ResponseStatus(HttpStatus.OK) +public interface DossierTemplateResource { + + String DOSSIER_TEMPLATE_PATH = ExternalApi.BASE_PATH + "/dossier-template"; + String DOSSIER_TEMPLATE_ID = "dossierTemplateId"; + String DOSSIER_TEMPLATE_ID_PATH_VARIABLE = "/{" + DOSSIER_TEMPLATE_ID + "}"; + String CLONE_PATH = "/clone"; + String STATS_PATH = "/stats"; + String IMPORT_PATH = "/import"; + String EXPORT_PATH = "/prepare-export"; + + + @ResponseStatus(HttpStatus.ACCEPTED) + @PostMapping(value = DOSSIER_TEMPLATE_PATH, consumes = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Creates a new DossierTemplates or updates an existing one.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "202", description = "Successfully created DossierTemplates."), @ApiResponse(responseCode = "400", description = "The create/update request is not valid."), @ApiResponse(responseCode = "409", description = "The create/update request is not valid.")}) + DossierTemplateModel createOrUpdateDossierTemplate(@RequestBody DossierTemplateModel dossierTemplate); + + + @GetMapping(value = DOSSIER_TEMPLATE_PATH, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Lists all existing DossierTemplates.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "List of all existing DossierTemplates.")}) + List getAllDossierTemplates(); + + + @GetMapping(value = DOSSIER_TEMPLATE_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Get a specific DossierTemplate by its ID", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The DossierTemplate."), @ApiResponse(responseCode = "404", description = "The DossierTemplate is not found.")}) + DossierTemplateModel getDossierTemplate(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId); + + + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @DeleteMapping(value = DOSSIER_TEMPLATE_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE) + @Operation(summary = "Delete a specific DossierTemplate by its ID", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "The DossierTemplate was deleted"), @ApiResponse(responseCode = "404", description = "The DossierTemplate is not found.")}) + void deleteDossierTemplate(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId); + + + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @PostMapping(value = DOSSIER_TEMPLATE_PATH + "/delete") + @Operation(summary = "Delete multiple DossierTemplates by their IDs", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "The DossierTemplates were deleted"), @ApiResponse(responseCode = "404", description = "DossierTemplates not found.")}) + void deleteDossierTemplates(@RequestBody List dossierTemplateIds); + + + @PostMapping(value = DOSSIER_TEMPLATE_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE + CLONE_PATH, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Clones a dossier template.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Successfully cloned dossier templates."), @ApiResponse(responseCode = "400", description = "The clone request is not valid."), @ApiResponse(responseCode = "409", description = "The clone request is not valid.")}) + DossierTemplateModel cloneDossierTemplate(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, @RequestBody CloneDossierTemplateRequest cloneDossierTemplateRequest); + + + @Operation(summary = "Get Stats for a specific DossierTemplate", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200"), @ApiResponse(responseCode = "404", description = "Dossier template not found")}) + @GetMapping(value = DOSSIER_TEMPLATE_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE + STATS_PATH, produces = MediaType.APPLICATION_JSON_VALUE) + DossierTemplateStats getDossierTemplateStats(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId); + + + @Operation(summary = "Get Stats for all DossierTemplates", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200")}) + @GetMapping(value = DOSSIER_TEMPLATE_PATH + STATS_PATH, produces = MediaType.APPLICATION_JSON_VALUE) + List getDossierTemplateStats(); + + + @Operation(summary = "Prepares an export download for given dossier template", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Success."), @ApiResponse(responseCode = "400", description = "Request contains error."), @ApiResponse(responseCode = "404", description = "Dossier template not found.")}) + @GetMapping(value = DOSSIER_TEMPLATE_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE + EXPORT_PATH, produces = MediaType.APPLICATION_JSON_VALUE) + DownloadResponse prepareExportDownload(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId); + + + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @PostMapping(value = DOSSIER_TEMPLATE_PATH + IMPORT_PATH, consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Receives an archive to import", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "Archive have successfully imported"), @ApiResponse(responseCode = "400", description = "Validation failed during import"), @ApiResponse(responseCode = "404", description = "The dossier template to update does not exist")}) + DossierTemplateModel importDossierTemplate(@RequestPart(name = "file") MultipartFile file, + @RequestParam(value = DOSSIER_TEMPLATE_ID, required = false) String dossierTemplateId, + @RequestParam(value = "updateExistingDossierTemplate", required = false, defaultValue = "false") boolean updateExistingDossierTemplate); + +} diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/DossierTemplateStatsResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/DossierTemplateStatsResource.java new file mode 100644 index 000000000..ab0590da9 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/DossierTemplateStatsResource.java @@ -0,0 +1,32 @@ +package com.iqser.red.service.persistence.service.v1.api.external.resource; + +import java.util.List; +import java.util.Set; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierTemplateDictionaryStats; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; + +@ResponseStatus(HttpStatus.OK) +public interface DossierTemplateStatsResource { + + String DOSSIER_TEMPLATE_STATS_REST_PATH = ExternalApi.BASE_PATH + "/dossier-template-stats"; + + + @ResponseBody + @ResponseStatus(value = HttpStatus.OK) + @PostMapping(value = DOSSIER_TEMPLATE_STATS_REST_PATH, produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Get stats for a specific list of Dossier Template IDs", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The Dossier Template Stats List.")}) + List getDossierTemplateStats(@RequestBody Set dossierTemplateIds); + +} diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/DownloadResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/DownloadResource.java new file mode 100644 index 000000000..1e7a870bb --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/DownloadResource.java @@ -0,0 +1,89 @@ +package com.iqser.red.service.persistence.service.v1.api.external.resource; + +import org.springframework.core.io.FileSystemResource; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.DownloadResponse; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DownloadStatusResponse; +import com.iqser.red.service.persistence.service.v1.api.shared.model.PrepareDownloadRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.PrepareDownloadWithOptionRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.RemoveDownloadRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; + +@ResponseStatus(HttpStatus.OK) +public interface DownloadResource { + + String REST_PATH = ExternalApi.BASE_PATH + "/async/download"; + String FALSE = "false"; + + String STORAGE_ID = "storageId"; + + String OTT = "oneTimeToken"; + String OTT_PATH_VARIABLE = "/{" + OTT + "}"; + String GENERATE_OTT_PATH = "/generate-ott"; + String OTT_PATH = "/with-ott"; + + + @Operation(summary = "Prepares a download for given fileIds and types", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Success."), @ApiResponse(responseCode = "400", description = "Request contains error."), @ApiResponse(responseCode = "404", description = "Dossier or file not found.")}) + @PostMapping(value = REST_PATH + "/prepare", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + DownloadResponse prepareDownload(@RequestBody PrepareDownloadRequest request); + + + @Operation(summary = "Prepares a download for given fileIds and types and reports", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Success."), @ApiResponse(responseCode = "400", description = "Request contains error."), @ApiResponse(responseCode = "404", description = "Dossier or file not found.")}) + @PostMapping(value = REST_PATH + "/prepare-option", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + DownloadResponse prepareDownload(@RequestBody PrepareDownloadWithOptionRequest request); + + + @Operation(summary = "Removes a previously created download status", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Success."), @ApiResponse(responseCode = "404", description = "StorageId does not exist.")}) + @PostMapping(value = REST_PATH + "/delete", consumes = MediaType.APPLICATION_JSON_VALUE) + void deleteDownloadStatus(@RequestBody RemoveDownloadRequest removeDownloadRequest); + + + @Operation(summary = "Gets to download status for the current user", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "Success."), @ApiResponse(responseCode = "400", description = "Request contains error."), @ApiResponse(responseCode = "404", description = "Dossier or file not found.")}) + @GetMapping(value = REST_PATH + "/status", produces = MediaType.APPLICATION_JSON_VALUE) + DownloadStatusResponse getDownloadStatus(); + + + @ResponseBody + @ResponseStatus(value = HttpStatus.OK) + @Operation(summary = "Returns a downloadable byte stream of the requested file", description = "Use the optional \"inline\" request parameter " + "to select, if this report will be opened in the browser.") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Download with this Id is no longer available")}) + @GetMapping(value = REST_PATH) + ResponseEntity downloadFile(@RequestParam(STORAGE_ID) String storageId, + @RequestParam(value = "inline", required = false, defaultValue = FALSE) boolean inline); + + + @ResponseBody + @ResponseStatus(value = HttpStatus.OK) + @Operation(summary = "Returns a oneTimeToken for a requested download", description = "Use the optional \"inline\" request parameter " + "to select, if this report will be opened in the browser.") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + @PostMapping(value = REST_PATH + GENERATE_OTT_PATH) + JSONPrimitive generateOneTimeToken(@RequestBody JSONPrimitive storageIdWrapper); + + + @ResponseBody + @ResponseStatus(value = HttpStatus.OK) + @Operation(summary = "Returns a downloadable byte stream of the requested file using a valid oneTimeToken", description = "Use the optional \"inline\" request parameter " + "to select, if this report will be opened in the browser.") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Download with this Id is no longer available"), @ApiResponse(responseCode = "400", description = "OTT is not valid")}) + @GetMapping(value = REST_PATH + OTT_PATH + OTT_PATH_VARIABLE) + ResponseEntity downloadFileUsingOTT(@PathVariable(OTT) String oneTimeToken, + @RequestParam(value = "inline", required = false, defaultValue = FALSE) boolean inline); + +} diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/ExternalApi.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/ExternalApi.java new file mode 100644 index 000000000..dd4f26a3b --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/ExternalApi.java @@ -0,0 +1,8 @@ +package com.iqser.red.service.persistence.service.v1.api.external.resource; + +public interface ExternalApi { + +// String BASE_PATH = "/api"; + + String BASE_PATH = "/redaction-gateway-v1"; +} diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/FileAttributesResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/FileAttributesResource.java new file mode 100644 index 000000000..266e330df --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/FileAttributesResource.java @@ -0,0 +1,97 @@ +package com.iqser.red.service.persistence.service.v1.api.external.resource; + +import java.util.List; +import java.util.Set; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +import com.google.common.collect.Sets; +import com.iqser.red.service.persistence.service.v1.api.shared.model.FileAttributes; +import com.iqser.red.service.persistence.service.v1.api.shared.model.FileAttributesConfig; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileAttributeConfig; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; + +public interface FileAttributesResource { + + String FILE_ATTRIBUTES_PATH = ExternalApi.BASE_PATH + "/fileAttributes"; + String BASE_CONFIG_PATH = "/baseConfig"; + String FILE_ATTRIBUTE_PATH = "/fileAttribute"; + String CONFIG_PATH = "/config"; + String SET_PATH = "/set"; + + String DOSSIER_TEMPLATE_ID = "dossierTemplateId"; + String DOSSIER_TEMPLATE_ID_PATH_VARIABLE = "/{" + DOSSIER_TEMPLATE_ID + "}"; + + String FILE_ATTRIBUTE_ID = "fileAttributeId"; + String FILE_ATTRIBUTE_ID_PATH_VARIABLE = "/{" + FILE_ATTRIBUTE_ID + "}"; + + String DOSSIER_ID_PARAM = "dossierId"; + String DOSSIER_ID_PATH_PARAM = "/{" + DOSSIER_ID_PARAM + "}"; + + String FILE_ID = "fileId"; + String FILE_ID_PATH_VARIABLE = "/{" + FILE_ID + "}"; + + Set encodingList = Sets.newHashSet("ISO", "ASCII", "UTF-8"); + + + @ResponseBody + @ResponseStatus(HttpStatus.OK) + @Operation(summary = "Set file attributes base configuration and a list of file attributes, ", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + @PutMapping(value = FILE_ATTRIBUTES_PATH + CONFIG_PATH + BASE_CONFIG_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + FileAttributesConfig setFileAttributesConfig(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, @RequestBody FileAttributesConfig fileAttributesConfig); + + + @ResponseBody + @ResponseStatus(HttpStatus.OK) + @Operation(summary = "Add or update a file attribute that can be used at importing csv.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + @PostMapping(value = FILE_ATTRIBUTES_PATH + CONFIG_PATH + FILE_ATTRIBUTE_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + FileAttributeConfig addOrUpdateFileAttribute(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, @RequestBody FileAttributeConfig fileAttributes); + + + @ResponseBody + @ResponseStatus(HttpStatus.NO_CONTENT) + @Operation(summary = "Delete a specific file attribute.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "NO_CONTENT")}) + + @DeleteMapping(value = FILE_ATTRIBUTES_PATH + CONFIG_PATH + FILE_ATTRIBUTE_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE + FILE_ATTRIBUTE_ID_PATH_VARIABLE) + void deleteFileAttribute(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, @PathVariable(FILE_ATTRIBUTE_ID) String fileAttributeId); + + + @ResponseBody + @ResponseStatus(HttpStatus.NO_CONTENT) + @Operation(summary = "Bulk delete file attributes.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "NO_CONTENT")}) + + @PostMapping(value = FILE_ATTRIBUTES_PATH + CONFIG_PATH + FILE_ATTRIBUTE_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE + "/delete") + void deleteFileAttributes(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, @RequestBody List fileAttributeIds); + + + @ResponseStatus(HttpStatus.OK) + @Operation(summary = "Get the file attributes that can be used at importing csv.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + + @GetMapping(value = FILE_ATTRIBUTES_PATH + CONFIG_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) + FileAttributesConfig getFileAttributesConfiguration(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId); + + + @Operation(summary = "Set file attributes to an existing file", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + + @PostMapping(value = FILE_ATTRIBUTES_PATH + SET_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE) + void setFileAttributes(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody FileAttributes fileAttributes); + +} diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/FileManagementResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/FileManagementResource.java new file mode 100644 index 000000000..b51f40889 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/FileManagementResource.java @@ -0,0 +1,87 @@ +package com.iqser.red.service.persistence.service.v1.api.external.resource; + +import java.util.List; +import java.util.Set; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.RotatePagesRequest; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; + +public interface FileManagementResource { + + String DELETE_PATH = ExternalApi.BASE_PATH + "/delete"; + String DOWNLOAD_ORIGINAL_PATH = ExternalApi.BASE_PATH + "/download/original"; + String ROTATION_PATH = ExternalApi.BASE_PATH + "/rotate"; + + String DOSSIER_ID = "dossierId"; + String FILE_ID = "fileId"; + String FILE_IDS = "fileIds"; + + String DOSSIER_ID_PATH_VARIABLE = "/{" + DOSSIER_ID + "}"; + String FILE_ID_PATH_VARIABLE = "/{" + FILE_ID + "}"; + String FALSE = "false"; + + String HARD_DELETE_PATH = DELETE_PATH + "/hard-delete"; + String UNDELETE_PATH = DELETE_PATH + "/restore"; + + + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @DeleteMapping(value = DELETE_PATH + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE) + @Operation(summary = "Deletes a file for a given dossierId and FileId", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK")}) + void deleteFile(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId); + + + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @PostMapping(value = DELETE_PATH + DOSSIER_ID_PATH_VARIABLE) + @Operation(summary = "Deletes a a list of files for a given dossierId", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK")}) + void deleteFiles(@PathVariable(DOSSIER_ID) String dossierId, @RequestBody List fileIds); + + + @ResponseBody + @ResponseStatus(value = HttpStatus.OK) + @Operation(summary = "Returns a downloadable byte stream of the original file with the specified fileId", description = "Use the optional \"inline\" request parameter to select, if " + "this downloadAnnotated will be opened in the browser.") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "400", description = "Could not " + "prepare file download.")}) + @GetMapping(value = DOWNLOAD_ORIGINAL_PATH + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE) + ResponseEntity downloadOriginal(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestParam(value = "inline", required = false, defaultValue = FALSE) boolean inline); + + + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @DeleteMapping(value = HARD_DELETE_PATH + DOSSIER_ID_PATH_VARIABLE) + @Operation(summary = "Hard deletes an uploaded file.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "Successfully hard deleted the file."), @ApiResponse(responseCode = "404", description = "Not found")}) + void hardDeleteFiles(@PathVariable(DOSSIER_ID) String dossierId, @RequestParam(FILE_IDS) Set fileIds); + + + @ResponseBody + @ResponseStatus(value = HttpStatus.CREATED) + @PostMapping(value = UNDELETE_PATH + DOSSIER_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Restores an deleted file.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "201", description = "File successfully restored."), @ApiResponse(responseCode = "400", description = "Incorrect dossier ID or file ID entered to restore file."), @ApiResponse(responseCode = "403", description = "Forbidden operation while restoring."), @ApiResponse(responseCode = "409", description = "Conflict occurred while restoring.")}) + void restoreFiles(@PathVariable(DOSSIER_ID) String dossierId, @RequestBody Set fileIds); + + + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @PostMapping(value = ROTATION_PATH + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Rotates one or more pages for one file.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "Pages successfully rotated."), @ApiResponse(responseCode = "400", description = "Incorrect dossier ID, file ID, pages or rotation entered."), @ApiResponse(responseCode = "403", description = "Forbidden operation while rotating.")}) + void rotatePages(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody RotatePagesRequest rotatePagesRequest); + +} diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/GeneralSettingsResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/GeneralSettingsResource.java new file mode 100644 index 000000000..24f944806 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/GeneralSettingsResource.java @@ -0,0 +1,36 @@ +package com.iqser.red.service.persistence.service.v1.api.external.resource; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.GeneralConfigurationModel; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; + +public interface GeneralSettingsResource { + + String SMTP_PATH = ExternalApi.BASE_PATH + "/configuration/general"; + + + @ResponseBody + @ResponseStatus(value = HttpStatus.OK) + @GetMapping(value = SMTP_PATH, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Returns the current general Configuration.") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK.")}) + GeneralConfigurationModel getGeneralConfigurations(); + + + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @PostMapping(value = SMTP_PATH, consumes = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Write General Configurations to KeyCloak") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "General Configuration updated successful."), @ApiResponse(responseCode = "400", description = "General Configuration update failed.")}) + void updateGeneralConfigurations(@RequestBody GeneralConfigurationModel generalConfigurationModel); + +} diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/HighlightsResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/HighlightsResource.java new file mode 100644 index 000000000..a6c240fe2 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/HighlightsResource.java @@ -0,0 +1,62 @@ +package com.iqser.red.service.persistence.service.v1.api.external.resource; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +import com.iqser.red.service.pdftron.redaction.v1.api.model.highlights.Highlights; +import com.iqser.red.service.persistence.service.v1.api.shared.model.AnnotationIds; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; + +public interface HighlightsResource { + + String HIGHLIGHTS_PATH = "/highlights"; + String IMPORTED_REDACTIONS_PATH = "/imported-redactions"; + String CONVERT_PATH = "/convert"; + String DELETE_PATH = "/delete"; + + String DOSSIERS_PATH = ExternalApi.BASE_PATH + "/dossiers"; + String FILES_PATH = "/files"; + + String DOSSIER_ID = "dossierId"; + String FILE_ID = "fileId"; + + String DOSSIER_ID_PATH_VARIABLE = "/{" + DOSSIER_ID + "}"; + String FILE_ID_PATH_VARIABLE = "/{" + FILE_ID + "}"; + + + @ResponseStatus(value = HttpStatus.OK) + @Operation(summary = "Gets available highlights for the file", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + @GetMapping(value = DOSSIERS_PATH + DOSSIER_ID_PATH_VARIABLE + FILES_PATH + FILE_ID_PATH_VARIABLE + HIGHLIGHTS_PATH, produces = MediaType.APPLICATION_JSON_VALUE) + Highlights getHighlights(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId); + + + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @Operation(summary = "Converts highlights to imported redactions", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK")}) + @PostMapping(value = DOSSIERS_PATH + DOSSIER_ID_PATH_VARIABLE + FILES_PATH + FILE_ID_PATH_VARIABLE + HIGHLIGHTS_PATH + CONVERT_PATH, consumes = MediaType.APPLICATION_JSON_VALUE) + void convertHighlights(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody AnnotationIds annotationIds); + + + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @Operation(summary = "Removed highlights from the file", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK")}) + @PostMapping(value = DOSSIERS_PATH + DOSSIER_ID_PATH_VARIABLE + FILES_PATH + FILE_ID_PATH_VARIABLE + HIGHLIGHTS_PATH + DELETE_PATH, consumes = MediaType.APPLICATION_JSON_VALUE) + void deleteHighlights(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody AnnotationIds annotationIds); + + + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @Operation(summary = "Deletes wrong imported redactions for a file", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK")}) + @PostMapping(value = DOSSIERS_PATH + DOSSIER_ID_PATH_VARIABLE + FILES_PATH + FILE_ID_PATH_VARIABLE + IMPORTED_REDACTIONS_PATH + DELETE_PATH, consumes = MediaType.APPLICATION_JSON_VALUE) + void deleteImportedRedactions(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody AnnotationIds annotationIds); + +} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/LegalBasisMappingResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/LegalBasisMappingResource.java similarity index 53% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/LegalBasisMappingResource.java rename to persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/LegalBasisMappingResource.java index a2474e074..cd5227e94 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/LegalBasisMappingResource.java +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/LegalBasisMappingResource.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.resources; +package com.iqser.red.service.persistence.service.v1.api.external.resource; import java.util.List; @@ -12,38 +12,46 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.legalbasis.LegalBasis; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.legalbasis.LegalBasis; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; public interface LegalBasisMappingResource { - String LEGAL_BASIS_PATH = "/legalBasis"; + String LEGAL_BASIS_PATH = ExternalApi.BASE_PATH + "/legalBasis"; String DELETE_PATH = "/delete"; - String VERSION_PATH = "/version"; String DOSSIER_TEMPLATE_PARAMETER_NAME = "dossierTemplateId"; - String DOSSIER_TEMPLATE_PATH_VARIABLE = "/{" + DOSSIER_TEMPLATE_PARAMETER_NAME + "}"; + String DOSSIER_TEMPLATE_PATH_VARIABLE = "/{dossierTemplateId}"; + @ResponseStatus(HttpStatus.NO_CONTENT) @PostMapping(value = LEGAL_BASIS_PATH + DOSSIER_TEMPLATE_PATH_VARIABLE + DELETE_PATH, consumes = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "delete some legal basis by their names.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK")}) void deleteLegalBasis(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, @RequestBody List legalBasisNames); + @ResponseStatus(HttpStatus.NO_CONTENT) @PutMapping(value = LEGAL_BASIS_PATH + DOSSIER_TEMPLATE_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Add or update one legalBasis.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK")}) void addOrUpdateLegalBasis(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, @RequestBody LegalBasis legalBasis); @ResponseStatus(HttpStatus.NO_CONTENT) @PostMapping(value = LEGAL_BASIS_PATH + DOSSIER_TEMPLATE_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE) - void setLegalBasisMapping(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, @RequestBody List legalBasisMapping); + @Operation(summary = "Set the mapping between legal basis and redaction reason.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK")}) + void setLegalBasisMapping(@RequestBody List legalBasisMapping, @PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId); @ResponseBody @ResponseStatus(value = HttpStatus.OK) @GetMapping(value = LEGAL_BASIS_PATH + DOSSIER_TEMPLATE_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Set the mapping between legal basis and redaction reason.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) List getLegalBasisMapping(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId); - - @ResponseStatus(HttpStatus.OK) - @GetMapping(value = LEGAL_BASIS_PATH + DOSSIER_TEMPLATE_PATH_VARIABLE + VERSION_PATH) - long getVersion(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId); - } diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/LicenseReportResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/LicenseReportResource.java new file mode 100644 index 000000000..00054b7d5 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/LicenseReportResource.java @@ -0,0 +1,32 @@ +package com.iqser.red.service.persistence.service.v1.api.external.resource; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.license.LicenseReport; +import com.iqser.red.service.persistence.service.v1.api.shared.model.license.LicenseReportRequest; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; + +public interface LicenseReportResource { + + String LICENSE_REPORT_PATH = ExternalApi.BASE_PATH + "/report/license"; + + + @ResponseBody + @ResponseStatus(value = HttpStatus.OK) + @PostMapping(value = LICENSE_REPORT_PATH, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Creates and serves license report.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Successfully created and served a license report.")}) + LicenseReport getReport(@RequestBody LicenseReportRequest reportRequest, + @RequestParam(value = "offset", defaultValue = "0") int offset, + @RequestParam(value = "limit", defaultValue = "20") int limit); + +} diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/LicenseResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/LicenseResource.java new file mode 100644 index 000000000..735baab0e --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/LicenseResource.java @@ -0,0 +1,36 @@ +package com.iqser.red.service.persistence.service.v1.api.external.resource; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.license.RedactionLicenseModel; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; + +public interface LicenseResource { + + String LICENSE_REST_PATH = ExternalApi.BASE_PATH + "/license"; + + + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @PostMapping(value = LICENSE_REST_PATH, consumes = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Takes Update the current license") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "License update successful.")}) + void updateLicense(@RequestBody RedactionLicenseModel licenseModel); + + + @ResponseBody + @ResponseStatus(value = HttpStatus.OK) + @GetMapping(value = LICENSE_REST_PATH, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Returns the current license ( or a demo license in case none is configured") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "License returned successfully.")}) + RedactionLicenseModel getLicense(); + +} diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/ManualRedactionResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/ManualRedactionResource.java new file mode 100644 index 000000000..3dbc3d7eb --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/ManualRedactionResource.java @@ -0,0 +1,349 @@ +package com.iqser.red.service.persistence.service.v1.api.external.resource; + +import java.util.List; +import java.util.Set; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.CommentResponse; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ManualAddResponse; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ManualRedactions; +import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.AddCommentRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.AddRedactionRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.ApproveRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.ForceRedactionRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.ImageRecategorizationRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.LegalBasisChangeRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.RemoveRedactionRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.ResizeRedactionRequest; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; + +public interface ManualRedactionResource { + + String MANUAL_REDACTION_REST_PATH = ExternalApi.BASE_PATH + "/manualRedaction"; + + String DOSSIER_ID = "dossierId"; + String DOSSIER_ID_PATH_PARAM = "/{" + DOSSIER_ID + "}"; + + String FILE_ID = "fileId"; + String FILE_ID_PATH_VARIABLE = "/{" + FILE_ID + "}"; + + String ANNOTATION_ID = "annotationId"; + String ANNOTATION_ID_PATH_VARIABLE = "/{" + ANNOTATION_ID + "}"; + + String COMMENT_ID = "commentId"; + String COMMENT_ID_PATH_VARIABLE = "/{" + COMMENT_ID + "}"; + + + /* Reviewer Operations*/ + + + @Deprecated + @ResponseStatus(value = HttpStatus.OK) + @PostMapping(value = MANUAL_REDACTION_REST_PATH + "/request/add" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Adds a request for a redaction.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + ManualAddResponse requestAddRedaction(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody AddRedactionRequest addRedactionRequest); + + + @ResponseStatus(value = HttpStatus.OK) + @PostMapping(value = MANUAL_REDACTION_REST_PATH + "/bulk/request/add" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Adds a request for a redaction.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + List requestBulkAddRedaction(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody Set addRedactionRequest); + + + @Deprecated + @ResponseStatus(value = HttpStatus.OK) + @PostMapping(value = MANUAL_REDACTION_REST_PATH + "/request/remove" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Adds a request to remove a redaction.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + ManualAddResponse requestRemoveRedaction(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody RemoveRedactionRequest removeRedactionRequest); + + + @ResponseStatus(value = HttpStatus.OK) + @PostMapping(value = MANUAL_REDACTION_REST_PATH + "/bulk/request/remove" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Adds a bulk of requests to remove a redaction.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + List requestBulkRemoveRedaction(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody Set removeRedactionRequests); + + + @Deprecated + @ResponseStatus(value = HttpStatus.OK) + @PostMapping(value = MANUAL_REDACTION_REST_PATH + "/request/force" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Adds a request to force a redaction.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + ManualAddResponse requestForceRedaction(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody ForceRedactionRequest forceRedactionRequest); + + + @ResponseStatus(value = HttpStatus.OK) + @PostMapping(value = MANUAL_REDACTION_REST_PATH + "/bulk/request/force" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Adds a bulk of requests to force a redaction.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + List requestBulkForceRedaction(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody Set forceRedactionRequests); + + + @Deprecated + @ResponseStatus(value = HttpStatus.OK) + @PostMapping(value = MANUAL_REDACTION_REST_PATH + "/request/legalBasis" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Adds a request to change the legal basis reason.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + ManualAddResponse requestLegalBasisChange(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody LegalBasisChangeRequest legalBasisChangeRequest); + + + @ResponseStatus(value = HttpStatus.OK) + @PostMapping(value = MANUAL_REDACTION_REST_PATH + "/bulk/request/legalBasis" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Adds a bulk of requests to change the legal basis reason.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + List requestBulkLegalBasisChange(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody Set legalBasisChangeRequests); + + + @Deprecated + @ResponseStatus(value = HttpStatus.OK) + @PostMapping(value = MANUAL_REDACTION_REST_PATH + "/request/recategorize" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Adds a request to recategorize a image.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + ManualAddResponse requestImageRecategorization(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody ImageRecategorizationRequest imageRecategorizationRequest); + + + @ResponseStatus(value = HttpStatus.OK) + @PostMapping(value = MANUAL_REDACTION_REST_PATH + "/bulk/request/recategorize" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Adds a bulk of requests to recategorize a image.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + List requestBulkImageRecategorization(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody Set imageRecategorizationRequests); + + + @Deprecated + @ResponseStatus(value = HttpStatus.OK) + @PostMapping(value = MANUAL_REDACTION_REST_PATH + "/request/resize" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Adds a request to resize a redaction.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + ManualAddResponse requestResizeRedaction(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody ResizeRedactionRequest resizeRedactionRequest); + + + @ResponseStatus(value = HttpStatus.OK) + @PostMapping(value = MANUAL_REDACTION_REST_PATH + "/bulk/request/resize" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Adds a bulk of requests to resize a redaction.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + List requestBulkResizeRedaction(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody Set resizeRedactionRequests); + + + @Deprecated + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @DeleteMapping(MANUAL_REDACTION_REST_PATH + "/undo" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + ANNOTATION_ID_PATH_VARIABLE) + @Operation(summary = "Undo a manual request or redaction", description = "Can only be done be the " + "user who added the request/redaction.") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK")}) + void undo(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @PathVariable(ANNOTATION_ID) String annotationId); + + + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @DeleteMapping(MANUAL_REDACTION_REST_PATH + "/bulk/undo" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE) + @Operation(summary = "Undo a list of manual requests or redactions", description = "Can only be done be the " + "user who added the request/redaction.") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK")}) + void undo(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody Set annotationIds); + + + @ResponseStatus(value = HttpStatus.OK) + @PostMapping(value = MANUAL_REDACTION_REST_PATH + "/comment/add" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + ANNOTATION_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Adds a comment to a redaction/redaction request", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + CommentResponse addComment(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @PathVariable(ANNOTATION_ID) String annotationId, + @RequestBody AddCommentRequest addCommentRequest); + + + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @DeleteMapping(value = MANUAL_REDACTION_REST_PATH + "/comment/undo" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + ANNOTATION_ID_PATH_VARIABLE + COMMENT_ID_PATH_VARIABLE) + @Operation(summary = "Undo a comment", description = "Can only be done be the user who added" + " the comment.") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK")}) + void undoComment(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @PathVariable(ANNOTATION_ID) String annotationId, + @PathVariable(COMMENT_ID) String commentId); + + + /* Approver Operations*/ + + + @Deprecated + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @PostMapping(value = MANUAL_REDACTION_REST_PATH + "/approve" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + ANNOTATION_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Approves a redaction request/ remove redaction request", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK")}) + void approveRequest(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @PathVariable(ANNOTATION_ID) String annotationId, + @RequestBody ApproveRequest approveRequest); + + + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @PostMapping(value = MANUAL_REDACTION_REST_PATH + "/bulk/approve" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Approves a list of redaction requests/ remove redaction requests", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK")}) + void approveRequestBulk(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody Set annotationIds); + + + @Deprecated + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @PostMapping(value = MANUAL_REDACTION_REST_PATH + "/decline" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + ANNOTATION_ID_PATH_VARIABLE) + @Operation(summary = "Declines a redaction request/ remove redaction request", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK")}) + void declineRequest(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @PathVariable(ANNOTATION_ID) String annotationId); + + + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @PostMapping(value = MANUAL_REDACTION_REST_PATH + "/bulk/decline" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE) + @Operation(summary = "Declines a redaction request/ remove redaction request list", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK")}) + void declineRequestBulk(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody Set annotationIds); + + + @Deprecated + @ResponseStatus(value = HttpStatus.OK) + @PostMapping(value = MANUAL_REDACTION_REST_PATH + "/redaction/add" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Adds a manual redaction", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + ManualAddResponse addRedaction(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody AddRedactionRequest addRedactionRequest); + + + @ResponseStatus(value = HttpStatus.OK) + @PostMapping(value = MANUAL_REDACTION_REST_PATH + "/bulk/redaction/add" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Adds a manual redaction", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + List addRedactionBulk(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody Set addRedactionRequest); + + + @Deprecated + @ResponseStatus(value = HttpStatus.OK) + @PostMapping(value = MANUAL_REDACTION_REST_PATH + "/redaction/remove" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Removes a redaction", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + ManualAddResponse removeRedaction(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody RemoveRedactionRequest removeRedactionRequest); + + + @ResponseStatus(value = HttpStatus.OK) + @PostMapping(value = MANUAL_REDACTION_REST_PATH + "/bulk/redaction/remove" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Removes the redactions list", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + List removeRedactionBulk(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody Set removeRedactionRequests); + + + @Deprecated + @ResponseStatus(value = HttpStatus.OK) + @PostMapping(value = MANUAL_REDACTION_REST_PATH + "/redaction/force" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Forces a redaction", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + ManualAddResponse forceRedaction(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody ForceRedactionRequest forceRedactionRequest); + + + @ResponseStatus(value = HttpStatus.OK) + @PostMapping(value = MANUAL_REDACTION_REST_PATH + "/bulk/redaction/force" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Forces the redactions list", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + List forceRedactionBulk(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody Set forceRedactionRequests); + + + @Deprecated + @ResponseStatus(value = HttpStatus.OK) + @PostMapping(value = MANUAL_REDACTION_REST_PATH + "/redaction/legalBasisChange" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Changes a legal basis reason", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + ManualAddResponse legalBasisChange(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody LegalBasisChangeRequest legalBasisChangeRequest); + + + @ResponseStatus(value = HttpStatus.OK) + @PostMapping(value = MANUAL_REDACTION_REST_PATH + "/bulk/redaction/legalBasisChange" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Changes the legal basis reasons list", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + List legalBasisChangeBulk(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody Set legalBasisChangeRequests); + + + @Deprecated + @ResponseStatus(value = HttpStatus.OK) + @PostMapping(value = MANUAL_REDACTION_REST_PATH + "/redaction/recategorize" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Recategorizes an image", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + ManualAddResponse recategorizeImage(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody ImageRecategorizationRequest imageRecategorizationRequest); + + + @ResponseStatus(value = HttpStatus.OK) + @PostMapping(value = MANUAL_REDACTION_REST_PATH + "/bulk/redaction/recategorize" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Recategorizes the images list", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + List recategorizeImageBulk(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody Set imageRecategorizationRequests); + + + @Deprecated + @ResponseStatus(value = HttpStatus.OK) + @PostMapping(value = MANUAL_REDACTION_REST_PATH + "/redaction/resize" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Resizes a redaction", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + ManualAddResponse resizeRedaction(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody ResizeRedactionRequest resizeRedactionRequest); + + + @ResponseStatus(value = HttpStatus.OK) + @PostMapping(value = MANUAL_REDACTION_REST_PATH + "/bulk/redaction/resize" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Resizes the redactions list", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + List resizeRedactionBulk(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody Set resizeRedactionRequests); + + + /* Other operations */ + + + @ResponseStatus(value = HttpStatus.OK) + @GetMapping(value = MANUAL_REDACTION_REST_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Returns the manual redactions", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + ManualRedactions getManualRedactions(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId); + +} diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/NotificationPreferencesResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/NotificationPreferencesResource.java new file mode 100644 index 000000000..bc7ead192 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/NotificationPreferencesResource.java @@ -0,0 +1,44 @@ +package com.iqser.red.service.persistence.service.v1.api.external.resource; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.notification.NotificationPreferences; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; + +public interface NotificationPreferencesResource { + + String NOTIFICATION_PREFERENCES = ExternalApi.BASE_PATH + "/notification-preferences"; + + + @ResponseBody + @ResponseStatus(value = HttpStatus.OK) + @Operation(summary = "Returns object containing the currently enabled notifications.") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + @GetMapping(value = NOTIFICATION_PREFERENCES, produces = MediaType.APPLICATION_JSON_VALUE) + NotificationPreferences getNotificationPreferences(); + + + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @Operation(summary = "Create/update notifications for the current user") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + @PostMapping(value = NOTIFICATION_PREFERENCES, consumes = MediaType.APPLICATION_JSON_VALUE) + void setNotificationPreferences(@RequestBody NotificationPreferences notificationPreferences); + + + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @Operation(summary = "Create/update notifications for the current user") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + @DeleteMapping(value = NOTIFICATION_PREFERENCES) + void deleteNotificationPreferences(); + +} diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/NotificationResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/NotificationResource.java new file mode 100644 index 000000000..f689e8ae5 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/NotificationResource.java @@ -0,0 +1,71 @@ +package com.iqser.red.service.persistence.service.v1.api.external.resource; + +import java.time.OffsetDateTime; +import java.util.List; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.NotificationResponse; +import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; + +public interface NotificationResource { + + String NOTIFICATION_PATH = ExternalApi.BASE_PATH + "/notification"; + String TOGGLE_SEEN_PATH = "/toggle-seen"; + String TOGGLE_READ_PATH = "/toggle-read"; + String DELETE_PATH = "/delete"; + String CHANGES_SINCE_PATH = "/changes"; + + String INCLUDE_SEEN_PARAM = "includeSeen"; + String SET_SEEN_PARAM = "setSeen"; + String SET_READ_PARAM = "setRead"; + + + @ResponseBody + @PostMapping(value = NOTIFICATION_PATH + CHANGES_SINCE_PATH, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "See if there are new notifications since param", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Success."), @ApiResponse(responseCode = "404", description = "Dossier does not exist.")}) + JSONPrimitive hasNewNotificationsSince(@RequestBody JSONPrimitive since); + + + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @Operation(summary = "Mark a notifications as seen or unseen", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK")}) + + @PostMapping(value = NOTIFICATION_PATH + TOGGLE_SEEN_PATH, consumes = MediaType.APPLICATION_JSON_VALUE) + void toggleNotificationSeen(@RequestBody List notificationIds, @RequestParam(SET_SEEN_PARAM) boolean setSeen); + + + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @Operation(summary = "Mark a notifications as read or unread", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK")}) + @PostMapping(value = NOTIFICATION_PATH + TOGGLE_READ_PATH, consumes = MediaType.APPLICATION_JSON_VALUE) + void toggleNotificationRead(@RequestBody List notificationIds, @RequestParam(SET_READ_PARAM) boolean setRead); + + + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @Operation(summary = "Delete notifications", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK")}) + @PostMapping(value = NOTIFICATION_PATH + DELETE_PATH, consumes = MediaType.APPLICATION_JSON_VALUE) + void delete(@RequestBody List notificationIds); + + + @ResponseBody + @ResponseStatus(value = HttpStatus.OK) + @Operation(summary = "Retrieves notifications for the current user", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + @GetMapping(value = NOTIFICATION_PATH, produces = MediaType.APPLICATION_JSON_VALUE) + NotificationResponse getNotifications(@RequestParam(INCLUDE_SEEN_PARAM) boolean includeSeen); + +} diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/RSSResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/RSSResource.java new file mode 100644 index 000000000..ab1dad8ad --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/RSSResource.java @@ -0,0 +1,70 @@ +package com.iqser.red.service.persistence.service.v1.api.external.resource; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.component.ComponentsOverrides; +import com.iqser.red.service.persistence.service.v1.api.shared.model.component.RevertOverrideRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.rss.RSSResponse; +import com.iqser.red.service.redaction.report.v1.api.model.rss.DetailedRSSResponse; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; + +@ResponseStatus(value = HttpStatus.OK) +public interface RSSResource { + + String RSS_PATH = ExternalApi.BASE_PATH + "/rss"; + String OVERRIDE_PATH = "/override"; + + String DOSSIER_ID = "dossierId"; + String DOSSIER_ID_PATH_VARIABLE = "/{" + DOSSIER_ID + "}"; + + String FILE_ID = "fileId"; + String FILE_ID_PATH_VARIABLE = "/{" + FILE_ID + "}"; + + + @GetMapping(value = RSS_PATH + DOSSIER_ID_PATH_VARIABLE, produces = {MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE}) + @Operation(summary = "Returns the RSS response for a dossier", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + RSSResponse getRSS(@PathVariable(DOSSIER_ID) String dossierId, @RequestParam(value = "fileId", required = false) String fileId); + + + @GetMapping(value = RSS_PATH + "/detailed" + DOSSIER_ID_PATH_VARIABLE, produces = {MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE}) + @Operation(summary = "Returns the RSS response with more details for a dossier", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + DetailedRSSResponse getDetailedRSS(@PathVariable(DOSSIER_ID) String dossierId, @RequestParam(value = "fileId", required = false) String fileId); + + + @ResponseBody + @ResponseStatus(value = HttpStatus.OK) + @PostMapping(value = RSS_PATH + OVERRIDE_PATH + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Adds overrides for RSS components", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + void addOverrides(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody ComponentsOverrides componentsOverrides); + + + @ResponseBody + @ResponseStatus(value = HttpStatus.OK) + @GetMapping(value = RSS_PATH + OVERRIDE_PATH + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Gets overrides for RSS components", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + ComponentsOverrides getOverrides(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId); + + + @ResponseBody + @ResponseStatus(value = HttpStatus.OK) + @PostMapping(value = RSS_PATH + OVERRIDE_PATH + "/revert" + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Reverts overrides for RSS components", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + void revertOverrides(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody RevertOverrideRequest revertOverrideRequest); + +} diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/ReanalysisResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/ReanalysisResource.java new file mode 100644 index 000000000..e9ebd084b --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/ReanalysisResource.java @@ -0,0 +1,140 @@ +package com.iqser.red.service.persistence.service.v1.api.external.resource; + +import java.util.List; +import java.util.Set; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseStatus; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.PageExclusionRequest; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; + +@ResponseStatus(value = HttpStatus.NO_CONTENT) +public interface ReanalysisResource { + + String TOGGLE_ANALYSIS_PATH = ExternalApi.BASE_PATH + "/toggle-analysis"; + String TOGGLE_AUTOMATIC_ANALYSIS_PATH = ExternalApi.BASE_PATH + "/toggle-automatic-analysis"; + String REANALYSIS_REST_PATH = ExternalApi.BASE_PATH + "/reanalyze"; + String REINDEX_REST_PATH = ExternalApi.BASE_PATH + "/reindex"; + String OCR_REANALYSIS_REST_PATH = ExternalApi.BASE_PATH + "/ocr/reanalyze"; + String EXCLUDE_PAGES_PATH = ExternalApi.BASE_PATH + "/exclude-pages"; + String INCLUDE_PAGES_PATH = ExternalApi.BASE_PATH + "/include-pages"; + + String BULK_REST_PATH = "/bulk"; + + String DOSSIER_ID = "dossierId"; + String FILE_ID = "fileId"; + + String DOSSIER_ID_PATH_VARIABLE = "/{" + DOSSIER_ID + "}"; + String FILE_ID_PATH_VARIABLE = "/{" + FILE_ID + "}"; + String FALSE = "false"; + + String EXCLUDED_STATUS_PARAM = "excluded"; + String FORCE_PARAM = "force"; + + + @PostMapping(value = REANALYSIS_REST_PATH + DOSSIER_ID_PATH_VARIABLE) + @Operation(summary = "Reanalyze all files of the dossier.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK")}) + void reanalyzeDossier(@PathVariable(DOSSIER_ID) String dossierId, @RequestParam(value = FORCE_PARAM, required = false, defaultValue = FALSE) boolean force); + + + @PostMapping(value = REANALYSIS_REST_PATH + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE) + @Operation(summary = "Reanalyze a file", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK")}) + void reanalyzeFile(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestParam(value = FORCE_PARAM, required = false, defaultValue = FALSE) boolean force); + + + @PostMapping(value = REANALYSIS_REST_PATH + DOSSIER_ID_PATH_VARIABLE + BULK_REST_PATH) + @Operation(summary = "Reanalyze multiple files for a dossier", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK")}) + void reanalyzeFilesForDossier(@PathVariable(DOSSIER_ID) String dossierId, + @RequestBody List fileIds, + @RequestParam(value = FORCE_PARAM, required = false, defaultValue = FALSE) boolean force); + + + @Operation(summary = "Ocr and reanalyze a dossier", description = "None") + @PostMapping(value = OCR_REANALYSIS_REST_PATH + DOSSIER_ID_PATH_VARIABLE) + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK")}) + void ocrDossier(@PathVariable(DOSSIER_ID) String dossierId); + + + @Operation(summary = "Ocr and reanalyze a file", description = "None") + @PostMapping(value = OCR_REANALYSIS_REST_PATH + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE) + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK"), @ApiResponse(responseCode = "409", description = "Conflict")}) + void ocrFile(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestParam(value = FORCE_PARAM, required = false, defaultValue = FALSE) boolean force); + + + @Operation(summary = "Ocr and reanalyze multiple files for a dossier", description = "None") + @PostMapping(value = OCR_REANALYSIS_REST_PATH + DOSSIER_ID_PATH_VARIABLE + BULK_REST_PATH) + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK")}) + void ocrFiles(@PathVariable(DOSSIER_ID) String dossierId, @RequestBody Set fileIds); + + + @Operation(summary = "Exclude or re-include a file to the automatic analysis", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK")}) + @PostMapping(value = TOGGLE_AUTOMATIC_ANALYSIS_PATH + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE) + void toggleAutomaticAnalysis(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestParam(EXCLUDED_STATUS_PARAM) boolean excludedFromAutomaticAnalysis); + + + @Operation(summary = "Exclude or re-include a file to analysis", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK")}) + + @PostMapping(value = TOGGLE_ANALYSIS_PATH + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE) + void toggleExclusion(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestParam(name = EXCLUDED_STATUS_PARAM, required = false, defaultValue = FALSE) boolean excluded); + + + @Operation(summary = "Exclude or re-include a file to the automatic analysis", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK")}) + + @PostMapping(value = TOGGLE_AUTOMATIC_ANALYSIS_PATH + DOSSIER_ID_PATH_VARIABLE + BULK_REST_PATH) + void toggleAutomaticAnalysisForList(@PathVariable(DOSSIER_ID) String dossierId, + @RequestBody Set fileIds, + @RequestParam(EXCLUDED_STATUS_PARAM) boolean excludedFromAutomaticAnalysis); + + + @Operation(summary = "Exclude or re-include a file to analysis", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK")}) + + @PostMapping(value = TOGGLE_ANALYSIS_PATH + DOSSIER_ID_PATH_VARIABLE + BULK_REST_PATH) + void toggleExclusionForList(@PathVariable(DOSSIER_ID) String dossierId, + @RequestBody Set fileIds, + @RequestParam(name = EXCLUDED_STATUS_PARAM, required = false, defaultValue = FALSE) boolean excluded); + + + @Operation(summary = "Exclude pages from analysis for a file", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK")}) + + @PostMapping(value = EXCLUDE_PAGES_PATH + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE) + void excludePages(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody PageExclusionRequest pageExclusionRequest); + + + @Operation(summary = "Include pages from analysis for a file", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK")}) + @PostMapping(value = INCLUDE_PAGES_PATH + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE) + void includePages(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody PageExclusionRequest pageInclusionRequest); + + + @PostMapping(value = REINDEX_REST_PATH) + @Operation(summary = "Reindex a dossier, files of a dossier or all", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK")}) + void reindex(@RequestParam(value = "dossierId", required = false) String dossierId, + @RequestParam(value = "dropIndex", required = false, defaultValue = FALSE) boolean dropIndex, + @RequestBody List fileIds); + +} diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/RedactionLogResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/RedactionLogResource.java new file mode 100644 index 000000000..a495b45a2 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/RedactionLogResource.java @@ -0,0 +1,73 @@ +package com.iqser.red.service.persistence.service.v1.api.external.resource; + +import java.util.List; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseStatus; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.FilteredRedactionLogRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLog; +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.section.SectionGrid; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; + +@ResponseStatus(value = HttpStatus.OK) +public interface RedactionLogResource { + + String REDACTION_LOG_PATH = ExternalApi.BASE_PATH + "/redactionLog"; + String SECTION_GRID_PATH = ExternalApi.BASE_PATH + "/sectionGrid"; + String SECTION_TEXT_PATH = ExternalApi.BASE_PATH + "/sectionText"; + String SIMPLIFIED_SECTION_TEXT_PATH = ExternalApi.BASE_PATH + "/simplifiedSectionText"; + + String FILE_ID = "fileId"; + String FILE_ID_PATH_VARIABLE = "/{" + FILE_ID + "}"; + + String DOSSIER_ID = "dossierId"; + String DOSSIER_ID_PATH_VARIABLE = "/{" + DOSSIER_ID + "}"; + + + @GetMapping(value = REDACTION_LOG_PATH + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Gets the redaction log for a fileId", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "400", description = "Request " + "contains error."), @ApiResponse(responseCode = "404", description = "The redaction log is not found.")}) + RedactionLog getRedactionLog(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestParam(value = "excludedType", required = false) List excludedTypes, + @RequestParam(value = "withManualRedactions", required = false, defaultValue = "true") boolean withManualRedactions, + @RequestParam(value = "includeFalsePositives", required = false, defaultValue = "false") boolean includeFalsePositives); + + + @GetMapping(value = SECTION_GRID_PATH + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Gets the section grid for a fileId", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "400", description = "Request " + "contains error."), @ApiResponse(responseCode = "404", description = "The section grid is not found.")}) + SectionGrid getSectionGrid(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId); + + + @GetMapping(value = SECTION_TEXT_PATH + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE) + @Operation(summary = "Gets the section text for a fileId", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "400", description = "Request " + "contains error."), @ApiResponse(responseCode = "404", description = "The section text is not found.")}) + ResponseEntity getSectionText(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId); + + + @GetMapping(value = SIMPLIFIED_SECTION_TEXT_PATH + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE) + @Operation(summary = "Gets the simplified section text for a fileId", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "400", description = "Request " + "contains error."), @ApiResponse(responseCode = "404", description = "The simplified section text is not found.")}) + ResponseEntity getSimplifiedSectionText(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId); + + + @PostMapping(value = REDACTION_LOG_PATH + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE + "/filtered", produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Gets the redaction log for a fileId grater than the specified date", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "400", description = "Request " + "contains error."), @ApiResponse(responseCode = "404", description = "The redaction log is not found.")}) + RedactionLog getFilteredRedactionLog(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody FilteredRedactionLogRequest filteredRedactionLogRequest); + +} diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/ReportTemplateResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/ReportTemplateResource.java new file mode 100644 index 000000000..4dfb64eb3 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/ReportTemplateResource.java @@ -0,0 +1,92 @@ +package com.iqser.red.service.persistence.service.v1.api.external.resource; + +import java.util.List; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.multipart.MultipartFile; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.PlaceholdersResponse; +import com.iqser.red.service.persistence.service.v1.api.shared.model.ReportTemplateUpdateRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.ReportTemplate; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; + +public interface ReportTemplateResource { + + String REPORT_TEMPLATE_UPLOAD_PATH = ExternalApi.BASE_PATH + "/templateUpload"; + String REPORT_TEMPLATES_PATH = ExternalApi.BASE_PATH + "/templates"; + String DOSSIER_TEMPLATE_ID = "dossierTemplateId"; + String DOSSIER_TEMPLATE_ID_PATH_VARIABLE = "/{" + DOSSIER_TEMPLATE_ID + "}"; + String TEMPLATE_ID = "templateId"; + String TEMPLATE_ID_PATH_VARIABLE = "/{" + TEMPLATE_ID + "}"; + String MULTI_FILE_REPORT = "multiFileReport"; + String ACTIVE_BY_DEFAULT = "activeByDefault"; + String PLACEHOLDERS_PATH = ExternalApi.BASE_PATH + "/placeholders"; + + + @PostMapping(value = REPORT_TEMPLATES_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Returns templates which contains given placeholder", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Report templates return succeeded.")}) + List getReportTemplatesByPlaceholder(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, @RequestBody JSONPrimitive placeholder); + + + @ResponseBody + @ResponseStatus(value = HttpStatus.CREATED) + @PostMapping(value = REPORT_TEMPLATE_UPLOAD_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE, consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Upload template file for redaction-report", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "201", description = "Report template upload succeeded.")}) + ReportTemplate uploadTemplate(@RequestPart(name = "file") MultipartFile file, + @PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, + @RequestParam(value = MULTI_FILE_REPORT, required = false, defaultValue = "false") boolean multiFileReport, + @RequestParam(value = ACTIVE_BY_DEFAULT, required = false, defaultValue = "false") boolean activeByDefault); + + + @GetMapping(value = REPORT_TEMPLATE_UPLOAD_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Returns available templates for redaction-report", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Report template return succeeded.")}) + List getAvailableReportTemplates(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId); + + + @GetMapping(value = REPORT_TEMPLATE_UPLOAD_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE + TEMPLATE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Download template file for redaction-report", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Report template download succeeded.")}) + ResponseEntity downloadReportTemplate(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, @PathVariable(TEMPLATE_ID) String templateId); + + + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @DeleteMapping(value = REPORT_TEMPLATE_UPLOAD_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE + TEMPLATE_ID_PATH_VARIABLE) + @Operation(summary = "Delete template file for redaction-report", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "Report template deletion succeeded.")}) + void deleteTemplate(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, @PathVariable(TEMPLATE_ID) String templateId); + + + @GetMapping(value = PLACEHOLDERS_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Returns list of available placeholders", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Placeholders return succeeded.")}) + PlaceholdersResponse getAvailablePlaceholders(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId); + + + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @PutMapping(value = REPORT_TEMPLATE_UPLOAD_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE + TEMPLATE_ID_PATH_VARIABLE) + @Operation(summary = "Update template file for redaction-report", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Report template update succeeded.")}) + void updateTemplate(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, + @PathVariable(TEMPLATE_ID) String templateId, + @RequestBody ReportTemplateUpdateRequest updateRequest); + +} diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/RulesResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/RulesResource.java new file mode 100644 index 000000000..337ecb923 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/RulesResource.java @@ -0,0 +1,70 @@ +package com.iqser.red.service.persistence.service.v1.api.external.resource; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.multipart.MultipartFile; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.Rules; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; + +public interface RulesResource { + + String RULES_PATH = ExternalApi.BASE_PATH + "/rules"; + String UPLOAD_PATH = "/upload"; + String DOWNLOAD_PATH = "/download"; + + String DOSSIER_TEMPLATE_PARAMETER_NAME = "dossierTemplateId"; + String DOSSIER_TEMPLATE_PATH_VARIABLE = "/{dossierTemplateId}"; + + + /** + * Upload rules to be used by redaction service. + * + * @param rules object containing string of rules. + */ + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @PostMapping(value = RULES_PATH, consumes = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Takes object containing string or rules as argument, which will be used by the redaction service.") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "Rules upload successful."), @ApiResponse(responseCode = "400", description = "Uploaded rules could not be verified.")}) + void upload(@RequestBody Rules rules); + + + @ResponseBody + @ResponseStatus(value = HttpStatus.OK) + @Operation(summary = "Returns object containing the currently used Drools rules.") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + @GetMapping(value = RULES_PATH + DOSSIER_TEMPLATE_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) + Rules download(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId); + + + /** + * Upload rules as file to be used by redaction service. + * + * @param file Drools file containing rules as plain text. + */ + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @PostMapping(value = RULES_PATH + DOSSIER_TEMPLATE_PATH_VARIABLE + UPLOAD_PATH, consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + @Operation(summary = "Takes object containing string or rules as argument, which will be used by the redaction service.") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "Rules upload successful."), @ApiResponse(responseCode = "400", description = "Uploaded rules could not be verified.")}) + void uploadFile(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, @RequestPart(name = "file") MultipartFile file); + + + @ResponseBody + @ResponseStatus(value = HttpStatus.OK) + @Operation(summary = "Returns file containing the currently used Drools rules.") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + @GetMapping(value = RULES_PATH + DOSSIER_TEMPLATE_PATH_VARIABLE + DOWNLOAD_PATH) + ResponseEntity downloadFile(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId); + +} diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/SMTPConfigurationResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/SMTPConfigurationResource.java new file mode 100644 index 000000000..2da24ed22 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/SMTPConfigurationResource.java @@ -0,0 +1,53 @@ +package com.iqser.red.service.persistence.service.v1.api.external.resource; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.SMTPConfiguration; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; + +public interface SMTPConfigurationResource { + + String SMTP_PATH = ExternalApi.BASE_PATH + "/configuration/smtp"; + + String TEST_PATH = "/test"; + + + @ResponseBody + @ResponseStatus(value = HttpStatus.OK) + @GetMapping(value = SMTP_PATH, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Returns the current SMTP Configuration.") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK."), @ApiResponse(responseCode = "404", description = "SMTP not configured.")}) + SMTPConfiguration getCurrentSMTPConfiguration(); + + + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @PostMapping(value = SMTP_PATH, consumes = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Write SMTP Settings to KeyCloak") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "SMTP Configuration updated successful."), @ApiResponse(responseCode = "400", description = "SMTP update failed.")}) + void updateSMTPConfiguration(@RequestBody SMTPConfiguration smtpConfigurationModel); + + + @ResponseStatus(value = HttpStatus.OK) + @PostMapping(value = SMTP_PATH + TEST_PATH, consumes = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Test SMTP Settings to KeyCloak") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "SMTP Configuration is valid."), @ApiResponse(responseCode = "400", description = "SMTP test failed.")}) + void testSMTPConfiguration(@RequestBody SMTPConfiguration smtpConfigurationModel); + + + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @DeleteMapping(value = SMTP_PATH) + @Operation(summary = "Clear SMTP Settings to KeyCloak") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "SMTP Configuration has been cleared."), @ApiResponse(responseCode = "400", description = "Failed to clear SMTP Configuration.")}) + void clearSMTPConfiguration(); + +} diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/SearchResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/SearchResource.java new file mode 100644 index 000000000..1bce8d918 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/SearchResource.java @@ -0,0 +1,39 @@ +package com.iqser.red.service.persistence.service.v1.api.external.resource; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +import com.iqser.red.service.search.v1.model.SearchRequest; +import com.iqser.red.service.search.v1.model.SearchResult; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; + +public interface SearchResource { + + String SEARCH_PATH = ExternalApi.BASE_PATH + "/search-v2"; + String SEARCH_PATH_DEPRECATED = ExternalApi.BASE_PATH + "/search"; + + + @ResponseBody + @ResponseStatus(value = HttpStatus.OK) + @PostMapping(value = SEARCH_PATH, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Search for contents of documents", description = "None") + @ApiResponses(value = @ApiResponse(responseCode = "200", description = "OK")) + SearchResult search(@RequestBody SearchRequest searchRequest); + + + @Deprecated + @ResponseBody + @ResponseStatus(value = HttpStatus.OK) + @PostMapping(value = SEARCH_PATH_DEPRECATED, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Search for contents of documents", description = "None") + @ApiResponses(value = @ApiResponse(responseCode = "200", description = "OK")) + SearchResult searchDeprecated(@RequestBody SearchRequest searchRequest); + +} diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/StatusReportResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/StatusReportResource.java new file mode 100644 index 000000000..a01dd7a1e --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/StatusReportResource.java @@ -0,0 +1,24 @@ +package com.iqser.red.service.persistence.service.v1.api.external.resource; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; + +public interface StatusReportResource { + + String STATUS_REPORT = ExternalApi.BASE_PATH + "/statusReport"; + String DOSSIER_ID = "dossierId"; + + String DOSSIER_ID_PATH_VARIABLE = "/{" + DOSSIER_ID + "}"; + + + @GetMapping(value = STATUS_REPORT + DOSSIER_ID_PATH_VARIABLE) + @Operation(summary = "Generate status report for dossier", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Status report was generated.")}) + ResponseEntity generateStatusReport(@PathVariable(DOSSIER_ID) String dossierId); + +} diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/StatusResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/StatusResource.java new file mode 100644 index 000000000..8ff0e9bbe --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/StatusResource.java @@ -0,0 +1,163 @@ +package com.iqser.red.service.persistence.service.v1.api.external.resource; + +import java.time.OffsetDateTime; +import java.util.List; +import java.util.Map; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.FileStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; + +public interface StatusResource { + + String STATUS_REST_PATH = ExternalApi.BASE_PATH + "/status"; + String CHANGES_SINCE_PATH = "/changes"; + String BULK_REST_PATH = "/bulk"; + String ASSIGNEE_REST_PATH = "/set-assignee"; + + String DOSSIER_ID = "dossierId"; + String DOSSIER_ID_PATH_VARIABLE = "/{" + DOSSIER_ID + "}"; + + String FILE_ID = "fileId"; + String FILE_ID_PATH_VARIABLE = "/{" + FILE_ID + "}"; + + String ASSIGNEE_ID_REQUEST_PARAM = "assigneeId"; + + String DELETED_PATH = "/softdeleted"; + + + @ResponseBody + @PostMapping(value = STATUS_REST_PATH + DOSSIER_ID_PATH_VARIABLE + CHANGES_SINCE_PATH, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "See if there are changes of files in a specific dossier dossiers since param", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Success."), @ApiResponse(responseCode = "404", description = "Dossier does not exist.")}) + JSONPrimitive hasChangesSince(@PathVariable(DOSSIER_ID) String dossierId, @RequestBody JSONPrimitive since); + + + @ResponseStatus(value = HttpStatus.OK) + @ResponseBody + @PostMapping(value = STATUS_REST_PATH, produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Gets the status for all files of a list of dossiers.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + Map> getDossierStatus(@RequestBody List dossierIds); + + + @ResponseStatus(value = HttpStatus.OK) + @ResponseBody + @PostMapping(value = STATUS_REST_PATH + DELETED_PATH, produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Gets the status for all soft deleted files of a list of dossiers.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + Map> getSoftDeletedFilesForDossiers(@RequestBody List dossierIds); + + + @ResponseStatus(value = HttpStatus.OK) + @ResponseBody + @GetMapping(value = STATUS_REST_PATH + DOSSIER_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Gets the status for all files in a dossier.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + List getDossierStatus(@PathVariable(DOSSIER_ID) String dossierId); + + + @ResponseStatus(value = HttpStatus.OK) + @ResponseBody + @GetMapping(value = STATUS_REST_PATH + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Gets the status for a file.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not found")}) + FileStatus getFileStatus(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId); + + + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @PostMapping(value = STATUS_REST_PATH + ASSIGNEE_REST_PATH + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE) + @Operation(summary = "Assigns a user to a a file.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Successfully assigned new owner to dossier."), @ApiResponse(responseCode = "404", description = "Not found")}) + void setCurrentFileAssignee(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestParam(value = ASSIGNEE_ID_REQUEST_PARAM, required = false) String assigneeId); + + + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @PostMapping(value = STATUS_REST_PATH + "/under-review" + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE) + @Operation(summary = "Sets the status UNDER_REVIEW for a file.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK")}) + void setStatusUnderReview(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestParam(value = ASSIGNEE_ID_REQUEST_PARAM, required = false) String assigneeId); + + + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @PostMapping(value = STATUS_REST_PATH + "/under-approval" + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE) + @Operation(summary = "Sets the status UNDER_APPROVAL for a file.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK")}) + void setStatusUnderApproval(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestParam(value = ASSIGNEE_ID_REQUEST_PARAM, required = false) String assigneeId); + + + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @PostMapping(value = STATUS_REST_PATH + "/approved" + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE) + @Operation(summary = "Sets the status APPROVED for a file.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK")}) + void setStatusApproved(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId); + + + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @PostMapping(value = STATUS_REST_PATH + "/set-assignee" + DOSSIER_ID_PATH_VARIABLE + BULK_REST_PATH, consumes = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Assign a a user for a list of files.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Successfully assigned new owner to dossier."), @ApiResponse(responseCode = "404", description = "Not found")}) + void setAssigneeForList(@PathVariable(DOSSIER_ID) String dossierId, + @RequestParam(value = ASSIGNEE_ID_REQUEST_PARAM, required = false) String assigneeId, + @RequestBody List fileIds); + + + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @PostMapping(value = STATUS_REST_PATH + "/under-review" + DOSSIER_ID_PATH_VARIABLE + BULK_REST_PATH, consumes = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Sets the status UNDER_REVIEW for a list of files.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK")}) + void setStatusUnderReviewForList(@PathVariable(DOSSIER_ID) String dossierId, + @RequestBody List fileIds, + @RequestParam(value = ASSIGNEE_ID_REQUEST_PARAM, required = false) String assigneeId); + + + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @PostMapping(value = STATUS_REST_PATH + "/under-approval" + DOSSIER_ID_PATH_VARIABLE + BULK_REST_PATH, consumes = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Sets the status UNDER_APPROVAL for a list of files.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK")}) + void setStatusUnderApprovalForList(@PathVariable(DOSSIER_ID) String dossierId, + @RequestBody List fileIds, + @RequestParam(value = ASSIGNEE_ID_REQUEST_PARAM, required = false) String assigneeId); + + + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @PostMapping(value = STATUS_REST_PATH + "/approved" + DOSSIER_ID_PATH_VARIABLE + BULK_REST_PATH, consumes = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Sets the status APPROVED for a list of files.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK")}) + void setStatusApprovedForList(@PathVariable(DOSSIER_ID) String dossierId, @RequestBody List fileIds); + + + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @PostMapping(value = STATUS_REST_PATH + "/new" + DOSSIER_ID_PATH_VARIABLE + BULK_REST_PATH, consumes = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Sets the status NEW for a list of files.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK")}) + void setStatusNewForList(@PathVariable(DOSSIER_ID) String dossierId, @RequestBody List fileIds); + + + @ResponseStatus(value = HttpStatus.OK) + @ResponseBody + @GetMapping(value = STATUS_REST_PATH + DELETED_PATH + DOSSIER_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Gets the deleted status for a file.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not found")}) + List getSoftDeletedDossierStatus(@PathVariable(DOSSIER_ID) String dossierId); + +} diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/TenantsResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/TenantsResource.java new file mode 100644 index 000000000..4e890cf87 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/TenantsResource.java @@ -0,0 +1,45 @@ +package com.iqser.red.service.persistence.service.v1.api.external.resource; + +import java.util.List; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; +import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.TenantRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.TenantResponse; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; + +@ResponseStatus(value = HttpStatus.OK) +public interface TenantsResource { + + String TENANT_ID_PARAM = "tenantId"; + String TENANT_ID_PATH_PARAM = "/{" + TENANT_ID_PARAM + "}"; + + + @PostMapping(value = ExternalApi.BASE_PATH + "/tenants", consumes = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Creates a new Tenant", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + void createTenant(@RequestBody TenantRequest tenant); + + + @GetMapping(value = ExternalApi.BASE_PATH + "/tenants", produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Gets all existing tenant", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + List getTenants(); + + + @GetMapping(value = ExternalApi.BASE_PATH + "/deploymentKey" + TENANT_ID_PATH_PARAM, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Returns the deployment key for a tenant", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + JSONPrimitive getDeploymentKey(@PathVariable(TENANT_ID_PARAM) String tenantId); + +} diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/UploadResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/UploadResource.java new file mode 100644 index 000000000..50a434b47 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/UploadResource.java @@ -0,0 +1,51 @@ +package com.iqser.red.service.persistence.service.v1.api.external.resource; + +import java.util.Set; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.multipart.MultipartFile; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.FileUploadResult; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; + +public interface UploadResource { + + String DOSSIER_ID = "dossierId"; + String FILE_ID = "fileId"; + String UPLOAD_PATH = ExternalApi.BASE_PATH + "/upload"; + String IMPORT_REDACTIONS_PATH = ExternalApi.BASE_PATH + "/import-redactions"; + String DOSSIER_ID_PATH_VARIABLE = "/{" + DOSSIER_ID + "}"; + String FILE_ID_PATH_VARIABLE = "/{" + FILE_ID + "}"; + + + @ResponseBody + @ResponseStatus(value = HttpStatus.CREATED) + @PostMapping(value = UPLOAD_PATH + DOSSIER_ID_PATH_VARIABLE, consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Receives an uploaded file and returns its fileId.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "201", description = "File upload succeeded. Return the fileId of the " + "uploaded file.")}) + FileUploadResult upload(@RequestPart(name = "file") MultipartFile file, + @PathVariable(DOSSIER_ID) String dossierId, + @RequestParam(value = "keepManualRedactions", required = false, defaultValue = "false") boolean keepManualRedactions); + + + @ResponseBody + @ResponseStatus(value = HttpStatus.OK) + @PostMapping(value = IMPORT_REDACTIONS_PATH + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE, consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + @Operation(summary = "Imports redactions from a redacted file to a existing file", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Ok")}) + void importRedactions(@RequestPart(name = "file") MultipartFile file, + @PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestParam(value = "pageInclusionRequest", required = false) Set pageInclusionRequest); + +} diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/UserPreferenceResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/UserPreferenceResource.java new file mode 100644 index 000000000..de6dd61ab --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/UserPreferenceResource.java @@ -0,0 +1,49 @@ +package com.iqser.red.service.persistence.service.v1.api.external.resource; + +import java.util.List; +import java.util.Map; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; + +public interface UserPreferenceResource { + + String PREFERENCES_PATH = ExternalApi.BASE_PATH + "/attributes"; + String KEY_PARAMETER_NAME = "key"; + String KEY_PATH_VARIABLE = "/{" + KEY_PARAMETER_NAME + "}"; + + + @ResponseBody + @ResponseStatus(value = HttpStatus.OK) + @GetMapping(value = PREFERENCES_PATH, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Get User Attributes.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) + Map> getAllUserAttributes(); + + + @ResponseStatus(HttpStatus.NO_CONTENT) + @PutMapping(value = PREFERENCES_PATH + KEY_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Store User Attribute by key.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK")}) + void setAttribute(@PathVariable(KEY_PARAMETER_NAME) String key, @RequestBody List values); + + + @ResponseBody + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @DeleteMapping(value = PREFERENCES_PATH + KEY_PATH_VARIABLE) + @Operation(summary = "Delete User Preferences by key.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK")}) + void deleteAttribute(@PathVariable(KEY_PARAMETER_NAME) String key); + +} diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/UserResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/UserResource.java new file mode 100644 index 000000000..218b6d80d --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/UserResource.java @@ -0,0 +1,125 @@ +package com.iqser.red.service.persistence.service.v1.api.external.resource; + +import java.util.List; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +import com.iqser.red.keycloak.commons.model.User; +import com.iqser.red.service.persistence.service.v1.api.shared.model.CreateUserRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.ResetPasswordRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.UpdateMyProfileRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.UpdateProfileRequest; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; + +@ResponseStatus(value = HttpStatus.OK) +public interface UserResource { + + String USER_REST_PATH = ExternalApi.BASE_PATH + "/user"; + String RED_USER_REST_PATH = USER_REST_PATH + "/red"; + String UPDATE_USER_PROFILE_PATH = USER_REST_PATH + "/profile"; + String ACTIVATE_USER_PROFILE_PATH = UPDATE_USER_PROFILE_PATH + "/activate"; + String UPDATE_MY_USER_PROFILE_PATH = USER_REST_PATH + "/my-profile"; + String USER_ID = "userId"; + String USER_ID_PATH_VARIABLE = "/{" + USER_ID + "}"; + + String USER_ROLE_REST_PATH = USER_REST_PATH + USER_ID_PATH_VARIABLE + "/role"; + + String RESET_PASSWORD_PATH = USER_REST_PATH + USER_ID_PATH_VARIABLE + "/reset-password"; + + String REFRESH_CACHE_PARAM = "refreshCache"; + String IS_ACTIVE_PARAM = "isActive"; + + + @ResponseBody + @Operation(summary = "Gets the users who contain redaction roles.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "400", description = "Invalid " + "offset or limit specified.")}) + @GetMapping(value = RED_USER_REST_PATH, produces = MediaType.APPLICATION_JSON_VALUE) + List getAllRedUsers(@RequestParam(name = REFRESH_CACHE_PARAM, defaultValue = "false", required = false) boolean bypassCache); + + + @ResponseBody + @Operation(summary = "Gets all the users in realm with information of roles.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "400", description = "Invalid " + "offset or limit specified.")}) + @GetMapping(value = USER_REST_PATH, produces = MediaType.APPLICATION_JSON_VALUE) + List getAllUsers(@RequestParam(name = REFRESH_CACHE_PARAM, defaultValue = "false", required = false) boolean bypassCache); + + + @ResponseBody + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @Operation(summary = "Update your own user-profile.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK"), @ApiResponse(responseCode = "400", description = "Failed to update profile, e-mail cannot be empty")}) + @PostMapping(value = UPDATE_USER_PROFILE_PATH + USER_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE) + void updateProfile(@PathVariable(USER_ID) String userId, @RequestBody UpdateProfileRequest updateProfileRequest); + + + @ResponseBody + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @Operation(summary = "Update your own user-profile.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK"), @ApiResponse(responseCode = "400", description = "Failed to update profile, e-mail cannot be empty")}) + @PostMapping(value = UPDATE_MY_USER_PROFILE_PATH, consumes = MediaType.APPLICATION_JSON_VALUE) + void updateMyProfile(@RequestBody UpdateMyProfileRequest updateProfileRequest); + + + @ResponseBody + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @Operation(summary = "Deletes given user", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK"), @ApiResponse(responseCode = "405", description = "Operation is not allowed."), @ApiResponse(responseCode = "409", description = "Conflict while deleting user.")}) + @DeleteMapping(value = USER_REST_PATH + USER_ID_PATH_VARIABLE) + void deleteUser(@PathVariable(USER_ID) String userId); + + + @ResponseBody + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @Operation(summary = "Deletes given users", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK"), @ApiResponse(responseCode = "405", description = "Operation is not allowed."), @ApiResponse(responseCode = "409", description = "Conflict while deleting user.")}) + @DeleteMapping(value = USER_REST_PATH) + void deleteUsers(@RequestParam(USER_ID) List userIds); + + + @ResponseBody + @Operation(summary = "Create a new user.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "400", description = "Invalid Data."), @ApiResponse(responseCode = "409", description = "User already exists.")}) + @PostMapping(value = USER_REST_PATH, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + User createUser(@RequestBody CreateUserRequest user); + + + @ResponseBody + @Operation(summary = "Gets the user in realm with information of roles.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "The " + "userId can not be found."), @ApiResponse(responseCode = "400", description = "The provided user id is empty or " + "null.")}) + @GetMapping(value = USER_REST_PATH + USER_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) + User getUserById(@PathVariable(USER_ID) String userId); + + + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @Operation(summary = "Add a role to users", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "No Content"), @ApiResponse(responseCode = "404", description = "The provided userId can not be found."), @ApiResponse(responseCode = "400", description = "One ore more roles are not valid.")}) + @PostMapping(value = USER_ROLE_REST_PATH, consumes = MediaType.APPLICATION_JSON_VALUE) + void setRoles(@PathVariable(USER_ID) String userId, @RequestBody List roles); + + + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @Operation(summary = "Reset a user's password", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "No Content"), @ApiResponse(responseCode = "404", description = "The provided userId can not be found.")}) + @PostMapping(value = RESET_PASSWORD_PATH, consumes = MediaType.APPLICATION_JSON_VALUE) + void resetPassword(@PathVariable(USER_ID) String userId, @RequestBody ResetPasswordRequest resetPasswordRequest); + + + @ResponseBody + @Operation(summary = "Activate/ deactivate a user-profile.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "400", description = "Failed to activate/deactivate profile")}) + @PostMapping(value = ACTIVATE_USER_PROFILE_PATH + USER_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) + User activateProfile(@PathVariable(USER_ID) String userId, @RequestParam(IS_ACTIVE_PARAM) boolean isActive); + +} diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/VersionsResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/VersionsResource.java new file mode 100644 index 000000000..5d26da122 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/VersionsResource.java @@ -0,0 +1,40 @@ +package com.iqser.red.service.persistence.service.v1.api.external.resource; + +import java.util.List; +import java.util.Map; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseStatus; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.VersionsResponse; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; + +@ResponseStatus(value = HttpStatus.OK) +public interface VersionsResource { + + String VERSION_REST_PATH = ExternalApi.BASE_PATH + "/version"; + String DOSSIER_TEMPLATE_PARAMETER_NAME = "dossierTemplateId"; + String DOSSIER_TEMPLATE_PATH_PARAM = "/{" + DOSSIER_TEMPLATE_PARAMETER_NAME + "}"; + + String DOSSIER_REST_PATH = "/dossier"; + String DOSSIER_ID_PARAM = "dossierId"; + String DOSSIER_ID_PATH_PARAM = "/{" + DOSSIER_ID_PARAM + "}"; + + + @GetMapping(value = VERSION_REST_PATH) + @Operation(summary = "Retrieves current versions.", description = "None") + @ApiResponse(responseCode = "200", description = "Successfully retrieved versions.") + Map getVersions(@RequestParam(DOSSIER_TEMPLATE_PARAMETER_NAME) List dossierTemplateIds); + + + @GetMapping(value = VERSION_REST_PATH + DOSSIER_REST_PATH + DOSSIER_TEMPLATE_PATH_PARAM + DOSSIER_ID_PATH_PARAM) + @Operation(summary = "Retrieves current version for dossier dictionary.", description = "None") + @ApiResponse(responseCode = "200", description = "Successfully retrieved versions.") + Long getDossierDictionaryVersion(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, @PathVariable(DOSSIER_ID_PARAM) String dossierId); + +} diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/ViewedPagesResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/ViewedPagesResource.java new file mode 100644 index 000000000..5cec12a04 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/ViewedPagesResource.java @@ -0,0 +1,53 @@ +package com.iqser.red.service.persistence.service.v1.api.external.resource; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.ViewedPages; +import com.iqser.red.service.persistence.service.v1.api.shared.model.ViewedPagesRequest; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; + +public interface ViewedPagesResource { + + String REST_PATH = ExternalApi.BASE_PATH + "/viewedPages"; + + String DOSSIER_ID = "dossierId"; + String DOSSIER_ID_PATH_VARIABLE = "/{" + DOSSIER_ID + "}"; + + String FILE_ID = "fileId"; + String FILE_ID_PATH_VARIABLE = "/{" + FILE_ID + "}"; + + String PAGE = "page"; + String PAGE_PATH_VARIABLE = "/{" + PAGE + "}"; + + + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @Operation(summary = "Adds a page to the viewed pages", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK"), @ApiResponse(responseCode = "404", description = "Not found"), @ApiResponse(responseCode = "400", description = "Invalid file status."), @ApiResponse(responseCode = "403", description = "Forbidden.")}) + @PostMapping(value = REST_PATH + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE) + void addPage(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody ViewedPagesRequest viewedPagesRequest); + + + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @Operation(summary = "Removes a page to the viewed pages", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK"), @ApiResponse(responseCode = "404", description = "Not found"), @ApiResponse(responseCode = "400", description = "Invalid file status."), @ApiResponse(responseCode = "403", description = "Forbidden.")}) + @DeleteMapping(value = REST_PATH + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE + PAGE_PATH_VARIABLE) + void removePage(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @PathVariable(PAGE) int page); + + + @ResponseStatus(value = HttpStatus.OK) + @Operation(summary = "Gets the viewed pages for a file, depending on the users role.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not found"), @ApiResponse(responseCode = "400", description = "Invalid file status."), @ApiResponse(responseCode = "403", description = "Forbidden.")}) + @GetMapping(value = REST_PATH + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) + ViewedPages getViewedPages(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId); + +} diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/WatermarkResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/WatermarkResource.java new file mode 100644 index 000000000..582e97882 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/WatermarkResource.java @@ -0,0 +1,66 @@ +package com.iqser.red.service.persistence.service.v1.api.external.resource; + +import java.util.List; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseStatus; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.WatermarkModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; + +@ResponseStatus(value = HttpStatus.OK) +public interface WatermarkResource { + + String WATERMARK_PATH = ExternalApi.BASE_PATH + "/watermark"; + String CHECK_USED_REST_PATH = "/used"; + String WATERMARK_ID_PARAMETER_NAME = "watermarkId"; + String WATERMARK_ID_PATH_VARIABLE = "/{" + WATERMARK_ID_PARAMETER_NAME + "}"; + String DOSSIER_TEMPLATE_ID_PARAMETER_NAME = "dossierTemplateId"; + + + @Operation(summary = "Save/Update watermark configuration", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "400", description = "Invalid Watermark Data."), @ApiResponse(responseCode = "403", description = "Forbidden.")}) + @ResponseStatus(HttpStatus.OK) + @PostMapping(value = WATERMARK_PATH, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + WatermarkModel saveWatermark(@RequestBody WatermarkModel watermark); + + + @Operation(summary = "Get a specific watermark configuration", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "403", description = "Forbidden.")}) + + @GetMapping(value = WATERMARK_PATH + WATERMARK_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) + WatermarkModel getWatermark(@PathVariable(WATERMARK_ID_PARAMETER_NAME) long watermarkId); + + + @Operation(summary = "Get watermarks for a dossierTemplateId", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "403", description = "Forbidden.")}) + @GetMapping(value = WATERMARK_PATH, produces = MediaType.APPLICATION_JSON_VALUE) + List getWatermarksForDossierTemplateId(@RequestParam(DOSSIER_TEMPLATE_ID_PARAMETER_NAME) String dossierTemplateId); + + + @Operation(summary = "Remove watermark configuration", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK"), @ApiResponse(responseCode = "403", description = "Forbidden.")}) + + @ResponseStatus(HttpStatus.NO_CONTENT) + @DeleteMapping(value = WATERMARK_PATH + WATERMARK_ID_PATH_VARIABLE) + void deleteWatermark(@PathVariable(WATERMARK_ID_PARAMETER_NAME) long watermarkId); + + + @Operation(summary = "Check if a specific watermark configuration is in use", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "403", description = "Forbidden.")}) + + @GetMapping(value = WATERMARK_PATH + CHECK_USED_REST_PATH, produces = MediaType.APPLICATION_JSON_VALUE) + JSONPrimitive isWatermarkUsed(@RequestParam(WATERMARK_ID_PARAMETER_NAME) long watermarkId); + +} diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/test/java/com/iqser/red/service/persistence/service/v1/api/external/IdentityTest.java b/persistence-service-v1/persistence-service-external-api-v1/src/test/java/com/iqser/red/service/persistence/service/v1/api/external/IdentityTest.java new file mode 100644 index 000000000..5e10d91f8 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-v1/src/test/java/com/iqser/red/service/persistence/service/v1/api/external/IdentityTest.java @@ -0,0 +1,16 @@ +package com.iqser.red.service.persistence.service.v1.api.external; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.Test; + +public class IdentityTest { + + @Test + public void mockTest() { + + int i = 1; + assertThat(i).isEqualTo(1); + } + +} diff --git a/persistence-service-v1/persistence-service-internal-api-impl-v1/pom.xml b/persistence-service-v1/persistence-service-internal-api-impl-v1/pom.xml new file mode 100644 index 000000000..e35506d0d --- /dev/null +++ b/persistence-service-v1/persistence-service-internal-api-impl-v1/pom.xml @@ -0,0 +1,28 @@ + + + + + persistence-service-v1 + com.iqser.red.service + 1.0-SNAPSHOT + + + 4.0.0 + + persistence-service-internal-api-impl-v1 + + 1.7.30 + UTF-8 + + + + + com.iqser.red.service + persistence-service-processor-v1 + ${project.version} + + + + diff --git a/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/PersistenceServiceInternalApiConfiguration.java b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/PersistenceServiceInternalApiConfiguration.java new file mode 100644 index 000000000..669efed6a --- /dev/null +++ b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/PersistenceServiceInternalApiConfiguration.java @@ -0,0 +1,10 @@ +package com.iqser.red.service.persistence.v1.internal.api; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ComponentScan +public class PersistenceServiceInternalApiConfiguration { + +} diff --git a/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/DictionaryInternalController.java b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/DictionaryInternalController.java new file mode 100644 index 000000000..d04e6a4b3 --- /dev/null +++ b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/DictionaryInternalController.java @@ -0,0 +1,81 @@ +package com.iqser.red.service.persistence.v1.internal.api.controller; + +import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; + +import java.util.List; + +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.iqser.red.service.persistence.management.v1.processor.service.ColorsService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DictionaryPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.EntryPersistenceService; +import com.iqser.red.service.persistence.service.v1.api.internal.resources.DictionaryResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.Colors; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionaryEntry; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionaryEntryType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.Type; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@RestController +@RequiredArgsConstructor +@Slf4j +public class DictionaryInternalController implements DictionaryResource { + + private final EntryPersistenceService entryPersistenceService; + private final DictionaryPersistenceService dictionaryPersistenceService; + private final ColorsService colorsService; + + + @Override + public List getAllTypesForDossierTemplate(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, + @RequestParam(value = INCLUDE_DELETED_PARAMETER_NAME, required = false, defaultValue = "false") boolean includeDeleted) { + + return convert(dictionaryPersistenceService.getAllTypesForDossierTemplate(dossierTemplateId, includeDeleted), Type.class); + } + + + @Override + public List getAllTypesForDossier(@PathVariable(DOSSIER_ID_PARAMETER_NAME) String dossierId, + @RequestParam(value = INCLUDE_DELETED_PARAMETER_NAME, required = false, defaultValue = "false") boolean includeDeleted) { + + return convert(dictionaryPersistenceService.getAllTypesForDossier(dossierId, includeDeleted), Type.class); + } + + + @Override + public Type getDictionaryForType(@PathVariable(TYPE_PARAMETER_NAME) String typeId, @RequestParam(value = FROM_VERSION_PARAM, required = false) Long fromVersion) { + + var entity = dictionaryPersistenceService.getType(typeId); + var target = convert(entity, Type.class); + target.setEntries(convert(entryPersistenceService.getEntries(typeId, DictionaryEntryType.ENTRY, fromVersion), DictionaryEntry.class)); + target.setFalsePositiveEntries(convert(entryPersistenceService.getEntries(typeId, DictionaryEntryType.FALSE_POSITIVE, fromVersion), DictionaryEntry.class)); + target.setFalseRecommendationEntries(convert(entryPersistenceService.getEntries(typeId, DictionaryEntryType.FALSE_RECOMMENDATION, fromVersion), DictionaryEntry.class)); + return target; + } + + + @Override + public long getVersion(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId) { + + return dictionaryPersistenceService.getVersion(dossierTemplateId); + } + + + @Override + public long getVersionForDossier(@PathVariable(DOSSIER_ID_PARAMETER_NAME) String dossierId) { + + return dictionaryPersistenceService.getVersionForDossier(dossierId); + } + + + @Override + public Colors getColors(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId) { + + return convert(colorsService.getColors(dossierTemplateId), Colors.class); + } + +} diff --git a/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/DigitalSignatureInternalController.java b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/DigitalSignatureInternalController.java new file mode 100644 index 000000000..29219acee --- /dev/null +++ b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/DigitalSignatureInternalController.java @@ -0,0 +1,49 @@ +package com.iqser.red.service.persistence.v1.internal.api.controller; + +import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; + +import org.springframework.web.bind.annotation.RestController; + +import com.iqser.red.service.persistence.management.v1.processor.service.DigitalSignatureKmsService; +import com.iqser.red.service.persistence.management.v1.processor.service.DigitalSignatureService; +import com.iqser.red.service.persistence.management.v1.processor.service.DigitalSignatureTypeService; +import com.iqser.red.service.persistence.service.v1.api.internal.resources.DigitalSignatureResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DigitalSignatureKms; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.DigitalSignature; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.DigitalSignatureType; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RestController +@RequiredArgsConstructor +public class DigitalSignatureInternalController implements DigitalSignatureResource { + + private final DigitalSignatureTypeService digitalSignatureTypeService; + private final DigitalSignatureService digitalSignatureService; + private final DigitalSignatureKmsService digitalSignatureKmsService; + + + @Override + public DigitalSignatureType getActiveDigitalSignatureType() { + + return digitalSignatureTypeService.getActiveDigitalSignatureType(); + + } + + + @Override + public DigitalSignature getDigitalSignature() { + + return convert(digitalSignatureService.getDigitalSignature(), DigitalSignature.class); + } + + + @Override + public DigitalSignatureKms getDigitalSignatureKms() { + + return convert(digitalSignatureKmsService.getDigitalSignature(), DigitalSignatureKms.class); + } + +} diff --git a/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/DossierAttributesConfigInternalController.java b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/DossierAttributesConfigInternalController.java new file mode 100644 index 000000000..640fdd427 --- /dev/null +++ b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/DossierAttributesConfigInternalController.java @@ -0,0 +1,33 @@ +package com.iqser.red.service.persistence.v1.internal.api.controller; + +import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; + +import java.util.List; + +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierAttributeConfigEntity; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierAttributeConfigPersistenceService; +import com.iqser.red.service.persistence.service.v1.api.internal.resources.DossierAttributesConfigResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierAttributeConfig; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RestController +@RequiredArgsConstructor +public class DossierAttributesConfigInternalController implements DossierAttributesConfigResource { + + private final DossierAttributeConfigPersistenceService dossierAttributeConfigPersistenceService; + + + @Override + public List getDossierAttributes(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId) { + + return convert(dossierAttributeConfigPersistenceService.getDossierAttributes(dossierTemplateId), DossierAttributeConfig.class); + } + +} diff --git a/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/DossierAttributesInternalController.java b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/DossierAttributesInternalController.java new file mode 100644 index 000000000..8c98167aa --- /dev/null +++ b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/DossierAttributesInternalController.java @@ -0,0 +1,30 @@ +package com.iqser.red.service.persistence.v1.internal.api.controller; + +import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; + +import java.util.List; + +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierAttributePersistenceService; +import com.iqser.red.service.persistence.service.v1.api.internal.resources.DossierAttributesResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.DossierAttribute; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequiredArgsConstructor +public class DossierAttributesInternalController implements DossierAttributesResource { + + private final DossierAttributePersistenceService dossierAttributePersistenceService; + + + @Override + public List getDossierAttributes(@PathVariable(DOSSIER_ID_PARAM) String dossierId) { + + return convert(dossierAttributePersistenceService.getDossierAttributes(dossierId), DossierAttribute.class); + } + +} + diff --git a/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/DossierInternalController.java b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/DossierInternalController.java new file mode 100644 index 000000000..1788dba2d --- /dev/null +++ b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/DossierInternalController.java @@ -0,0 +1,45 @@ +package com.iqser.red.service.persistence.v1.internal.api.controller; + +import java.util.List; + +import javax.transaction.Transactional; + +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.iqser.red.service.persistence.management.v1.processor.service.DossierManagementService; +import com.iqser.red.service.persistence.service.v1.api.internal.resources.DossierResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.Dossier; + +import feign.Param; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RestController +@RequiredArgsConstructor +public class DossierInternalController implements DossierResource { + + private final DossierManagementService dossierManagementService; + + + @Override + @Transactional + public List getAllDossiers(@RequestParam(name = INCLUDE_ARCHIVED_PARAM, defaultValue = "false", required = false) boolean includeArchived, + @RequestParam(name = INCLUDE_DELETED_PARAM, defaultValue = "false", required = false) boolean includeDeleted) { + + return dossierManagementService.getAllDossiers(includeArchived, includeDeleted); + } + + + @Override + @Transactional + public Dossier getDossierById(@Param(DOSSIER_ID_PARAM) @PathVariable(DOSSIER_ID_PARAM) String dossierId, + @RequestParam(name = INCLUDE_ARCHIVED_PARAM, defaultValue = "false", required = false) boolean includeArchived, + @RequestParam(name = INCLUDE_DELETED_PARAM, defaultValue = "false", required = false) boolean includeDeleted) { + + return dossierManagementService.getDossierById(dossierId, includeArchived, includeDeleted); + } + +} diff --git a/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/DossierTemplateInternalController.java b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/DossierTemplateInternalController.java new file mode 100644 index 000000000..e38ae4f5a --- /dev/null +++ b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/DossierTemplateInternalController.java @@ -0,0 +1,33 @@ +package com.iqser.red.service.persistence.v1.internal.api.controller; + +import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; + +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import com.iqser.red.service.persistence.management.v1.processor.service.DossierTemplateImportService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierTemplatePersistenceService; +import com.iqser.red.service.persistence.service.v1.api.internal.resources.DossierTemplateResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierTemplate; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.importexport.ImportDossierTemplateRequest; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RestController +@RequiredArgsConstructor +public class DossierTemplateInternalController implements DossierTemplateResource { + + private final DossierTemplateImportService dossierTemplateImportService; + private final DossierTemplatePersistenceService dossierTemplatePersistenceService; + + + @Override + public DossierTemplate importDossierTemplate(@RequestBody ImportDossierTemplateRequest request) { + + String dossierTemplateId = dossierTemplateImportService.importDossierTemplate(request); + return convert(dossierTemplatePersistenceService.getDossierTemplate(dossierTemplateId), DossierTemplate.class); + } + +} diff --git a/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/FileAttributesConfigInternalController.java b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/FileAttributesConfigInternalController.java new file mode 100644 index 000000000..79c5cc3dc --- /dev/null +++ b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/FileAttributesConfigInternalController.java @@ -0,0 +1,31 @@ +package com.iqser.red.service.persistence.v1.internal.api.controller; + +import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; + +import java.util.List; + +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileAttributeConfigPersistenceService; +import com.iqser.red.service.persistence.service.v1.api.internal.resources.FileAttributesConfigResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileAttributeConfig; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RestController +@RequiredArgsConstructor +public class FileAttributesConfigInternalController implements FileAttributesConfigResource { + + private final FileAttributeConfigPersistenceService fileAttributeConfigPersistenceService; + + + @Override + public List getFileAttributeConfigs(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId) { + + return convert(fileAttributeConfigPersistenceService.getFileAttributes(dossierTemplateId), FileAttributeConfig.class); + } + +} diff --git a/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/FileStatusInternalController.java b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/FileStatusInternalController.java new file mode 100644 index 000000000..08e12ea47 --- /dev/null +++ b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/FileStatusInternalController.java @@ -0,0 +1,46 @@ +package com.iqser.red.service.persistence.v1.internal.api.controller; + +import java.util.List; +import java.util.stream.Collectors; + +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusService; +import com.iqser.red.service.persistence.service.v1.api.internal.resources.StatusResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileModel; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequiredArgsConstructor +public class FileStatusInternalController implements StatusResource { + + private final FileStatusService fileStatusService; + + + @Override + public List getDossierStatus(@PathVariable(DOSSIER_ID_PARAM) String dossierId) { + + return fileStatusService.getDossierStatus(dossierId).stream().filter(f -> !f.isSoftOrHardDeleted()).collect(Collectors.toList()); + } + + + @Override + public List getSoftDeletedDossierStatus(@PathVariable(DOSSIER_ID_PARAM) String dossierId) { + + return fileStatusService.getDossierStatus(dossierId) + .stream() + .filter(f3 -> f3.getDeleted() != null && f3.getHardDeletedTime() == null) + .sorted((f11, f21) -> f21.getDeleted().compareTo(f11.getDeleted())) + .collect(Collectors.toList()); + } + + + @Override + public FileModel getFileStatus(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId) { + + return fileStatusService.getStatus(fileId); + } + +} diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/FileStatusProcessingUpdateController.java b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/FileStatusProcessingUpdateInternalController.java similarity index 83% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/FileStatusProcessingUpdateController.java rename to persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/FileStatusProcessingUpdateInternalController.java index 5c7ce8d3a..59c917419 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/FileStatusProcessingUpdateController.java +++ b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/FileStatusProcessingUpdateInternalController.java @@ -1,13 +1,13 @@ -package com.iqser.red.service.peristence.v1.server.controller; +package com.iqser.red.service.persistence.v1.internal.api.controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; -import com.iqser.red.service.pdftron.redaction.v1.api.model.UntouchedDocumentResponse; -import com.iqser.red.service.peristence.v1.server.service.FileStatusProcessingUpdateService; -import com.iqser.red.service.persistence.service.v1.api.resources.FileStatusProcessingUpdateResource; -import com.iqser.red.service.redaction.v1.model.AnalyzeResult; +import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusProcessingUpdateService; +import com.iqser.red.service.persistence.service.v1.api.internal.resources.FileStatusProcessingUpdateResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.AnalyzeResult; +import com.iqser.red.service.persistence.service.v1.api.shared.model.UntouchedDocumentResponse; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -15,7 +15,7 @@ import lombok.extern.slf4j.Slf4j; @Slf4j @RestController @RequiredArgsConstructor -public class FileStatusProcessingUpdateController implements FileStatusProcessingUpdateResource { +public class FileStatusProcessingUpdateInternalController implements FileStatusProcessingUpdateResource { private final FileStatusProcessingUpdateService fileStatusProcessingUpdateService; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/IndexInformationController.java b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/IndexInformationInternalController.java similarity index 55% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/IndexInformationController.java rename to persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/IndexInformationInternalController.java index 94202fd58..2a36cc066 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/IndexInformationController.java +++ b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/IndexInformationInternalController.java @@ -1,20 +1,19 @@ -package com.iqser.red.service.peristence.v1.server.controller; - -import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; +package com.iqser.red.service.persistence.v1.internal.api.controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import com.iqser.red.service.persistence.management.v1.processor.entity.index.IndexInformationEntity; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.IndexInformationPersistenceService; -import com.iqser.red.service.persistence.service.v1.api.model.index.IndexInformation; -import com.iqser.red.service.persistence.service.v1.api.resources.IndexInformationResource; +import com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter; +import com.iqser.red.service.persistence.service.v1.api.internal.resources.IndexInformationResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.index.IndexInformation; import lombok.RequiredArgsConstructor; @RestController @RequiredArgsConstructor -public class IndexInformationController implements IndexInformationResource { +public class IndexInformationInternalController implements IndexInformationResource { private final IndexInformationPersistenceService indexInformationPersistenceService; @@ -22,14 +21,14 @@ public class IndexInformationController implements IndexInformationResource { @Override public IndexInformation getIndexInformation() { - return convert(indexInformationPersistenceService.getIndexInformation(), IndexInformation.class); + return MagicConverter.convert(indexInformationPersistenceService.getIndexInformation(), IndexInformation.class); } @Override public void updateIndexInformation(@RequestBody IndexInformation indexInformation) { - indexInformationPersistenceService.updateIndexInformation(convert(indexInformation, IndexInformationEntity.class)); + indexInformationPersistenceService.updateIndexInformation(MagicConverter.convert(indexInformation, IndexInformationEntity.class)); } } diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ControllerAdvice.java b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/InternalControllerAdvice.java similarity index 95% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ControllerAdvice.java rename to persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/InternalControllerAdvice.java index 84aff9367..fc0fde898 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ControllerAdvice.java +++ b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/InternalControllerAdvice.java @@ -1,8 +1,7 @@ -package com.iqser.red.service.peristence.v1.server.controller; +package com.iqser.red.service.persistence.v1.internal.api.controller; import java.sql.SQLException; import java.time.OffsetDateTime; -import java.util.List; import java.util.stream.Collectors; import org.springframework.http.HttpStatus; @@ -14,17 +13,17 @@ import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestControllerAdvice; import com.iqser.red.commons.spring.ErrorMessage; -import com.iqser.red.service.peristence.v1.server.exception.InvalidRulesException; import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; import com.iqser.red.service.persistence.management.v1.processor.exception.ConflictException; import com.iqser.red.service.persistence.management.v1.processor.exception.DossierNotFoundException; +import com.iqser.red.service.persistence.management.v1.processor.exception.InvalidRulesException; import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; import lombok.extern.slf4j.Slf4j; @Slf4j @RestControllerAdvice -public class ControllerAdvice { +public class InternalControllerAdvice { /* error handling */ @@ -90,7 +89,7 @@ public class ControllerAdvice { if (e.getMessage().contains("violates unique constraint")) { return new ResponseEntity<>(new ErrorMessage(OffsetDateTime.now(), "Unique constraint violation"), HttpStatus.CONFLICT); - } else if (e.getMessage().contains("No suitable driver found")){ + } else if (e.getMessage().contains("No suitable driver found")) { return new ResponseEntity<>(new ErrorMessage(OffsetDateTime.now(), "JDBC URL is incorrect"), HttpStatus.BAD_REQUEST); } else { log.error("PLSQL Exception occurred: {}", e.getMessage(), e); @@ -103,6 +102,7 @@ public class ControllerAdvice { @ResponseStatus(value = HttpStatus.BAD_REQUEST) @ExceptionHandler(value = MethodArgumentNotValidException.class) public ErrorMessage handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { + var errorList = e.getFieldErrors(); String errorListAsString = errorList.stream().map(fieldError -> fieldError.getField() + ": " + fieldError.getDefaultMessage()).collect(Collectors.joining(", ")); return new ErrorMessage(OffsetDateTime.now(), String.format("You have empty/wrong formatted parameters: %s", errorListAsString)); diff --git a/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/LegalBasisMappingInternalController.java b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/LegalBasisMappingInternalController.java new file mode 100644 index 000000000..0d0b43cf2 --- /dev/null +++ b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/LegalBasisMappingInternalController.java @@ -0,0 +1,39 @@ +package com.iqser.red.service.persistence.v1.internal.api.controller; + +import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; + +import java.util.List; + +import javax.transaction.Transactional; + +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.LegalBasisMappingPersistenceService; +import com.iqser.red.service.persistence.service.v1.api.internal.resources.LegalBasisMappingResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.legalbasis.LegalBasis; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequiredArgsConstructor +public class LegalBasisMappingInternalController implements LegalBasisMappingResource { + + private final LegalBasisMappingPersistenceService legalBasisMappingPersistenceService; + + + @Override + @Transactional + public List getLegalBasisMapping(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId) { + + return convert(legalBasisMappingPersistenceService.getLegalBasisMapping(dossierTemplateId), LegalBasis.class); + } + + + @Override + public long getVersion(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId) { + + return legalBasisMappingPersistenceService.getVersion(dossierTemplateId); + } + +} diff --git a/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/RedactionLogInternalController.java b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/RedactionLogInternalController.java new file mode 100644 index 000000000..878daa64a --- /dev/null +++ b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/RedactionLogInternalController.java @@ -0,0 +1,31 @@ +package com.iqser.red.service.persistence.v1.internal.api.controller; + +import java.util.List; + +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.iqser.red.service.persistence.management.v1.processor.service.RedactionLogService; +import com.iqser.red.service.persistence.service.v1.api.internal.resources.RedactionLogResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLog; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequiredArgsConstructor +public class RedactionLogInternalController implements RedactionLogResource { + + private final RedactionLogService redactionLogService; + + + public RedactionLog getRedactionLog(@PathVariable(DOSSIER_ID_PARAM) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestParam(value = "excludedType", required = false) List excludedTypes, + @RequestParam(value = "withManualRedactions", required = false, defaultValue = "true") boolean withManualRedactions, + @RequestParam(value = "includeFalsePositives", required = false, defaultValue = "false") boolean includeFalsePositives) { + + return redactionLogService.getRedactionLog(dossierId, fileId, excludedTypes, withManualRedactions, includeFalsePositives); + } + +} diff --git a/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/ReportTemplateInternalController.java b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/ReportTemplateInternalController.java new file mode 100644 index 000000000..9cfdab435 --- /dev/null +++ b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/ReportTemplateInternalController.java @@ -0,0 +1,34 @@ +package com.iqser.red.service.persistence.v1.internal.api.controller; + +import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; + +import java.util.List; + +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.ReportTemplatePersistenceService; +import com.iqser.red.service.persistence.service.v1.api.internal.resources.ReportTemplateResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.ReportTemplate; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequiredArgsConstructor +public class ReportTemplateInternalController implements ReportTemplateResource { + + private final ReportTemplatePersistenceService reportTemplatePersistenceService; + + + public List getAvailableReportTemplates(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId) { + + return convert(reportTemplatePersistenceService.findByDossierTemplateId(dossierTemplateId), ReportTemplate.class); + } + + + public ReportTemplate getReportTemplate(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, @PathVariable(TEMPLATE_ID) String templateId) { + + return convert(reportTemplatePersistenceService.find(templateId), ReportTemplate.class); + } + +} diff --git a/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/RulesInternalController.java b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/RulesInternalController.java new file mode 100644 index 000000000..b9bc958f6 --- /dev/null +++ b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/RulesInternalController.java @@ -0,0 +1,37 @@ +package com.iqser.red.service.persistence.v1.internal.api.controller; + +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.RulesPersistenceService; +import com.iqser.red.service.persistence.service.v1.api.internal.resources.RulesResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequiredArgsConstructor +public class RulesInternalController implements RulesResource { + + private final RulesPersistenceService rulesPersistenceService; + + + @Override + public JSONPrimitive getRules(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId) { + + return new JSONPrimitive<>(rulesPersistenceService.getRules(dossierTemplateId).getValue()); + } + + + @Override + public long getVersion(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId) { + + try { + return rulesPersistenceService.getRules(dossierTemplateId).getVersion(); + } catch (NotFoundException e) { + return 0; + } + } + +} diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/TenantsController.java b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/TenantsInternalController.java similarity index 64% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/TenantsController.java rename to persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/TenantsInternalController.java index 0610c6f34..ec78bf150 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/TenantsController.java +++ b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/TenantsInternalController.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.controller; +package com.iqser.red.service.persistence.v1.internal.api.controller; import java.util.List; @@ -8,19 +8,19 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; -import com.iqser.red.service.peristence.v1.server.service.DeploymentKeyService; -import com.iqser.red.service.peristence.v1.server.service.TenantManagementService; import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; -import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive; -import com.iqser.red.service.persistence.service.v1.api.model.multitenancy.TenantRequest; -import com.iqser.red.service.persistence.service.v1.api.model.multitenancy.TenantResponse; -import com.iqser.red.service.persistence.service.v1.api.resources.TenantsResource; +import com.iqser.red.service.persistence.management.v1.processor.service.DeploymentKeyService; +import com.iqser.red.service.persistence.management.v1.processor.service.TenantManagementService; +import com.iqser.red.service.persistence.service.v1.api.internal.resources.TenantsResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; +import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.TenantRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.TenantResponse; import lombok.RequiredArgsConstructor; @RestController @RequiredArgsConstructor -public class TenantsController implements TenantsResource { +public class TenantsInternalController implements TenantsResource { private final TenantManagementService tenantManagementService; private final DeploymentKeyService deploymentKeyService; @@ -53,4 +53,4 @@ public class TenantsController implements TenantsResource { return JSONPrimitive.of(deploymentKeyService.getDeploymentKey(tenantId)); } -} \ No newline at end of file +} diff --git a/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/WatermarkInternalController.java b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/WatermarkInternalController.java new file mode 100644 index 000000000..19ad0fb4f --- /dev/null +++ b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/WatermarkInternalController.java @@ -0,0 +1,26 @@ +package com.iqser.red.service.persistence.v1.internal.api.controller; + +import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; + +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +import com.iqser.red.service.persistence.management.v1.processor.service.WatermarkService; +import com.iqser.red.service.persistence.service.v1.api.internal.resources.WatermarkResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.WatermarkModel; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequiredArgsConstructor +public class WatermarkInternalController implements WatermarkResource { + + private final WatermarkService watermarkService; + + + public WatermarkModel getWatermark(@PathVariable(WATERMARK_ID_PARAMETER_NAME) long watermarkId) { + + return convert(watermarkService.getWatermark(watermarkId), WatermarkModel.class); + } + +} diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/internal/AdminInterfaceController.java b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/internal/AdminInterfaceController.java similarity index 87% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/internal/AdminInterfaceController.java rename to persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/internal/AdminInterfaceController.java index 04bfdf9e1..f2d2190ee 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/internal/AdminInterfaceController.java +++ b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/internal/AdminInterfaceController.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.internal; +package com.iqser.red.service.persistence.v1.internal.api.controller.internal; import java.util.stream.Collectors; @@ -8,12 +8,13 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import com.iqser.red.service.peristence.v1.server.service.DossierService; -import com.iqser.red.service.peristence.v1.server.service.FileManagementStorageService; -import com.iqser.red.service.peristence.v1.server.service.FileStatusService; -import com.iqser.red.service.peristence.v1.server.settings.FileManagementServiceSettings; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileType; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus; +import com.iqser.red.service.persistence.management.v1.processor.service.DossierService; +import com.iqser.red.service.persistence.management.v1.processor.service.FileManagementStorageService; +import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusService; +import com.iqser.red.service.persistence.management.v1.processor.settings.FileManagementServiceSettings; +import com.iqser.red.service.persistence.service.v1.api.internal.resources.InternalApi; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -21,7 +22,7 @@ import lombok.extern.slf4j.Slf4j; @Slf4j @RestController @RequiredArgsConstructor -@RequestMapping("/private/admin") +@RequestMapping(InternalApi.BASE_PATH+"/admin") public class AdminInterfaceController { private final FileManagementStorageService fileManagementStorageService; diff --git a/persistence-service-v1/persistence-service-internal-api-impl-v1/src/test/java/com/iqser/red/service/persistence/v1/internal/api/IdentityTest.java b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/test/java/com/iqser/red/service/persistence/v1/internal/api/IdentityTest.java new file mode 100644 index 000000000..f197ed5f6 --- /dev/null +++ b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/test/java/com/iqser/red/service/persistence/v1/internal/api/IdentityTest.java @@ -0,0 +1,16 @@ +package com.iqser.red.service.persistence.v1.internal.api; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.Test; + +public class IdentityTest { + + @Test + public void mockTest() { + + int i = 1; + assertThat(i).isEqualTo(1); + } + +} diff --git a/persistence-service-v1/persistence-service-internal-api-v1/pom.xml b/persistence-service-v1/persistence-service-internal-api-v1/pom.xml new file mode 100644 index 000000000..8e63de089 --- /dev/null +++ b/persistence-service-v1/persistence-service-internal-api-v1/pom.xml @@ -0,0 +1,60 @@ + + + + + persistence-service-v1 + com.iqser.red.service + 1.0-SNAPSHOT + + + 4.0.0 + + persistence-service-internal-api-v1 + + + + + + + io.github.openfeign + feign-core + true + + + + org.springdoc + springdoc-openapi-ui + provided + + + + + org.springframework.boot + spring-boot-starter-web + compile + + + org.springframework.boot + spring-boot-starter-validation + compile + + + + + + com.iqser.red.commons + jackson-commons + + + com.iqser.red.service + persistence-service-shared-api-v1 + 1.0-SNAPSHOT + compile + + + + + + diff --git a/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/DictionaryResource.java b/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/DictionaryResource.java new file mode 100644 index 000000000..0e155a892 --- /dev/null +++ b/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/DictionaryResource.java @@ -0,0 +1,65 @@ +package com.iqser.red.service.persistence.service.v1.api.internal.resources; + +import java.util.List; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.Colors; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.Type; + +@ResponseStatus(value = HttpStatus.OK) +public interface DictionaryResource { + + String DICTIONARY_PATH = "/dictionary"; + String TYPE_PATH = DICTIONARY_PATH + "/type"; + + String TYPE_PARAMETER_NAME = "type"; + String TYPE_PATH_VARIABLE = "/{" + TYPE_PARAMETER_NAME + "}"; + + String INCLUDE_DELETED_PARAMETER_NAME = "includeDeleted"; + String DOSSIER_TEMPLATE_PARAMETER_NAME = "dossierTemplateId"; + String DOSSIER_TEMPLATE_PATH_VARIABLE = "/{" + DOSSIER_TEMPLATE_PARAMETER_NAME + "}"; + + String DOSSIER_ID_PARAMETER_NAME = "dossierId"; + String DOSSIER_PATH = "/dossier"; + String DOSSIER_ID_PATH_VARIABLE = "/{" + DOSSIER_ID_PARAMETER_NAME + "}"; + + String FROM_VERSION_PARAM = "fromVersion"; + + String COLOR_PATH = "/color"; + String VERSION_PATH = "/version"; + + + @GetMapping(value = InternalApi.BASE_PATH+TYPE_PATH + DOSSIER_TEMPLATE_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) + List getAllTypesForDossierTemplate(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, + @RequestParam(value = INCLUDE_DELETED_PARAMETER_NAME, required = false, defaultValue = "false") boolean includeDeleted); + + + @GetMapping(value = InternalApi.BASE_PATH+TYPE_PATH + DOSSIER_PATH + DOSSIER_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) + List getAllTypesForDossier(@PathVariable(DOSSIER_ID_PARAMETER_NAME) String dossierId, + @RequestParam(value = INCLUDE_DELETED_PARAMETER_NAME, required = false, defaultValue = "false") boolean includeDeleted); + + + @GetMapping(value = InternalApi.BASE_PATH+DICTIONARY_PATH + TYPE_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) + Type getDictionaryForType(@PathVariable(TYPE_PARAMETER_NAME) String typeId, @RequestParam(value = FROM_VERSION_PARAM, required = false) Long fromVersion); + + + @GetMapping(value = InternalApi.BASE_PATH+VERSION_PATH + DOSSIER_TEMPLATE_PATH_VARIABLE) + long getVersion(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId); + + + @GetMapping(value = InternalApi.BASE_PATH+VERSION_PATH + DOSSIER_PATH + DOSSIER_ID_PATH_VARIABLE) + long getVersionForDossier(@PathVariable(DOSSIER_ID_PARAMETER_NAME) String dossierId); + + + @ResponseBody + @GetMapping(value = InternalApi.BASE_PATH+COLOR_PATH + DOSSIER_TEMPLATE_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) + Colors getColors(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId); + +} diff --git a/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/DigitalSignatureResource.java b/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/DigitalSignatureResource.java new file mode 100644 index 000000000..315c0ae9c --- /dev/null +++ b/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/DigitalSignatureResource.java @@ -0,0 +1,31 @@ +package com.iqser.red.service.persistence.service.v1.api.internal.resources; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ResponseStatus; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.DigitalSignatureKms; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.DigitalSignature; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.DigitalSignatureType; + +@ResponseStatus(value = HttpStatus.OK) +public interface DigitalSignatureResource { + + String DIGITAL_SIGNATURE_PATH = "/digital-signature"; + String DIGITAL_SIGNATURE_TYPE_PATH = DIGITAL_SIGNATURE_PATH + "/type"; + String DIGITAL_SIGNATURE_KMS_PATH = DIGITAL_SIGNATURE_PATH + "/kms"; + + + @GetMapping(value = InternalApi.BASE_PATH+DIGITAL_SIGNATURE_TYPE_PATH, produces = MediaType.APPLICATION_JSON_VALUE) + DigitalSignatureType getActiveDigitalSignatureType(); + + + @GetMapping(value = InternalApi.BASE_PATH+DIGITAL_SIGNATURE_PATH, produces = MediaType.APPLICATION_JSON_VALUE) + DigitalSignature getDigitalSignature(); + + + @GetMapping(value = InternalApi.BASE_PATH+DIGITAL_SIGNATURE_KMS_PATH, produces = MediaType.APPLICATION_JSON_VALUE) + DigitalSignatureKms getDigitalSignatureKms(); + +} diff --git a/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/DossierAttributesConfigResource.java b/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/DossierAttributesConfigResource.java new file mode 100644 index 000000000..7da66e1a5 --- /dev/null +++ b/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/DossierAttributesConfigResource.java @@ -0,0 +1,27 @@ +package com.iqser.red.service.persistence.service.v1.api.internal.resources; + +import java.util.List; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierAttributeConfig; + +public interface DossierAttributesConfigResource { + + String DOSSIER_ATTRIBUTE_PATH = "/dossier-attribute"; + + String DOSSIER_TEMPLATE_ID = "dossierTemplateId"; + String DOSSIER_TEMPLATE_ID_PATH_VARIABLE = "/{" + DOSSIER_TEMPLATE_ID + "}"; + + + @ResponseBody + @ResponseStatus(HttpStatus.OK) + @GetMapping(value = InternalApi.BASE_PATH + DOSSIER_ATTRIBUTE_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) + List getDossierAttributes(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId); + +} diff --git a/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/DossierAttributesResource.java b/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/DossierAttributesResource.java new file mode 100644 index 000000000..8a6343ae1 --- /dev/null +++ b/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/DossierAttributesResource.java @@ -0,0 +1,22 @@ +package com.iqser.red.service.persistence.service.v1.api.internal.resources; + +import java.util.List; + +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.DossierAttribute; + +public interface DossierAttributesResource { + + String REST_PATH = "/dossierAttributes"; + + String DOSSIER_ID_PARAM = "dossierId"; + String DOSSIER_ID_PATH_PARAM = "/{" + DOSSIER_ID_PARAM + "}"; + + + @GetMapping(value = InternalApi.BASE_PATH + REST_PATH + DOSSIER_ID_PATH_PARAM, produces = MediaType.APPLICATION_JSON_VALUE) + List getDossierAttributes(@PathVariable(DOSSIER_ID_PARAM) String dossierId); + +} diff --git a/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/DossierResource.java b/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/DossierResource.java new file mode 100644 index 000000000..8ae8e04ad --- /dev/null +++ b/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/DossierResource.java @@ -0,0 +1,36 @@ +package com.iqser.red.service.persistence.service.v1.api.internal.resources; + +import java.util.List; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseStatus; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.Dossier; + +@ResponseStatus(value = HttpStatus.OK) +public interface DossierResource { + + String REST_PATH = "/dossier"; + + String DOSSIER_ID_PARAM = "dossierId"; + String DOSSIER_ID_PATH_PARAM = "/{" + DOSSIER_ID_PARAM + "}"; + + String INCLUDE_DELETED_PARAM = "includeDeleted"; + String INCLUDE_ARCHIVED_PARAM = "includeArchived"; + + + @GetMapping(value = InternalApi.BASE_PATH + REST_PATH, produces = MediaType.APPLICATION_JSON_VALUE) + List getAllDossiers(@RequestParam(name = INCLUDE_ARCHIVED_PARAM, defaultValue = "false", required = false) boolean includeArchived, + @RequestParam(name = INCLUDE_DELETED_PARAM, defaultValue = "false", required = false) boolean includeDeleted); + + + @GetMapping(value = InternalApi.BASE_PATH + REST_PATH + DOSSIER_ID_PATH_PARAM, produces = MediaType.APPLICATION_JSON_VALUE) + Dossier getDossierById(@PathVariable(DOSSIER_ID_PARAM) String dossierId, + @RequestParam(name = INCLUDE_ARCHIVED_PARAM, defaultValue = "false", required = false) boolean includeArchived, + @RequestParam(name = INCLUDE_DELETED_PARAM, defaultValue = "false", required = false) boolean includeDeleted); + +} diff --git a/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/DossierTemplateResource.java b/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/DossierTemplateResource.java new file mode 100644 index 000000000..7a0d2432b --- /dev/null +++ b/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/DossierTemplateResource.java @@ -0,0 +1,22 @@ +package com.iqser.red.service.persistence.service.v1.api.internal.resources; + +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierTemplate; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.importexport.ImportDossierTemplateRequest; + +public interface DossierTemplateResource { + + String DOSSIER_TEMPLATE_PATH = "/dossier-template"; + + String IMPORT_PATH = "/import"; + + + @ResponseBody + @PostMapping(value = InternalApi.BASE_PATH + DOSSIER_TEMPLATE_PATH + IMPORT_PATH, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + DossierTemplate importDossierTemplate(@RequestBody ImportDossierTemplateRequest request); + +} diff --git a/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/FileAttributesConfigResource.java b/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/FileAttributesConfigResource.java new file mode 100644 index 000000000..5e20d097f --- /dev/null +++ b/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/FileAttributesConfigResource.java @@ -0,0 +1,27 @@ +package com.iqser.red.service.persistence.service.v1.api.internal.resources; + +import java.util.List; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileAttributeConfig; + +public interface FileAttributesConfigResource { + + String FILE_ATTRIBUTES_PATH = "/fileAttributes"; + + String DOSSIER_TEMPLATE_ID = "dossierTemplateId"; + String DOSSIER_TEMPLATE_ID_PATH_VARIABLE = "/{" + DOSSIER_TEMPLATE_ID + "}"; + + + @ResponseBody + @ResponseStatus(HttpStatus.OK) + @GetMapping(value = InternalApi.BASE_PATH + FILE_ATTRIBUTES_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) + List getFileAttributeConfigs(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId); + +} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/FileStatusProcessingUpdateResource.java b/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/FileStatusProcessingUpdateResource.java similarity index 58% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/FileStatusProcessingUpdateResource.java rename to persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/FileStatusProcessingUpdateResource.java index fd02c144b..8ceb301f4 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/FileStatusProcessingUpdateResource.java +++ b/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/FileStatusProcessingUpdateResource.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.resources; +package com.iqser.red.service.persistence.service.v1.api.internal.resources; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -7,8 +7,8 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.ResponseStatus; -import com.iqser.red.service.pdftron.redaction.v1.api.model.UntouchedDocumentResponse; -import com.iqser.red.service.redaction.v1.model.AnalyzeResult; +import com.iqser.red.service.persistence.service.v1.api.shared.model.AnalyzeResult; +import com.iqser.red.service.persistence.service.v1.api.shared.model.UntouchedDocumentResponse; public interface FileStatusProcessingUpdateResource { @@ -21,59 +21,59 @@ public interface FileStatusProcessingUpdateResource { @ResponseStatus(value = HttpStatus.OK) - @PostMapping(value = STATUS_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + "/preprocessing-successful", consumes = MediaType.APPLICATION_JSON_VALUE) + @PostMapping(value = InternalApi.BASE_PATH + STATUS_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + "/preprocessing-successful", consumes = MediaType.APPLICATION_JSON_VALUE) void preprocessingSuccessful(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody UntouchedDocumentResponse untouchedDocumentResponse); @ResponseStatus(value = HttpStatus.OK) - @PostMapping(value = STATUS_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + "/preprocessing-failed") + @PostMapping(value = InternalApi.BASE_PATH + STATUS_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + "/preprocessing-failed") void preprocessingFailed(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId); @ResponseStatus(value = HttpStatus.OK) - @PostMapping(value = STATUS_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + "/analysis-successful", consumes = MediaType.APPLICATION_JSON_VALUE) + @PostMapping(value = InternalApi.BASE_PATH + STATUS_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + "/analysis-successful", consumes = MediaType.APPLICATION_JSON_VALUE) void analysisSuccessful(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody AnalyzeResult analyzeResult); @ResponseStatus(value = HttpStatus.OK) - @PostMapping(value = STATUS_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + "/ocr-successful") + @PostMapping(value = InternalApi.BASE_PATH + STATUS_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + "/ocr-successful") void ocrSuccessful(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId); @ResponseStatus(value = HttpStatus.OK) - @PostMapping(value = STATUS_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + "/analysis-failed") + @PostMapping(value = InternalApi.BASE_PATH + STATUS_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + "/analysis-failed") void analysisFailed(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId); @ResponseStatus(value = HttpStatus.OK) - @PostMapping(value = STATUS_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + "/pre-processing") + @PostMapping(value = InternalApi.BASE_PATH + STATUS_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + "/pre-processing") void preProcessing(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId); @ResponseStatus(value = HttpStatus.OK) - @PostMapping(value = STATUS_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + "/ocr-processing") + @PostMapping(value = InternalApi.BASE_PATH + STATUS_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + "/ocr-processing") void ocrProcessing(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId); @ResponseStatus(value = HttpStatus.OK) - @PostMapping(value = STATUS_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + "/ocr-failed") + @PostMapping(value = InternalApi.BASE_PATH + STATUS_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + "/ocr-failed") void ocrFailed(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId); @ResponseStatus(value = HttpStatus.OK) - @PostMapping(value = STATUS_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + "/indexing") + @PostMapping(value = InternalApi.BASE_PATH + STATUS_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + "/indexing") void indexing(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId); @ResponseStatus(value = HttpStatus.OK) - @PostMapping(value = STATUS_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + "/indexing-successful") + @PostMapping(value = InternalApi.BASE_PATH + STATUS_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + "/indexing-successful") void indexingSuccessful(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId); @ResponseStatus(value = HttpStatus.OK) - @PostMapping(value = STATUS_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + "/indexing-failed") + @PostMapping(value = InternalApi.BASE_PATH + STATUS_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + "/indexing-failed") void indexingFailed(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId); } diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/IndexInformationResource.java b/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/IndexInformationResource.java similarity index 66% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/IndexInformationResource.java rename to persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/IndexInformationResource.java index 5ea4428b6..e50f73ee5 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/IndexInformationResource.java +++ b/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/IndexInformationResource.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.resources; +package com.iqser.red.service.persistence.service.v1.api.internal.resources; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -8,7 +8,7 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; -import com.iqser.red.service.persistence.service.v1.api.model.index.IndexInformation; +import com.iqser.red.service.persistence.service.v1.api.shared.model.index.IndexInformation; public interface IndexInformationResource { @@ -17,13 +17,13 @@ public interface IndexInformationResource { @ResponseBody @ResponseStatus(value = HttpStatus.OK) - @GetMapping(value = PATH, produces = MediaType.APPLICATION_JSON_VALUE) + @GetMapping(value = InternalApi.BASE_PATH + PATH, produces = MediaType.APPLICATION_JSON_VALUE) IndexInformation getIndexInformation(); @ResponseBody @ResponseStatus(value = HttpStatus.OK) - @PostMapping(value = PATH, consumes = MediaType.APPLICATION_JSON_VALUE) + @PostMapping(value = InternalApi.BASE_PATH + PATH, consumes = MediaType.APPLICATION_JSON_VALUE) void updateIndexInformation(@RequestBody IndexInformation indexInformation); } diff --git a/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/InternalApi.java b/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/InternalApi.java new file mode 100644 index 000000000..c3991e715 --- /dev/null +++ b/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/InternalApi.java @@ -0,0 +1,6 @@ +package com.iqser.red.service.persistence.service.v1.api.internal.resources; + +public interface InternalApi { + + String BASE_PATH = "/internal-api"; +} diff --git a/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/LegalBasisMappingResource.java b/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/LegalBasisMappingResource.java new file mode 100644 index 000000000..5693deef2 --- /dev/null +++ b/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/LegalBasisMappingResource.java @@ -0,0 +1,32 @@ +package com.iqser.red.service.persistence.service.v1.api.internal.resources; + +import java.util.List; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.legalbasis.LegalBasis; + +public interface LegalBasisMappingResource { + + String LEGAL_BASIS_PATH = "/legalBasis"; + String VERSION_PATH = "/version"; + String DOSSIER_TEMPLATE_PARAMETER_NAME = "dossierTemplateId"; + String DOSSIER_TEMPLATE_PATH_VARIABLE = "/{" + DOSSIER_TEMPLATE_PARAMETER_NAME + "}"; + + + @ResponseBody + @ResponseStatus(value = HttpStatus.OK) + @GetMapping(value = InternalApi.BASE_PATH + LEGAL_BASIS_PATH + DOSSIER_TEMPLATE_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) + List getLegalBasisMapping(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId); + + + @ResponseStatus(HttpStatus.OK) + @GetMapping(value = InternalApi.BASE_PATH + LEGAL_BASIS_PATH + DOSSIER_TEMPLATE_PATH_VARIABLE + VERSION_PATH) + long getVersion(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId); + +} diff --git a/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/RedactionLogResource.java b/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/RedactionLogResource.java new file mode 100644 index 000000000..9967c9402 --- /dev/null +++ b/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/RedactionLogResource.java @@ -0,0 +1,33 @@ +package com.iqser.red.service.persistence.service.v1.api.internal.resources; + +import java.util.List; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseStatus; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLog; + +@ResponseStatus(value = HttpStatus.OK) +public interface RedactionLogResource { + + String REDACTION_LOG_PATH = "/redactionLog"; + + String FILE_ID = "fileId"; + String FILE_ID_PATH_VARIABLE = "/{" + FILE_ID + "}"; + + String DOSSIER_ID_PARAM = "dossierId"; + String DOSSIER_ID_PATH_PARAM = "/{" + DOSSIER_ID_PARAM + "}"; + + + @GetMapping(value = InternalApi.BASE_PATH + REDACTION_LOG_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) + RedactionLog getRedactionLog(@PathVariable(DOSSIER_ID_PARAM) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestParam(value = "excludedType", required = false) List excludedTypes, + @RequestParam(value = "withManualRedactions", required = false, defaultValue = "true") boolean withManualRedactions, + @RequestParam(value = "includeFalsePositives", required = false, defaultValue = "false") boolean includeFalsePositives); + +} diff --git a/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/ReportTemplateResource.java b/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/ReportTemplateResource.java new file mode 100644 index 000000000..01cf7589f --- /dev/null +++ b/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/ReportTemplateResource.java @@ -0,0 +1,29 @@ +package com.iqser.red.service.persistence.service.v1.api.internal.resources; + +import java.util.List; + +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.ReportTemplate; + +public interface ReportTemplateResource { + + String REPORT_TEMPLATE_UPLOAD_PATH = "/templateUpload"; + + String DOSSIER_TEMPLATE_ID = "dossierTemplateId"; + String DOSSIER_TEMPLATE_ID_PATH_VARIABLE = "/{" + DOSSIER_TEMPLATE_ID + "}"; + + String TEMPLATE_ID = "templateId"; + String TEMPLATE_ID_PATH_VARIABLE = "/{" + TEMPLATE_ID + "}"; + + + @GetMapping(value = InternalApi.BASE_PATH + REPORT_TEMPLATE_UPLOAD_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) + List getAvailableReportTemplates(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId); + + + @GetMapping(value = InternalApi.BASE_PATH + REPORT_TEMPLATE_UPLOAD_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE + TEMPLATE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) + ReportTemplate getReportTemplate(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, @PathVariable(TEMPLATE_ID) String templateId); + +} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/RulesResource.java b/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/RulesResource.java similarity index 54% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/RulesResource.java rename to persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/RulesResource.java index b45f7d0ec..5f6de8e08 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/RulesResource.java +++ b/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/RulesResource.java @@ -1,15 +1,13 @@ -package com.iqser.red.service.persistence.service.v1.api.resources; +package com.iqser.red.service.persistence.service.v1.api.internal.resources; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; -import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive; +import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; public interface RulesResource { @@ -20,19 +18,14 @@ public interface RulesResource { String VERSION_PATH = "/version"; - @ResponseStatus(HttpStatus.NO_CONTENT) - @PostMapping(value = PATH + DOSSIER_TEMPLATE_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE) - void setRules(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, @RequestBody JSONPrimitive rules); - - @ResponseBody @ResponseStatus(HttpStatus.OK) - @GetMapping(value = PATH + DOSSIER_TEMPLATE_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) + @GetMapping(value = InternalApi.BASE_PATH + PATH + DOSSIER_TEMPLATE_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) JSONPrimitive getRules(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId); @ResponseStatus(HttpStatus.OK) - @GetMapping(value = PATH + DOSSIER_TEMPLATE_PATH_VARIABLE + VERSION_PATH) + @GetMapping(value = InternalApi.BASE_PATH + PATH + DOSSIER_TEMPLATE_PATH_VARIABLE + VERSION_PATH) long getVersion(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId); } diff --git a/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/StatusResource.java b/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/StatusResource.java new file mode 100644 index 000000000..6d0b5be7e --- /dev/null +++ b/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/StatusResource.java @@ -0,0 +1,43 @@ +package com.iqser.red.service.persistence.service.v1.api.internal.resources; + +import java.util.List; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileModel; + +public interface StatusResource { + + String STATUS_PATH = "/status"; + String DELETED_PATH = "/softdeleted"; + String DOSSIER_ID_PARAM = "dossierId"; + String DOSSIER_ID_PATH_PARAM = "/{" + DOSSIER_ID_PARAM + "}"; + + String FILE_ID = "fileId"; + String FILE_ID_PATH_VARIABLE = "/{" + FILE_ID + "}"; + + + @ResponseBody + @ResponseStatus(value = HttpStatus.OK) + @GetMapping(value = InternalApi.BASE_PATH + STATUS_PATH + DOSSIER_ID_PATH_PARAM, produces = MediaType.APPLICATION_JSON_VALUE) + List getDossierStatus(@PathVariable(DOSSIER_ID_PARAM) String dossierId); + + + @ResponseBody + @ResponseStatus(value = HttpStatus.OK) + @GetMapping(value = InternalApi.BASE_PATH + STATUS_PATH + DELETED_PATH + DOSSIER_ID_PATH_PARAM, produces = MediaType.APPLICATION_JSON_VALUE) + List getSoftDeletedDossierStatus(@PathVariable(DOSSIER_ID_PARAM) String dossierId); + + + @ResponseBody + @ResponseStatus(value = HttpStatus.OK) + @GetMapping(value = InternalApi.BASE_PATH + STATUS_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) + FileModel getFileStatus(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId); + +} + diff --git a/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/TenantsResource.java b/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/TenantsResource.java new file mode 100644 index 000000000..f64255051 --- /dev/null +++ b/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/TenantsResource.java @@ -0,0 +1,41 @@ +package com.iqser.red.service.persistence.service.v1.api.internal.resources; + +import java.security.PrivateKey; +import java.util.List; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; +import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.TenantRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.TenantResponse; + +@ResponseStatus(value = HttpStatus.OK) +public interface TenantsResource { + + String TENANT_PATH ="/tenants"; + String TENANT_ID_PARAM = "tenantId"; + String TENANT_ID_PATH_PARAM = "/{" + TENANT_ID_PARAM + "}"; + + + @PostMapping(value = InternalApi.BASE_PATH + TENANT_PATH, consumes = MediaType.APPLICATION_JSON_VALUE) + void createTenant(@RequestBody TenantRequest tenantRequest); + + + @GetMapping(value = InternalApi.BASE_PATH + TENANT_PATH, produces = MediaType.APPLICATION_JSON_VALUE) + List getTenants(); + + + @GetMapping(value = InternalApi.BASE_PATH + TENANT_PATH+ TENANT_ID_PATH_PARAM, produces = MediaType.APPLICATION_JSON_VALUE) + TenantResponse getTenant(@PathVariable(TENANT_ID_PARAM) String tenantId); + + + @GetMapping(value = InternalApi.BASE_PATH + "/deploymentKey" + TENANT_ID_PATH_PARAM, produces = MediaType.APPLICATION_JSON_VALUE) + JSONPrimitive getDeploymentKey(@PathVariable(TENANT_ID_PARAM) String tenantId); + +} diff --git a/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/WatermarkResource.java b/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/WatermarkResource.java new file mode 100644 index 000000000..c5d0be309 --- /dev/null +++ b/persistence-service-v1/persistence-service-internal-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/internal/resources/WatermarkResource.java @@ -0,0 +1,23 @@ +package com.iqser.red.service.persistence.service.v1.api.internal.resources; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.ResponseStatus; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.WatermarkModel; + +@ResponseStatus(value = HttpStatus.OK) +public interface WatermarkResource { + + String WATERMARK_PATH = "/watermark"; + String WATERMARK_ID_PARAMETER_NAME = "watermarkId"; + String WATERMARK_ID_PATH_VARIABLE = "/{" + WATERMARK_ID_PARAMETER_NAME + "}"; + + + @GetMapping(value = InternalApi.BASE_PATH + WATERMARK_PATH + WATERMARK_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) + WatermarkModel getWatermark(@PathVariable(WATERMARK_ID_PARAMETER_NAME) long watermarkId); + +} + diff --git a/persistence-service-v1/persistence-service-internal-api-v1/src/test/java/com/iqser/red/service/persistence/service/v1/api/internal/IdentityTest.java b/persistence-service-v1/persistence-service-internal-api-v1/src/test/java/com/iqser/red/service/persistence/service/v1/api/internal/IdentityTest.java new file mode 100644 index 000000000..d5edfc543 --- /dev/null +++ b/persistence-service-v1/persistence-service-internal-api-v1/src/test/java/com/iqser/red/service/persistence/service/v1/api/internal/IdentityTest.java @@ -0,0 +1,16 @@ +package com.iqser.red.service.persistence.service.v1.api.internal; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.Test; + +public class IdentityTest { + + @Test + public void mockTest() { + + int i = 1; + assertThat(i).isEqualTo(1); + } + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/pom.xml b/persistence-service-v1/persistence-service-processor-v1/pom.xml index ed3b3ddb8..1cf4537f8 100644 --- a/persistence-service-v1/persistence-service-processor-v1/pom.xml +++ b/persistence-service-v1/persistence-service-processor-v1/pom.xml @@ -13,12 +13,113 @@ persistence-service-processor-v1 + + 6.4.1 + 0.4.0 + + + + + com.iqser.red.service - persistence-service-api-v1 + pdftron-redaction-service-api-v1 + + + com.iqser.red.service + redaction-service-api-v1 + + + com.iqser.red.service + persistence-service-api-v1 + + + + + + com.iqser.red.service + redaction-service-api-v1 + + + com.iqser.red.service + pdftron-redaction-service-api-v1 + + + com.iqser.red.service + persistence-service-api-v1 + + + + + + com.iqser.red.service + redaction-report-service-api-v1 + + + com.iqser.red.service + persistence-service-api-v1 + + + + + + com.iqser.red.service + search-service-api-v1 + + + com.iqser.red.service + persistence-service-api-v1 + + + + + + + com.giffing.bucket4j.spring.boot.starter + bucket4j-spring-boot-starter + ${bucket4j.spring.version} + + + com.github.vladimir-bukhtoyarov + bucket4j-jcache + + + com.github.vladimir-bukhtoyarov + bucket4j-core + + + + + com.iqser.red.service + persistence-service-internal-api-v1 ${project.version} + + com.iqser.red.service + persistence-service-external-api-v1 + ${project.version} + + + com.iqser.red.service + search-service-api-v1 + + + com.iqser.red.service + persistence-service-api-v1 + + + + + com.iqser.red.service + redaction-service-api-v1 + + + com.iqser.red.service + persistence-service-api-v1 + + + com.iqser.red.service pdftron-redaction-service-api-v1 @@ -29,6 +130,10 @@ + + org.springframework.security + spring-security-acl + org.springframework.boot spring-boot-starter-mail @@ -37,52 +142,101 @@ org.springframework.boot spring-boot-starter-data-jpa + + org.springframework.boot + spring-boot-starter-data-redis + + + com.iqser.red.service + keycloak-commons + ${project.version} + + + com.iqser.red.commons + spring-commons + com.iqser.red.commons jackson-commons + + org.apache.commons + commons-compress + 1.21 + com.iqser.red.commons storage-commons - com.iqser.red.commons - logging-commons + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + + + org.postgresql + postgresql + 42.2.23 + + org.apache.commons commons-lang3 - - org.apache.commons - commons-collections4 - 4.4 + com.iqser.red.commons + logging-commons + + org.slf4j + slf4j-log4j12 + + + org.springframework.boot + spring-boot-starter-web + + + com.iqser.red.commons + spring-boot-starter-web-custom-commons + + + com.iqser.red.commons + metric-commons + + + com.opencsv + opencsv + 5.4 + + org.springframework.cloud spring-cloud-starter-openfeign - provided + + + + org.springframework.boot + spring-boot-starter-quartz + + + + org.springframework.boot + spring-boot-starter-amqp - commons-io - commons-io + org.springframework.amqp + spring-rabbit-test test - - commons-codec - commons-codec - test - org.testcontainers postgresql - 1.15.0 + 1.17.1 test @@ -96,13 +250,44 @@ test - com.google.guava - guava + org.liquibase + liquibase-core + 4.3.1 + + + com.yannbriancon + spring-hibernate-query-utils + 2.0.0 + test + + + commons-validator + commons-validator + 1.7 compile com.iqser.red.service - redaction-report-service-api-v1 + persistence-service-shared-api-v1 + 1.0-SNAPSHOT + compile + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + lombok.launch.AnnotationProcessorHider$AnnotationProcessor + com.dslplatform.json.processor.CompiledJsonAnnotationProcessor + + + + + + diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/PersistenceServiceProcessorConfiguration.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/PersistenceServiceProcessorConfiguration.java index aa4a381c0..53e4206c8 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/PersistenceServiceProcessorConfiguration.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/PersistenceServiceProcessorConfiguration.java @@ -6,12 +6,19 @@ import org.springframework.cloud.openfeign.support.SortJacksonModule; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; +import org.springframework.retry.backoff.ExponentialBackOffPolicy; +import org.springframework.retry.policy.SimpleRetryPolicy; +import org.springframework.retry.support.RetryTemplate; -import com.iqser.red.service.persistence.management.v1.processor.client.PDFTronRedactionClient; +import com.iqser.red.service.persistence.management.v1.processor.client.pdftronredactionservice.PDFTronClient; +import com.iqser.red.service.persistence.management.v1.processor.client.redactionreportservice.StatusReportClient; +import com.iqser.red.service.persistence.management.v1.processor.client.redactionservice.RedactionClient; +import com.iqser.red.service.persistence.management.v1.processor.client.searchservice.SearchClient; +import com.iqser.red.service.persistence.management.v1.processor.settings.FileManagementServiceSettings; @Configuration @ComponentScan -@EnableFeignClients(basePackageClasses = {PDFTronRedactionClient.class}) +@EnableFeignClients(basePackageClasses = {PDFTronClient.class, StatusReportClient.class, SearchClient.class, RedactionClient.class}) public class PersistenceServiceProcessorConfiguration { @Bean @@ -27,4 +34,21 @@ public class PersistenceServiceProcessorConfiguration { return new SortJacksonModule(); } + + @Bean + public RetryTemplate retryTemplate(FileManagementServiceSettings settings) { + + RetryTemplate retryTemplate = new RetryTemplate(); + + ExponentialBackOffPolicy backOffPolicy = new ExponentialBackOffPolicy(); + backOffPolicy.setMaxInterval(settings.getMaxRetryInterval()); + retryTemplate.setBackOffPolicy(backOffPolicy); + + SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy(); + retryPolicy.setMaxAttempts(settings.getMaxRetryAttempts()); + retryTemplate.setRetryPolicy(retryPolicy); + + return retryTemplate; + } + } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/ACLBeanConfiguration.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/ACLBeanConfiguration.java new file mode 100644 index 000000000..a85137218 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/ACLBeanConfiguration.java @@ -0,0 +1,107 @@ +package com.iqser.red.service.persistence.management.v1.processor.acl; + +import javax.sql.DataSource; + +import org.springframework.cache.CacheManager; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler; +import org.springframework.security.access.expression.method.MethodSecurityExpressionHandler; +import org.springframework.security.acls.AclPermissionCacheOptimizer; +import org.springframework.security.acls.AclPermissionEvaluator; +import org.springframework.security.acls.domain.AclAuthorizationStrategy; +import org.springframework.security.acls.domain.ConsoleAuditLogger; +import org.springframework.security.acls.domain.DefaultPermissionFactory; +import org.springframework.security.acls.domain.DefaultPermissionGrantingStrategy; +import org.springframework.security.acls.domain.PermissionFactory; +import org.springframework.security.acls.domain.SpringCacheBasedAclCache; +import org.springframework.security.acls.jdbc.BasicLookupStrategy; +import org.springframework.security.acls.jdbc.JdbcMutableAclService; +import org.springframework.security.acls.jdbc.LookupStrategy; +import org.springframework.security.acls.model.PermissionGrantingStrategy; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.mulitenancy.MultiTenantDataSource; + +import lombok.RequiredArgsConstructor; + +@Configuration +@RequiredArgsConstructor +@EnableTransactionManagement +public class ACLBeanConfiguration { + + private final MultiTenantDataSource dataSource; + + private final CacheManager cacheManager; + + private final static String ACL_CACHE = "acl"; + + + @Bean + public AclAuthorizationStrategy aclAuthorizationStrategy() { + + return (acl, changeType) -> { + // no-op + }; + } + + + @Bean + public PermissionFactory permissionFactory() { + + return new DefaultPermissionFactory(RedPermission.class); + } + + + @Bean + public PermissionGrantingStrategy permissionGrantingStrategy() { + + return new DefaultPermissionGrantingStrategy(new ConsoleAuditLogger()); + } + + + @Bean + public SpringCacheBasedAclCache aclCache() { + + return new SpringCacheBasedAclCache(cacheManager.getCache(ACL_CACHE), permissionGrantingStrategy(), aclAuthorizationStrategy()); + } + + + @Bean + public LookupStrategy lookupStrategy() { + + var lookupStrategy = new BasicLookupStrategy(dataSource, aclCache(), aclAuthorizationStrategy(), new ConsoleAuditLogger()); + lookupStrategy.setAclClassIdSupported(true); + lookupStrategy.setPermissionFactory(permissionFactory()); + return lookupStrategy; + } + + + @Bean + @Primary + public MethodSecurityExpressionHandler defaultMethodSecurityExpressionHandler() { + + DefaultMethodSecurityExpressionHandler expressionHandler = new DefaultMethodSecurityExpressionHandler(); + AclPermissionEvaluator permissionEvaluator = new AclPermissionEvaluator(aclService()); + permissionEvaluator.setPermissionFactory(permissionFactory()); + expressionHandler.setPermissionEvaluator(permissionEvaluator); + + var permissionCacheOptimizer = new AclPermissionCacheOptimizer(aclService()); + permissionCacheOptimizer.setObjectIdentityRetrievalStrategy(new RedObjectIdentityRetrievalStrategy()); + expressionHandler.setPermissionCacheOptimizer(permissionCacheOptimizer); + return expressionHandler; + } + + + @Bean + public JdbcMutableAclService aclService() { + + var service = new JdbcMutableAclService(dataSource, lookupStrategy(), aclCache()); + service.setClassIdentityQuery("select currval(pg_get_serial_sequence('acl_class', 'id'))"); + service.setSidIdentityQuery("select currval(pg_get_serial_sequence('acl_sid', 'id'))"); + service.setAclClassIdSupported(true); + return service; + } + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/AbstractACLService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/AbstractACLService.java new file mode 100644 index 000000000..f9e591e56 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/AbstractACLService.java @@ -0,0 +1,31 @@ +package com.iqser.red.service.persistence.management.v1.processor.acl; + +import java.io.Serializable; + +import org.springframework.security.acls.domain.ObjectIdentityImpl; +import org.springframework.security.acls.model.MutableAcl; +import org.springframework.security.acls.model.MutableAclService; +import org.springframework.security.acls.model.NotFoundException; + +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public abstract class AbstractACLService { + + protected final MutableAclService mutableAclService; + + + public MutableAcl getOrCreateACL(Serializable id) { + + ObjectIdentityImpl dossierIdentity = new ObjectIdentityImpl(getIdentifier(), id); + try { + return (MutableAcl) mutableAclService.readAclById(dossierIdentity); + } catch (NotFoundException e) { + return mutableAclService.createAcl(dossierIdentity); + } + } + + + public abstract String getIdentifier(); + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/AclMethodSecurityConfiguration.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/AclMethodSecurityConfiguration.java new file mode 100644 index 000000000..623909e5b --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/AclMethodSecurityConfiguration.java @@ -0,0 +1,24 @@ +package com.iqser.red.service.persistence.management.v1.processor.acl; + +import org.springframework.context.annotation.Configuration; +import org.springframework.security.access.expression.method.MethodSecurityExpressionHandler; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.method.configuration.GlobalMethodSecurityConfiguration; + +import lombok.RequiredArgsConstructor; + +@Configuration +@RequiredArgsConstructor +@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) +public class AclMethodSecurityConfiguration extends GlobalMethodSecurityConfiguration { + + private final MethodSecurityExpressionHandler defaultMethodSecurityExpressionHandler; + + + @Override + protected MethodSecurityExpressionHandler createExpressionHandler() { + + return defaultMethodSecurityExpressionHandler; + } + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/CustomAclPermissionEvaluator.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/CustomAclPermissionEvaluator.java new file mode 100644 index 000000000..59f847b33 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/CustomAclPermissionEvaluator.java @@ -0,0 +1,47 @@ +package com.iqser.red.service.persistence.management.v1.processor.acl; + +import java.io.Serializable; + +import org.springframework.security.acls.AclPermissionEvaluator; +import org.springframework.security.acls.model.AclService; +import org.springframework.security.acls.model.NotFoundException; +import org.springframework.security.core.Authentication; + +import com.iqser.red.service.persistence.management.v1.processor.exception.NotAllowedException; + +public class CustomAclPermissionEvaluator extends AclPermissionEvaluator { + + public CustomAclPermissionEvaluator(AclService aclService) { + + super(aclService); + } + + + @Override + public boolean hasPermission(Authentication authentication, Object domainObject, Object permission) { + + var result = super.hasPermission(authentication, domainObject, permission); + if (!result && "VIEW_OBJECT".equals(permission)) { + throw new NotFoundException("Object not found"); + } else if (!result && "ACCESS_OBJECT".equals(permission)) { + throw new NotAllowedException("Access is denied"); + } else { + return result; + } + } + + + @Override + public boolean hasPermission(Authentication authentication, Serializable targetId, String targetType, Object permission) { + + var result = super.hasPermission(authentication, targetId, targetType, permission); + if (!result && "VIEW_OBJECT".equals(permission)) { + throw new NotFoundException("Object not found"); + } else if (!result && "ACCESS_OBJECT".equals(permission)) { + throw new NotAllowedException("Access is denied"); + } else { + return result; + } + } + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/RedObjectIdentityRetrievalStrategy.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/RedObjectIdentityRetrievalStrategy.java new file mode 100644 index 000000000..49b891e76 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/RedObjectIdentityRetrievalStrategy.java @@ -0,0 +1,31 @@ +package com.iqser.red.service.persistence.management.v1.processor.acl; + +import org.springframework.security.acls.domain.ObjectIdentityImpl; +import org.springframework.security.acls.model.ObjectIdentity; +import org.springframework.security.acls.model.ObjectIdentityRetrievalStrategy; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierChangeEntry; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.Dossier; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class RedObjectIdentityRetrievalStrategy implements ObjectIdentityRetrievalStrategy { + + @Override + public ObjectIdentity getObjectIdentity(Object domainObject) { + + log.debug("Requesting data for object: {}", domainObject); + if (domainObject instanceof Dossier) { + return new ObjectIdentityImpl("Dossier", ((Dossier) domainObject).getId()); + } else if (domainObject instanceof DossierChangeEntry) { + return new ObjectIdentityImpl("Dossier", ((DossierChangeEntry) domainObject).getDossierId()); + } else if (domainObject instanceof String) { + // TODO ACL this will not work once we have more than one type. + return new ObjectIdentityImpl("Dossier", (String) domainObject); + } else { + return null; + } + } + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/RedPermission.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/RedPermission.java new file mode 100644 index 000000000..3bb192790 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/RedPermission.java @@ -0,0 +1,48 @@ +package com.iqser.red.service.persistence.management.v1.processor.acl; + +import java.util.List; +import java.util.Optional; + +import org.springframework.security.acls.domain.AbstractPermission; +import org.springframework.security.acls.model.Permission; + +import lombok.Getter; + +public class RedPermission extends AbstractPermission implements Permission { + + public static final RedPermission VIEW_OBJECT = new RedPermission("VIEW_OBJECT", 1 << 0, 'V', 100); // 1 + + public static final RedPermission ACCESS_OBJECT = new RedPermission("ACCESS_OBJECT", 1 << 1, 'A', 200); // 2 + + public static final RedPermission REVIEW = new RedPermission("REVIEW", 1 << 2, 'W', 30); // 4 + + public static final RedPermission APPROVE = new RedPermission("APPROVE", 1 << 3, 'A', 20); // 8 + + public static final RedPermission OWNER = new RedPermission("OWNER", 1 << 4, 'O', 10); // 16 + + private static final List ALL_PERMISSIONS = List.of(VIEW_OBJECT, ACCESS_OBJECT, REVIEW, APPROVE, OWNER); + + @Getter + private final String name; + + @Getter + private final int sort; + + + protected RedPermission(String name, int mask, char code, int sort) { + + super(mask, code); + this.name = name; + this.sort = sort; + } + + + public static Optional resolvePermission(Integer mask) { + + if (mask == null) { + return Optional.empty(); + } + return ALL_PERMISSIONS.stream().filter(p -> p.getMask() == mask).findAny(); + } + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/api/ICustomPermissionService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/api/ICustomPermissionService.java new file mode 100644 index 000000000..1ccd4e00b --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/api/ICustomPermissionService.java @@ -0,0 +1,120 @@ +package com.iqser.red.service.persistence.management.v1.processor.acl.custom.api; + +import static com.iqser.red.service.persistence.management.v1.processor.acl.custom.constants.CustomPermissionConstants.EVERYONE_ELSE; + +import java.io.Serializable; +import java.util.Collection; +import java.util.Set; +import java.util.stream.Collectors; + +import org.springframework.security.acls.domain.AbstractPermission; +import org.springframework.security.acls.domain.PrincipalSid; +import org.springframework.security.acls.model.AccessControlEntry; +import org.springframework.security.acls.model.MutableAcl; +import org.springframework.security.acls.model.MutableAclService; +import org.springframework.transaction.annotation.Transactional; + +import com.iqser.red.keycloak.commons.UserListingService; +import com.iqser.red.keycloak.commons.model.User; +import com.iqser.red.service.persistence.management.v1.processor.acl.AbstractACLService; +import com.iqser.red.service.persistence.management.v1.processor.acl.RedPermission; +import com.iqser.red.service.persistence.service.v1.api.shared.model.permission.CustomPermissionMappingModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.permission.CustomPermissionModel; + +public abstract class ICustomPermissionService extends AbstractACLService { + + protected final UserListingService userListingService; + + + protected ICustomPermissionService(UserListingService userListingService, MutableAclService mutableAclService) { + + super(mutableAclService); + this.userListingService = userListingService; + } + + + @Transactional + public void applyCustomPermissions(CustomPermissionMappingModel customPermissionMappingModel) { + + var objectIds = provideAllObjectIds(); + objectIds.forEach(id -> applyCustomPermissions(customPermissionMappingModel, id)); + } + + + protected abstract Collection provideAllObjectIds(); + + + @Transactional + public void applyCustomPermissions(CustomPermissionMappingModel customPermissionMappingModel, Serializable objectId) { + + var acl = getOrCreateACL(objectId); + applyAces(acl, customPermissionMappingModel); + mutableAclService.updateAcl(acl); + } + + + protected void applyAces(MutableAcl acl, CustomPermissionMappingModel model) { + + clearAces(acl); + + var redPermission = RedPermission.resolvePermission(model.getTargetPermission().getMask()); + + if (redPermission.isPresent()) { + var masks = model.getMappedPermissions().stream().map(CustomPermissionModel::getMask).collect(Collectors.toSet()); + + var principalsForCustomPermission = getSidsForMasks(acl, masks); + + if (allowEveryoneElseSetting() && masks.contains(EVERYONE_ELSE.getMask())) { + var allUserIds = getUserIds(); + var usersWithDefinedPermissions = getSidsForMasks(acl, definingPermissions().stream().map(AbstractPermission::getMask).collect(Collectors.toSet())); + allUserIds.removeAll(usersWithDefinedPermissions); + + principalsForCustomPermission.addAll(allUserIds); + } + + principalsForCustomPermission.forEach(p -> acl.insertAce(0, redPermission.get(), new PrincipalSid(p), true)); + } + } + + + protected void clearAces(MutableAcl acl) { + + for (var i = acl.getEntries().size() - 1; i >= 0; i--) { + if (acl.getEntries().get(i).getPermission().getMask() == forPermission().getMask()) { + acl.deleteAce(i); + } + } + } + + + private Set getSidsForMasks(MutableAcl acl, Collection masks) { + + return acl.getEntries() + .stream() + .filter(e -> masks.contains(e.getPermission().getMask())) + .map(AccessControlEntry::getSid) + .filter(PrincipalSid.class::isInstance) + .map(s -> ((PrincipalSid) s).getPrincipal()) + .collect(Collectors.toSet()); + + } + + + public boolean allowEveryoneElseSetting() { + + return true; + } + + + private Set getUserIds() { + + return userListingService.getAllUsers().stream().map(User::getUserId).collect(Collectors.toSet()); + } + + + public abstract Set definingPermissions(); + + + public abstract RedPermission forPermission(); + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/constants/CustomPermissionConstants.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/constants/CustomPermissionConstants.java new file mode 100644 index 000000000..cbee8ff2e --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/constants/CustomPermissionConstants.java @@ -0,0 +1,12 @@ +package com.iqser.red.service.persistence.management.v1.processor.acl.custom.constants; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.permission.CustomPermissionModel; + +public final class CustomPermissionConstants { + + public static final CustomPermissionModel EVERYONE_ELSE = new CustomPermissionModel(-1, "EVERYONE_ELSE", 100_000); + + + private CustomPermissionConstants() {} + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/dossier/AccessObjectDossierObjectPermissionService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/dossier/AccessObjectDossierObjectPermissionService.java new file mode 100644 index 000000000..b7c2058e8 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/dossier/AccessObjectDossierObjectPermissionService.java @@ -0,0 +1,59 @@ +package com.iqser.red.service.persistence.management.v1.processor.acl.custom.dossier; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Set; +import java.util.stream.Collectors; + +import org.springframework.security.acls.model.MutableAclService; +import org.springframework.stereotype.Service; + +import com.iqser.red.keycloak.commons.UserListingService; +import com.iqser.red.service.persistence.management.v1.processor.acl.RedPermission; +import com.iqser.red.service.persistence.management.v1.processor.acl.custom.api.ICustomPermissionService; +import com.iqser.red.service.persistence.management.v1.processor.service.DossierManagementService; +import com.iqser.red.service.persistence.management.v1.processor.service.TenantManagementService; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.Dossier; + +@Service +public class AccessObjectDossierObjectPermissionService extends ICustomPermissionService { + + private final DossierManagementService dossierManagementService; + + public AccessObjectDossierObjectPermissionService(UserListingService userService, + MutableAclService mutableAclService, + DossierManagementService dossierManagementService) { + + super(userService, mutableAclService); + this.dossierManagementService = dossierManagementService; + } + + + @Override + public String getIdentifier() { + + return "Dossier"; + } + + + @Override + protected Collection provideAllObjectIds() { + + return dossierManagementService.getAllDossiers(true, true).stream().map(Dossier::getId).collect(Collectors.toList()); + } + + + @Override + public Set definingPermissions() { + + return Set.of(RedPermission.APPROVE, RedPermission.REVIEW, RedPermission.OWNER); + } + + + @Override + public RedPermission forPermission() { + + return RedPermission.ACCESS_OBJECT; + } + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/dossier/DossierACLService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/dossier/DossierACLService.java new file mode 100644 index 000000000..c7ef6ed62 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/dossier/DossierACLService.java @@ -0,0 +1,134 @@ +package com.iqser.red.service.persistence.management.v1.processor.acl.custom.dossier; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +import org.springframework.security.access.prepost.PostFilter; +import org.springframework.security.acls.domain.ObjectIdentityImpl; +import org.springframework.security.acls.domain.PrincipalSid; +import org.springframework.security.acls.model.MutableAclService; +import org.springframework.security.acls.model.NotFoundException; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.iqser.red.service.persistence.management.v1.processor.acl.AbstractACLService; +import com.iqser.red.service.persistence.management.v1.processor.acl.RedPermission; +import com.iqser.red.service.persistence.management.v1.processor.acl.custom.service.CustomPermissionService; +import com.iqser.red.service.persistence.management.v1.processor.service.DossierManagementService; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.Dossier; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Service +public class DossierACLService extends AbstractACLService { + + private final CustomPermissionService customPermissionService; + + private final DossierManagementService dossierManagementService; + + + public DossierACLService(MutableAclService mutableAclService, DossierManagementService dossierManagementService, CustomPermissionService customPermissionService) { + + super(mutableAclService); + this.dossierManagementService = dossierManagementService; + this.customPermissionService = customPermissionService; + } + + + @PostFilter("hasPermission(filterObject, 'Dossier', 'VIEW_OBJECT')") + public List getDossierIdsWithViewPermission() { + + return dossierManagementService.getAllDossiers(true, true).stream().map(Dossier::getId).collect(Collectors.toList()); + } + + + public Set getMembers(String dossierId) { + + ObjectIdentityImpl dossierIdentity = new ObjectIdentityImpl(getIdentifier(), dossierId); + var acl = mutableAclService.readAclById(dossierIdentity); + Set members = new HashSet<>(); + acl.getEntries().forEach(entry -> { + if (entry.getSid() instanceof PrincipalSid) { + var principal = ((PrincipalSid) entry.getSid()).getPrincipal(); + if (entry.getPermission().getMask() == RedPermission.APPROVE.getMask()) { + members.add(principal); + } + if (entry.getPermission().getMask() == RedPermission.REVIEW.getMask()) { + members.add(principal); + } + if (entry.getPermission().getMask() == RedPermission.OWNER.getMask()) { + members.add(principal); + } + } + }); + return members; + } + + + @Override + public String getIdentifier() { + + return "Dossier"; + } + + + public Dossier enhanceDossierWithACLData(Dossier dossier) { + + ObjectIdentityImpl dossierIdentity = new ObjectIdentityImpl(getIdentifier(), dossier.getId()); + var acl = mutableAclService.readAclById(dossierIdentity); + dossier.setOwnerId(null); + dossier.getMemberIds().clear(); + dossier.getApproverIds().clear(); + acl.getEntries().forEach(entry -> { + if (entry.getSid() instanceof PrincipalSid) { + var principal = ((PrincipalSid) entry.getSid()).getPrincipal(); + if (entry.getPermission().getMask() == RedPermission.APPROVE.getMask()) { + dossier.getApproverIds().add(principal); + dossier.getMemberIds().add(principal); + } + if (entry.getPermission().getMask() == RedPermission.REVIEW.getMask()) { + dossier.getMemberIds().add(principal); + } + if (entry.getPermission().getMask() == RedPermission.OWNER.getMask()) { + dossier.getMemberIds().add(principal); + dossier.setOwnerId(principal); + } + } + }); + return dossier; + } + + + @Transactional + public void updateDossierACL(Set members, Set approvers, String owner, String dossierId) { + + var acl = getOrCreateACL(dossierId); + + // naive clear all ace's first + while (!acl.getEntries().isEmpty()) { + try { + acl.deleteAce(0); + } catch (NotFoundException e) { + break; + } + } + + log.info("Setting members and approvers to ACL for dossier: {}", dossierId); + + if (owner != null) { + acl.insertAce(0, RedPermission.OWNER, new PrincipalSid(owner), true); + } + + members.forEach(member -> acl.insertAce(0, RedPermission.REVIEW, new PrincipalSid(member), true)); + + approvers.forEach(member -> acl.insertAce(0, RedPermission.APPROVE, new PrincipalSid(member), true)); + + mutableAclService.updateAcl(acl); + + customPermissionService.applyCustomPermissions(getIdentifier(), dossierId); + } + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/dossier/ViewObjectDossierObjectPermissionService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/dossier/ViewObjectDossierObjectPermissionService.java new file mode 100644 index 000000000..dddb54669 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/dossier/ViewObjectDossierObjectPermissionService.java @@ -0,0 +1,58 @@ +package com.iqser.red.service.persistence.management.v1.processor.acl.custom.dossier; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Set; +import java.util.stream.Collectors; + +import org.springframework.security.acls.model.MutableAclService; +import org.springframework.stereotype.Service; + +import com.iqser.red.keycloak.commons.UserListingService; +import com.iqser.red.service.persistence.management.v1.processor.acl.RedPermission; +import com.iqser.red.service.persistence.management.v1.processor.acl.custom.api.ICustomPermissionService; +import com.iqser.red.service.persistence.management.v1.processor.service.DossierManagementService; +import com.iqser.red.service.persistence.management.v1.processor.service.TenantManagementService; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.Dossier; + +@Service +public class ViewObjectDossierObjectPermissionService extends ICustomPermissionService { + + private final DossierManagementService dossierManagementService; + + + public ViewObjectDossierObjectPermissionService(UserListingService userService, MutableAclService mutableAclService, DossierManagementService dossierManagementService) { + + super(userService, mutableAclService); + this.dossierManagementService = dossierManagementService; + } + + + @Override + public String getIdentifier() { + + return "Dossier"; + } + + + @Override + protected Collection provideAllObjectIds() { + + return dossierManagementService.getAllDossiers(true, true).stream().map(Dossier::getId).collect(Collectors.toList()); + } + + + @Override + public Set definingPermissions() { + + return Set.of(RedPermission.APPROVE, RedPermission.REVIEW, RedPermission.OWNER); + } + + + @Override + public RedPermission forPermission() { + + return RedPermission.VIEW_OBJECT; + } + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/initializer/ACLInitializer.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/initializer/ACLInitializer.java new file mode 100644 index 000000000..552f03d4e --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/initializer/ACLInitializer.java @@ -0,0 +1,26 @@ +package com.iqser.red.service.persistence.management.v1.processor.acl.custom.initializer; + +import java.util.Comparator; +import java.util.List; + +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.stereotype.Service; + +import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; + +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +public class ACLInitializer { + + private final List aclInitializerList; + + public void run() { + + aclInitializerList.sort(Comparator.comparingInt(IACLInitializer::sort)); + aclInitializerList.forEach(IACLInitializer::initialize); + } + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/initializer/CustomDossierPermissionsACLInitializer.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/initializer/CustomDossierPermissionsACLInitializer.java new file mode 100644 index 000000000..51a8b773f --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/initializer/CustomDossierPermissionsACLInitializer.java @@ -0,0 +1,65 @@ +package com.iqser.red.service.persistence.management.v1.processor.acl.custom.initializer; + +import static com.iqser.red.service.persistence.management.v1.processor.acl.custom.constants.CustomPermissionConstants.EVERYONE_ELSE; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.stereotype.Service; + +import com.iqser.red.service.persistence.management.v1.processor.acl.RedPermission; +import com.iqser.red.service.persistence.management.v1.processor.acl.custom.service.CustomPermissionService; +import com.iqser.red.service.persistence.management.v1.processor.service.TenantManagementService; +import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; +import com.iqser.red.service.persistence.service.v1.api.shared.model.permission.CustomPermissionMappingModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.permission.CustomPermissionModel; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Service +@RequiredArgsConstructor +public class CustomDossierPermissionsACLInitializer implements IACLInitializer { + + private static final String TARGET_OBJECT = "Dossier"; + private final CustomPermissionService customPermissionService; + + public void initialize() { + if (customPermissionService.getCustomPermissionMappings(TARGET_OBJECT).isEmpty()) { + + log.info("No custom permissions seeded. Adding defaults!"); + + List mappingModels = new ArrayList<>(); + + var viewObjectPermission = convert(RedPermission.VIEW_OBJECT); + var viewObjectMappedPermissions = List.of(convert(RedPermission.OWNER), convert(RedPermission.APPROVE), convert(RedPermission.REVIEW), EVERYONE_ELSE); + + mappingModels.add(new CustomPermissionMappingModel(viewObjectPermission, viewObjectMappedPermissions)); + + var accessObjectPermission = convert(RedPermission.ACCESS_OBJECT); + var accessObjectMappedPermissions = List.of(convert(RedPermission.OWNER), convert(RedPermission.APPROVE), convert(RedPermission.REVIEW), EVERYONE_ELSE); + + mappingModels.add(new CustomPermissionMappingModel(accessObjectPermission, accessObjectMappedPermissions)); + + customPermissionService.saveCustomPermissionMappings(TARGET_OBJECT, mappingModels); + + } + + customPermissionService.syncAllCustomPermissions(); + } + + + @Override + public int sort() { + + return 10; + } + + + private CustomPermissionModel convert(RedPermission redPermission) { + + return new CustomPermissionModel(redPermission.getMask(), redPermission.getName(), redPermission.getSort()); + } + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/initializer/IACLInitializer.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/initializer/IACLInitializer.java new file mode 100644 index 000000000..a7f2b0acf --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/initializer/IACLInitializer.java @@ -0,0 +1,10 @@ +package com.iqser.red.service.persistence.management.v1.processor.acl.custom.initializer; + +public interface IACLInitializer { + + void initialize(); + + + int sort(); + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/job/SyncUserPermissionsJob.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/job/SyncUserPermissionsJob.java new file mode 100644 index 000000000..2b8ae03a5 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/job/SyncUserPermissionsJob.java @@ -0,0 +1,31 @@ +package com.iqser.red.service.persistence.management.v1.processor.acl.custom.job; + +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; + +import com.iqser.red.service.persistence.management.v1.processor.acl.custom.service.CustomPermissionService; +import com.iqser.red.service.persistence.management.v1.processor.service.TenantManagementService; +import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Service +@RequiredArgsConstructor +public class SyncUserPermissionsJob { + + private final CustomPermissionService customPermissionService; + + private final TenantManagementService tenantManagementService; + + + @Scheduled(fixedRate = 1000 * 60 * 10, initialDelay = 1000 * 60) + public void syncCustomPermissions() { + tenantManagementService.getTenants().forEach(tenant -> { + TenantContext.setTenantId(tenant.getTenantId()); + customPermissionService.syncAllCustomPermissions(); + }); + } + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/service/CustomPermissionService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/service/CustomPermissionService.java new file mode 100644 index 000000000..c9aef18fa --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/service/CustomPermissionService.java @@ -0,0 +1,184 @@ +package com.iqser.red.service.persistence.management.v1.processor.acl.custom.service; + +import static com.iqser.red.service.persistence.management.v1.processor.acl.custom.constants.CustomPermissionConstants.EVERYONE_ELSE; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.iqser.red.service.persistence.management.v1.processor.acl.AbstractACLService; +import com.iqser.red.service.persistence.management.v1.processor.acl.RedPermission; +import com.iqser.red.service.persistence.management.v1.processor.acl.custom.api.ICustomPermissionService; +import com.iqser.red.service.persistence.management.v1.processor.entity.permissions.CustomPermissionEntity; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.CustomPermissionRepository; +import com.iqser.red.service.persistence.service.v1.api.shared.model.permission.CustomPermissionMappingModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.permission.CustomPermissionModel; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Service +@RequiredArgsConstructor +public class CustomPermissionService { + + private final CustomPermissionRepository customPermissionRepository; + + private final List> customPermissionServices; + + + public void syncAllCustomPermissions() { + + log.info("Syncing all custom permissions"); + var targetObjects = getAllSupportedTargetObjects(); + targetObjects.forEach(this::applyCustomPermissions); + log.info("All custom permissions synced"); + } + + + public Set getAllSupportedTargetObjects() { + + return customPermissionServices.stream().map(AbstractACLService::getIdentifier).collect(Collectors.toSet()); + } + + + public void applyCustomPermissions(String targetObject) { + + var mappings = getCustomPermissionMappings(targetObject); + apply(mappings); + } + + + public List getCustomPermissionMappings(String targetObject) { + + var all = customPermissionRepository.findByTargetObject(targetObject); + + Map> mapping = new HashMap<>(); + + for (var permission : all) { + + var targetPermission = RedPermission.resolvePermission(permission.getTargetPermissionMask()); + + if (targetPermission.isEmpty()) { + log.warn("Invalid saved permission: {}", permission.getTargetPermissionMask()); + continue; + } + + var key = fromPermission(targetPermission.get()); + var value = RedPermission.resolvePermission(permission.getExistingPermissionMask()).map(this::fromPermission).orElse(EVERYONE_ELSE); + + var list = mapping.computeIfAbsent(key, entry -> new ArrayList<>()); + list.add(value); + } + + var result = new ArrayList(); + mapping.forEach((k, v) -> result.add(new CustomPermissionMappingModel(k, v))); + return result; + } + + + public void apply(List customPermissionMappingModels) { + + customPermissionMappingModels.forEach(p -> customPermissionServices.forEach(s -> { + if (p.getTargetPermission().getMask() == s.forPermission().getMask()) { + s.applyCustomPermissions(p); + } + })); + } + + + private CustomPermissionModel fromPermission(RedPermission redPermission) { + + return new CustomPermissionModel(redPermission.getMask(), redPermission.getName(), redPermission.getSort()); + } + + + public void applyCustomPermissions(String targetObject, String objectId) { + + var mappings = getCustomPermissionMappings(targetObject); + apply(mappings, objectId); + } + + + public void apply(List customPermissionMappingModels, Serializable objectId) { + + customPermissionMappingModels.forEach(p -> customPermissionServices.forEach(s -> { + if (p.getTargetPermission().getMask() == s.forPermission().getMask()) { + s.applyCustomPermissions(p, objectId); + } + })); + } + + + public List getTargetPermissions(String targetObject) { + + Set permissionModels = new HashSet<>(); + + customPermissionServices.forEach(service -> { + if (service.getIdentifier().equals(targetObject)) { + permissionModels.add(fromPermission(service.forPermission())); + } + }); + + var result = new ArrayList<>(permissionModels); + result.sort(Comparator.comparingInt(CustomPermissionModel::getSort)); + return result; + } + + + public List getExistingPermissions(String targetObject) { + + var result = new ArrayList(); + + customPermissionServices.forEach(service -> { + + if (service.getIdentifier().equals(targetObject)) { + + CustomPermissionMappingModel cmp = new CustomPermissionMappingModel(); + List permissionModels = new ArrayList<>(); + service.definingPermissions().forEach(dp -> permissionModels.add(fromPermission(dp))); + + if (service.allowEveryoneElseSetting()) { + permissionModels.add(EVERYONE_ELSE); + } + + permissionModels.sort(Comparator.comparingInt(CustomPermissionModel::getSort)); + + cmp.setMappedPermissions(permissionModels); + cmp.setTargetPermission(fromPermission(service.forPermission())); + + result.add(cmp); + } + }); + + result.sort(Comparator.comparingInt(a -> a.getTargetPermission().getSort())); + return result; + } + + + @Transactional + public void saveCustomPermissionMappings(String targetObject, List customPermissionMappingModel) { + + List entities = new ArrayList<>(); + + customPermissionMappingModel.forEach(c -> c.getMappedPermissions().forEach(value -> { + CustomPermissionEntity entity = new CustomPermissionEntity(targetObject, c.getTargetPermission().getMask(), value.getMask()); + entities.add(entity); + })); + + customPermissionRepository.deleteByTargetObject(targetObject); + customPermissionRepository.saveAll(entities); + + this.apply(getCustomPermissionMappings(targetObject)); + } + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/client/PDFTronRedactionClient.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/client/pdftronredactionservice/PDFTronClient.java similarity index 53% rename from persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/client/PDFTronRedactionClient.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/client/pdftronredactionservice/PDFTronClient.java index f4bab0073..712c0ac80 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/client/PDFTronRedactionClient.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/client/pdftronredactionservice/PDFTronClient.java @@ -1,10 +1,10 @@ -package com.iqser.red.service.persistence.management.v1.processor.client; +package com.iqser.red.service.persistence.management.v1.processor.client.pdftronredactionservice; import org.springframework.cloud.openfeign.FeignClient; import com.iqser.red.service.pdftron.redaction.v1.api.resources.PDFTronRedactionResource; -@FeignClient(name = "PDFTronRedactionClient", url = "${pdftron-redaction-service.url}") -public interface PDFTronRedactionClient extends PDFTronRedactionResource { +@FeignClient(name = "PDFTronRedactionResource", url = "${pdftron-redaction-service.url}") +public interface PDFTronClient extends PDFTronRedactionResource { } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/client/redactionreportservice/PlaceholderClient.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/client/redactionreportservice/PlaceholderClient.java new file mode 100644 index 000000000..1572d88c0 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/client/redactionreportservice/PlaceholderClient.java @@ -0,0 +1,10 @@ +package com.iqser.red.service.persistence.management.v1.processor.client.redactionreportservice; + +import org.springframework.cloud.openfeign.FeignClient; + +import com.iqser.red.service.redaction.report.v1.api.resource.PlaceholderResource; + +@FeignClient(name = "PlaceholderClient", url = "${redaction-report-service.url}") +public interface PlaceholderClient extends PlaceholderResource { + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/client/redactionreportservice/ReportTemplatePlaceholderClient.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/client/redactionreportservice/ReportTemplatePlaceholderClient.java new file mode 100644 index 000000000..7e9e924aa --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/client/redactionreportservice/ReportTemplatePlaceholderClient.java @@ -0,0 +1,10 @@ +package com.iqser.red.service.persistence.management.v1.processor.client.redactionreportservice; + +import org.springframework.cloud.openfeign.FeignClient; + +import com.iqser.red.service.redaction.report.v1.api.resource.ReportTemplateResource; + +@FeignClient(name = "ReportTemplatePlaceholderResource", url = "${redaction-report-service.url}") +public interface ReportTemplatePlaceholderClient extends ReportTemplateResource { + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/client/redactionreportservice/RssReportClient.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/client/redactionreportservice/RssReportClient.java new file mode 100644 index 000000000..6239b34fa --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/client/redactionreportservice/RssReportClient.java @@ -0,0 +1,10 @@ +package com.iqser.red.service.persistence.management.v1.processor.client.redactionreportservice; + +import org.springframework.cloud.openfeign.FeignClient; + +import com.iqser.red.service.redaction.report.v1.api.resource.RSSResource; + +@FeignClient(name = "RssReportClient", url = "${redaction-report-service.url}") +public interface RssReportClient extends RSSResource { + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/client/redactionreportservice/StatusReportClient.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/client/redactionreportservice/StatusReportClient.java new file mode 100644 index 000000000..45077a7cb --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/client/redactionreportservice/StatusReportClient.java @@ -0,0 +1,10 @@ +package com.iqser.red.service.persistence.management.v1.processor.client.redactionreportservice; + +import org.springframework.cloud.openfeign.FeignClient; + +import com.iqser.red.service.redaction.report.v1.api.resource.StatusReportResource; + +@FeignClient(name = "StatusReportClient", url = "${redaction-report-service.url}") +public interface StatusReportClient extends StatusReportResource { + +} diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/client/RedactionClient.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/client/redactionservice/RedactionClient.java similarity index 54% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/client/RedactionClient.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/client/redactionservice/RedactionClient.java index 3a810a406..f82e92381 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/client/RedactionClient.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/client/redactionservice/RedactionClient.java @@ -1,10 +1,10 @@ -package com.iqser.red.service.peristence.v1.server.client; +package com.iqser.red.service.persistence.management.v1.processor.client.redactionservice; import org.springframework.cloud.openfeign.FeignClient; import com.iqser.red.service.redaction.v1.resources.RedactionResource; -@FeignClient(name = "RedactionResource", url = "${redaction-service.url}") +@FeignClient(name = "RedactionClient", url = "${redaction-service.url}") public interface RedactionClient extends RedactionResource { } diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/client/SearchClient.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/client/searchservice/SearchClient.java similarity index 74% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/client/SearchClient.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/client/searchservice/SearchClient.java index 63f5bd2bf..fb0944789 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/client/SearchClient.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/client/searchservice/SearchClient.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.client; +package com.iqser.red.service.persistence.management.v1.processor.client.searchservice; import org.springframework.cloud.openfeign.FeignClient; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/configuration/CleanupDownloadSchedulerConfiguration.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/configuration/CleanupDownloadSchedulerConfiguration.java similarity index 90% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/configuration/CleanupDownloadSchedulerConfiguration.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/configuration/CleanupDownloadSchedulerConfiguration.java index f5669e018..9a9f5e26d 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/configuration/CleanupDownloadSchedulerConfiguration.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/configuration/CleanupDownloadSchedulerConfiguration.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.configuration; +package com.iqser.red.service.persistence.management.v1.processor.configuration; import java.util.concurrent.Executor; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/configuration/MessagingConfiguration.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/configuration/MessagingConfiguration.java similarity index 99% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/configuration/MessagingConfiguration.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/configuration/MessagingConfiguration.java index ad4636296..601d1b5d1 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/configuration/MessagingConfiguration.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/configuration/MessagingConfiguration.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.configuration; +package com.iqser.red.service.persistence.management.v1.processor.configuration; import org.springframework.amqp.core.Queue; import org.springframework.amqp.core.QueueBuilder; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/IBaseAnnotation.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/IBaseAnnotation.java index 10bd620b5..814751f53 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/IBaseAnnotation.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/IBaseAnnotation.java @@ -2,7 +2,7 @@ package com.iqser.red.service.persistence.management.v1.processor.entity.annotat import java.time.OffsetDateTime; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; public interface IBaseAnnotation { diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/IdRemovalEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/IdRemovalEntity.java index 639fe738f..a9b33251b 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/IdRemovalEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/IdRemovalEntity.java @@ -11,7 +11,7 @@ import javax.persistence.ManyToOne; import javax.persistence.Table; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualForceRedactionEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualForceRedactionEntity.java index fcd174b4b..c0f20732a 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualForceRedactionEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualForceRedactionEntity.java @@ -11,7 +11,7 @@ import javax.persistence.ManyToOne; import javax.persistence.Table; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualImageRecategorizationEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualImageRecategorizationEntity.java index e2481fb37..2e916373b 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualImageRecategorizationEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualImageRecategorizationEntity.java @@ -11,7 +11,7 @@ import javax.persistence.ManyToOne; import javax.persistence.Table; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualLegalBasisChangeEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualLegalBasisChangeEntity.java index d4f16ad5e..45a2ddc40 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualLegalBasisChangeEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualLegalBasisChangeEntity.java @@ -11,7 +11,7 @@ import javax.persistence.ManyToOne; import javax.persistence.Table; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualRedactionEntryEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualRedactionEntryEntity.java index b7dd941f0..815170ddd 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualRedactionEntryEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualRedactionEntryEntity.java @@ -18,8 +18,8 @@ import org.hibernate.annotations.Fetch; import org.hibernate.annotations.FetchMode; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.DictionaryEntryType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionaryEntryType; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualResizeRedactionEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualResizeRedactionEntity.java index 45e5738c9..1709ec6c7 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualResizeRedactionEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualResizeRedactionEntity.java @@ -18,7 +18,7 @@ import org.hibernate.annotations.Fetch; import org.hibernate.annotations.FetchMode; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/ColorsEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/ColorsEntity.java index 083bea5a9..284a481fa 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/ColorsEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/ColorsEntity.java @@ -1,6 +1,11 @@ package com.iqser.red.service.persistence.management.v1.processor.entity.configuration; -import javax.persistence.*; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.PrePersist; +import javax.persistence.PreUpdate; +import javax.persistence.Table; import lombok.AllArgsConstructor; import lombok.Builder; @@ -44,17 +49,16 @@ public class ColorsEntity { @Column private String appliedRedactionColor; + @PrePersist public void prePersist() { + this.adjustColors(); } - @PreUpdate - public void preUpdate() { - this.adjustColors(); - } private void adjustColors() { + requestAddColor = setToLowerCase(requestAddColor); requestRemoveColor = setToLowerCase(requestRemoveColor); dictionaryRequestColor = setToLowerCase(dictionaryRequestColor); @@ -68,11 +72,20 @@ public class ColorsEntity { appliedRedactionColor = setToLowerCase(appliedRedactionColor); } + private String setToLowerCase(String color) { + if (color == null) { return null; } return color.toLowerCase(); } + + @PreUpdate + public void preUpdate() { + + this.adjustColors(); + } + } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/DigitalSignatureEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/DigitalSignatureEntity.java index 4690af7e0..0d19c49aa 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/DigitalSignatureEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/DigitalSignatureEntity.java @@ -6,7 +6,7 @@ import javax.persistence.Id; import javax.persistence.Lob; import javax.persistence.Table; -import com.iqser.red.service.persistence.service.v1.api.utils.SuppressFBWarnings; +import com.iqser.red.service.persistence.service.v1.api.shared.model.utils.SuppressFBWarnings; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/DigitalSignatureKmsEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/DigitalSignatureKmsEntity.java index c77fab53c..14e713e23 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/DigitalSignatureKmsEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/DigitalSignatureKmsEntity.java @@ -6,7 +6,7 @@ import javax.persistence.Id; import javax.persistence.Lob; import javax.persistence.Table; -import com.iqser.red.service.persistence.service.v1.api.utils.SuppressFBWarnings; +import com.iqser.red.service.persistence.service.v1.api.shared.model.utils.SuppressFBWarnings; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/DigitalSignatureTypeEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/DigitalSignatureTypeEntity.java index 1ec19d952..0e18e3e9b 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/DigitalSignatureTypeEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/DigitalSignatureTypeEntity.java @@ -7,8 +7,8 @@ import javax.persistence.Enumerated; import javax.persistence.Id; import javax.persistence.Table; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.DigitalSignatureType; -import com.iqser.red.service.persistence.service.v1.api.utils.SuppressFBWarnings; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.DigitalSignatureType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.utils.SuppressFBWarnings; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/SMTPConfigurationEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/SMTPConfigurationEntity.java index 8461bf215..6628b7044 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/SMTPConfigurationEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/SMTPConfigurationEntity.java @@ -5,7 +5,7 @@ import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; -import com.iqser.red.service.persistence.service.v1.api.utils.SuppressFBWarnings; +import com.iqser.red.service.persistence.service.v1.api.shared.model.utils.SuppressFBWarnings; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/WatermarkEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/WatermarkEntity.java index a47179a78..9d18cb238 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/WatermarkEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/WatermarkEntity.java @@ -15,7 +15,7 @@ import javax.persistence.ManyToOne; import javax.persistence.Table; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierTemplateEntity; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.WatermarkOrientation; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.WatermarkOrientation; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierAttributeConfigEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierAttributeConfigEntity.java index 2a78b923b..fa5fc0955 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierAttributeConfigEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierAttributeConfigEntity.java @@ -8,7 +8,7 @@ import javax.persistence.Id; import javax.persistence.ManyToOne; import javax.persistence.Table; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierAttributeType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.DossierAttributeType; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierEntity.java index 496d6ea99..126193a57 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierEntity.java @@ -28,8 +28,8 @@ import com.iqser.red.service.persistence.management.v1.processor.entity.configur import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.WatermarkEntity; import com.iqser.red.service.persistence.management.v1.processor.utils.JSONDownloadFileTypeConverter; import com.iqser.red.service.persistence.management.v1.processor.utils.JSONStringSetConverter; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DownloadFileType; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierVisibility; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DownloadFileType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.DossierVisibility; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierTemplateEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierTemplateEntity.java index 8762f1d80..2bafd202d 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierTemplateEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierTemplateEntity.java @@ -20,8 +20,8 @@ import org.hibernate.annotations.FetchMode; import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.TypeEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.WatermarkEntity; import com.iqser.red.service.persistence.management.v1.processor.utils.JSONDownloadFileTypeConverter; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierTemplateStatus; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DownloadFileType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierTemplateStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DownloadFileType; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/FileAttributeConfigEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/FileAttributeConfigEntity.java index f3d537f9c..b0bb6a1e5 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/FileAttributeConfigEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/FileAttributeConfigEntity.java @@ -9,7 +9,7 @@ import javax.persistence.ManyToOne; import javax.persistence.Table; import com.fasterxml.jackson.annotation.JsonIgnore; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileAttributeType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileAttributeType; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/FileEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/FileEntity.java index 29dec7114..5e8ddf106 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/FileEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/FileEntity.java @@ -22,8 +22,8 @@ import org.hibernate.annotations.Fetch; import org.hibernate.annotations.FetchMode; import com.iqser.red.service.persistence.management.v1.processor.utils.JSONIntegerSetConverter; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.ProcessingStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/download/DownloadStatusEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/download/DownloadStatusEntity.java index 1966cf8b7..544b9ba28 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/download/DownloadStatusEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/download/DownloadStatusEntity.java @@ -24,8 +24,8 @@ import com.iqser.red.service.persistence.management.v1.processor.entity.dossier. import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.ReportTemplateEntity; import com.iqser.red.service.persistence.management.v1.processor.utils.JSONDownloadFileTypeConverter; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DownloadFileType; -import com.iqser.red.service.persistence.service.v1.api.model.download.DownloadStatusValue; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DownloadFileType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.download.DownloadStatusValue; import lombok.AccessLevel; import lombok.AllArgsConstructor; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/index/IndexInformationEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/index/IndexInformationEntity.java index fd7aebcc1..64e49c17a 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/index/IndexInformationEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/index/IndexInformationEntity.java @@ -7,7 +7,7 @@ import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; -import com.iqser.red.service.persistence.service.v1.api.utils.SuppressFBWarnings; +import com.iqser.red.service.persistence.service.v1.api.shared.model.utils.SuppressFBWarnings; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/notification/NotificationPreferencesEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/notification/NotificationPreferencesEntity.java index 799dfdafc..0f7d88ac5 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/notification/NotificationPreferencesEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/notification/NotificationPreferencesEntity.java @@ -12,7 +12,7 @@ import javax.persistence.Table; import org.hibernate.annotations.Fetch; import org.hibernate.annotations.FetchMode; -import com.iqser.red.service.persistence.service.v1.api.model.notification.EmailNotificationType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.notification.EmailNotificationType; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/permissions/CustomPermissionEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/permissions/CustomPermissionEntity.java new file mode 100644 index 000000000..4cad37374 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/permissions/CustomPermissionEntity.java @@ -0,0 +1,46 @@ +package com.iqser.red.service.persistence.management.v1.processor.entity.permissions; + +import java.io.Serializable; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.IdClass; +import javax.persistence.Table; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Entity +@NoArgsConstructor +@AllArgsConstructor +@Table(name = "ACL_CUSTOM_PERMISSIONS") +@IdClass(CustomPermissionEntity.CustomPermissionEntityId.class) +public class CustomPermissionEntity { + + @Id + @Column(name = "target_object") + private String targetObject; + + @Id + @Column(name = "target_permission_mask") + private int targetPermissionMask; + + @Id + @Column(name = "existing_permission_mask") + private int existingPermissionMask; + + @Data + @AllArgsConstructor + @NoArgsConstructor + public static class CustomPermissionEntityId implements Serializable { + + private String targetObject; + private int targetPermissionMask; + private int existingPermissionMask; + + } + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/exception/AuthenticationFailedException.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/exception/AuthenticationFailedException.java new file mode 100644 index 000000000..b1b3f169d --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/exception/AuthenticationFailedException.java @@ -0,0 +1,28 @@ +package com.iqser.red.service.persistence.management.v1.processor.exception; + +public class AuthenticationFailedException extends RuntimeException { + + public AuthenticationFailedException(String message) { + + super(message); + } + + + public AuthenticationFailedException(String message, Throwable cause) { + + super(message, cause); + } + + + public AuthenticationFailedException(Throwable cause) { + + super("invalid name or password", cause); + } + + + public AuthenticationFailedException() { + + super("invalid name or password"); + } + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/exception/ConflictException.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/exception/ConflictException.java index 7e268bf97..dae006817 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/exception/ConflictException.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/exception/ConflictException.java @@ -8,6 +8,12 @@ public class ConflictException extends RuntimeException { } + public ConflictException(String message, Throwable t) { + + super(message, t); + } + + public static ConflictException withObjectName(String objectName) { return new ConflictException(String.format("An object of type %s already exists.", objectName)); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/exception/DownloadException.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/exception/DownloadException.java new file mode 100644 index 000000000..25c756700 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/exception/DownloadException.java @@ -0,0 +1,16 @@ +package com.iqser.red.service.persistence.management.v1.processor.exception; + +public class DownloadException extends RuntimeException { + + public DownloadException(String message) { + + super(message); + } + + + public DownloadException(String message, Throwable cause) { + + super(message, cause); + } + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/exception/FileUploadException.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/exception/FileUploadException.java new file mode 100644 index 000000000..b6c2e28fa --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/exception/FileUploadException.java @@ -0,0 +1,16 @@ +package com.iqser.red.service.persistence.management.v1.processor.exception; + +public class FileUploadException extends RuntimeException { + + public FileUploadException(String message) { + + super(message); + } + + + public FileUploadException(String message, Throwable cause) { + + super(message, cause); + } + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/exception/InvalidRealmException.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/exception/InvalidRealmException.java new file mode 100644 index 000000000..cec9b544c --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/exception/InvalidRealmException.java @@ -0,0 +1,16 @@ +package com.iqser.red.service.persistence.management.v1.processor.exception; + +public class InvalidRealmException extends RuntimeException { + + public InvalidRealmException(String message) { + + super(message); + } + + + public InvalidRealmException(String message, Throwable t) { + + super(message, t); + } + +} diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/exception/InvalidRulesException.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/exception/InvalidRulesException.java similarity index 65% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/exception/InvalidRulesException.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/exception/InvalidRulesException.java index e1ac5c5c5..4a54126ef 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/exception/InvalidRulesException.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/exception/InvalidRulesException.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.exception; +package com.iqser.red.service.persistence.management.v1.processor.exception; public class InvalidRulesException extends RuntimeException { diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/exception/JSONParseException.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/exception/JSONParseException.java similarity index 67% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/exception/JSONParseException.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/exception/JSONParseException.java index ed681c694..db5cfb5a5 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/exception/JSONParseException.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/exception/JSONParseException.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.exception; +package com.iqser.red.service.persistence.management.v1.processor.exception; public class JSONParseException extends RuntimeException { diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/exception/MigrationException.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/exception/MigrationException.java similarity index 75% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/exception/MigrationException.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/exception/MigrationException.java index 741815109..95c45fbd5 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/exception/MigrationException.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/exception/MigrationException.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.exception; +package com.iqser.red.service.persistence.management.v1.processor.exception; public class MigrationException extends RuntimeException { @@ -13,4 +13,4 @@ public class MigrationException extends RuntimeException { super(message); } -} \ No newline at end of file +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/exception/NotAllowedException.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/exception/NotAllowedException.java new file mode 100644 index 000000000..084564c0f --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/exception/NotAllowedException.java @@ -0,0 +1,16 @@ +package com.iqser.red.service.persistence.management.v1.processor.exception; + +public class NotAllowedException extends RuntimeException { + + public NotAllowedException(String message) { + + super(message); + } + + + public NotAllowedException(String message, Throwable t) { + + super(message, t); + } + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/exception/NotFoundException.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/exception/NotFoundException.java index f82dc0198..48001af5b 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/exception/NotFoundException.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/exception/NotFoundException.java @@ -7,4 +7,9 @@ public class NotFoundException extends RuntimeException { super(message); } + public NotFoundException(String message, Throwable t) { + + super(message, t); + } + } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/job/KeyCloakUserSyncJob.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/job/KeyCloakUserSyncJob.java new file mode 100644 index 000000000..7cf7637fa --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/job/KeyCloakUserSyncJob.java @@ -0,0 +1,23 @@ +package com.iqser.red.service.persistence.management.v1.processor.job; + +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Service +@RequiredArgsConstructor +public class KeyCloakUserSyncJob { + + private final KeyCloakUserSyncService keyCloakUserSyncService; + + + @Scheduled(fixedRate = 1000 * 60, initialDelay = 1000 * 60) + public void syncCustomPermissions() { + + keyCloakUserSyncService.syncUsersWithKC(); + } + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/job/KeyCloakUserSyncService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/job/KeyCloakUserSyncService.java new file mode 100644 index 000000000..01407a638 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/job/KeyCloakUserSyncService.java @@ -0,0 +1,62 @@ +package com.iqser.red.service.persistence.management.v1.processor.job; + +import java.util.HashSet; +import java.util.stream.Collectors; + +import org.springframework.stereotype.Service; + +import com.iqser.red.keycloak.commons.UserListingService; +import com.iqser.red.keycloak.commons.model.User; +import com.iqser.red.service.persistence.management.v1.processor.acl.custom.dossier.DossierACLService; +import com.iqser.red.service.persistence.management.v1.processor.service.DossierManagementService; +import com.iqser.red.service.persistence.management.v1.processor.service.TenantManagementService; +import com.iqser.red.service.persistence.management.v1.processor.service.UserService; +import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Service +@RequiredArgsConstructor +public class KeyCloakUserSyncService { + + private final UserService userService; + private final UserListingService userListingService; + private final DossierManagementService dossierManagementService; + private final DossierACLService dossierACLService; + private final TenantManagementService tenantManagementService; + + + public void syncUsersWithKC() { + + var allUsers = userListingService.getAllUsers(); + // all userIds from KC + var allUserIds = allUsers.stream().map(User::getUserId).collect(Collectors.toSet()); + + tenantManagementService.getTenants().forEach(tenant -> { + + TenantContext.setTenantId(tenant.getTenantId()); + + var redactionObjectsUserIds = new HashSet(); + + var alLDossiers = dossierManagementService.getAllDossiers(true, true); + // find all userIds that are used by redaction + alLDossiers.forEach(dossier -> { + dossierACLService.enhanceDossierWithACLData(dossier); + redactionObjectsUserIds.addAll(dossier.getMemberIds()); + }); + + // remove KC users, what's left is users that are in redaction but no longer in KC + redactionObjectsUserIds.removeAll(allUserIds); + + log.info("Performing user sync/cleanup for ids: {}", redactionObjectsUserIds); + + redactionObjectsUserIds.forEach(removedUser -> alLDossiers.forEach(dossier -> this.userService.updateDossierUsers(removedUser, + UserService.UserRemovalModel.PERMANENT, + dossier))); + }); + + } + +} diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/jobs/CreateJobsConfiguration.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/jobs/CreateJobsConfiguration.java similarity index 88% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/jobs/CreateJobsConfiguration.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/jobs/CreateJobsConfiguration.java index 1d22845db..9dfa92957 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/jobs/CreateJobsConfiguration.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/jobs/CreateJobsConfiguration.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.jobs; +package com.iqser.red.service.persistence.management.v1.processor.jobs; import java.text.ParseException; @@ -11,26 +11,14 @@ import org.quartz.TriggerBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import com.iqser.red.service.peristence.v1.server.service.job.AutomaticAnalysisJob; -import com.iqser.red.service.peristence.v1.server.service.job.DeletedFilesCleanupJob; -import com.iqser.red.service.peristence.v1.server.service.job.DownloadCleanupJob; -import com.iqser.red.service.peristence.v1.server.service.job.SendNotificationEmailJob; +import com.iqser.red.service.persistence.management.v1.processor.service.job.AutomaticAnalysisJob; +import com.iqser.red.service.persistence.management.v1.processor.service.job.DeletedFilesCleanupJob; +import com.iqser.red.service.persistence.management.v1.processor.service.job.DownloadCleanupJob; +import com.iqser.red.service.persistence.management.v1.processor.service.job.SendNotificationEmailJob; @Configuration public class CreateJobsConfiguration { - @Bean - public JobDetail notificationEmailSummaryJob() { - - return JobBuilder.newJob() - .ofType(SendNotificationEmailJob.class) - .storeDurably() - .withIdentity("SendNotificationEmailJob") - .withDescription("Send summary email with daily/weekly notifications") - .build(); - } - - @Bean public Trigger notificationEmailSummaryJobTrigger() throws ParseException { @@ -44,13 +32,13 @@ public class CreateJobsConfiguration { @Bean - public JobDetail automaticAnalysisJobDetail() { + public JobDetail notificationEmailSummaryJob() { return JobBuilder.newJob() - .ofType(AutomaticAnalysisJob.class) + .ofType(SendNotificationEmailJob.class) .storeDurably() - .withIdentity("AutomaticAnalysisJob") - .withDescription("Automatically queues files for analysis") + .withIdentity("SendNotificationEmailJob") + .withDescription("Send summary email with daily/weekly notifications") .build(); } @@ -68,13 +56,13 @@ public class CreateJobsConfiguration { @Bean - public JobDetail deletedFilesCleanupJobDetail() { + public JobDetail automaticAnalysisJobDetail() { return JobBuilder.newJob() - .ofType(DeletedFilesCleanupJob.class) + .ofType(AutomaticAnalysisJob.class) .storeDurably() - .withIdentity("DeletedFilesCleanupJob") - .withDescription("Hard delete dossiers / files after certain time") + .withIdentity("AutomaticAnalysisJob") + .withDescription("Automatically queues files for analysis") .build(); } @@ -92,12 +80,12 @@ public class CreateJobsConfiguration { @Bean - public JobDetail downloadCleanupJobDetail() { + public JobDetail deletedFilesCleanupJobDetail() { return JobBuilder.newJob() - .ofType(DownloadCleanupJob.class) + .ofType(DeletedFilesCleanupJob.class) .storeDurably() - .withIdentity("DownloadCleanupJob") + .withIdentity("DeletedFilesCleanupJob") .withDescription("Hard delete dossiers / files after certain time") .build(); } @@ -114,4 +102,16 @@ public class CreateJobsConfiguration { .build(); } + + @Bean + public JobDetail downloadCleanupJobDetail() { + + return JobBuilder.newJob() + .ofType(DownloadCleanupJob.class) + .storeDurably() + .withIdentity("DownloadCleanupJob") + .withDescription("Hard delete dossiers / files after certain time") + .build(); + } + } diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/jobs/CustomQuartzConfiguration.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/jobs/CustomQuartzConfiguration.java similarity index 91% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/jobs/CustomQuartzConfiguration.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/jobs/CustomQuartzConfiguration.java index 7e65ab110..209b3c185 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/jobs/CustomQuartzConfiguration.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/jobs/CustomQuartzConfiguration.java @@ -3,7 +3,7 @@ // (powered by FernFlower decompiler) // -package com.iqser.red.service.peristence.v1.server.jobs; +package com.iqser.red.service.persistence.management.v1.processor.jobs; import java.util.Map; import java.util.Properties; @@ -14,6 +14,7 @@ import org.quartz.Calendar; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.Trigger; +import org.quartz.impl.jdbcjobstore.PostgreSQLDelegate; import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.AutoConfigureAfter; @@ -58,6 +59,7 @@ public class CustomQuartzConfiguration { @Bean @ConditionalOnMissingBean public SchedulerFactoryBean quartzScheduler(QuartzProperties properties, + @Qualifier("masterDataSource") DataSource dataSource, ObjectProvider customizers, ObjectProvider jobDetails, Map calendars, @@ -72,6 +74,7 @@ public class CustomQuartzConfiguration { schedulerFactoryBean.setSchedulerName(properties.getSchedulerName()); } + schedulerFactoryBean.setDataSource(dataSource); schedulerFactoryBean.setAutoStartup(properties.isAutoStartup()); schedulerFactoryBean.setStartupDelay((int) properties.getStartupDelay().getSeconds()); schedulerFactoryBean.setWaitForJobsToCompleteOnShutdown(properties.isWaitForJobsToCompleteOnShutdown()); @@ -80,11 +83,11 @@ public class CustomQuartzConfiguration { schedulerFactoryBean.setQuartzProperties(this.asProperties(properties.getProperties())); } - schedulerFactoryBean.setJobDetails((JobDetail[]) jobDetails.orderedStream().toArray((x$0) -> { + schedulerFactoryBean.setJobDetails(jobDetails.orderedStream().toArray((x$0) -> { return new JobDetail[x$0]; })); schedulerFactoryBean.setCalendars(calendars); - schedulerFactoryBean.setTriggers((Trigger[]) triggers.orderedStream().toArray((x$0) -> { + schedulerFactoryBean.setTriggers(triggers.orderedStream().toArray((x$0) -> { return new Trigger[x$0]; })); customizers.orderedStream().forEach((customizer) -> { @@ -135,7 +138,7 @@ public class CustomQuartzConfiguration { private DataSource getDataSource(DataSource dataSource, ObjectProvider quartzDataSource) { - DataSource dataSourceIfAvailable = (DataSource) quartzDataSource.getIfAvailable(); + DataSource dataSourceIfAvailable = quartzDataSource.getIfAvailable(); return dataSourceIfAvailable != null ? dataSourceIfAvailable : dataSource; } @@ -143,8 +146,8 @@ public class CustomQuartzConfiguration { private PlatformTransactionManager getTransactionManager(ObjectProvider transactionManager, ObjectProvider quartzTransactionManager) { - PlatformTransactionManager transactionManagerIfAvailable = (PlatformTransactionManager) quartzTransactionManager.getIfAvailable(); - return transactionManagerIfAvailable != null ? transactionManagerIfAvailable : (PlatformTransactionManager) transactionManager.getIfUnique(); + PlatformTransactionManager transactionManagerIfAvailable = quartzTransactionManager.getIfAvailable(); + return transactionManagerIfAvailable != null ? transactionManagerIfAvailable : transactionManager.getIfUnique(); } @@ -164,7 +167,7 @@ public class CustomQuartzConfiguration { OnQuartzDatasourceInitializationCondition() { - super("Quartz", new String[]{"spring.quartz.jdbc.initialize-schema"}); + super("Quartz", "spring.quartz.jdbc.initialize-schema"); } } diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/metrics/HibernateStatisticsInterceptor.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/metrics/HibernateStatisticsInterceptor.java similarity index 79% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/metrics/HibernateStatisticsInterceptor.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/metrics/HibernateStatisticsInterceptor.java index 2eae05483..6a0d05f6c 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/metrics/HibernateStatisticsInterceptor.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/metrics/HibernateStatisticsInterceptor.java @@ -1,10 +1,10 @@ -package com.iqser.red.service.peristence.v1.server.metrics; +package com.iqser.red.service.persistence.management.v1.processor.metrics; import org.hibernate.EmptyInterceptor; public class HibernateStatisticsInterceptor extends EmptyInterceptor { - private ThreadLocal queryCount = new ThreadLocal<>(); + private final ThreadLocal queryCount = new ThreadLocal<>(); public void startCounter() { diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/metrics/MetricsConfiguration.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/metrics/MetricsConfiguration.java similarity index 93% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/metrics/MetricsConfiguration.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/metrics/MetricsConfiguration.java index 8a6c91e0b..afd5685f3 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/metrics/MetricsConfiguration.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/metrics/MetricsConfiguration.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.metrics; +package com.iqser.red.service.persistence.management.v1.processor.metrics; import java.util.Map; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/metrics/PersistenceMetricsAspect.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/metrics/PersistenceMetricsAspect.java similarity index 97% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/metrics/PersistenceMetricsAspect.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/metrics/PersistenceMetricsAspect.java index 52ac54146..39872c843 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/metrics/PersistenceMetricsAspect.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/metrics/PersistenceMetricsAspect.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.metrics; +package com.iqser.red.service.persistence.management.v1.processor.metrics; import java.util.concurrent.TimeUnit; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/AsyncMigrationStarterService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/AsyncMigrationStarterService.java similarity index 68% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/AsyncMigrationStarterService.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/AsyncMigrationStarterService.java index 9a63cd1b9..572af8252 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/AsyncMigrationStarterService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/AsyncMigrationStarterService.java @@ -1,9 +1,10 @@ -package com.iqser.red.service.peristence.v1.server.migration; +package com.iqser.red.service.persistence.management.v1.processor.migration; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; -import com.iqser.red.service.peristence.v1.server.service.job.AutomaticAnalysisJob; +import com.iqser.red.service.persistence.management.v1.processor.acl.custom.initializer.ACLInitializer; +import com.iqser.red.service.persistence.management.v1.processor.service.job.AutomaticAnalysisJob; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -15,6 +16,7 @@ public class AsyncMigrationStarterService { private final AutomaticAnalysisJob automaticAnalysisJob; private final MigrationStarterService migrationStarterService; + private final ACLInitializer aclInitializer; @Async @@ -23,6 +25,7 @@ public class AsyncMigrationStarterService { try { automaticAnalysisJob.setSchedulingStopped(true); migrationStarterService.runForTenant(tenantId); + aclInitializer.run(); automaticAnalysisJob.setSchedulingStopped(false); } catch (Exception e) { automaticAnalysisJob.setSchedulingStopped(false); diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/Migration.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/Migration.java similarity index 94% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/Migration.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/Migration.java index d5d2893bf..125ce8815 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/Migration.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/Migration.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.migration; +package com.iqser.red.service.persistence.management.v1.processor.migration; import org.springframework.beans.factory.annotation.Autowired; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/MigrationController.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/MigrationController.java similarity index 91% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/MigrationController.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/MigrationController.java index 65029875a..918f1f129 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/MigrationController.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/MigrationController.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.migration; +package com.iqser.red.service.persistence.management.v1.processor.migration; import java.util.List; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/MigrationStarterService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/MigrationStarterService.java similarity index 93% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/MigrationStarterService.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/MigrationStarterService.java index 4d9e41ce6..aa318b542 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/MigrationStarterService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/MigrationStarterService.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.migration; +package com.iqser.red.service.persistence.management.v1.processor.migration; import java.util.Comparator; import java.util.List; @@ -9,9 +9,9 @@ import org.springframework.context.ApplicationContext; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Service; -import com.iqser.red.service.peristence.v1.server.settings.FileManagementServiceSettings; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.MigrationPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.mulitenancy.repository.TenantRepository; +import com.iqser.red.service.persistence.management.v1.processor.settings.FileManagementServiceSettings; import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; import lombok.RequiredArgsConstructor; @@ -55,6 +55,15 @@ public class MigrationStarterService { } + private void seedMigration() { + + if (migrationPersistenceService.getLatestProcessedVersion() == null) { + migrations.sort(Comparator.comparing(Migration::getVersion).reversed()); + migrationPersistenceService.insertMigration("migration start version", migrations.get(0).getVersion()); + } + } + + public void runForTenant(String tenantId) { TenantContext.setTenantId(tenantId); @@ -71,13 +80,4 @@ public class MigrationStarterService { log.info("Migration is finished for tenant: " + tenantId); } - - private void seedMigration() { - - if (migrationPersistenceService.getLatestProcessedVersion() == null) { - migrations.sort(Comparator.comparing(Migration::getVersion).reversed()); - migrationPersistenceService.insertMigration("migration start version", migrations.get(0).getVersion()); - } - } - } diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/DeleteRemovedManualAddRedactions7.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/DeleteRemovedManualAddRedactions7.java similarity index 89% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/DeleteRemovedManualAddRedactions7.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/DeleteRemovedManualAddRedactions7.java index dd0f8e12a..a072394e3 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/DeleteRemovedManualAddRedactions7.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/DeleteRemovedManualAddRedactions7.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.migration.migrations; +package com.iqser.red.service.persistence.management.v1.processor.migration.migrations; import java.util.List; @@ -6,10 +6,10 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import com.iqser.red.service.peristence.v1.server.migration.Migration; -import com.iqser.red.service.peristence.v1.server.service.ManualRedactionProviderService; import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.IdRemovalEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ManualRedactionEntryEntity; +import com.iqser.red.service.persistence.management.v1.processor.migration.Migration; +import com.iqser.red.service.persistence.management.v1.processor.service.ManualRedactionProviderService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.annotations.AddRedactionPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.annotations.RemoveRedactionPersistenceService; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/DictionaryToEntityMigration2.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/DictionaryToEntityMigration2.java similarity index 87% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/DictionaryToEntityMigration2.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/DictionaryToEntityMigration2.java index e2432d9af..8c0f9f029 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/DictionaryToEntityMigration2.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/DictionaryToEntityMigration2.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.migration.migrations; +package com.iqser.red.service.persistence.management.v1.processor.migration.migrations; import java.util.ArrayList; @@ -6,12 +6,12 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.fasterxml.jackson.databind.ObjectMapper; -import com.iqser.red.service.peristence.v1.server.migration.Migration; -import com.iqser.red.service.peristence.v1.server.service.FileManagementStorageService; +import com.iqser.red.service.persistence.management.v1.processor.migration.Migration; +import com.iqser.red.service.persistence.management.v1.processor.service.FileManagementStorageService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileType; -import com.iqser.red.service.redaction.v1.model.RedactionLogEntry; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLogEntry; import lombok.Setter; import lombok.extern.slf4j.Slf4j; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/EncryptSMTPPasswordsMigration11.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/EncryptSMTPPasswordsMigration11.java similarity index 81% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/EncryptSMTPPasswordsMigration11.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/EncryptSMTPPasswordsMigration11.java index a9e1ec17b..0000c067f 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/EncryptSMTPPasswordsMigration11.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/EncryptSMTPPasswordsMigration11.java @@ -1,12 +1,14 @@ -package com.iqser.red.service.peristence.v1.server.migration.migrations; +package com.iqser.red.service.persistence.management.v1.processor.migration.migrations; + +import javax.transaction.Transactional; -import com.iqser.red.service.peristence.v1.server.migration.Migration; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.SMTPConfigurationService; -import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import javax.transaction.Transactional; +import com.iqser.red.service.persistence.management.v1.processor.migration.Migration; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.SMTPConfigurationService; + +import lombok.extern.slf4j.Slf4j; @Slf4j @Service @@ -20,6 +22,7 @@ public class EncryptSMTPPasswordsMigration11 extends Migration { public EncryptSMTPPasswordsMigration11() { + super(NAME, VERSION); } @@ -27,6 +30,7 @@ public class EncryptSMTPPasswordsMigration11 extends Migration { @Override @Transactional protected void migrate() { + smtpConfigurationService.encryptPasswordIfNecessary(); } diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/EntityTypesMigration4.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/EntityTypesMigration4.java similarity index 90% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/EntityTypesMigration4.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/EntityTypesMigration4.java index dc6ed78e0..e54b1664f 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/EntityTypesMigration4.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/EntityTypesMigration4.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.migration.migrations; +package com.iqser.red.service.persistence.management.v1.processor.migration.migrations; import java.util.List; import java.util.Set; @@ -6,12 +6,12 @@ import java.util.Set; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import com.iqser.red.service.peristence.v1.server.migration.Migration; import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.BaseDictionaryEntry; import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.TypeEntity; +import com.iqser.red.service.persistence.management.v1.processor.migration.Migration; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DictionaryPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.EntryPersistenceService; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.DictionaryEntryType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionaryEntryType; import lombok.Setter; import lombok.extern.slf4j.Slf4j; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/FileSizeMigration8.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/FileSizeMigration8.java similarity index 81% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/FileSizeMigration8.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/FileSizeMigration8.java index 0049b9aa9..9992232e8 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/FileSizeMigration8.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/FileSizeMigration8.java @@ -1,15 +1,15 @@ -package com.iqser.red.service.peristence.v1.server.migration.migrations; +package com.iqser.red.service.persistence.management.v1.processor.migration.migrations; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import com.iqser.red.service.peristence.v1.server.migration.Migration; -import com.iqser.red.service.peristence.v1.server.service.FileManagementStorageService; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity; +import com.iqser.red.service.persistence.management.v1.processor.migration.Migration; +import com.iqser.red.service.persistence.management.v1.processor.service.FileManagementStorageService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; import lombok.Setter; import lombok.extern.slf4j.Slf4j; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/IndexMigration1.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/IndexMigration1.java similarity index 72% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/IndexMigration1.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/IndexMigration1.java index ba9cf4dfa..da5fb1e3e 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/IndexMigration1.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/IndexMigration1.java @@ -1,10 +1,10 @@ -package com.iqser.red.service.peristence.v1.server.migration.migrations; +package com.iqser.red.service.persistence.management.v1.processor.migration.migrations; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import com.iqser.red.service.peristence.v1.server.migration.Migration; -import com.iqser.red.service.peristence.v1.server.service.IndexingService; +import com.iqser.red.service.persistence.management.v1.processor.migration.Migration; +import com.iqser.red.service.persistence.management.v1.processor.service.IndexingService; import lombok.Setter; import lombok.extern.slf4j.Slf4j; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/ManualRedactionTypeMigration9.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/ManualRedactionTypeMigration9.java similarity index 93% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/ManualRedactionTypeMigration9.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/ManualRedactionTypeMigration9.java index 80aee4625..3052259ad 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/ManualRedactionTypeMigration9.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/ManualRedactionTypeMigration9.java @@ -1,9 +1,9 @@ -package com.iqser.red.service.peristence.v1.server.migration.migrations; +package com.iqser.red.service.persistence.management.v1.processor.migration.migrations; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import com.iqser.red.service.peristence.v1.server.migration.Migration; +import com.iqser.red.service.persistence.management.v1.processor.migration.Migration; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DictionaryPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierTemplateRepository; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.TypeRepository; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/MigrateHighlights3.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/MigrateHighlights3.java similarity index 86% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/MigrateHighlights3.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/MigrateHighlights3.java index 966a53276..cb49dc667 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/MigrateHighlights3.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/MigrateHighlights3.java @@ -1,16 +1,16 @@ -package com.iqser.red.service.peristence.v1.server.migration.migrations; +package com.iqser.red.service.persistence.management.v1.processor.migration.migrations; import java.io.ByteArrayInputStream; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import com.iqser.red.service.peristence.v1.server.migration.Migration; -import com.iqser.red.service.peristence.v1.server.service.FileManagementStorageService; -import com.iqser.red.service.peristence.v1.server.service.FileStatusService; +import com.iqser.red.service.persistence.management.v1.processor.migration.Migration; +import com.iqser.red.service.persistence.management.v1.processor.service.FileManagementStorageService; +import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; import lombok.Setter; import lombok.extern.slf4j.Slf4j; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/ReduceTextFileSizeMigration10.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/ReduceTextFileSizeMigration10.java similarity index 86% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/ReduceTextFileSizeMigration10.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/ReduceTextFileSizeMigration10.java index e5e67ae21..15dd6c814 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/ReduceTextFileSizeMigration10.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/ReduceTextFileSizeMigration10.java @@ -1,15 +1,15 @@ -package com.iqser.red.service.peristence.v1.server.migration.migrations; +package com.iqser.red.service.persistence.management.v1.processor.migration.migrations; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.InputStreamResource; import org.springframework.stereotype.Service; -import com.iqser.red.service.peristence.v1.server.migration.Migration; -import com.iqser.red.service.peristence.v1.server.migration.migrations.model.reducetext.Text; -import com.iqser.red.service.peristence.v1.server.utils.StorageIdUtils; +import com.iqser.red.service.persistence.management.v1.processor.migration.Migration; +import com.iqser.red.service.persistence.management.v1.processor.migration.migrations.model.reducetext.Text; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileType; +import com.iqser.red.service.persistence.management.v1.processor.utils.StorageIdUtils; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; import com.iqser.red.storage.commons.exception.StorageObjectDoesNotExist; import com.iqser.red.storage.commons.service.StorageService; @@ -87,7 +87,7 @@ public class ReduceTextFileSizeMigration10 extends Migration { try { - if(!storageService.objectExists(StorageIdUtils.getStorageId(dossierId, fileId, FileType.TEXT) + ".bak")) { + if (!storageService.objectExists(StorageIdUtils.getStorageId(dossierId, fileId, FileType.TEXT) + ".bak")) { InputStreamResource textInputStreamResource = storageService.getObject(StorageIdUtils.getStorageId(dossierId, fileId, FileType.TEXT)); storageService.storeObject(StorageIdUtils.getStorageId(dossierId, fileId, FileType.TEXT) + ".bak", textInputStreamResource.getInputStream()); var text = storageService.readJSONObject(StorageIdUtils.getStorageId(dossierId, fileId, FileType.TEXT), Text.class); diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/RemoveFalsePositiveManualRedactions6.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/RemoveFalsePositiveManualRedactions6.java similarity index 84% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/RemoveFalsePositiveManualRedactions6.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/RemoveFalsePositiveManualRedactions6.java index f160bca2a..5bdd9d890 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/RemoveFalsePositiveManualRedactions6.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/RemoveFalsePositiveManualRedactions6.java @@ -1,12 +1,12 @@ -package com.iqser.red.service.peristence.v1.server.migration.migrations; +package com.iqser.red.service.persistence.management.v1.processor.migration.migrations; import java.util.ArrayList; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import com.iqser.red.service.peristence.v1.server.controller.ManualRedactionController; -import com.iqser.red.service.peristence.v1.server.migration.Migration; +import com.iqser.red.service.persistence.management.v1.processor.migration.Migration; +import com.iqser.red.service.persistence.management.v1.processor.service.ManualRedactionService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.annotations.AddRedactionPersistenceService; @@ -29,7 +29,7 @@ public class RemoveFalsePositiveManualRedactions6 extends Migration { private FileStatusPersistenceService fileStatusPersistenceService; @Autowired - private ManualRedactionController manualRedactionController; + private ManualRedactionService manualRedactionService; @Autowired private AddRedactionPersistenceService addRedactionPersistenceService; @@ -50,7 +50,7 @@ public class RemoveFalsePositiveManualRedactions6 extends Migration { files.forEach(file -> { if (file.getHardDeletedTime() == null) { var annotationIdsToRemove = new ArrayList(); - var manualRedactions = manualRedactionController.getManualRedactions(dossier.getId(), file.getId()); + var manualRedactions = manualRedactionService.getManualRedactions( file.getId()); if (manualRedactions != null && manualRedactions.getEntriesToAdd() != null) { manualRedactions.getEntriesToAdd().forEach(addRedaction -> { diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/SimplifiedTextMigration12.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/SimplifiedTextMigration12.java similarity index 80% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/SimplifiedTextMigration12.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/SimplifiedTextMigration12.java index 4c8d0ac1e..66d71e8e8 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/SimplifiedTextMigration12.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/SimplifiedTextMigration12.java @@ -1,14 +1,14 @@ -package com.iqser.red.service.peristence.v1.server.migration.migrations; +package com.iqser.red.service.persistence.management.v1.processor.migration.migrations; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import com.iqser.red.service.peristence.v1.server.migration.Migration; -import com.iqser.red.service.peristence.v1.server.migration.migrations.model.simplifiedtext.Text; -import com.iqser.red.service.peristence.v1.server.utils.StorageIdUtils; +import com.iqser.red.service.persistence.management.v1.processor.migration.Migration; +import com.iqser.red.service.persistence.management.v1.processor.migration.migrations.model.simplifiedtext.Text; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileType; +import com.iqser.red.service.persistence.management.v1.processor.utils.StorageIdUtils; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; import com.iqser.red.storage.commons.exception.StorageObjectDoesNotExist; import com.iqser.red.storage.commons.service.StorageService; @@ -66,7 +66,7 @@ public class SimplifiedTextMigration12 extends Migration { try { - if(!storageService.objectExists(StorageIdUtils.getStorageId(dossierId, fileId, FileType.SIMPLIFIED_TEXT))) { + if (!storageService.objectExists(StorageIdUtils.getStorageId(dossierId, fileId, FileType.SIMPLIFIED_TEXT))) { var text = storageService.readJSONObject(StorageIdUtils.getStorageId(dossierId, fileId, FileType.TEXT), Text.class); storageService.storeJSONObject(StorageIdUtils.getStorageId(dossierId, fileId, FileType.SIMPLIFIED_TEXT), text); } diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/TypeToEntityMigration5.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/TypeToEntityMigration5.java similarity index 88% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/TypeToEntityMigration5.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/TypeToEntityMigration5.java index 50c387362..d7348c5c2 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/TypeToEntityMigration5.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/TypeToEntityMigration5.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.migration.migrations; +package com.iqser.red.service.persistence.management.v1.processor.migration.migrations; import java.util.ArrayList; import java.util.HashSet; @@ -10,13 +10,14 @@ import java.util.stream.Collectors; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import com.iqser.red.service.peristence.v1.server.controller.DictionaryController; -import com.iqser.red.service.peristence.v1.server.migration.Migration; import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.BaseDictionaryEntry; +import com.iqser.red.service.persistence.management.v1.processor.migration.Migration; +import com.iqser.red.service.persistence.management.v1.processor.service.DictionaryManagementService; +import com.iqser.red.service.persistence.management.v1.processor.service.DictionaryService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DictionaryPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.EntryPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierTemplateRepository; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.DictionaryEntryType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionaryEntryType; import lombok.Setter; import lombok.extern.slf4j.Slf4j; @@ -39,7 +40,7 @@ public class TypeToEntityMigration5 extends Migration { private EntryPersistenceService entryPersistenceService; @Autowired - private DictionaryController dictionaryController; + private DictionaryManagementService dictionaryManagementService; public TypeToEntityMigration5() { @@ -96,13 +97,13 @@ public class TypeToEntityMigration5 extends Migration { }); if (!typeFalsePositives.isEmpty()) { - dictionaryController.addEntries(typeEntity.getId(), new ArrayList<>(typeFalsePositives), false, true, DictionaryEntryType.FALSE_POSITIVE); + dictionaryManagementService.addEntries(typeEntity.getId(), new ArrayList<>(typeFalsePositives), false, false, DictionaryEntryType.FALSE_POSITIVE); log.info("Added {} for type {}", typeFalsePositives.size(), typeEntity.getType()); } log.info("Finished processing type {}", typeEntity.getType()); }); - typeIdsToDelete.forEach(typeIdToDelete -> dictionaryController.deleteType(typeIdToDelete)); + typeIdsToDelete.forEach(typeIdToDelete -> dictionaryManagementService.deleteType(typeIdToDelete)); log.info("Finished false positive migration of dossierTemplate {}", dossierTemplate.getId()); }); diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/model/reducetext/AbstractTextContainer.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/AbstractTextContainer.java similarity index 86% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/model/reducetext/AbstractTextContainer.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/AbstractTextContainer.java index 5d2e2501b..9ae942f9a 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/model/reducetext/AbstractTextContainer.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/AbstractTextContainer.java @@ -1,8 +1,8 @@ -package com.iqser.red.service.peristence.v1.server.migration.migrations.model.reducetext; +package com.iqser.red.service.persistence.management.v1.processor.migration.migrations.model.reducetext; import com.dslplatform.json.JsonAttribute; import com.fasterxml.jackson.annotation.JsonIgnore; -import com.iqser.red.service.redaction.v1.model.Rectangle; +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Rectangle; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/model/reducetext/CellValue.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/CellValue.java similarity index 74% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/model/reducetext/CellValue.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/CellValue.java index 8f5f897e0..90ec853b8 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/model/reducetext/CellValue.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/CellValue.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.migration.migrations.model.reducetext; +package com.iqser.red.service.persistence.management.v1.processor.migration.migrations.model.reducetext; import java.util.ArrayList; import java.util.List; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/model/reducetext/Image.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/Image.java similarity index 84% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/model/reducetext/Image.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/Image.java index 52314e574..578d9eeca 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/model/reducetext/Image.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/Image.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.migration.migrations.model.reducetext; +package com.iqser.red.service.persistence.management.v1.processor.migration.migrations.model.reducetext; import com.dslplatform.json.CompiledJson; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/model/reducetext/RedRectangle2D.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/RedRectangle2D.java similarity index 91% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/model/reducetext/RedRectangle2D.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/RedRectangle2D.java index 032cb6344..de9f4a503 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/model/reducetext/RedRectangle2D.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/RedRectangle2D.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.migration.migrations.model.reducetext; +package com.iqser.red.service.persistence.management.v1.processor.migration.migrations.model.reducetext; import com.dslplatform.json.CompiledJson; import com.dslplatform.json.JsonAttribute; @@ -24,14 +24,6 @@ public class RedRectangle2D { private double height; - @JsonIgnore - @JsonAttribute(ignore = true) - public boolean isEmpty() { - - return width <= 0.0f || height <= 0.0f; - } - - public boolean contains(double x, double y, double w, double h) { if (isEmpty() || w <= 0 || h <= 0) { @@ -43,6 +35,14 @@ public class RedRectangle2D { } + @JsonIgnore + @JsonAttribute(ignore = true) + public boolean isEmpty() { + + return width <= 0.0f || height <= 0.0f; + } + + private double round(double value) { double d = Math.pow(10, 2); diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/model/reducetext/RedTextPosition.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/RedTextPosition.java similarity index 96% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/model/reducetext/RedTextPosition.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/RedTextPosition.java index 026623924..eab32fed3 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/model/reducetext/RedTextPosition.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/RedTextPosition.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.migration.migrations.model.reducetext; +package com.iqser.red.service.persistence.management.v1.processor.migration.migrations.model.reducetext; import com.dslplatform.json.CompiledJson; import com.dslplatform.json.JsonAttribute; @@ -74,6 +74,10 @@ public class RedTextPosition { } + @JsonIgnore + public float getXDirAdj() {return this.XDirAdj;} + + @JsonAlias("xdirAdj") @JsonAttribute(alternativeNames = {"xdirAdj"}) @JsonProperty @@ -83,20 +87,16 @@ public class RedTextPosition { } + @JsonIgnore + public float getYDirAdj() {return this.YDirAdj;} + + @JsonAlias("ydirAdj") @JsonAttribute(alternativeNames = {"ydirAdj"}) @JsonProperty public void setYDirAdj(float YDirAdj) {this.YDirAdj = YDirAdj;} - @JsonIgnore - public float getXDirAdj() {return this.XDirAdj;} - - - @JsonIgnore - public float getYDirAdj() {return this.YDirAdj;} - - @JsonIgnore public float getWidthDirAdj() {return this.widthDirAdj;} diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/model/reducetext/SectionText.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/SectionText.java similarity index 81% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/model/reducetext/SectionText.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/SectionText.java index 05b008e6f..69e78134b 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/model/reducetext/SectionText.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/SectionText.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.migration.migrations.model.reducetext; +package com.iqser.red.service.persistence.management.v1.processor.migration.migrations.model.reducetext; import java.util.ArrayList; import java.util.HashMap; @@ -8,7 +8,7 @@ import java.util.Map; import java.util.Set; import com.dslplatform.json.CompiledJson; -import com.iqser.red.service.redaction.v1.model.SectionArea; +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.section.SectionArea; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/model/reducetext/Text.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/Text.java similarity index 77% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/model/reducetext/Text.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/Text.java index 89368c92a..84eac28c9 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/model/reducetext/Text.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/Text.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.migration.migrations.model.reducetext; +package com.iqser.red.service.persistence.management.v1.processor.migration.migrations.model.reducetext; import java.util.ArrayList; import java.util.List; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/model/reducetext/TextBlock.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/TextBlock.java similarity index 91% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/model/reducetext/TextBlock.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/TextBlock.java index ff0bc4919..dc3824388 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/model/reducetext/TextBlock.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/TextBlock.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.migration.migrations.model.reducetext; +package com.iqser.red.service.persistence.management.v1.processor.migration.migrations.model.reducetext; import java.util.ArrayList; import java.util.List; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/model/reducetext/TextPositionSequence.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/TextPositionSequence.java similarity index 92% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/model/reducetext/TextPositionSequence.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/TextPositionSequence.java index 9197b59cc..9662fcc6a 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/model/reducetext/TextPositionSequence.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/reducetext/TextPositionSequence.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.migration.migrations.model.reducetext; +package com.iqser.red.service.persistence.management.v1.processor.migration.migrations.model.reducetext; import java.util.ArrayList; import java.util.List; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/model/simplifiedtext/SectionArea.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/simplifiedtext/SectionArea.java similarity index 63% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/model/simplifiedtext/SectionArea.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/simplifiedtext/SectionArea.java index ad6a5cf9d..3371a356c 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/model/simplifiedtext/SectionArea.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/simplifiedtext/SectionArea.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.migration.migrations.model.simplifiedtext; +package com.iqser.red.service.persistence.management.v1.processor.migration.migrations.model.simplifiedtext; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/model/simplifiedtext/SectionText.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/simplifiedtext/SectionText.java similarity index 79% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/model/simplifiedtext/SectionText.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/simplifiedtext/SectionText.java index f98767f14..201930542 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/model/simplifiedtext/SectionText.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/simplifiedtext/SectionText.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.migration.migrations.model.simplifiedtext; +package com.iqser.red.service.persistence.management.v1.processor.migration.migrations.model.simplifiedtext; import java.util.ArrayList; import java.util.List; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/model/simplifiedtext/Text.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/simplifiedtext/Text.java similarity index 75% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/model/simplifiedtext/Text.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/simplifiedtext/Text.java index 965f048bd..5982a82fb 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/migration/migrations/model/simplifiedtext/Text.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/model/simplifiedtext/Text.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.migration.migrations.model.simplifiedtext; +package com.iqser.red.service.persistence.management.v1.processor.migration.migrations.model.simplifiedtext; import java.util.ArrayList; import java.util.List; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/model/CvAnalysisServiceRequest.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/model/CvAnalysisServiceRequest.java similarity index 91% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/model/CvAnalysisServiceRequest.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/model/CvAnalysisServiceRequest.java index 99622fdf3..caf140760 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/model/CvAnalysisServiceRequest.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/model/CvAnalysisServiceRequest.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.model; +package com.iqser.red.service.persistence.management.v1.processor.model; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/model/CvAnalysisServiceResponse.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/model/CvAnalysisServiceResponse.java similarity index 78% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/model/CvAnalysisServiceResponse.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/model/CvAnalysisServiceResponse.java index d52d5fc62..495ff0838 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/model/CvAnalysisServiceResponse.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/model/CvAnalysisServiceResponse.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.model; +package com.iqser.red.service.persistence.management.v1.processor.model; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/model/DownloadJob.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/model/DownloadJob.java similarity index 80% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/model/DownloadJob.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/model/DownloadJob.java index c5909918e..91fc5b18c 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/model/DownloadJob.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/model/DownloadJob.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.model; +package com.iqser.red.service.persistence.management.v1.processor.model; import lombok.AccessLevel; import lombok.AllArgsConstructor; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/model/NerServiceRequest.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/model/NerServiceRequest.java similarity index 76% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/model/NerServiceRequest.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/model/NerServiceRequest.java index c3ceba999..f7a0b05fe 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/model/NerServiceRequest.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/model/NerServiceRequest.java @@ -1,6 +1,6 @@ -package com.iqser.red.service.peristence.v1.server.model; +package com.iqser.red.service.persistence.management.v1.processor.model; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/model/image/ImageServiceRequest.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/model/image/ImageServiceRequest.java similarity index 86% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/model/image/ImageServiceRequest.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/model/image/ImageServiceRequest.java index de4c0e02f..d5b284121 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/model/image/ImageServiceRequest.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/model/image/ImageServiceRequest.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.model.image; +package com.iqser.red.service.persistence.management.v1.processor.model.image; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/multitenancy/AsyncConfig.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/AsyncConfig.java similarity index 90% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/multitenancy/AsyncConfig.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/AsyncConfig.java index 3ebfe3b30..5767e412e 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/multitenancy/AsyncConfig.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/AsyncConfig.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.multitenancy; +package com.iqser.red.service.persistence.management.v1.processor.multitenancy; import java.util.concurrent.Executor; @@ -24,4 +24,4 @@ public class AsyncConfig extends AsyncConfigurerSupport { return executor; } -} \ No newline at end of file +} diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/multitenancy/MultiTenancyMessagingConfiguration.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/MultiTenancyMessagingConfiguration.java similarity index 85% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/multitenancy/MultiTenancyMessagingConfiguration.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/MultiTenancyMessagingConfiguration.java index 71611be3c..269a68c43 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/multitenancy/MultiTenancyMessagingConfiguration.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/MultiTenancyMessagingConfiguration.java @@ -1,7 +1,7 @@ -package com.iqser.red.service.peristence.v1.server.multitenancy; +package com.iqser.red.service.persistence.management.v1.processor.multitenancy; -import static com.iqser.red.service.peristence.v1.server.multitenancy.TenantInterceptor.DEFAULT_TENANT; -import static com.iqser.red.service.peristence.v1.server.multitenancy.TenantInterceptor.TENANT_HEADER_NAME; +import static com.iqser.red.service.persistence.management.v1.processor.multitenancy.TenantInterceptor.DEFAULT_TENANT; +import static com.iqser.red.service.persistence.management.v1.processor.multitenancy.TenantInterceptor.TENANT_HEADER_NAME; import org.springframework.amqp.rabbit.config.AbstractRabbitListenerContainerFactory; import org.springframework.amqp.rabbit.core.RabbitTemplate; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/multitenancy/MultiTenancyWebConfiguration.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/MultiTenancyWebConfiguration.java similarity index 84% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/multitenancy/MultiTenancyWebConfiguration.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/MultiTenancyWebConfiguration.java index a50c05623..0981a01de 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/multitenancy/MultiTenancyWebConfiguration.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/MultiTenancyWebConfiguration.java @@ -1,7 +1,8 @@ -package com.iqser.red.service.peristence.v1.server.multitenancy; +package com.iqser.red.service.persistence.management.v1.processor.multitenancy; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import com.iqser.red.commons.spring.DefaultWebMvcConfiguration; @@ -25,4 +26,4 @@ public class MultiTenancyWebConfiguration extends DefaultWebMvcConfiguration { registry.addWebRequestInterceptor(tenantInterceptor); } -} \ No newline at end of file +} diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/multitenancy/TenantAwareTaskDecorator.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/TenantAwareTaskDecorator.java similarity index 88% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/multitenancy/TenantAwareTaskDecorator.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/TenantAwareTaskDecorator.java index 519483347..06af1f7e3 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/multitenancy/TenantAwareTaskDecorator.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/TenantAwareTaskDecorator.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.multitenancy; +package com.iqser.red.service.persistence.management.v1.processor.multitenancy; import org.springframework.core.task.TaskDecorator; import org.springframework.lang.NonNull; @@ -22,4 +22,4 @@ public class TenantAwareTaskDecorator implements TaskDecorator { }; } -} \ No newline at end of file +} diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/multitenancy/TenantInterceptor.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/TenantInterceptor.java similarity index 92% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/multitenancy/TenantInterceptor.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/TenantInterceptor.java index 18f7e80ec..1115b32eb 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/multitenancy/TenantInterceptor.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/TenantInterceptor.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.multitenancy; +package com.iqser.red.service.persistence.management.v1.processor.multitenancy; import org.springframework.stereotype.Component; import org.springframework.ui.ModelMap; @@ -37,4 +37,4 @@ public class TenantInterceptor implements WebRequestInterceptor { } -} \ No newline at end of file +} diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/multitenancy/persistence/MasterPersistenceConfig.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/persistence/MasterPersistenceConfig.java similarity index 98% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/multitenancy/persistence/MasterPersistenceConfig.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/persistence/MasterPersistenceConfig.java index 2fa2d1af9..ead431a27 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/multitenancy/persistence/MasterPersistenceConfig.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/persistence/MasterPersistenceConfig.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.multitenancy.persistence; +package com.iqser.red.service.persistence.management.v1.processor.multitenancy.persistence; import java.util.HashMap; import java.util.Map; @@ -36,9 +36,9 @@ import lombok.RequiredArgsConstructor; @RequiredArgsConstructor public class MasterPersistenceConfig { + private static final String entityPackages = "com.iqser.red.service.persistence.management.v1.processor.multitenancy.entity"; private final ConfigurableListableBeanFactory beanFactory; private final JpaProperties jpaProperties; - private static final String entityPackages = "com.iqser.red.service.persistence.management.v1.processor.multitenancy.entity"; @Bean @@ -70,14 +70,6 @@ public class MasterPersistenceConfig { } - @Bean - @ConfigurationProperties("multitenancy.master.liquibase") - public LiquibaseProperties masterLiquibaseProperties() { - - return new LiquibaseProperties(); - } - - @Bean public SpringLiquibase masterLiquibase(@LiquibaseDataSource ObjectProvider liquibaseDataSource) { @@ -91,10 +83,10 @@ public class MasterPersistenceConfig { @Bean - @ConfigurationProperties("multitenancy.master.datasource") - public DataSourceProperties masterDataSourceProperties() { + @ConfigurationProperties("multitenancy.master.liquibase") + public LiquibaseProperties masterLiquibaseProperties() { - return new DataSourceProperties(); + return new LiquibaseProperties(); } @@ -108,4 +100,12 @@ public class MasterPersistenceConfig { return dataSource; } -} \ No newline at end of file + + @Bean + @ConfigurationProperties("multitenancy.master.datasource") + public DataSourceProperties masterDataSourceProperties() { + + return new DataSourceProperties(); + } + +} diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/multitenancy/persistence/TenantPersistenceConfig.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/persistence/TenantPersistenceConfig.java similarity index 94% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/multitenancy/persistence/TenantPersistenceConfig.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/persistence/TenantPersistenceConfig.java index 6b3671c01..e6b2c91dd 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/multitenancy/persistence/TenantPersistenceConfig.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/persistence/TenantPersistenceConfig.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.multitenancy.persistence; +package com.iqser.red.service.persistence.management.v1.processor.multitenancy.persistence; import java.util.HashMap; import java.util.Map; @@ -18,6 +18,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.DependsOn; import org.springframework.context.annotation.Primary; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.orm.hibernate5.SpringBeanContainer; import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; @@ -26,6 +27,7 @@ import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; import com.iqser.red.service.persistence.management.v1.processor.service.EncryptionDecryptionService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.mulitenancy.CurrentTenantIdentifierResolverImpl; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.mulitenancy.DynamicDataSourceBasedMultiTenantConnectionProvider; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.mulitenancy.MultiTenantDataSource; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.mulitenancy.repository.TenantRepository; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.ColorsRepository; @@ -37,9 +39,9 @@ import lombok.RequiredArgsConstructor; @RequiredArgsConstructor public class TenantPersistenceConfig { + private static final String entityPackages = "com.iqser.red.service.persistence.management.v1.processor.entity"; private final ConfigurableListableBeanFactory beanFactory; private final JpaProperties jpaProperties; - private static final String entityPackages = "com.iqser.red.service.persistence.management.v1.processor.entity"; @Primary diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/multitenancy/persistence/TenantSpringLiquibaseExecutor.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/persistence/TenantSpringLiquibaseExecutor.java similarity index 96% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/multitenancy/persistence/TenantSpringLiquibaseExecutor.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/persistence/TenantSpringLiquibaseExecutor.java index c1bb68713..93cb27b9a 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/multitenancy/persistence/TenantSpringLiquibaseExecutor.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/multitenancy/persistence/TenantSpringLiquibaseExecutor.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.multitenancy.persistence; +package com.iqser.red.service.persistence.management.v1.processor.multitenancy.persistence; import java.sql.Connection; import java.sql.DriverManager; @@ -74,4 +74,4 @@ public class TenantSpringLiquibaseExecutor implements InitializingBean, Resource return liquibase; } -} \ No newline at end of file +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/AccessControlService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/AccessControlService.java new file mode 100644 index 000000000..cd75b6e65 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/AccessControlService.java @@ -0,0 +1,141 @@ +package com.iqser.red.service.persistence.management.v1.processor.service; + +import org.springframework.http.HttpStatus; +import org.springframework.security.access.prepost.PostAuthorize; +import org.springframework.stereotype.Service; + +import com.iqser.red.keycloak.commons.KeycloakSecurity; +import com.iqser.red.service.persistence.management.v1.processor.acl.custom.dossier.DossierACLService; +import com.iqser.red.service.persistence.management.v1.processor.exception.NotAllowedException; +import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus; + +import feign.FeignException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Service +@RequiredArgsConstructor +@Slf4j +public class AccessControlService { + + private final FileStatusManagementService fileStatusManagementService; + private final DossierManagementService dossierManagementService; + private final DossierACLService dossierACLService; + + + public void verifyUserIsReviewer(String dossierId, String fileId) { + + String fileReviewer = getAssignee(dossierId, fileId); + + var isReviewer = KeycloakSecurity.getUserId().equals(fileReviewer); + if (!isReviewer) { + throw new NotAllowedException("User must be reviewer of the file."); + } + } + + + private String getAssignee(String dossierId, String fileId) { + + try { + return fileStatusManagementService.getFileStatus(fileId).getAssignee(); + } catch (FeignException e) { + if (e.status() == HttpStatus.NOT_FOUND.value()) { + throw new NotFoundException("File " + fileId + " dossier " + dossierId + " not found."); + } + throw e; + } + } + + + public void verifyUserIsReviewerOrApprover(String dossierId, String fileId) { + + var dossier = dossierACLService.enhanceDossierWithACLData(dossierManagementService.getDossierById(dossierId, false, false)); + + String fileReviewer = getAssignee(dossierId, fileId); + + var isReviewer = KeycloakSecurity.getUserId().equals(fileReviewer); + var isApprover = dossier.getApproverIds().contains(KeycloakSecurity.getUserId()); + if (!isReviewer && !isApprover) { + throw new NotAllowedException("User must be reviewer or approver."); + } + } + + + public void verifyUserIsMemberOrApprover(String dossierId, String userId) { + + var dossier = dossierACLService.enhanceDossierWithACLData(dossierManagementService.getDossierById(dossierId, false, false)); + + var isMember = dossier.getMemberIds().contains(userId); + var isApprover = dossier.getApproverIds().contains(userId); + if (!isMember && !isApprover) { + throw new NotAllowedException("User must be dossier member or approver."); + } + } + + + @PostAuthorize("hasPermission(#dossierId, 'Dossier', 'VIEW_OBJECT')") + public void verifyUserHasViewPermissions(String dossierId) { + + } + + + @PostAuthorize("hasPermission(#dossierId, 'Dossier', 'ACCESS_OBJECT')") + public void verifyUserHasAccessPermissions(String dossierId) { + + } + + + @PostAuthorize("hasPermission(#dossierId, 'Dossier', 'APPROVE') || hasPermission(#dossierId, 'Dossier', 'REVIEW')") + public void verifyUserIsMemberOrApprover(String dossierId) { + + } + + + @PostAuthorize("hasPermission(#dossierId, 'Dossier', 'APPROVE')") + public void verifyUserIsApprover(String dossierId) { + + } + + + @PostAuthorize("hasPermission(#dossierId, 'Dossier', 'OWNER')") + public void verifyUserIsDossierOwner(String dossierId) { + + } + + + @PostAuthorize("hasPermission(#dossierId, 'Dossier', 'WRITE')") + public void verifyWriter(String dossierId) { + + } + + + @PostAuthorize("hasPermission(#dossierId, 'Dossier', 'APPROVE') || hasPermission(#dossierId, 'Dossier', 'OWNER')") + public void verifyUserIsDossierOwnerOrApprover(String dossierId) { + + } + + + @PostAuthorize("hasAuthority('RED_MANAGER') || hasPermission(#dossierId, 'Dossier', 'APPROVE') || hasPermission(#dossierId, 'Dossier', 'OWNER')") + public void verifyUserIsDossierOwnerOrApproverOrManager(String dossierId) { + + } + + + public void verifyFileIsNotApproved(String dossierId, String fileId) { + + try { + var status = fileStatusManagementService.getFileStatus(fileId).getWorkflowStatus(); + + if (WorkflowStatus.APPROVED.equals(status)) { + throw new NotAllowedException("File is already in status APPROVED."); + } + } catch (FeignException e) { + if (e.status() == HttpStatus.NOT_FOUND.value()) { + throw new NotFoundException("File " + fileId + " dossier " + dossierId + " not found."); + } + throw e; + } + } + +} diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/AnalysisFlagsCalculationService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/AnalysisFlagsCalculationService.java similarity index 90% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/AnalysisFlagsCalculationService.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/AnalysisFlagsCalculationService.java index 11c1ad320..ee750cc7e 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/AnalysisFlagsCalculationService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/AnalysisFlagsCalculationService.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.service; +package com.iqser.red.service.persistence.management.v1.processor.service; import java.time.OffsetDateTime; import java.util.Map; @@ -10,11 +10,11 @@ import org.springframework.stereotype.Service; import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ViewedPageEntity; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.ViewedPagesPersistenceService; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus; -import com.iqser.red.service.redaction.v1.model.ChangeType; -import com.iqser.red.service.redaction.v1.model.ManualRedactionType; -import com.iqser.red.service.redaction.v1.model.RedactionLogEntry; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.ChangeType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.ManualRedactionType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLogEntry; import io.micrometer.core.annotation.Timed; import lombok.RequiredArgsConstructor; @@ -29,6 +29,7 @@ public class AnalysisFlagsCalculationService { private final RedactionLogService redactionLogService; private final ViewedPagesPersistenceService viewedPagesPersistenceService; + @Timed("redactmanager_calculateFlags") public void calculateFlags(String dossierId, String fileId) { @@ -104,7 +105,7 @@ public class AnalysisFlagsCalculationService { if (!hasSuggestions && (lastChange == null || lastChange.getType() != ChangeType.REMOVED) && entry.getManualChanges() .stream() - .anyMatch(e -> e.getAnnotationStatus() == AnnotationStatus.REQUESTED)) { + .anyMatch(e -> e.getAnnotationStatus().name().equals(AnnotationStatus.REQUESTED.name()))) { hasSuggestions = true; } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ColorsService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ColorsService.java index 9b23f00cc..50dcba08c 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ColorsService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ColorsService.java @@ -40,7 +40,7 @@ public class ColorsService { entity.setIgnoredHintColor(defaultColor); entity.setSkippedColor(defaultColor); entity.setAppliedRedactionColor("#000000"); - return colorsRepository.save(entity); + return colorsRepository.saveAndFlush(entity); }); } @@ -48,7 +48,9 @@ public class ColorsService { public ColorsEntity saveColors(ColorsEntity colors) { if (colors.getAppliedRedactionColor() == null) // store the default one in case non is provided + { colors.setAppliedRedactionColor("#000000"); + } return colorsRepository.save(colors); } diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ComponentOverrideController.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ComponentOverrideService.java similarity index 62% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ComponentOverrideController.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ComponentOverrideService.java index 6beaf6bad..f84f37ba7 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ComponentOverrideController.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ComponentOverrideService.java @@ -1,31 +1,27 @@ -package com.iqser.red.service.peristence.v1.server.controller; +package com.iqser.red.service.persistence.management.v1.processor.service; import java.io.ByteArrayInputStream; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.stereotype.Service; import com.fasterxml.jackson.databind.ObjectMapper; -import com.iqser.red.service.peristence.v1.server.service.FileManagementStorageService; -import com.iqser.red.service.persistence.service.v1.api.model.component.ComponentsOverrides; -import com.iqser.red.service.persistence.service.v1.api.model.component.RevertOverrideRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileType; -import com.iqser.red.service.persistence.service.v1.api.resources.ComponentOverrideResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.component.ComponentsOverrides; +import com.iqser.red.service.persistence.service.v1.api.shared.model.component.RevertOverrideRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; -@RestController +@Service @RequiredArgsConstructor -public class ComponentOverrideController implements ComponentOverrideResource { +public class ComponentOverrideService { private final FileManagementStorageService fileManagementStorageService; private final ObjectMapper objectMapper; @SneakyThrows - public void addOverrides(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody ComponentsOverrides componentsOverrides) { + public void addOverrides(String dossierId, String fileId, ComponentsOverrides componentsOverrides) { if (!fileManagementStorageService.objectExists(dossierId, fileId, FileType.COMPONENTS)) { fileManagementStorageService.storeObject(dossierId, fileId, FileType.COMPONENTS, new ByteArrayInputStream(objectMapper.writeValueAsBytes(componentsOverrides))); @@ -41,7 +37,7 @@ public class ComponentOverrideController implements ComponentOverrideResource { @SneakyThrows - public ComponentsOverrides getOverrides(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId) { + public ComponentsOverrides getOverrides(String dossierId, String fileId) { var existingComponentsBytes = fileManagementStorageService.getStoredObjectBytes(dossierId, fileId, FileType.COMPONENTS); var existingComponents = objectMapper.readValue(existingComponentsBytes, ComponentsOverrides.class); @@ -50,7 +46,7 @@ public class ComponentOverrideController implements ComponentOverrideResource { @SneakyThrows - public void revertOverrides(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody RevertOverrideRequest revertOverrideRequest) { + public void revertOverrides(String dossierId, String fileId, RevertOverrideRequest revertOverrideRequest) { if (!fileManagementStorageService.objectExists(dossierId, fileId, FileType.COMPONENTS)) { return; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/CvAnalysisMessageReceiver.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/CvAnalysisMessageReceiver.java similarity index 85% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/CvAnalysisMessageReceiver.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/CvAnalysisMessageReceiver.java index 4b0594681..0548e910a 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/CvAnalysisMessageReceiver.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/CvAnalysisMessageReceiver.java @@ -1,12 +1,12 @@ -package com.iqser.red.service.peristence.v1.server.service; +package com.iqser.red.service.persistence.management.v1.processor.service; import org.springframework.amqp.core.Message; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Service; import com.fasterxml.jackson.databind.ObjectMapper; -import com.iqser.red.service.peristence.v1.server.configuration.MessagingConfiguration; -import com.iqser.red.service.peristence.v1.server.model.CvAnalysisServiceResponse; +import com.iqser.red.service.persistence.management.v1.processor.configuration.MessagingConfiguration; +import com.iqser.red.service.persistence.management.v1.processor.model.CvAnalysisServiceResponse; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/DeploymentKeyService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DeploymentKeyService.java similarity index 67% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/DeploymentKeyService.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DeploymentKeyService.java index 08348a37c..9ccbd5ccf 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/DeploymentKeyService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DeploymentKeyService.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.service; +package com.iqser.red.service.persistence.management.v1.processor.service; import java.nio.charset.StandardCharsets; import java.util.Locale; @@ -18,21 +18,16 @@ public class DeploymentKeyService { private final TenantManagementService tenantManagementService; private final HashFunction hashFunction = Hashing.farmHashFingerprint64(); - + private final String hardcodedKey = "89274365-160c-49f2-ab8b-ad83fc43c2e1"; @Value("${redaction.kubernetes.id:someValue}") private String redactionKubernetesId; - private String hardcodedKey = "89274365-160c-49f2-ab8b-ad83fc43c2e1"; - public String getDeploymentKey(String tenantId) { var tenant = tenantManagementService.getTenant(tenantId); - var stringBuilder = new StringBuilder(); - stringBuilder.append(tenant.getGuid()).append(redactionKubernetesId).append(hardcodedKey); - - var deploymentKey = hashFunction.hashString(stringBuilder.toString(), StandardCharsets.UTF_8); + var deploymentKey = hashFunction.hashString(tenant.getGuid() + redactionKubernetesId + hardcodedKey, StandardCharsets.UTF_8); return deploymentKey.toString().toUpperCase(Locale.ROOT); } diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/DictionaryService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DictionaryManagementService.java similarity index 89% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/DictionaryService.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DictionaryManagementService.java index 253dc3b25..065e76172 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/DictionaryService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DictionaryManagementService.java @@ -1,6 +1,5 @@ -package com.iqser.red.service.peristence.v1.server.service; +package com.iqser.red.service.persistence.management.v1.processor.service; -import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; import static java.util.stream.Collectors.toList; import static java.util.stream.Collectors.toSet; @@ -11,21 +10,24 @@ import java.util.function.Predicate; import java.util.regex.Matcher; import java.util.regex.Pattern; +import javax.transaction.Transactional; + import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; -import com.iqser.red.service.peristence.v1.server.TextNormalizationUtilities; -import com.iqser.red.service.peristence.v1.server.validation.DictionaryValidator; import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.BaseDictionaryEntry; import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.TypeEntity; import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; import com.iqser.red.service.persistence.management.v1.processor.exception.ConflictException; -import com.iqser.red.service.persistence.management.v1.processor.service.ColorsService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DictionaryPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.EntryPersistenceService; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.DictionaryEntryType; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.Type; +import com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter; +import com.iqser.red.service.persistence.management.v1.processor.utils.TextNormalizationUtilities; +import com.iqser.red.service.persistence.management.v1.processor.utils.TypeMapper; +import com.iqser.red.service.persistence.management.v1.processor.validation.DictionaryValidator; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionaryEntryType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.Type; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -33,7 +35,7 @@ import lombok.extern.slf4j.Slf4j; @Slf4j @Service @RequiredArgsConstructor -public class DictionaryService { +public class DictionaryManagementService { private final EntryPersistenceService entryPersistenceService; private final DictionaryPersistenceService dictionaryPersistenceService; @@ -41,6 +43,7 @@ public class DictionaryService { private final StopwordService stopwordService; + @Transactional public Type addType(Type typeRequest) { if (typeRequest.getDossierTemplateId() == null) { @@ -74,7 +77,7 @@ public class DictionaryService { validateColor(typeRequest.getRecommendationHexColor()); } - return convert(dictionaryPersistenceService.addType(typeRequest.getType(), + return MagicConverter.convert(dictionaryPersistenceService.addType(typeRequest.getType(), typeRequest.getDossierTemplateId(), color, recommendationHexColor, @@ -89,7 +92,59 @@ public class DictionaryService { typeRequest.getDossierId(), typeRequest.isHasDictionary(), typeRequest.isSystemManaged(), - typeRequest.isAutoHideSkipped()), Type.class); + typeRequest.isAutoHideSkipped()), Type.class, new TypeMapper()); + } + + + private String humanizedDictionaryType(String label) { + + String str = label; + str = str.replaceAll("-+?", " "); + str = str.replaceAll("_+?", " "); + str = str.replaceAll(" +", " "); + + StringBuilder strbf = new StringBuilder(); + Matcher match = Pattern.compile("([a-z])([a-z]*)", Pattern.CASE_INSENSITIVE).matcher(str); + while (match.find()) { + match.appendReplacement(strbf, match.group(1).toUpperCase() + match.group(2)); + } + return match.appendTail(strbf).toString(); + + } + + + private void checkForDuplicateLabels(String dossierTemplateId, String dossierId, String type, String labelToCheck) { + + List typeResponse = dictionaryPersistenceService.getCumulatedTypes(dossierTemplateId, dossierId, false); + for (TypeEntity res : typeResponse) { + var dossierTemplateResponse = res.getDossierTemplateId() == null ? res.getDossierTemplate().getId() : res.getDossierTemplateId(); + if (res.getDossierId() != null && res.getDossierId() + .equals(dossierId) && !type.equals(res.getType()) && dossierTemplateResponse.equals(dossierTemplateId) && labelToCheck.equals(res.getLabel()) || !type.equals( + res.getType()) && dossierTemplateResponse.equals(dossierTemplateId) && labelToCheck.equals(res.getLabel())) { + throw new ConflictException("Label must be unique."); + } + } + } + + + public boolean checkForExistingType(Type typeRequest) { + + return dictionaryPersistenceService.getCumulatedTypes(typeRequest.getDossierTemplateId(), typeRequest.getDossierId(), false) + .stream() + .anyMatch(typeResult -> typeRequest.getDossierId() != null && typeResult.getDossierId() != null && typeRequest.getDossierId() + .equals(typeResult.getDossierId()) && typeRequest.getType().equals(typeResult.getType()) && typeRequest.getDossierTemplateId() + .equals(typeResult.getDossierTemplateId()) || typeRequest.getDossierId() == null && typeRequest.getType() + .equals(typeResult.getType()) && typeRequest.getDossierTemplateId().equals(typeResult.getDossierTemplateId())); + } + + + private void validateColor(String hexColor) { + + Optional errorMessage = DictionaryValidator.validateColor(hexColor); + if (errorMessage.isPresent()) { + throw new BadRequestException(errorMessage.get()); + } + } @@ -116,7 +171,7 @@ public class DictionaryService { } // To check whether the type exists and it is not deleted - Type typeResult = convert(dictionaryPersistenceService.getType(typeId), Type.class); + Type typeResult = MagicConverter.convert(dictionaryPersistenceService.getType(typeId), Type.class); if (typeRequest.getLabel() != null) { checkForDuplicateLabels(typeResult.getDossierTemplateId(), typeResult.getDossierId(), typeResult.getType(), typeRequest.getLabel()); @@ -124,7 +179,7 @@ public class DictionaryService { typeRequest.setLabel(typeResult.getLabel()); } - dictionaryPersistenceService.updateType(typeId, convert(typeRequest, TypeEntity.class)); + dictionaryPersistenceService.updateType(typeId, MagicConverter.convert(typeRequest, TypeEntity.class)); if (typeResult.isHint() != typeRequest.isHint() || typeResult.isCaseInsensitive() != typeRequest.isCaseInsensitive() || typeResult.getRank() != typeRequest.getRank()) { @@ -139,6 +194,27 @@ public class DictionaryService { } + private void validateBoolean(Boolean bool, String name) { + + Optional errorMessage = DictionaryValidator.validateBoolean(bool, name); + if (errorMessage.isPresent()) { + throw new BadRequestException(errorMessage.get()); + } + } + + + private long getCurrentVersion(Type typeResult) { + + long currentVersion; + if (typeResult.getDossierId() != null) { + currentVersion = dictionaryPersistenceService.getVersionForDossier(typeResult.getDossierId()); + } else { + currentVersion = dictionaryPersistenceService.getVersion(typeResult.getDossierTemplateId()); + } + return currentVersion; + } + + public void addEntries(String typeId, List entries, boolean removeCurrent, boolean ignoreInvalidEntries, DictionaryEntryType dictionaryEntryType) { Set cleanEntries = entries.stream().map(this::cleanDictionaryEntry).collect(toSet()); @@ -156,7 +232,7 @@ public class DictionaryService { } // To check whether the type exists, type should not be added into database implicitly by addEntry. - Type typeResult = convert(dictionaryPersistenceService.getType(typeId), Type.class); + Type typeResult = MagicConverter.convert(dictionaryPersistenceService.getType(typeId), Type.class); if (!typeResult.isHasDictionary()) { throw new BadRequestException("Entity type does not have a dictionary"); } @@ -174,10 +250,25 @@ public class DictionaryService { } + private String cleanDictionaryEntry(String entry) { + + return TextNormalizationUtilities.removeHyphenLineBreaks(entry).replaceAll("\\n", " "); + } + + + private Set getInvalidEntries(Set entries) { + + Predicate isDictionaryEntryNotValid = entry -> DictionaryValidator.validateDictionaryEntry(entry).isPresent(); + Predicate isStopword = stopwordService::isStopword; + + return entries.stream().filter(isDictionaryEntryNotValid.or(isStopword)).collect(toSet()); + } + + public void deleteEntries(String typeId, List entries, DictionaryEntryType dictionaryEntryType) { // To check whether the type exists - Type typeResult = convert(dictionaryPersistenceService.getType(typeId), Type.class); + Type typeResult = MagicConverter.convert(dictionaryPersistenceService.getType(typeId), Type.class); var currentVersion = getCurrentVersion(typeResult); @@ -198,7 +289,7 @@ public class DictionaryService { public void deleteType(String typeId) { // NotFoundException would be thrown if the type not found in database. - Type typeResult = convert(dictionaryPersistenceService.getType(typeId), Type.class); + Type typeResult = MagicConverter.convert(dictionaryPersistenceService.getType(typeId), Type.class); if (typeResult.isSystemManaged()) { throw new BadRequestException("Can not delete system managed entity type"); } @@ -217,7 +308,7 @@ public class DictionaryService { public long getCurrentVersion(String typeId) { - Type typeResult = convert(dictionaryPersistenceService.getType(typeId), Type.class); + Type typeResult = MagicConverter.convert(dictionaryPersistenceService.getType(typeId), Type.class); long currentVersion; if (typeResult.getDossierId() != null) { currentVersion = dictionaryPersistenceService.getVersionForDossier(typeResult.getDossierId()); @@ -227,92 +318,4 @@ public class DictionaryService { return currentVersion; } - - private void validateBoolean(Boolean bool, String name) { - - Optional errorMessage = DictionaryValidator.validateBoolean(bool, name); - if (errorMessage.isPresent()) { - throw new BadRequestException(errorMessage.get()); - } - } - - - private void validateColor(String hexColor) { - - Optional errorMessage = DictionaryValidator.validateColor(hexColor); - if (errorMessage.isPresent()) { - throw new BadRequestException(errorMessage.get()); - } - - } - - - private void checkForDuplicateLabels(String dossierTemplateId, String dossierId, String type, String labelToCheck) { - - List typeResponse = dictionaryPersistenceService.getCumulatedTypes(dossierTemplateId, dossierId, false); - for (TypeEntity res : typeResponse) { - var dossierTemplateResponse = res.getDossierTemplateId() == null ? res.getDossierTemplate().getId() : res.getDossierTemplateId(); - if (res.getDossierId() != null && res.getDossierId() - .equals(dossierId) && !type.equals(res.getType()) && dossierTemplateResponse.equals(dossierTemplateId) && labelToCheck.equals(res.getLabel()) || !type.equals( - res.getType()) && dossierTemplateResponse.equals(dossierTemplateId) && labelToCheck.equals(res.getLabel())) { - throw new ConflictException("Label must be unique."); - } - } - } - - - private String humanizedDictionaryType(String label) { - - String str = label; - str = str.replaceAll("-+?", " "); - str = str.replaceAll("_+?", " "); - str = str.replaceAll(" +", " "); - - StringBuilder strbf = new StringBuilder(); - Matcher match = Pattern.compile("([a-z])([a-z]*)", Pattern.CASE_INSENSITIVE).matcher(str); - while (match.find()) { - match.appendReplacement(strbf, match.group(1).toUpperCase() + match.group(2)); - } - return match.appendTail(strbf).toString(); - - } - - - private Set getInvalidEntries(Set entries) { - - Predicate isDictionaryEntryNotValid = entry -> DictionaryValidator.validateDictionaryEntry(entry).isPresent(); - Predicate isStopword = stopwordService::isStopword; - - return entries.stream().filter(isDictionaryEntryNotValid.or(isStopword)).collect(toSet()); - } - - - private String cleanDictionaryEntry(String entry) { - - return TextNormalizationUtilities.removeHyphenLineBreaks(entry).replaceAll("\\n", " "); - } - - - private long getCurrentVersion(Type typeResult) { - - long currentVersion; - if (typeResult.getDossierId() != null) { - currentVersion = dictionaryPersistenceService.getVersionForDossier(typeResult.getDossierId()); - } else { - currentVersion = dictionaryPersistenceService.getVersion(typeResult.getDossierTemplateId()); - } - return currentVersion; - } - - - public boolean checkForExistingType(Type typeRequest) { - - return dictionaryPersistenceService.getCumulatedTypes(typeRequest.getDossierTemplateId(), typeRequest.getDossierId(), false) - .stream() - .anyMatch(typeResult -> typeRequest.getDossierId() != null && typeResult.getDossierId() != null && typeRequest.getDossierId() - .equals(typeResult.getDossierId()) && typeRequest.getType().equals(typeResult.getType()) && typeRequest.getDossierTemplateId() - .equals(typeResult.getDossierTemplateId()) || typeRequest.getDossierId() == null && typeRequest.getType() - .equals(typeResult.getType()) && typeRequest.getDossierTemplateId().equals(typeResult.getDossierTemplateId())); - } - } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DictionaryService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DictionaryService.java new file mode 100644 index 000000000..50b540950 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DictionaryService.java @@ -0,0 +1,309 @@ +package com.iqser.red.service.persistence.management.v1.processor.service; + +import static com.iqser.red.keycloak.commons.roles.ActionRoles.ADD_DICTIONARY_ENTRY; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.ADD_DOSSIER_DICTIONARY_ENTRY; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.ADD_UPDATE_DICTIONARY_TYPE; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.ADD_UPDATE_DOSSIER_DICTIONARY_TYPE; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.DELETE_DICTIONARY_ENTRY; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.DELETE_DICTIONARY_TYPE; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.DELETE_DOSSIER_DICTIONARY_ENTRY; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.DELETE_DOSSIER_DICTIONARY_TYPE; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_COLORS; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.READ_DICTIONARY_TYPES; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_COLORS; +import static com.iqser.red.service.persistence.management.v1.processor.utils.TypeIdUtils.toTypeId; + +import java.util.List; +import java.util.stream.Collectors; + +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.stereotype.Service; + +import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.ColorsEntity; +import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DictionaryPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.EntryPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.utils.ColorUtils; +import com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter; +import com.iqser.red.service.persistence.service.v1.api.shared.model.CreateTypeValue; +import com.iqser.red.service.persistence.service.v1.api.shared.model.Dictionary; +import com.iqser.red.service.persistence.service.v1.api.shared.model.TypeResponse; +import com.iqser.red.service.persistence.service.v1.api.shared.model.TypeValue; +import com.iqser.red.service.persistence.service.v1.api.shared.model.UpdateTypeValue; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.Colors; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionaryEntry; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionaryEntryType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.Type; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Service +@RequiredArgsConstructor +public class DictionaryService { + + private final DictionaryManagementService dictionaryManagementService; + + private final ColorsService colorsService; + private final DictionaryPersistenceService dictionaryPersistenceService; + private final AccessControlService accessControlService; + private final EntryPersistenceService entryPersistenceService; + + + @PreAuthorize("hasAuthority('" + ADD_DICTIONARY_ENTRY + "')") + public void addGlobalEntries(String type, String dossierTemplateId, List entries, boolean removeCurrent, DictionaryEntryType dictionaryEntryType) { + + addEntries(toTypeId(type, dossierTemplateId), entries, removeCurrent, dictionaryEntryType); + } + + + public void addEntries(String type, List entries, boolean removeCurrent, DictionaryEntryType dictionaryEntryType) { + + dictionaryManagementService.addEntries(type, entries, removeCurrent, false, dictionaryEntryType); + } + + + @PreAuthorize("hasAuthority('" + ADD_DOSSIER_DICTIONARY_ENTRY + "')") + public void addDossierEntries(String type, String dossierTemplateId, List entries, boolean removeCurrent, String dossierId, DictionaryEntryType dictionaryEntryType) { + + accessControlService.verifyUserIsDossierOwner(dossierId); + addEntries(toTypeId(type, dossierTemplateId, dossierId), entries, removeCurrent, dictionaryEntryType); + } + + + @PreAuthorize("hasAuthority('" + DELETE_DICTIONARY_ENTRY + "')") + public void deleteGlobalEntries(String type, String dossierTemplateId, List entries, DictionaryEntryType dictionaryEntryType) { + + deleteEntries(toTypeId(type, dossierTemplateId), entries, dictionaryEntryType); + + } + + + public void deleteEntries(String type, List entries, DictionaryEntryType dictionaryEntryType) { + + dictionaryManagementService.deleteEntries(type, entries, dictionaryEntryType); + } + + + @PreAuthorize("hasAuthority('" + DELETE_DOSSIER_DICTIONARY_ENTRY + "')") + public void deleteDossierEntries(String type, String dossierTemplateId, List entries, String dossierId, DictionaryEntryType dictionaryEntryType) { + + accessControlService.verifyUserHasAccessPermissions(dossierId); + accessControlService.verifyUserIsMemberOrApprover(dossierId); + deleteEntries(toTypeId(type, dossierTemplateId, dossierId), entries, dictionaryEntryType); + } + + + @PreAuthorize("hasAuthority('" + ADD_UPDATE_DICTIONARY_TYPE + "')") + public void updateGlobalType(String type, String dossierTemplateId, UpdateTypeValue typeValue) { + + updateType(dossierTemplateId, toTypeId(type, dossierTemplateId), typeValue); + } + + + private void updateType(String dossierTemplateId, String typeId, UpdateTypeValue typeValue) { + + dictionaryManagementService.updateTypeValue(typeId, + Type.builder() + .dossierTemplateId(dossierTemplateId) + .hexColor(typeValue.getHexColor()) + .recommendationHexColor(typeValue.getRecommendationHexColor()) + .skippedHexColor(typeValue.getSkippedHexColor()) + .rank(typeValue.getRank()) + .isHint(typeValue.isHint()) + .isCaseInsensitive(typeValue.isCaseInsensitive()) + .isRecommendation(typeValue.isRecommendation()) + .description(typeValue.getDescription()) + .addToDictionaryAction(typeValue.isAddToDictionaryAction()) + .label(typeValue.getLabel()) + .hasDictionary(typeValue.isHasDictionary()) + .autoHideSkipped(typeValue.isAutoHideSkipped()) + .build()); + } + + + @PreAuthorize("hasAuthority('" + ADD_UPDATE_DOSSIER_DICTIONARY_TYPE + "')") + public void updateDossierType(String type, String dossierTemplateId, UpdateTypeValue typeValue, String dossierId) { + + accessControlService.verifyUserIsDossierOwner(dossierId); + updateType(dossierTemplateId, toTypeId(type, dossierTemplateId, dossierId), typeValue); + } + + + @PreAuthorize("hasAuthority('" + ADD_UPDATE_DICTIONARY_TYPE + "')") + public Type addGlobalType(CreateTypeValue typeValue) { + + return addType(typeValue, null); + } + + + private Type addType(CreateTypeValue typeValue, String dossierId) { + + return dictionaryManagementService.addType(Type.builder() + .dossierTemplateId(typeValue.getDossierTemplateId()) + .dossierId(dossierId) + .type(typeValue.getType()) + .hexColor(typeValue.getHexColor()) + .recommendationHexColor(typeValue.getRecommendationHexColor()) + .skippedHexColor(typeValue.getSkippedHexColor()) + .rank(typeValue.getRank()) + .isHint(typeValue.isHint()) + .isCaseInsensitive(typeValue.isCaseInsensitive()) + .isRecommendation(typeValue.isRecommendation()) + .description(typeValue.getDescription()) + .addToDictionaryAction(typeValue.isAddToDictionaryAction()) + .label(typeValue.getLabel()) + .hasDictionary(typeValue.isHasDictionary()) + .systemManaged(false) + .autoHideSkipped(typeValue.isAutoHideSkipped()) + .build()); + } + + + @PreAuthorize("hasAuthority('" + ADD_UPDATE_DOSSIER_DICTIONARY_TYPE + "')") + public Type addDossierType(CreateTypeValue typeValue, String dossierId) { + + accessControlService.verifyUserIsMemberOrApprover(dossierId); + return addType(typeValue, dossierId); + } + + + @PreAuthorize("hasAuthority('" + DELETE_DICTIONARY_TYPE + "')") + public void deleteGlobalType(String type, String dossierTemplateId) { + + deleteType(toTypeId(type, dossierTemplateId)); + } + + + public void deleteType(String typeId) { + + dictionaryManagementService.deleteType(typeId); + } + + + @PreAuthorize("hasAuthority('" + DELETE_DOSSIER_DICTIONARY_TYPE + "')") + public void deleteDossierType(String type, String dossierTemplateId, String dossierId) { + + accessControlService.verifyUserHasAccessPermissions(dossierId); + accessControlService.verifyUserIsMemberOrApprover(dossierId); + deleteType(toTypeId(type, dossierTemplateId, dossierId)); + } + + + @PreAuthorize("hasAuthority('" + READ_DICTIONARY_TYPES + "')") + public TypeResponse getAllTypes(String dossierTemplateId, String dossierId, boolean includeDeleted) { + + List types = MagicConverter.convert(dictionaryPersistenceService.getAllTypesForDossierTemplate(dossierTemplateId, includeDeleted), Type.class); + if (dossierId != null) { + try { + accessControlService.verifyUserHasViewPermissions(dossierId); + types.addAll(MagicConverter.convert(dictionaryPersistenceService.getAllTypesForDossier(dossierId, includeDeleted), Type.class)); + } catch (AccessDeniedException e) { + log.debug(" Don't include the types for the dossier id"); + } + } + + List typeValues = types.stream() + .map(typeResult -> TypeValue.builder() + .type(typeResult.getType()) + .typeId(typeResult.getId()) + .hexColor(typeResult.getHexColor()) + .recommendationHexColor(typeResult.getRecommendationHexColor()) + .skippedHexColor(typeResult.getSkippedHexColor()) + .rank(typeResult.getRank()) + .dossierTemplateId(typeResult.getDossierTemplateId()) + .hint(typeResult.isHint()) + .caseInsensitive(typeResult.isCaseInsensitive()) + .recommendation(typeResult.isRecommendation()) + .description(typeResult.getDescription()) + .addToDictionaryAction(typeResult.isAddToDictionaryAction()) + .label(typeResult.getLabel()) + .hasDictionary(typeResult.isHasDictionary()) + .systemManaged(typeResult.isSystemManaged()) + .autoHideSkipped(typeResult.isAutoHideSkipped()) + .build()) + .collect(Collectors.toList()); + return new TypeResponse(typeValues); + } + + + @PreAuthorize("hasAuthority('" + READ_DICTIONARY_TYPES + "')") + public Dictionary getDictionaryForType(String type, String dossierTemplateId, String dossierId) { + + try { + if (dossierId != null) { + accessControlService.verifyUserHasViewPermissions(dossierId); + } + var typeId = toTypeId(type, dossierTemplateId, dossierId); + var entity = dictionaryPersistenceService.getType(typeId); + var dictionaryForType = MagicConverter.convert(entity, Type.class); + dictionaryForType.setEntries(MagicConverter.convert(entryPersistenceService.getEntries(typeId, DictionaryEntryType.ENTRY, null), DictionaryEntry.class)); + dictionaryForType.setFalsePositiveEntries(MagicConverter.convert(entryPersistenceService.getEntries(typeId, DictionaryEntryType.FALSE_POSITIVE, null), + DictionaryEntry.class)); + dictionaryForType.setFalseRecommendationEntries(MagicConverter.convert(entryPersistenceService.getEntries(typeId, DictionaryEntryType.FALSE_RECOMMENDATION, null), + DictionaryEntry.class)); + + return Dictionary.builder() + .entries(dictionaryForType.getEntries().stream().filter(e -> !e.isDeleted()).map(DictionaryEntry::getValue).collect(Collectors.toList())) + .falsePositiveEntries(dictionaryForType.getFalsePositiveEntries() + .stream() + .filter(e -> !e.isDeleted()) + .map(DictionaryEntry::getValue) + .collect(Collectors.toList())) + .falseRecommendationEntries(dictionaryForType.getFalseRecommendationEntries() + .stream() + .filter(e -> !e.isDeleted()) + .map(DictionaryEntry::getValue) + .collect(Collectors.toList())) + .hexColor(dictionaryForType.getHexColor()) + .recommendationHexColor(dictionaryForType.getRecommendationHexColor()) + .skippedHexColor(dictionaryForType.getSkippedHexColor()) + .dossierTemplateId(dossierTemplateId) + .rank(dictionaryForType.getRank()) + .hint(dictionaryForType.isHint()) + .caseInsensitive(dictionaryForType.isCaseInsensitive()) + .recommendation(dictionaryForType.isRecommendation()) + .description(dictionaryForType.getDescription()) + .addToDictionaryAction(dictionaryForType.isAddToDictionaryAction()) + .label(dictionaryForType.getLabel()) + .hasDictionary(dictionaryForType.isHasDictionary()) + .systemManaged(dictionaryForType.isSystemManaged()) + .autoHideSkipped(dictionaryForType.isAutoHideSkipped()) + .build(); + } catch (AccessDeniedException e) { + throw new NotFoundException("Object not found"); + } + } + + + @PreAuthorize("hasAuthority('" + WRITE_COLORS + "')") + public void setColors(String dossierTemplateId, Colors colors) { + //validate all colors before setting them + ColorUtils.validateColor(colors.getRequestAddColor()); + ColorUtils.validateColor(colors.getRequestRemoveColor()); + ColorUtils.validateColor(colors.getDictionaryRequestColor()); + ColorUtils.validateColor(colors.getPreviewColor()); + ColorUtils.validateColor(colors.getAnalysisColor()); + ColorUtils.validateColor(colors.getUpdatedColor()); + ColorUtils.validateColor(colors.getRecommendationColor()); + ColorUtils.validateColor(colors.getHintColor()); + ColorUtils.validateColor(colors.getRedactionColor()); + ColorUtils.validateColor(colors.getIgnoredHintColor()); + ColorUtils.validateColor(colors.getSkippedColor()); + ColorUtils.validateColor(colors.getAppliedRedactionColor()); + + var colorsEntity = MagicConverter.convert(colors, ColorsEntity.class); + colorsEntity.setDossierTemplateId(dossierTemplateId); + colorsService.saveColors(colorsEntity); + } + + + @PreAuthorize("hasAuthority('" + READ_COLORS + "')") + public Colors getColors(String dossierTemplateId) { + + return MagicConverter.convert(colorsService.getColors(dossierTemplateId), Colors.class); + } + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DigitalSignatureKmsService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DigitalSignatureKmsService.java index 1ad7320b7..4620630ba 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DigitalSignatureKmsService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DigitalSignatureKmsService.java @@ -1,19 +1,18 @@ package com.iqser.red.service.persistence.management.v1.processor.service; -import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; - import org.springframework.beans.BeanUtils; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; -import com.iqser.red.service.persistence.management.v1.processor.client.PDFTronRedactionClient; +import com.iqser.red.service.persistence.management.v1.processor.client.pdftronredactionservice.PDFTronClient; import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.DigitalSignatureEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.DigitalSignatureKmsEntity; import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DigitalSignatureKmsRepository; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.DigitalSignatureKms; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.DigitalSignatureType; +import com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DigitalSignatureKms; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.DigitalSignatureType; import feign.FeignException; import lombok.RequiredArgsConstructor; @@ -27,14 +26,14 @@ public class DigitalSignatureKmsService { private final EncryptionDecryptionService encryptionDecryptionService; private final DigitalSignatureKmsRepository digitalSignatureKmsRepository; private final DigitalSignatureTypeService digitalSignatureTypeService; - private final PDFTronRedactionClient pdfTronRedactionClient; + private final PDFTronClient pdfTronRedactionClient; public DigitalSignatureKmsEntity saveDigitalSignature(DigitalSignatureKmsEntity digitalSignature) { log.info("Validate digital KMS signature before saving"); try { - pdfTronRedactionClient.testDigitalSignatureKms(convert(digitalSignature, DigitalSignatureKms.class)); + pdfTronRedactionClient.testDigitalSignatureKms(MagicConverter.convert(digitalSignature, DigitalSignatureKms.class)); } catch (FeignException e) { if (e.status() == HttpStatus.BAD_REQUEST.value()) { throw new BadRequestException(e.getMessage(), e); @@ -51,24 +50,6 @@ public class DigitalSignatureKmsService { } - public DigitalSignatureKmsEntity getDigitalSignature() { - - return digitalSignatureKmsRepository.findById(DigitalSignatureKmsEntity.ID).map(digitalSignature -> { - DigitalSignatureKmsEntity result = new DigitalSignatureKmsEntity(); - BeanUtils.copyProperties(digitalSignature, result); - decrypt(result); - return result; - }).orElseThrow(() -> new NotFoundException("Digital KMS Signature Not found")); - } - - - public void deleteDigitalSignature() { - - digitalSignatureKmsRepository.deleteById(DigitalSignatureEntity.ID); - digitalSignatureTypeService.deleteDigitalSignatureType(); - } - - private void encrypt(DigitalSignatureKmsEntity digitalSignature) { digitalSignature.setCertificate(encryptionDecryptionService.encrypt(digitalSignature.getCertificate())); @@ -86,4 +67,22 @@ public class DigitalSignatureKmsService { digitalSignature.setKmsSecretKey(encryptionDecryptionService.decrypt(digitalSignature.getKmsSecretKey())); } + + public DigitalSignatureKmsEntity getDigitalSignature() { + + return digitalSignatureKmsRepository.findById(DigitalSignatureKmsEntity.ID).map(digitalSignature -> { + DigitalSignatureKmsEntity result = new DigitalSignatureKmsEntity(); + BeanUtils.copyProperties(digitalSignature, result); + decrypt(result); + return result; + }).orElseThrow(() -> new NotFoundException("Digital KMS Signature Not found")); + } + + + public void deleteDigitalSignature() { + + digitalSignatureKmsRepository.deleteById(DigitalSignatureEntity.ID); + digitalSignatureTypeService.deleteDigitalSignatureType(); + } + } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DigitalSignatureService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DigitalSignatureService.java index d40308cf9..cd087453f 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DigitalSignatureService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DigitalSignatureService.java @@ -1,19 +1,18 @@ package com.iqser.red.service.persistence.management.v1.processor.service; -import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; - import javax.transaction.Transactional; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; -import com.iqser.red.service.persistence.management.v1.processor.client.PDFTronRedactionClient; +import com.iqser.red.service.persistence.management.v1.processor.client.pdftronredactionservice.PDFTronClient; import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.DigitalSignatureEntity; import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DigitalSignatureRepository; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.DigitalSignature; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.DigitalSignatureType; +import com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.DigitalSignature; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.DigitalSignatureType; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -25,7 +24,7 @@ public class DigitalSignatureService { private final EncryptionDecryptionService encryptionDecryptionService; private final DigitalSignatureRepository digitalSignatureRepository; - private final PDFTronRedactionClient pdfTronRedactionClient; + private final PDFTronClient pdfTronRedactionClient; private final DigitalSignatureTypeService digitalSignatureTypeService; @@ -51,7 +50,7 @@ public class DigitalSignatureService { public DigitalSignatureEntity saveDigitalSignature(DigitalSignatureEntity digitalSignature) { try { - pdfTronRedactionClient.testDigitalCurrentSignature(convert(digitalSignature, DigitalSignature.class)); + pdfTronRedactionClient.testDigitalCurrentSignature(MagicConverter.convert(digitalSignature, DigitalSignature.class)); } catch (Exception e) { throw new BadRequestException("Failed to test digital signature"); } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DigitalSignatureTypeService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DigitalSignatureTypeService.java index 595b7447d..5d8415798 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DigitalSignatureTypeService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DigitalSignatureTypeService.java @@ -5,7 +5,7 @@ import org.springframework.stereotype.Service; import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.DigitalSignatureTypeEntity; import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DigitalSignatureTypeRepository; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.DigitalSignatureType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.DigitalSignatureType; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DossierAttributesController.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierAttributesManagementService.java similarity index 67% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DossierAttributesController.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierAttributesManagementService.java index a6e6f6aca..2d0453b8c 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DossierAttributesController.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierAttributesManagementService.java @@ -1,37 +1,32 @@ -package com.iqser.red.service.peristence.v1.server.controller; - -import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; +package com.iqser.red.service.persistence.management.v1.processor.service; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.stereotype.Service; -import com.iqser.red.service.peristence.v1.server.service.DossierService; +import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierAttributeConfigEntity; import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; import com.iqser.red.service.persistence.management.v1.processor.exception.ConflictException; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierAttributeConfigPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierAttributePersistenceService; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierAttribute; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierAttributeType; -import com.iqser.red.service.persistence.service.v1.api.resources.DossierAttributesResource; +import com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.DossierAttribute; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.DossierAttributeType; import lombok.RequiredArgsConstructor; -@RestController +@Service @RequiredArgsConstructor -public class DossierAttributesController implements DossierAttributesResource { +public class DossierAttributesManagementService { private final DossierAttributePersistenceService dossierAttributePersistenceService; private final DossierAttributeConfigPersistenceService dossierAttributeConfigPersistenceService; private final DossierService dossierService; - @Override - public List setDossierAttributes(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @RequestBody List dossierAttributes) { + public List setDossierAttributes(String dossierId, List dossierAttributes) { var dossier = dossierService.getDossierById(dossierId); var config = dossierAttributeConfigPersistenceService.getDossierAttributes(dossier.getDossierTemplateId()); @@ -51,43 +46,6 @@ public class DossierAttributesController implements DossierAttributesResource { } - @Override - public DossierAttribute addOrUpdateDossierAttribute(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @RequestBody DossierAttribute dossierAttribute) { - - var dossier = dossierService.getDossierById(dossierId); - var dossierAttributes = dossierAttributePersistenceService.getDossierAttributes(dossierId); - var config = dossierAttributeConfigPersistenceService.getDossierAttributes(dossier.getDossierTemplateId()); - - var typeById = config.stream().collect(Collectors.toMap(entry -> entry.getId(), entry -> entry.getType())); - validateDossierAttribute(typeById, dossierAttribute); - - if (dossierAttributes.stream() - .anyMatch(d -> d.getId().getDossierId().equals(dossierAttribute.getDossierId()) && d.getId() - .getDossierAttributeConfigId() - .equals(dossierAttribute.getDossierAttributeConfigId()))) { - dossierAttributePersistenceService.updateDossierAttribute(dossierId, dossierAttribute.getDossierAttributeConfigId(), dossierAttribute.getValue()); - } else { - dossierAttributePersistenceService.insertDossierAttribute(dossierId, dossierAttribute.getDossierAttributeConfigId(), dossierAttribute.getValue()); - } - - return convert(dossierAttributePersistenceService.findOne(dossierId, dossierAttribute.getDossierAttributeConfigId()), DossierAttribute.class); - } - - - @Override - public List getDossierAttributes(@PathVariable(DOSSIER_ID_PARAM) String dossierId) { - - return convert(dossierAttributePersistenceService.getDossierAttributes(dossierId), DossierAttribute.class); - } - - - @Override - public void deleteDossierAttribute(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(DOSSIER_ATTRIBUTE_ID_PARAM) String dossierAttributeId) { - - dossierAttributePersistenceService.deleteDossierAttribute(dossierId, dossierAttributeId); - } - - private void validateDossierAttribute(Map typeById, DossierAttribute dossierAttribute) { if (!typeById.containsKey(dossierAttribute.getDossierAttributeConfigId())) { @@ -102,5 +60,39 @@ public class DossierAttributesController implements DossierAttributesResource { } } + + public List getDossierAttributes(String dossierId) { + + return MagicConverter.convert(dossierAttributePersistenceService.getDossierAttributes(dossierId), DossierAttribute.class); + } + + + public DossierAttribute addOrUpdateDossierAttribute(String dossierId, DossierAttribute dossierAttribute) { + + var dossier = dossierService.getDossierById(dossierId); + var dossierAttributes = dossierAttributePersistenceService.getDossierAttributes(dossierId); + var config = dossierAttributeConfigPersistenceService.getDossierAttributes(dossier.getDossierTemplateId()); + + var typeById = config.stream().collect(Collectors.toMap(DossierAttributeConfigEntity::getId, DossierAttributeConfigEntity::getType)); + validateDossierAttribute(typeById, dossierAttribute); + + if (dossierAttributes.stream() + .anyMatch(d -> d.getId().getDossierId().equals(dossierAttribute.getDossierId()) && d.getId() + .getDossierAttributeConfigId() + .equals(dossierAttribute.getDossierAttributeConfigId()))) { + dossierAttributePersistenceService.updateDossierAttribute(dossierId, dossierAttribute.getDossierAttributeConfigId(), dossierAttribute.getValue()); + } else { + dossierAttributePersistenceService.insertDossierAttribute(dossierId, dossierAttribute.getDossierAttributeConfigId(), dossierAttribute.getValue()); + } + + return MagicConverter.convert(dossierAttributePersistenceService.findOne(dossierId, dossierAttribute.getDossierAttributeConfigId()), DossierAttribute.class); + } + + + public void deleteDossierAttribute(String dossierId, String dossierAttributeId) { + + dossierAttributePersistenceService.deleteDossierAttribute(dossierId, dossierAttributeId); + } + } diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DossierController.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierManagementService.java similarity index 63% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DossierController.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierManagementService.java index 2e2e6215c..60378d67b 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DossierController.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierManagementService.java @@ -1,7 +1,6 @@ -package com.iqser.red.service.peristence.v1.server.controller; +package com.iqser.red.service.persistence.management.v1.processor.service; import static com.iqser.red.service.persistence.management.v1.processor.exception.DossierNotFoundException.DOSSIER_NOT_FOUND_MESSAGE; -import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; import java.time.OffsetDateTime; import java.util.Collections; @@ -11,67 +10,62 @@ import java.util.stream.Collectors; import javax.transaction.Transactional; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.stereotype.Service; -import com.iqser.red.service.peristence.v1.server.service.DossierService; -import com.iqser.red.service.peristence.v1.server.service.FileService; -import com.iqser.red.service.peristence.v1.server.service.FileStatusService; -import com.iqser.red.service.peristence.v1.server.service.IndexingService; -import com.iqser.red.service.peristence.v1.server.utils.DossierMapper; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierEntity; import com.iqser.red.service.persistence.management.v1.processor.exception.DossierNotFoundException; -import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.CreateOrUpdateDossierRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.Dossier; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierChange; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierInformation; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileModel; -import com.iqser.red.service.persistence.service.v1.api.resources.DossierResource; +import com.iqser.red.service.persistence.management.v1.processor.settings.FileManagementServiceSettings; +import com.iqser.red.service.persistence.management.v1.processor.utils.DossierMapper; +import com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierInformation; +import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.CreateOrUpdateDossierRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.Dossier; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.DossierChange; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.Type; import com.iqser.red.service.search.v1.model.IndexMessageType; -import feign.Param; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @Slf4j -@RestController +@Service @RequiredArgsConstructor -public class DossierController implements DossierResource { +public class DossierManagementService { private final DossierService dossierService; private final FileStatusService fileStatusService; private final FileService fileService; private final IndexingService indexingService; + private final DictionaryManagementService dictionaryManagementService; + private final FileManagementServiceSettings fileManagementServiceSettings; - @Override - public Set changesSince(@RequestBody JSONPrimitive since) { + public Set changesSince(JSONPrimitive since) { return dossierService.changesSince(since.getValue()); } - @Override @Transactional - public Dossier addDossier(@RequestBody CreateOrUpdateDossierRequest dossierRequest) { + public Dossier addDossier(CreateOrUpdateDossierRequest dossierRequest) { - return convert(dossierService.addDossier(dossierRequest), Dossier.class, new DossierMapper()); + var dossier = dossierService.addDossier(dossierRequest); + + addDossierDictionary(dossier.getDossierTemplateId(), dossier.getId()); + return MagicConverter.convert(dossier, Dossier.class, new DossierMapper()); } - @Override @Transactional - public Dossier updateDossier(@RequestBody CreateOrUpdateDossierRequest dossierRequest, @PathVariable(DOSSIER_ID_PARAM) String dossierId) { + public Dossier updateDossier(CreateOrUpdateDossierRequest dossierRequest, String dossierId) { - return convert(dossierService.updateDossier(dossierRequest, dossierId), Dossier.class, new DossierMapper()); + return MagicConverter.convert(dossierService.updateDossier(dossierRequest, dossierId), Dossier.class, new DossierMapper()); } - @Override - public void delete(@Param(DOSSIER_ID_PARAM) @PathVariable(DOSSIER_ID_PARAM) String dossierId) { + public void delete(String dossierId) { OffsetDateTime now = OffsetDateTime.now(); @@ -91,56 +85,52 @@ public class DossierController implements DossierResource { } - @Override @Transactional - public List getAllDossiers(@RequestParam(name = INCLUDE_ARCHIVED_PARAM, defaultValue = "false", required = false) boolean includeArchived, - @RequestParam(name = INCLUDE_DELETED_PARAM, defaultValue = "false", required = false) boolean includeDeleted) { + public List getAllDossiers(boolean includeArchived, boolean includeDeleted) { return getConvertedAllDossiers(dossierService.getAllDossiers(), includeArchived, includeDeleted); } - @Override - @Transactional - public List getAllDossiersForDossierTemplateId(@PathVariable(DOSSIER_TEMPLATE_ID_PARAM) String dossierTemplateId, - @RequestParam(name = INCLUDE_ARCHIVED_PARAM, defaultValue = "false", required = false) boolean includeArchived, - @RequestParam(name = INCLUDE_DELETED_PARAM, defaultValue = "false", required = false) boolean includeDeleted) { - - return getConvertedAllDossiers(dossierService.getAllDossiersForDossierTemplateId(dossierTemplateId), includeArchived, includeDeleted); - - } - - private List getConvertedAllDossiers(List dossierEntityList, boolean includeArchived, boolean includeDeleted) { List dossierEntitiesList = dossierEntityList.stream().filter(dossierEntity -> dossierEntity.getHardDeletedTime() == null).collect(Collectors.toList()); // return all dossiers if (includeDeleted && includeArchived) { - return convert(dossierEntitiesList, Dossier.class, new DossierMapper()); + return MagicConverter.convert(dossierEntitiesList, Dossier.class, new DossierMapper()); } // return both active and archived&non-deleted dossiers if (includeArchived) { - return convert(dossierEntitiesList.stream().filter(p -> p.getSoftDeletedTime() == null).collect(Collectors.toList()), Dossier.class, new DossierMapper()); + return MagicConverter.convert(dossierEntitiesList.stream().filter(p -> p.getSoftDeletedTime() == null).collect(Collectors.toList()), + Dossier.class, + new DossierMapper()); } // return both active and deleted dossiers if (includeDeleted) { - return convert(dossierEntitiesList.stream().filter(p -> p.getArchivedTime() == null || p.getSoftDeletedTime() != null).collect(Collectors.toList()), + return MagicConverter.convert(dossierEntitiesList.stream().filter(p -> p.getArchivedTime() == null || p.getSoftDeletedTime() != null).collect(Collectors.toList()), Dossier.class, new DossierMapper()); } // return only active dossiers - return convert(dossierEntitiesList.stream().filter(p -> p.getSoftDeletedTime() == null && p.getArchivedTime() == null).collect(Collectors.toList()), + return MagicConverter.convert(dossierEntitiesList.stream().filter(p -> p.getSoftDeletedTime() == null && p.getArchivedTime() == null).collect(Collectors.toList()), Dossier.class, new DossierMapper()); } - @Override - public DossierInformation getDossierInformation(@RequestBody List filteredDossierIds) { + @Transactional + public List getAllDossiersForDossierTemplateId(String dossierTemplateId, boolean includeArchived, boolean includeDeleted) { + + return getConvertedAllDossiers(dossierService.getAllDossiersForDossierTemplateId(dossierTemplateId), includeArchived, includeDeleted); + + } + + + public DossierInformation getDossierInformation(List filteredDossierIds) { DossierInformation dossierInformation = new DossierInformation(); @@ -162,11 +152,8 @@ public class DossierController implements DossierResource { } - @Override @Transactional - public Dossier getDossierById(@Param(DOSSIER_ID_PARAM) @PathVariable(DOSSIER_ID_PARAM) String dossierId, - @RequestParam(name = INCLUDE_ARCHIVED_PARAM, defaultValue = "false", required = false) boolean includeArchived, - @RequestParam(name = INCLUDE_DELETED_PARAM, defaultValue = "false", required = false) boolean includeDeleted) { + public Dossier getDossierById(String dossierId, boolean includeArchived, boolean includeDeleted) { DossierEntity dossier = dossierService.getDossierById(dossierId); if (dossier.getArchivedTime() != null && !includeArchived) { @@ -175,11 +162,10 @@ public class DossierController implements DossierResource { if (dossier.getSoftDeletedTime() != null && !includeDeleted) { throw new DossierNotFoundException(String.format(DOSSIER_NOT_FOUND_MESSAGE, dossierId)); } - return convert(dossier, Dossier.class, new DossierMapper()); + return MagicConverter.convert(dossier, Dossier.class, new DossierMapper()); } - @Override @Transactional public List getArchivedDossiers() { @@ -187,17 +173,9 @@ public class DossierController implements DossierResource { } - @Override - @Transactional - public List getArchivedDossiersForDossierTemplateId(@PathVariable(DOSSIER_TEMPLATE_ID_PARAM) String dossierTemplateId) { - - return getArchivedDossiersList(dossierService.getAllDossiersForDossierTemplateId(dossierTemplateId)); - } - - private List getArchivedDossiersList(List dossierEntityList) { - var archivedDossiers = convert(dossierEntityList.stream() + var archivedDossiers = MagicConverter.convert(dossierEntityList.stream() .filter(p -> p.getArchivedTime() != null && p.getHardDeletedTime() == null && p.getSoftDeletedTime() == null) .collect(Collectors.toList()), Dossier.class, new DossierMapper()); archivedDossiers.sort((dossier1, dossier2) -> dossier2.getArchivedTime().compareTo(dossier1.getArchivedTime())); @@ -206,11 +184,17 @@ public class DossierController implements DossierResource { } - @Override + @Transactional + public List getArchivedDossiersForDossierTemplateId(String dossierTemplateId) { + + return getArchivedDossiersList(dossierService.getAllDossiersForDossierTemplateId(dossierTemplateId)); + } + + @Transactional public List getSoftDeletedDossiers() { - var softDeletedDossiers = convert(dossierService.getAllDossiers() + var softDeletedDossiers = MagicConverter.convert(dossierService.getAllDossiers() .stream() .filter(p -> p.getSoftDeletedTime() != null && p.getHardDeletedTime() == null) .collect(Collectors.toList()), Dossier.class, new DossierMapper()); @@ -220,8 +204,7 @@ public class DossierController implements DossierResource { } - @Override - public void hardDeleteDossiers(@RequestBody Set dossierIds) { + public void hardDeleteDossiers(Set dossierIds) { for (String dossierId : dossierIds) { DossierEntity dossier = dossierService.getDossierById(dossierId); @@ -236,8 +219,7 @@ public class DossierController implements DossierResource { } - @Override - public void undeleteDossiers(@RequestBody Set dossierIds) { + public void undeleteDossiers(Set dossierIds) { for (String dossierId : dossierIds) { var dossier = dossierService.getDossierById(dossierId); @@ -256,8 +238,7 @@ public class DossierController implements DossierResource { } - @Override - public void archiveDossiers(@RequestBody Set dossierIds) { + public void archiveDossiers(Set dossierIds) { for (String dossierId : dossierIds) { DossierEntity dossier = dossierService.getDossierById(dossierId); @@ -273,8 +254,13 @@ public class DossierController implements DossierResource { } - @Override - public void unarchiveDossiers(@RequestBody Set dossierIds) { + private void addToIndexingQueue(String dossierId, List fileStatuses) { + + fileStatuses.forEach(f -> indexingService.addToIndexingQueue(IndexMessageType.UPDATE, null, dossierId, f.getId(), 2)); + } + + + public void unarchiveDossiers(Set dossierIds) { for (String dossierId : dossierIds) { DossierEntity dossier = dossierService.getDossierById(dossierId); @@ -290,9 +276,22 @@ public class DossierController implements DossierResource { } - private void addToIndexingQueue(String dossierId, List fileStatuses) { + private void addDossierDictionary(String dossierTemplateId, String dossierId) { - fileStatuses.forEach(f -> indexingService.addToIndexingQueue(IndexMessageType.UPDATE, null, dossierId, f.getId(), 2)); + dictionaryManagementService.addType(Type.builder() + .type(fileManagementServiceSettings.getDossierDictionarySettings().getName()) + .dossierTemplateId(dossierTemplateId) + .hexColor(fileManagementServiceSettings.getDossierDictionarySettings().getHexColor()) + .rank(fileManagementServiceSettings.getDossierDictionarySettings().getRank()) + .isHint(fileManagementServiceSettings.getDossierDictionarySettings().isHint()) + .isCaseInsensitive(fileManagementServiceSettings.getDossierDictionarySettings().isCaseInsensitive()) + .isRecommendation(fileManagementServiceSettings.getDossierDictionarySettings().isRecommendation()) + .description(fileManagementServiceSettings.getDossierDictionarySettings().getDescription()) + .addToDictionaryAction(fileManagementServiceSettings.getDossierDictionarySettings().isAddToDictionaryAction()) + .dossierId(dossierId) + .hasDictionary(true) + .systemManaged(true) + .build()); } } diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/DossierService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierService.java similarity index 93% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/DossierService.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierService.java index 370ade44c..03cbb820b 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/DossierService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierService.java @@ -1,9 +1,11 @@ -package com.iqser.red.service.peristence.v1.server.service; +package com.iqser.red.service.persistence.management.v1.processor.service; import java.time.OffsetDateTime; import java.util.List; import java.util.Set; +import javax.validation.ConstraintViolationException; + import org.springframework.stereotype.Service; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierEntity; @@ -14,15 +16,12 @@ import com.iqser.red.service.persistence.management.v1.processor.service.persist import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierTemplatePersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.utils.TypeIdUtils; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierTemplateStatus; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.CreateOrUpdateDossierRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierChange; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierTemplateStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.CreateOrUpdateDossierRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.DossierChange; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.transaction.annotation.Transactional; - -import javax.validation.ConstraintViolationException; /** * Provides the internal interface between dossier request and the actual persistence. diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/DossierStatsService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierStatsService.java similarity index 93% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/DossierStatsService.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierStatsService.java index 0e93b4cac..710cc81eb 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/DossierStatsService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierStatsService.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.service; +package com.iqser.red.service.persistence.management.v1.processor.service; import static com.iqser.red.service.persistence.management.v1.processor.exception.DossierNotFoundException.DOSSIER_NOT_FOUND_MESSAGE; @@ -10,8 +10,8 @@ import org.springframework.stereotype.Service; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierEntity; import com.iqser.red.service.persistence.management.v1.processor.exception.DossierNotFoundException; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierStats; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierStats; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileModel; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -27,7 +27,7 @@ public class DossierStatsService { // private Map dossierStatsMap = new HashMap<>(); // @Scheduled(fixedDelay = 10000, initialDelay = 1000) -// public void computeDossierStats() { +// external void computeDossierStats() { // log.info("Computing Dossier Stats ... "); // long start = System.currentTimeMillis(); // Map dossierStatsComputeMap = new HashMap<>(); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierTemplateCloneService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierTemplateCloneService.java index 1a5afb981..cbb676926 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierTemplateCloneService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierTemplateCloneService.java @@ -1,7 +1,5 @@ package com.iqser.red.service.persistence.management.v1.processor.service; -import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; - import java.io.IOException; import java.time.OffsetDateTime; import java.time.temporal.ChronoUnit; @@ -9,6 +7,8 @@ import java.util.ArrayList; import java.util.List; import java.util.UUID; +import javax.transaction.Transactional; + import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; @@ -31,11 +31,12 @@ import com.iqser.red.service.persistence.management.v1.processor.service.persist import com.iqser.red.service.persistence.management.v1.processor.service.persistence.ReportTemplatePersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.RulesPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierTemplateRepository; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.CloneDossierTemplateRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierTemplateStatus; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.Watermark; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.CreateOrUpdateDossierStatusRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.legalbasis.LegalBasis; +import com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter; +import com.iqser.red.service.persistence.service.v1.api.shared.model.WatermarkModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.CloneDossierTemplateRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierTemplateStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.CreateOrUpdateDossierStatusRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.legalbasis.LegalBasis; import com.iqser.red.storage.commons.service.StorageService; import lombok.RequiredArgsConstructor; @@ -61,6 +62,7 @@ public class DossierTemplateCloneService { private final WatermarkService watermarkService; + @Transactional public DossierTemplateEntity cloneDossierTemplate(String dossierTemplateId, CloneDossierTemplateRequest cloneDossierTemplateRequest) { dossierTemplatePersistenceService.validateDossierTemplateNameIsUnique(cloneDossierTemplateRequest.getName()); @@ -131,7 +133,7 @@ public class DossierTemplateCloneService { private void cloneLegalBasisMapping(String dossierTemplateId, String clonedDossierTemplateId) { legalBasisMappingPersistenceService.setLegalBasisMapping(clonedDossierTemplateId, - convert(legalBasisMappingPersistenceService.getLegalBasisMapping(dossierTemplateId), LegalBasis.class)); + MagicConverter.convert(legalBasisMappingPersistenceService.getLegalBasisMapping(dossierTemplateId), LegalBasis.class)); } @@ -266,7 +268,7 @@ public class DossierTemplateCloneService { var watermarkList = watermarkService.getWatermarksForDossierTemplateId(dossierTemplateId); for (var watermark : watermarkList) { - var clonedWatermark = new Watermark(); + var clonedWatermark = new WatermarkModel(); BeanUtils.copyProperties(watermark, clonedWatermark, "id", "dossierTemplateId"); clonedWatermark.setDossierTemplateId(clonedDossierTemplateId); watermarkService.createOrUpdateWatermark(clonedWatermark); diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/DossierTemplateImportService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierTemplateImportService.java similarity index 91% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/DossierTemplateImportService.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierTemplateImportService.java index c7daff1f1..b919363c3 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/DossierTemplateImportService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierTemplateImportService.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.service; +package com.iqser.red.service.persistence.management.v1.processor.service; import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; @@ -24,10 +24,10 @@ import java.util.stream.Collectors; import javax.transaction.Transactional; -import com.iqser.red.service.peristence.v1.server.settings.FileManagementServiceSettings; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.compress.archivers.zip.ZipArchiveEntry; import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream; +import org.apache.commons.compress.archivers.zip.ZipEncodingHelper; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; @@ -36,7 +36,6 @@ import org.springframework.web.bind.annotation.RequestBody; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import com.iqser.red.service.peristence.v1.server.utils.FileUtils; import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.BaseDictionaryEntry; import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.ColorsEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.FileAttributesGeneralConfigurationEntity; @@ -49,8 +48,6 @@ import com.iqser.red.service.persistence.management.v1.processor.entity.dossier. import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileAttributeConfigEntity; import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; import com.iqser.red.service.persistence.management.v1.processor.exception.ConflictException; -import com.iqser.red.service.persistence.management.v1.processor.service.ColorsService; -import com.iqser.red.service.persistence.management.v1.processor.service.WatermarkService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DictionaryPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierAttributeConfigPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierStatusPersistenceService; @@ -61,23 +58,25 @@ import com.iqser.red.service.persistence.management.v1.processor.service.persist import com.iqser.red.service.persistence.management.v1.processor.service.persistence.ReportTemplatePersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.RulesPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierTemplateRepository; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierAttributeConfig; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierTemplate; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierTemplateStatus; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.FileAttributesGeneralConfiguration; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.ReportTemplate; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.ReportTemplateUploadRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.Colors; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.Watermark; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.CreateOrUpdateDossierStatusRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierStatusInfo; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileAttributeConfig; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.importexport.ExportFilename; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.importexport.ImportDossierTemplateRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.importexport.ImportTemplateResult; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.legalbasis.LegalBasis; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.DictionaryEntryType; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.Type; +import com.iqser.red.service.persistence.management.v1.processor.settings.FileManagementServiceSettings; +import com.iqser.red.service.persistence.management.v1.processor.utils.FileUtils; +import com.iqser.red.service.persistence.service.v1.api.shared.model.WatermarkModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierAttributeConfig; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierTemplate; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierTemplateStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.FileAttributesGeneralConfiguration; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.ReportTemplate; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.ReportTemplateUploadRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.Colors; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.CreateOrUpdateDossierStatusRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.DossierStatusInfo; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileAttributeConfig; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.importexport.ExportFilename; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.importexport.ImportDossierTemplateRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.importexport.ImportTemplateResult; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.legalbasis.LegalBasis; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionaryEntryType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.Type; import com.iqser.red.storage.commons.service.StorageService; import lombok.RequiredArgsConstructor; @@ -102,7 +101,7 @@ public class DossierTemplateImportService { private final DossierStatusPersistenceService dossierStatusPersistenceService; private final WatermarkService watermarkService; private final ReportTemplateService reportTemplateService; - private final DictionaryService dictionaryService; + private final DictionaryManagementService dictionaryManagementService; private final EntryPersistenceService entryPersistenceService; private final ReportTemplatePersistenceService reportTemplatePersistenceService; private final StorageService storageService; @@ -110,15 +109,182 @@ public class DossierTemplateImportService { private final FileManagementServiceSettings settings; - public String importDossierTemplate(@RequestBody ImportDossierTemplateRequest request) { + @Transactional + public String importDossierTemplate(ImportDossierTemplateRequest request) { ImportTemplateResult archiveResult = this.handleArchive(request); return this.importDossierTemplate(archiveResult); } - @Transactional - public String importDossierTemplate(ImportTemplateResult request) { + private ImportTemplateResult handleArchive(ImportDossierTemplateRequest request) { + + objectMapper.registerModule(new JavaTimeModule()); + File tempFile; + try { + tempFile = FileUtils.createTempFile(request.getArchive(), UUID.randomUUID().toString(), ".zip"); + var importTemplateResult = new ImportTemplateResult(); + importTemplateResult.setDossierTemplateId(request.getDossierTemplateId()); + importTemplateResult.setUserId(request.getUserId()); + importTemplateResult.setUpdateExistingTemplate(request.isUpdateExistingDossierTemplate()); + + try (FileInputStream fis = new FileInputStream(tempFile); BufferedInputStream bis = new BufferedInputStream(fis); ZipArchiveInputStream zis = new ZipArchiveInputStream( + bis, + "UTF8", + true, + true)) { + + int totalSizeArchive = 0; + int totalEntryArchive = 0; + ZipArchiveEntry ze; + Map reportTemplateMap = new HashMap<>(); + Map reportTemplateBytesMap = new HashMap<>(); + List reportTemplateFilenameList = new ArrayList<>(); + Map> typeEntriesMap = new HashMap<>(); + Map> typeFalsePositivesMap = new HashMap<>(); + Map> typeFalseRecommendationsMap = new HashMap<>(); + + while ((ze = zis.getNextZipEntry()) != null) { + log.debug("---> " + ze.getName() + " ---- " + ze.isDirectory()); + totalEntryArchive++; + + if (!zis.canReadEntryData(ze)) { + continue; + } + if (ze.isUnixSymlink()) { + continue; + } + if (!ze.isDirectory()) { + var bos = new ByteArrayOutputStream(); + var buffer = new byte[2048]; + var nBytes = 0; + int totalSizeEntry = 0; + + while ((nBytes = zis.read(buffer)) > 0) { + bos.write(buffer, 0, nBytes); + totalSizeEntry += nBytes; + totalSizeArchive += nBytes; + + double compressionRatio = (float) totalSizeEntry / ze.getCompressedSize(); + if (compressionRatio > settings.getCompressionThresholdRatio()) { + log.debug("zip entry: " + ze.getName() + " - totalSizeEntry: " + totalSizeEntry + " ze.getCompressedSize(): " + ze.getCompressedSize() + " compressionRatio: " + compressionRatio); + // ratio between compressed and uncompressed data is highly suspicious, looks like a Zip Bomb Attack + throw new BadRequestException("ZIP-Bomb detected (compressionRatio)."); + } + } + if (totalSizeArchive > THRESHOLD_SIZE) { + log.debug("zip entry: " + ze.getName() + " totalSizeEntry: " + totalSizeArchive); + + // the uncompressed data size is too much for the application resource capacity + throw new BadRequestException("ZIP-Bomb detected. (threshold size)"); + } + + if (totalEntryArchive > THRESHOLD_ENTRIES) { + log.debug("zip entry: " + ze.getName() + " totalEntryArchive: " + totalEntryArchive); + // too much entries in this archive, can lead to inodes exhaustion of the system + throw new BadRequestException("ZIP-Bomb detected (threshold entries)."); + } + + var bytes = bos.toByteArray(); + if (ze.getName().contains(ExportFilename.DOSSIER_TEMPLATE_META.getFilename())) { + DossierTemplate dossierTemplate = objectMapper.readValue(bytes, DossierTemplate.class); + importTemplateResult.setDossierTemplate(dossierTemplate); + } else if (ze.getName().contains(ExportFilename.WATERMARK.getFilename())) { + List watermarkList = objectMapper.readValue(bytes, new TypeReference<>() { + }); + importTemplateResult.getWatermarks().addAll(watermarkList); + } else if (ze.getName().contains(ExportFilename.COLORS.getFilename())) { + Colors colors = objectMapper.readValue(bytes, Colors.class); + importTemplateResult.setColors(colors); + } else if (ze.getName().contains(ExportFilename.DOSSIER_STATUS.getFilename())) { + List dossierStatusInfoList = objectMapper.readValue(bytes, new TypeReference<>() { + }); + importTemplateResult.getDossierStatusInfos().addAll(dossierStatusInfoList); + } else if (ze.getName().contains(ExportFilename.DOSSIER_ATTRIBUTES_CONFIG.getFilename())) { + List dossierAttributeConfigs = objectMapper.readValue(bytes, new TypeReference<>() { + }); + importTemplateResult.getDossierAttributesConfigs().addAll(dossierAttributeConfigs); + } else if (ze.getName().contains(ExportFilename.FILE_ATTRIBUTE_CONFIG.getFilename())) { + List fileAttributeConfigs = objectMapper.readValue(bytes, new TypeReference<>() { + }); + importTemplateResult.getFileAttributesConfigs().addAll(fileAttributeConfigs); + } else if (ze.getName().contains(ExportFilename.LEGAL_BASIS.getFilename())) { + List legalBasisList = objectMapper.readValue(bytes, new TypeReference<>() { + }); + importTemplateResult.getLegalBases().addAll(legalBasisList); + } else if (ze.getName().contains(ExportFilename.FILE_ATTRIBUTE_GENERAL_CONFIG.getFilename())) { + FileAttributesGeneralConfiguration fileAttributesGeneralConfiguration = objectMapper.readValue(bytes, FileAttributesGeneralConfiguration.class); + importTemplateResult.setFileAttributesGeneralConfiguration(fileAttributesGeneralConfiguration); + } else if (ze.getName().contains(ExportFilename.RULES.getFilename())) { + String rules = objectMapper.readValue(bytes, String.class); + importTemplateResult.setRuleSet(rules); + } else if (ze.getName().contains(ExportFilename.DOSSIER_TYPE.getFilename())) { + Type type = objectMapper.readValue(bytes, Type.class); + importTemplateResult.getTypes().add(type); + } else if (ze.getName().contains(ExportFilename.ENTRIES.getFilename())) { + + List entries = this.readEntries(bytes); + typeEntriesMap.put(this.getType(ze.getName()), entries); + + } else if (ze.getName().contains(ExportFilename.FALSE_POSITIVES.getFilename())) { + + List falsePositives = this.readEntries(bytes); + typeFalsePositivesMap.put(this.getType(ze.getName()), falsePositives); + + } else if (ze.getName().contains(ExportFilename.FALSE_RECOMMENDATION.getFilename())) { + + List falseRecommendations = this.readEntries(bytes); + typeFalseRecommendationsMap.put(this.getType(ze.getName()), falseRecommendations); + + } else if (ze.getName().contains(ExportFilename.REPORT_TEMPLATE.getFilename())) { + var reportTemplateList = objectMapper.readValue(bytes, new TypeReference>() { + }); + reportTemplateMap = reportTemplateList.stream() + .collect(Collectors.toMap(rt -> rt.isMultiFileReport() ? rt.getFileName() + ExportFilename.REPORT_TEMPLATE_MULTI_FILE.getFilename() : rt.getFileName(), + Function.identity())); + reportTemplateFilenameList = reportTemplateList.stream() + .map(rt -> rt.isMultiFileReport() ? rt.getFileName() + ExportFilename.REPORT_TEMPLATE_MULTI_FILE.getFilename() : rt.getFileName()) + .collect(Collectors.toList()); + } else { + reportTemplateBytesMap.put(ze.getName(), bos); + } + bos.close(); + } + } + importTemplateResult.setEntries(typeEntriesMap); + importTemplateResult.setFalsePositives(typeFalsePositivesMap); + importTemplateResult.setFalseRecommendations(typeFalseRecommendationsMap); + + for (var reportZe : reportTemplateBytesMap.entrySet()) { + if (reportTemplateFilenameList.contains(reportZe.getKey())) { + var report = reportTemplateMap.get(reportZe.getKey()); + importTemplateResult.getReportTemplateUploadRequests() + .add(ReportTemplateUploadRequest.builder() + .fileName(report.getFileName()) + .activeByDefault(report.isActiveByDefault()) + .multiFileReport(report.isMultiFileReport()) + .dossierTemplateId(request.getDossierTemplateId() != null ? request.getDossierTemplateId() : "") + .template(reportZe.getValue().toByteArray()) + .build()); + + } + } + return importTemplateResult; + } finally { + if (tempFile != null) { + boolean isDeleted = tempFile.delete(); + if (!isDeleted) { + log.debug("tempFile could not be deleted"); + } + } + } + } catch (IOException | BadRequestException e) { + throw new BadRequestException(e.getMessage(), e); + } + } + + + private String importDossierTemplate(ImportTemplateResult request) { long start = System.currentTimeMillis(); String dossierTemplateId; @@ -143,7 +309,7 @@ public class DossierTemplateImportService { // set watermarks if (CollectionUtils.isNotEmpty(request.getWatermarks())) { - Set toSetWatermarks = request.getWatermarks().stream().map(Watermark::getName).filter(Objects::nonNull).collect(Collectors.toSet()); + Set toSetWatermarks = request.getWatermarks().stream().map(WatermarkModel::getName).filter(Objects::nonNull).collect(Collectors.toSet()); var currentWatermarkConfigs = watermarkService.getWatermarksForDossierTemplateId(dossierTemplateId); Set configsToRemove = currentWatermarkConfigs.stream().filter(c -> !toSetWatermarks.contains(c.getName())).collect(Collectors.toSet()); var watermarkNameToEntity = currentWatermarkConfigs.stream().collect(Collectors.toMap(WatermarkEntity::getName, Function.identity())); @@ -288,7 +454,7 @@ public class DossierTemplateImportService { if (CollectionUtils.isNotEmpty(request.getTypes())) { for (var type : request.getTypes()) { type.setDossierTemplateId(dossierTemplateId); - var returnedType = dictionaryService.addType(type); + var returnedType = dictionaryManagementService.addType(type); this.addEntries(request.getEntries(), returnedType.getTypeId(), returnedType.getType(), DictionaryEntryType.ENTRY); this.addEntries(request.getFalsePositives(), returnedType.getTypeId(), returnedType.getType(), DictionaryEntryType.FALSE_POSITIVE); this.addEntries(request.getFalseRecommendations(), returnedType.getTypeId(), returnedType.getType(), DictionaryEntryType.FALSE_RECOMMENDATION); @@ -321,26 +487,29 @@ public class DossierTemplateImportService { } - private void addEntries(Map> entries, String typeId, String typeName, DictionaryEntryType dictionaryType) { + private List readEntries(byte[] bytes) { + + ByteArrayInputStream bInput = new ByteArrayInputStream(bytes); + DataInputStream in = new DataInputStream(bInput); + List entries = new ArrayList<>(); + try { + while (in.available() > 0) { + String entry = in.readUTF(); + entries.add(entry); - if (entries != null && !entries.isEmpty() && entries.get(typeName) != null && !entries.get(typeName).isEmpty()) { - dictionaryService.addEntries(typeId, entries.get(typeName), true, true, dictionaryType); - } else { // no entries, delete current entries - List existing = entryPersistenceService.getEntries(typeId, dictionaryType, null).stream().map(BaseDictionaryEntry::getValue).collect(Collectors.toList()); - if (!existing.isEmpty()) { - dictionaryService.deleteEntries(typeId, existing, dictionaryType); } + } catch (IOException e) { + log.debug("exception: ", e); + throw new BadRequestException("Error while reading the entries", e); } + return entries; } - private void setColors(String dossierTemplateId, Colors requestedColors) { - // set colors - if (requestedColors != null) { - ColorsEntity colorsEntity = convert(requestedColors, ColorsEntity.class); - colorsEntity.setDossierTemplateId(dossierTemplateId); - colorsService.saveColors(colorsEntity); - } + private String getType(String filename) { + + var index = filename.indexOf('/'); + return filename.substring(0, index); } @@ -363,102 +532,13 @@ public class DossierTemplateImportService { } - private DossierStatusEntity updateDossierStatus(String dossierTemplateId, DossierStatusInfo state) { - - var dossierStatusRequest = CreateOrUpdateDossierStatusRequest.builder() - .dossierStatusId(state.getId()) - .name(state.getName()) - .description(state.getDescription()) - .color(state.getColor()) - .dossierTemplateId(dossierTemplateId) - .rank(state.getRank()) - .build(); - return dossierStatusPersistenceService.createOrUpdateDossierStatus(dossierStatusRequest); - } - - - private void validateDossierTemplateName(DossierTemplate dossierTemplateMeta) { - - boolean cond = true; - int index = 0; - String dossierTemplateName = dossierTemplateMeta.getName(); - do { - try { - dossierTemplatePersistenceService.validateDossierTemplateNameIsUnique(dossierTemplateMeta.getName()); - cond = false; - } catch (ConflictException e) { - if (index == 0) { - dossierTemplateMeta.setName("Copy of " + dossierTemplateName); - } else { - dossierTemplateMeta.setName("Copy of " + dossierTemplateName + " - " + index); - } - index++; - } - } while (cond); - } - - - private void updateTypes(ImportTemplateResult request, String dossierTemplateId) { - - List currentTypes = dossierTemplatePersistenceService.getDossierTemplate(dossierTemplateId) - .getDossierTypes() - .stream() - .filter(t -> t.getDossierId() == null) - .collect(Collectors.toList()); - - Set currentTypesId = currentTypes.stream().map(TypeEntity::getId).collect(Collectors.toSet()); - Set typeIdsAdded = new HashSet<>(); - var typeToEntityMap = currentTypes.stream().collect(Collectors.toMap(TypeEntity::getType, Function.identity())); - for (var type : request.getTypes()) { -// log.info("Adding type: " + type.getType() + " id: " + type.getId()); - type.setDossierTemplateId(dossierTemplateId); - String typeId; - if (currentTypesId.contains(type.getId())) { //check by id - typeId = type.getId(); - // type found, possible to be deleted, undelete it first before updating - dictionaryPersistenceService.undeleteType(typeId); - dictionaryService.updateTypeValue(typeId, type); - } else if (!typeToEntityMap.isEmpty() && typeToEntityMap.get(type.getType()) != null) { //check by name - typeId = typeToEntityMap.get(type.getType()).getId(); - // type found, possible to be deleted, undelete it first before updating - dictionaryPersistenceService.undeleteType(typeId); - dictionaryService.updateTypeValue(typeId, type); - } else { // add the type, no match was found - var returnedType = dictionaryService.addType(type); - typeId = returnedType.getTypeId(); - } - typeIdsAdded.add(typeId); - - this.addEntries(request.getEntries(), typeId, type.getType(), DictionaryEntryType.ENTRY); - this.addEntries(request.getFalsePositives(), typeId, type.getType(), DictionaryEntryType.FALSE_POSITIVE); - this.addEntries(request.getFalseRecommendations(), typeId, type.getType(), DictionaryEntryType.FALSE_RECOMMENDATION); + private void setColors(String dossierTemplateId, Colors requestedColors) { + // set colors + if (requestedColors != null) { + ColorsEntity colorsEntity = convert(requestedColors, ColorsEntity.class); + colorsEntity.setDossierTemplateId(dossierTemplateId); + colorsService.saveColors(colorsEntity); } - // remove additional types and not included in the archive - this.deleteTypes(currentTypes, typeIdsAdded); - } - - - private void deleteTypes(List currentTypes, Set typeIdsAdded) { - - Set currentTypesIdSystemManaged = currentTypes.stream().filter(TypeEntity::isSystemManaged).map(TypeEntity::getId).collect(Collectors.toSet()); - - // for types system managed just delete the entries - Set entriesToRemove = currentTypesIdSystemManaged.stream().filter(t -> !typeIdsAdded.contains(t)).collect(Collectors.toSet()); - entriesToRemove.forEach(typeId -> { - var currentVersion = dictionaryService.getCurrentVersion(typeId); - entryPersistenceService.deleteAllEntriesForTypeId(typeId, currentVersion + 1, DictionaryEntryType.ENTRY); - entryPersistenceService.deleteAllEntriesForTypeId(typeId, currentVersion + 1, DictionaryEntryType.FALSE_POSITIVE); - entryPersistenceService.deleteAllEntriesForTypeId(typeId, currentVersion + 1, DictionaryEntryType.FALSE_RECOMMENDATION); - dictionaryPersistenceService.incrementVersion(typeId); - typeIdsAdded.add(typeId); // added to the list, since the type can not be deleted - }); - Set typesToRemove = currentTypes.stream() - .filter(t -> !t.isDeleted()) // remove the ones already soft deleted - .map(TypeEntity::getId) - .filter(t -> !typeIdsAdded.contains(t)) // exclude the type ids already added from the import - .filter(t -> !currentTypesIdSystemManaged.contains(t)) // exclude the types system managed - .collect(Collectors.toSet()); - typesToRemove.forEach(dictionaryService::deleteType); } @@ -528,193 +608,113 @@ public class DossierTemplateImportService { } - public ImportTemplateResult handleArchive(ImportDossierTemplateRequest request) { + private void updateTypes(ImportTemplateResult request, String dossierTemplateId) { - long start = System.currentTimeMillis(); - objectMapper.registerModule(new JavaTimeModule()); - File tempFile; - try { - tempFile = FileUtils.createTempFile(request.getArchive(), UUID.randomUUID().toString(), ".zip"); - var importTemplateResult = new ImportTemplateResult(); - importTemplateResult.setDossierTemplateId(request.getDossierTemplateId()); - importTemplateResult.setUserId(request.getUserId()); - importTemplateResult.setUpdateExistingTemplate(request.isUpdateExistingDossierTemplate()); + List currentTypes = dossierTemplatePersistenceService.getDossierTemplate(dossierTemplateId) + .getDossierTypes() + .stream() + .filter(t -> t.getDossierId() == null) + .collect(Collectors.toList()); - try (FileInputStream fis = new FileInputStream(tempFile); BufferedInputStream bis = new BufferedInputStream(fis); ZipArchiveInputStream zis = new ZipArchiveInputStream( - bis)) { - - int totalSizeArchive = 0; - int totalEntryArchive = 0; - ZipArchiveEntry ze; - Map reportTemplateMap = new HashMap<>(); - Map reportTemplateBytesMap = new HashMap<>(); - List reportTemplateFilenameList = new ArrayList<>(); - Map> typeEntriesMap = new HashMap<>(); - Map> typeFalsePositivesMap = new HashMap<>(); - Map> typeFalseRecommendationsMap = new HashMap<>(); - - while ((ze = zis.getNextZipEntry()) != null) { - log.debug("---> " + ze.getName() + " ---- " + ze.isDirectory()); - totalEntryArchive++; - if (ze.isUnixSymlink()) { - continue; - } - if (!ze.isDirectory()) { - var bos = new ByteArrayOutputStream(); - var buffer = new byte[2048]; - var nBytes = 0; - int totalSizeEntry = 0; - - while ((nBytes = zis.read(buffer)) > 0) { - bos.write(buffer, 0, nBytes); - totalSizeEntry += nBytes; - totalSizeArchive += nBytes; - - double compressionRatio = (float) totalSizeEntry / ze.getCompressedSize(); - if (compressionRatio > settings.getCompressionThresholdRatio()) { - log.debug("zip entry: " + ze.getName() + " - totalSizeEntry: " + totalSizeEntry + " ze.getCompressedSize(): " + ze.getCompressedSize() + " compressionRatio: " + compressionRatio); - // ratio between compressed and uncompressed data is highly suspicious, looks like a Zip Bomb Attack - throw new BadRequestException("ZIP-Bomb detected (compressionRatio)."); - } - } - if (totalSizeArchive > THRESHOLD_SIZE) { - log.debug("zip entry: " + ze.getName() + " totalSizeEntry: " + totalSizeArchive); - - // the uncompressed data size is too much for the application resource capacity - throw new BadRequestException("ZIP-Bomb detected. (threshold size)"); - } - - if (totalEntryArchive > THRESHOLD_ENTRIES) { - log.debug("zip entry: " + ze.getName() + " totalEntryArchive: " + totalEntryArchive); - // too much entries in this archive, can lead to inodes exhaustion of the system - throw new BadRequestException("ZIP-Bomb detected (threshold entries)."); - } - - var bytes = bos.toByteArray(); - if (ze.getName().contains(ExportFilename.DOSSIER_TEMPLATE_META.getFilename())) { - DossierTemplate dossierTemplate = objectMapper.readValue(bytes, DossierTemplate.class); - importTemplateResult.setDossierTemplate(dossierTemplate); - } else if (ze.getName().contains(ExportFilename.WATERMARK.getFilename())) { - List watermarkList = objectMapper.readValue(bytes, new TypeReference<>() { - }); - importTemplateResult.getWatermarks().addAll(watermarkList); - } else if (ze.getName().contains(ExportFilename.COLORS.getFilename())) { - Colors colors = objectMapper.readValue(bytes, Colors.class); - importTemplateResult.setColors(colors); - } else if (ze.getName().contains(ExportFilename.DOSSIER_STATUS.getFilename())) { - List dossierStatusInfoList = objectMapper.readValue(bytes, new TypeReference<>() { - }); - importTemplateResult.getDossierStatusInfos().addAll(dossierStatusInfoList); - } else if (ze.getName().contains(ExportFilename.DOSSIER_ATTRIBUTES_CONFIG.getFilename())) { - List dossierAttributeConfigs = objectMapper.readValue(bytes, new TypeReference<>() { - }); - importTemplateResult.getDossierAttributesConfigs().addAll(dossierAttributeConfigs); - } else if (ze.getName().contains(ExportFilename.FILE_ATTRIBUTE_CONFIG.getFilename())) { - List fileAttributeConfigs = objectMapper.readValue(bytes, new TypeReference<>() { - }); - importTemplateResult.getFileAttributesConfigs().addAll(fileAttributeConfigs); - } else if (ze.getName().contains(ExportFilename.LEGAL_BASIS.getFilename())) { - List legalBasisList = objectMapper.readValue(bytes, new TypeReference<>() { - }); - importTemplateResult.getLegalBases().addAll(legalBasisList); - } else if (ze.getName().contains(ExportFilename.FILE_ATTRIBUTE_GENERAL_CONFIG.getFilename())) { - FileAttributesGeneralConfiguration fileAttributesGeneralConfiguration = objectMapper.readValue(bytes, FileAttributesGeneralConfiguration.class); - importTemplateResult.setFileAttributesGeneralConfiguration(fileAttributesGeneralConfiguration); - } else if (ze.getName().contains(ExportFilename.RULES.getFilename())) { - String rules = objectMapper.readValue(bytes, String.class); - importTemplateResult.setRuleSet(rules); - } else if (ze.getName().contains(ExportFilename.DOSSIER_TYPE.getFilename())) { - Type type = objectMapper.readValue(bytes, Type.class); - importTemplateResult.getTypes().add(type); - } else if (ze.getName().contains(ExportFilename.ENTRIES.getFilename())) { - - List entries = this.readEntries(bytes); - typeEntriesMap.put(this.getType(ze.getName()), entries); - - } else if (ze.getName().contains(ExportFilename.FALSE_POSITIVES.getFilename())) { - - List falsePositives = this.readEntries(bytes); - typeFalsePositivesMap.put(this.getType(ze.getName()), falsePositives); - - } else if (ze.getName().contains(ExportFilename.FALSE_RECOMMENDATION.getFilename())) { - - List falseRecommendations = this.readEntries(bytes); - typeFalseRecommendationsMap.put(this.getType(ze.getName()), falseRecommendations); - - } else if (ze.getName().contains(ExportFilename.REPORT_TEMPLATE.getFilename())) { - var reportTemplateList = objectMapper.readValue(bytes, new TypeReference>() { - }); - reportTemplateMap = reportTemplateList.stream() - .collect(Collectors.toMap(rt -> rt.isMultiFileReport() ? rt.getFileName() + ExportFilename.REPORT_TEMPLATE_MULTI_FILE.getFilename() : rt.getFileName(), - Function.identity())); - reportTemplateFilenameList = reportTemplateList.stream() - .map(rt -> rt.isMultiFileReport() ? rt.getFileName() + ExportFilename.REPORT_TEMPLATE_MULTI_FILE.getFilename() : rt.getFileName()) - .collect(Collectors.toList()); - } else { - reportTemplateBytesMap.put(ze.getName(), bos); - } - bos.close(); - } - } - importTemplateResult.setEntries(typeEntriesMap); - importTemplateResult.setFalsePositives(typeFalsePositivesMap); - importTemplateResult.setFalseRecommendations(typeFalseRecommendationsMap); - - for (var reportZe : reportTemplateBytesMap.entrySet()) { - if (reportTemplateFilenameList.contains(reportZe.getKey())) { - var report = reportTemplateMap.get(reportZe.getKey()); - importTemplateResult.getReportTemplateUploadRequests() - .add(ReportTemplateUploadRequest.builder() - .fileName(report.getFileName()) - .activeByDefault(report.isActiveByDefault()) - .multiFileReport(report.isMultiFileReport()) - .dossierTemplateId(request.getDossierTemplateId() != null ? request.getDossierTemplateId() : "") - .template(reportZe.getValue().toByteArray()) - .build()); - - } - } - long elapsedTime = System.currentTimeMillis() - start; - log.debug("----Stop handle archive--- elapsedTime: " + elapsedTime + " for: " + request.getDossierTemplateId()); - return importTemplateResult; - } finally { - if (tempFile != null) { - boolean isDeleted = tempFile.delete(); - if (!isDeleted) { - log.debug("tempFile could not be deleted"); - } - } + Set currentTypesId = currentTypes.stream().map(TypeEntity::getId).collect(Collectors.toSet()); + Set typeIdsAdded = new HashSet<>(); + var typeToEntityMap = currentTypes.stream().collect(Collectors.toMap(TypeEntity::getType, Function.identity())); + for (var type : request.getTypes()) { +// log.info("Adding type: " + type.getType() + " id: " + type.getId()); + type.setDossierTemplateId(dossierTemplateId); + String typeId; + if (currentTypesId.contains(type.getId())) { //check by id + typeId = type.getId(); + // type found, possible to be deleted, undelete it first before updating + dictionaryPersistenceService.undeleteType(typeId); + dictionaryManagementService.updateTypeValue(typeId, type); + } else if (!typeToEntityMap.isEmpty() && typeToEntityMap.get(type.getType()) != null) { //check by name + typeId = typeToEntityMap.get(type.getType()).getId(); + // type found, possible to be deleted, undelete it first before updating + dictionaryPersistenceService.undeleteType(typeId); + dictionaryManagementService.updateTypeValue(typeId, type); + } else { // add the type, no match was found + var returnedType = dictionaryManagementService.addType(type); + typeId = returnedType.getTypeId(); } - } catch (IOException | BadRequestException e) { - throw new BadRequestException(e.getMessage(), e); - } + typeIdsAdded.add(typeId); + this.addEntries(request.getEntries(), typeId, type.getType(), DictionaryEntryType.ENTRY); + this.addEntries(request.getFalsePositives(), typeId, type.getType(), DictionaryEntryType.FALSE_POSITIVE); + this.addEntries(request.getFalseRecommendations(), typeId, type.getType(), DictionaryEntryType.FALSE_RECOMMENDATION); + } + // remove additional types and not included in the archive + this.deleteTypes(currentTypes, typeIdsAdded); } - private List readEntries(byte[] bytes) { + private void deleteTypes(List currentTypes, Set typeIdsAdded) { - ByteArrayInputStream bInput = new ByteArrayInputStream(bytes); - DataInputStream in = new DataInputStream(bInput); - List entries = new ArrayList<>(); - try { - while (in.available() > 0) { - String entry = in.readUTF(); - entries.add(entry); + Set currentTypesIdSystemManaged = currentTypes.stream().filter(TypeEntity::isSystemManaged).map(TypeEntity::getId).collect(Collectors.toSet()); - } - } catch (IOException e) { - log.debug("exception: ", e); - throw new BadRequestException("Error while reading the entries", e); - } - return entries; + // for types system managed just delete the entries + Set entriesToRemove = currentTypesIdSystemManaged.stream().filter(t -> !typeIdsAdded.contains(t)).collect(Collectors.toSet()); + entriesToRemove.forEach(typeId -> { + var currentVersion = dictionaryManagementService.getCurrentVersion(typeId); + entryPersistenceService.deleteAllEntriesForTypeId(typeId, currentVersion + 1, DictionaryEntryType.ENTRY); + entryPersistenceService.deleteAllEntriesForTypeId(typeId, currentVersion + 1, DictionaryEntryType.FALSE_POSITIVE); + entryPersistenceService.deleteAllEntriesForTypeId(typeId, currentVersion + 1, DictionaryEntryType.FALSE_RECOMMENDATION); + dictionaryPersistenceService.incrementVersion(typeId); + typeIdsAdded.add(typeId); // added to the list, since the type can not be deleted + }); + Set typesToRemove = currentTypes.stream().filter(t -> !t.isDeleted()) // remove the ones already soft deleted + .map(TypeEntity::getId).filter(t -> !typeIdsAdded.contains(t)) // exclude the type ids already added from the import + .filter(t -> !currentTypesIdSystemManaged.contains(t)) // exclude the types system managed + .collect(Collectors.toSet()); + typesToRemove.forEach(dictionaryManagementService::deleteType); } - private String getType(String filename) { + private void validateDossierTemplateName(DossierTemplate dossierTemplateMeta) { - var index = filename.indexOf('/'); - return filename.substring(0, index); + boolean cond = true; + int index = 0; + String dossierTemplateName = dossierTemplateMeta.getName(); + do { + try { + dossierTemplatePersistenceService.validateDossierTemplateNameIsUnique(dossierTemplateMeta.getName()); + cond = false; + } catch (ConflictException e) { + if (index == 0) { + dossierTemplateMeta.setName("Copy of " + dossierTemplateName); + } else { + dossierTemplateMeta.setName("Copy of " + dossierTemplateName + " - " + index); + } + index++; + } + } while (cond); + } + + + private DossierStatusEntity updateDossierStatus(String dossierTemplateId, DossierStatusInfo state) { + + var dossierStatusRequest = CreateOrUpdateDossierStatusRequest.builder() + .dossierStatusId(state.getId()) + .name(state.getName()) + .description(state.getDescription()) + .color(state.getColor()) + .dossierTemplateId(dossierTemplateId) + .rank(state.getRank()) + .build(); + return dossierStatusPersistenceService.createOrUpdateDossierStatus(dossierStatusRequest); + } + + + private void addEntries(Map> entries, String typeId, String typeName, DictionaryEntryType dictionaryType) { + + if (entries != null && !entries.isEmpty() && entries.get(typeName) != null && !entries.get(typeName).isEmpty()) { + dictionaryManagementService.addEntries(typeId, entries.get(typeName), true, true, dictionaryType); + } else { // no entries, delete current entries + List existing = entryPersistenceService.getEntries(typeId, dictionaryType, null).stream().map(BaseDictionaryEntry::getValue).collect(Collectors.toList()); + if (!existing.isEmpty()) { + dictionaryManagementService.deleteEntries(typeId, existing, dictionaryType); + } + } } } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierTemplateManagementService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierTemplateManagementService.java new file mode 100644 index 000000000..4d9cd97aa --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierTemplateManagementService.java @@ -0,0 +1,81 @@ +package com.iqser.red.service.persistence.management.v1.processor.service; + +import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; + +import java.util.List; + +import org.springframework.stereotype.Service; + +import com.iqser.red.service.persistence.management.v1.processor.model.DownloadJob; +import com.iqser.red.service.persistence.management.v1.processor.service.export.DossierTemplateExportService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierTemplatePersistenceService; +import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.CloneDossierTemplateRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.CreateOrUpdateDossierTemplateRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierTemplate; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.importexport.ExportDownloadRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.importexport.ImportDossierTemplateRequest; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Service +@RequiredArgsConstructor +public class DossierTemplateManagementService { + + private final DossierTemplateExportService dossierTemplateExportService; + private final DossierTemplateImportService dossierTemplateImportService; + private final DossierTemplatePersistenceService dossierTemplatePersistenceService; + private final DossierTemplateCloneService dossierTemplateCloneService; + + + public DossierTemplate createOrUpdateDossierTemplate(CreateOrUpdateDossierTemplateRequest dossierTemplate) { + + return convert(dossierTemplatePersistenceService.createOrUpdateDossierTemplate(dossierTemplate), DossierTemplate.class); + } + + + public List getAllDossierTemplates() { + + return convert(dossierTemplatePersistenceService.getAllDossierTemplates(), DossierTemplate.class); + } + + + public DossierTemplate getDossierTemplate(String dossierTemplateId) { + + return convert(dossierTemplatePersistenceService.getDossierTemplate(dossierTemplateId), DossierTemplate.class); + } + + + public void deleteDossierTemplate(String dossierTemplateId, String deletingUserId) { + + dossierTemplatePersistenceService.deleteDossierTemplate(dossierTemplateId, deletingUserId); + } + + + public DossierTemplate cloneDossierTemplate(String dossierTemplateId, CloneDossierTemplateRequest cloneDossierTemplateRequest) { + + return convert(dossierTemplateCloneService.cloneDossierTemplate(dossierTemplateId, cloneDossierTemplateRequest), DossierTemplate.class); + } + + + public JSONPrimitive prepareExportDownload(ExportDownloadRequest request) { + + return dossierTemplateExportService.prepareExportDownload(request); + } + + + public void createExportDownload(String userId, String storageId) { + + dossierTemplateExportService.createDownloadArchive(DownloadJob.builder().userId(userId).storageId(storageId).build()); + } + + + public DossierTemplate importDossierTemplate(ImportDossierTemplateRequest request) { + + String dossierTemplateId = dossierTemplateImportService.importDossierTemplate(request); + return convert(dossierTemplatePersistenceService.getDossierTemplate(dossierTemplateId), DossierTemplate.class); + } + +} diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/DossierTemplateStatsService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierTemplateStatsService.java similarity index 92% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/DossierTemplateStatsService.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierTemplateStatsService.java index c55112a46..537c58798 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/DossierTemplateStatsService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierTemplateStatsService.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.service; +package com.iqser.red.service.persistence.management.v1.processor.service; import java.util.ArrayList; import java.util.Collections; @@ -17,11 +17,11 @@ import com.iqser.red.service.persistence.management.v1.processor.service.persist import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierRepository; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierTemplateRepository; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.FileRepository; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierTemplateDictionaryStats; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierTemplateStats; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierTemplateStatus; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.DictionarySummary; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.DictionarySummaryResponse; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierTemplateDictionaryStats; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierTemplateStats; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierTemplateStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionarySummary; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionarySummaryResponse; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -51,6 +51,43 @@ public class DossierTemplateStatsService { } + private DossierTemplateStats getDossierTemplateStats(String dossierTemplateId, String dossierTemplateName, DossierTemplateStatus dossierTemplateStatus) { + + DossierTemplateStats dts = new DossierTemplateStats(); + + dts.setDossierTemplateId(dossierTemplateId); + dts.setName(dossierTemplateName); + dts.setDossierTemplateStatus(dossierTemplateStatus); + dts.setNumberOfArchivedDossiers(dossierRepository.countArchived(dossierTemplateId)); + dts.setNumberOfActiveDossiers(dossierRepository.countActive(dossierTemplateId)); + dts.setNumberOfDeletedDossiers(dossierRepository.countSofDeleted(dossierTemplateId)); + dts.setNumberOfActiveFiles(fileRepository.countActiveFiles(dossierTemplateId)); + dts.setNumberOfSoftDeletedFiles(fileRepository.countSoftDeletedFilesPerDossierTemplateId(dossierTemplateId)); + + var processingCounts = fileRepository.countFilesByProcessingStatus(dossierTemplateId); + var workflowCounts = fileRepository.countFilesByWorkflowStatus(dossierTemplateId); + var pageCounts = fileRepository.countPages(dossierTemplateId); + var dossierStatusCounts = dossierRepository.countByDossierStatus(dossierTemplateId); + + dts.setNumberOfPages(pageCounts.getNumberOfAnalyzedPages()); + dts.setNumberOfExcludedPages(pageCounts.getNumberOfExcludedPages()); + + dts.setFileCountPerProcessingStatus(processingCounts.stream() + .map(t -> new DossierTemplateStats.ProcessingStatusCount(t.getProcessingStatus(), t.getCount())) + .collect(Collectors.toList())); + dts.setFileCountPerWorkflowStatus(workflowCounts.stream() + .map(t -> new DossierTemplateStats.WorkflowStatusCount(t.getWorkflowStatus(), t.getCount())) + .collect(Collectors.toList())); + dts.setDossierCountByStatus(dossierStatusCounts.stream() + .map(t -> new DossierTemplateStats.DossierStatusCount(t.getDossierStatusId(), t.getCount())) + .collect(Collectors.toList())); + + dts.setDossiersInTemplate(dossierRepository.findActiveDossierIdsForTemplate(dossierTemplateId)); + + return dts; + } + + public List getDossierTemplateStats() { var allUnDeletedTemplates = dossierTemplateRepository.findAllWhereDeletedIsFalse(); @@ -100,41 +137,4 @@ public class DossierTemplateStatsService { return new DictionarySummary(response.getId(), response.getType(), response.getName(), response.getEntriesCount()); } - - private DossierTemplateStats getDossierTemplateStats(String dossierTemplateId, String dossierTemplateName, DossierTemplateStatus dossierTemplateStatus) { - - DossierTemplateStats dts = new DossierTemplateStats(); - - dts.setDossierTemplateId(dossierTemplateId); - dts.setName(dossierTemplateName); - dts.setDossierTemplateStatus(dossierTemplateStatus); - dts.setNumberOfArchivedDossiers(dossierRepository.countArchived(dossierTemplateId)); - dts.setNumberOfActiveDossiers(dossierRepository.countActive(dossierTemplateId)); - dts.setNumberOfDeletedDossiers(dossierRepository.countSofDeleted(dossierTemplateId)); - dts.setNumberOfActiveFiles(fileRepository.countActiveFiles(dossierTemplateId)); - dts.setNumberOfSoftDeletedFiles(fileRepository.countSoftDeletedFilesPerDossierTemplateId(dossierTemplateId)); - - var processingCounts = fileRepository.countFilesByProcessingStatus(dossierTemplateId); - var workflowCounts = fileRepository.countFilesByWorkflowStatus(dossierTemplateId); - var pageCounts = fileRepository.countPages(dossierTemplateId); - var dossierStatusCounts = dossierRepository.countByDossierStatus(dossierTemplateId); - - dts.setNumberOfPages(pageCounts.getNumberOfAnalyzedPages()); - dts.setNumberOfExcludedPages(pageCounts.getNumberOfExcludedPages()); - - dts.setFileCountPerProcessingStatus(processingCounts.stream() - .map(t -> new DossierTemplateStats.ProcessingStatusCount(t.getProcessingStatus(), t.getCount())) - .collect(Collectors.toList())); - dts.setFileCountPerWorkflowStatus(workflowCounts.stream() - .map(t -> new DossierTemplateStats.WorkflowStatusCount(t.getWorkflowStatus(), t.getCount())) - .collect(Collectors.toList())); - dts.setDossierCountByStatus(dossierStatusCounts.stream() - .map(t -> new DossierTemplateStats.DossierStatusCount(t.getDossierStatusId(), t.getCount())) - .collect(Collectors.toList())); - - dts.setDossiersInTemplate(dossierRepository.findActiveDossierIdsForTemplate(dossierTemplateId)); - - return dts; - } - } diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DownloadController.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DownloadService.java similarity index 80% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DownloadController.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DownloadService.java index 63ac2aeec..347d1ac14 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DownloadController.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DownloadService.java @@ -1,44 +1,41 @@ -package com.iqser.red.service.peristence.v1.server.controller; - -import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; +package com.iqser.red.service.persistence.management.v1.processor.service; import java.util.List; import java.util.Set; import java.util.stream.Collectors; import org.springframework.amqp.rabbit.core.RabbitTemplate; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import com.iqser.red.service.peristence.v1.server.configuration.MessagingConfiguration; -import com.iqser.red.service.peristence.v1.server.model.DownloadJob; -import com.iqser.red.service.peristence.v1.server.utils.StorageIdUtils; +import com.iqser.red.service.persistence.management.v1.processor.configuration.MessagingConfiguration; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.ReportTemplateEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.download.DownloadStatusEntity; import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; +import com.iqser.red.service.persistence.management.v1.processor.model.DownloadJob; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DownloadStatusPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.ReportTemplateRepository; -import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus; -import com.iqser.red.service.persistence.service.v1.api.model.download.DownloadRequest; -import com.iqser.red.service.persistence.service.v1.api.model.download.DownloadStatus; -import com.iqser.red.service.persistence.service.v1.api.model.download.DownloadWithOptionRequest; -import com.iqser.red.service.persistence.service.v1.api.resources.DownloadResource; +import com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter; +import com.iqser.red.service.persistence.management.v1.processor.utils.StorageIdUtils; +import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.download.DownloadRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.download.DownloadStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.download.DownloadWithOptionRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @Slf4j -@RestController +@Service @RequiredArgsConstructor -public class DownloadController implements DownloadResource { +public class DownloadService { private final DownloadStatusPersistenceService downloadStatusPersistenceService; private final FileStatusPersistenceService fileStatusPersistenceService; @@ -48,12 +45,13 @@ public class DownloadController implements DownloadResource { private final RabbitTemplate rabbitTemplate; - public JSONPrimitive prepareDownload(@RequestBody DownloadRequest request) { + @Transactional + public JSONPrimitive prepareDownload(DownloadRequest request) { var existingFileStatuses = fileStatusPersistenceService.getStatusesForDossier(request.getDossierId()); var filesInNotApprovedState = existingFileStatuses.stream() .filter(f -> request.getFileIds().contains(f.getId()) && !WorkflowStatus.APPROVED.equals(f.getWorkflowStatus())) - .collect(Collectors.toList()); + .toList(); if (!filesInNotApprovedState.isEmpty()) { throw new BadRequestException("At least one file is not in Approved state"); } @@ -70,24 +68,6 @@ public class DownloadController implements DownloadResource { } - public JSONPrimitive prepareDownload(@RequestBody DownloadWithOptionRequest request) { - - var existingFileStatuses = fileStatusPersistenceService.getStatusesForDossier(request.getDossierId()); - var dossier = dossierPersistenceService.getActiveOrArchivedDossier(request.getDossierId()); - // check reports list and download types so both can be valid - - if (request.getReportTemplateIds() != null && !request.getReportTemplateIds().isEmpty()) { - //validate reports ids - var reportTemplates = reportTemplateRepository.findAllById(request.getReportTemplateIds()); - if (reportTemplates.isEmpty() && (request.getDownloadFileTypes() == null || request.getDownloadFileTypes().isEmpty())) { - throw new BadRequestException(" Invalid reports ids and no download types"); - } - request.setReportTemplateIds(reportTemplates.stream().map(ReportTemplateEntity::getTemplateId).collect(Collectors.toList())); - } - return this.startPrepareDownload(request, dossier, existingFileStatuses); - } - - private JSONPrimitive startPrepareDownload(DownloadWithOptionRequest request, DossierEntity dossier, List existingFileStatuses) { var downloadArchiveMimeType = "application/zip"; @@ -110,38 +90,6 @@ public class DownloadController implements DownloadResource { } - public List getDownloadStatus(@PathVariable(USER_ID) String userId) { - - return convert(downloadStatusPersistenceService.getStatusesByUser(userId), DownloadStatus.class); - } - - - public void setDownloaded(@RequestBody JSONPrimitive setDownloadedRequest) { - - downloadStatusPersistenceService.updateLastDownload(setDownloadedRequest.getValue()); - } - - - @Override - public void deleteDownloadStatus(@RequestBody JSONPrimitive setDownloadedRequest) { - - downloadStatusPersistenceService.deleteStatus(setDownloadedRequest.getValue()); - } - - - private void addToDownloadQueue(DownloadJob downloadJob, int priority) { - - try { - rabbitTemplate.convertAndSend(MessagingConfiguration.DOWNLOAD_QUEUE, objectMapper.writeValueAsString(downloadJob), message -> { - message.getMessageProperties().setPriority(priority); - return message; - }); - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } - } - - private String buildName(String dossierId, List fileIds, String userId, String mimeType, List existingFileStatuses) { var dossier = dossierPersistenceService.getActiveOrArchivedDossier(dossierId); @@ -181,6 +129,19 @@ public class DownloadController implements DownloadResource { } + private void addToDownloadQueue(DownloadJob downloadJob, int priority) { + + try { + rabbitTemplate.convertAndSend(MessagingConfiguration.DOWNLOAD_QUEUE, objectMapper.writeValueAsString(downloadJob), message -> { + message.getMessageProperties().setPriority(priority); + return message; + }); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } + + private String getCleanName(String fileName) { var lastIndexOfDot = fileName.lastIndexOf("."); @@ -202,4 +163,40 @@ public class DownloadController implements DownloadResource { return ".entity"; } + + public JSONPrimitive prepareDownload(DownloadWithOptionRequest request) { + + var existingFileStatuses = fileStatusPersistenceService.getStatusesForDossier(request.getDossierId()); + var dossier = dossierPersistenceService.getActiveOrArchivedDossier(request.getDossierId()); + // check reports list and download types so both can be valid + + if (request.getReportTemplateIds() != null && !request.getReportTemplateIds().isEmpty()) { + //validate reports ids + var reportTemplates = reportTemplateRepository.findAllById(request.getReportTemplateIds()); + if (reportTemplates.isEmpty() && (request.getDownloadFileTypes() == null || request.getDownloadFileTypes().isEmpty())) { + throw new BadRequestException(" Invalid reports ids and no download types"); + } + request.setReportTemplateIds(reportTemplates.stream().map(ReportTemplateEntity::getTemplateId).collect(Collectors.toList())); + } + return this.startPrepareDownload(request, dossier, existingFileStatuses); + } + + + public List getDownloadStatus(String userId) { + + return MagicConverter.convert(downloadStatusPersistenceService.getStatusesByUser(userId), DownloadStatus.class); + } + + + public void setDownloaded(JSONPrimitive setDownloadedRequest) { + + downloadStatusPersistenceService.updateLastDownload(setDownloadedRequest.getValue()); + } + + + public void deleteDownloadStatus(JSONPrimitive setDownloadedRequest) { + + downloadStatusPersistenceService.deleteStatus(setDownloadedRequest.getValue()); + } + } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/EmailService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/EmailService.java index 4980fd4e3..7a130c8db 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/EmailService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/EmailService.java @@ -17,7 +17,7 @@ import org.springframework.mail.javamail.JavaMailSenderImpl; import org.springframework.stereotype.Service; import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.SMTPConfiguration; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.SMTPConfiguration; import lombok.extern.slf4j.Slf4j; @@ -70,18 +70,6 @@ public class EmailService { } - protected InternetAddress toInternetAddress(String email, String displayName) throws UnsupportedEncodingException, AddressException { - - if (email == null || "".equals(email.trim())) { - throw new BadRequestException("Please provide a valid address"); - } - if (displayName == null || "".equals(displayName.trim())) { - return new InternetAddress(email); - } - return new InternetAddress(email, displayName, "utf-8"); - } - - public JavaMailSender getJavaMailSender(SMTPConfiguration smtpConfiguration) { JavaMailSenderImpl mailSender = new JavaMailSenderImpl(); @@ -110,4 +98,16 @@ public class EmailService { return mailSender; } + + protected InternetAddress toInternetAddress(String email, String displayName) throws UnsupportedEncodingException, AddressException { + + if (email == null || "".equals(email.trim())) { + throw new BadRequestException("Please provide a valid address"); + } + if (displayName == null || "".equals(displayName.trim())) { + return new InternetAddress(email); + } + return new InternetAddress(email, displayName, "utf-8"); + } + } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/EncryptionDecryptionService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/EncryptionDecryptionService.java index 53e406234..5dc7052fb 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/EncryptionDecryptionService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/EncryptionDecryptionService.java @@ -40,6 +40,16 @@ public class EncryptionDecryptionService { } + @SneakyThrows + public SecretKey generateSecretKey(String password, byte[] iv) { + + KeySpec spec = new PBEKeySpec(password.toCharArray(), iv, 65536, 128); // AES-128 + SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); + byte[] key = secretKeyFactory.generateSecret(spec).getEncoded(); + return new SecretKeySpec(key, "AES"); + } + + @SneakyThrows public String encrypt(String strToEncrypt) { if(strToEncrypt == null){ @@ -50,14 +60,6 @@ public class EncryptionDecryptionService { } - @SneakyThrows - public String decrypt(String strToDecrypt) { - - byte[] bytes = Base64.getDecoder().decode(strToDecrypt); - return new String(decrypt(bytes), StandardCharsets.UTF_8); - } - - @SneakyThrows public byte[] encrypt(byte[] data) { @@ -73,6 +75,14 @@ public class EncryptionDecryptionService { } + @SneakyThrows + public String decrypt(String strToDecrypt) { + + byte[] bytes = Base64.getDecoder().decode(strToDecrypt); + return new String(decrypt(bytes), StandardCharsets.UTF_8); + } + + @SneakyThrows public byte[] decrypt(byte[] encryptedData) { @@ -95,14 +105,4 @@ public class EncryptionDecryptionService { return cipher.doFinal(cipherBytes); } - - @SneakyThrows - public SecretKey generateSecretKey(String password, byte[] iv) { - - KeySpec spec = new PBEKeySpec(password.toCharArray(), iv, 65536, 128); // AES-128 - SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); - byte[] key = secretKeyFactory.generateSecret(spec).getEncoded(); - return new SecretKeySpec(key, "AES"); - } - } diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/ExcludeFromAnalysisService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ExcludeFromAnalysisService.java similarity index 84% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/ExcludeFromAnalysisService.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ExcludeFromAnalysisService.java index 49b84317a..114671893 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/ExcludeFromAnalysisService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ExcludeFromAnalysisService.java @@ -1,9 +1,9 @@ -package com.iqser.red.service.peristence.v1.server.service; +package com.iqser.red.service.persistence.management.v1.processor.service; import org.springframework.stereotype.Service; import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus; import lombok.RequiredArgsConstructor; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FeignExceptionHandler.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FeignExceptionHandler.java new file mode 100644 index 000000000..5d1cc7864 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FeignExceptionHandler.java @@ -0,0 +1,30 @@ +package com.iqser.red.service.persistence.management.v1.processor.service; + +import org.springframework.http.HttpStatus; + +import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; +import com.iqser.red.service.persistence.management.v1.processor.exception.ConflictException; +import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; + +import feign.FeignException; + +public final class FeignExceptionHandler { + + private FeignExceptionHandler() {} + + + public static RuntimeException processFeignException(FeignException e) { + + if (e.status() == HttpStatus.NOT_FOUND.value()) { + return new NotFoundException(e.getMessage(), e); + } + if (e.status() == HttpStatus.BAD_REQUEST.value()) { + return new BadRequestException(e.getMessage(), e); + } + if (e.status() == HttpStatus.CONFLICT.value()) { + throw new ConflictException(e.getMessage(), e); + } + return e; + } + +} diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/FileAttributesController.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileAttributesManagementService.java similarity index 81% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/FileAttributesController.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileAttributesManagementService.java index aaa0f1801..7014fe703 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/FileAttributesController.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileAttributesManagementService.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.controller; +package com.iqser.red.service.persistence.management.v1.processor.service; import java.io.BufferedReader; import java.io.ByteArrayInputStream; @@ -18,13 +18,9 @@ import java.util.stream.Collectors; import javax.transaction.Transactional; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.stereotype.Service; import com.google.common.collect.Lists; -import com.iqser.red.service.peristence.v1.server.service.FileStatusService; -import com.iqser.red.service.peristence.v1.server.service.IndexingService; import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.FileAttributesGeneralConfigurationEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileAttributeConfigEntity; @@ -32,11 +28,10 @@ import com.iqser.red.service.persistence.management.v1.processor.exception.BadRe import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileAttributeConfigPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.ImportCsvRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.ImportCsvResponse; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileModel; -import com.iqser.red.service.persistence.service.v1.api.resources.FileAttributesResource; -import com.iqser.red.service.persistence.service.v1.api.utils.SuppressFBWarnings; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.ImportCsvRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.ImportCsvResponse; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.utils.SuppressFBWarnings; import com.iqser.red.service.search.v1.model.IndexMessageType; import com.opencsv.CSVParser; import com.opencsv.CSVParserBuilder; @@ -47,12 +42,10 @@ import com.opencsv.exceptions.CsvException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import static com.iqser.red.service.persistence.service.v1.api.resources.FileAttributesConfigResource.*; - @Slf4j -@RestController +@Service @RequiredArgsConstructor -public class FileAttributesController implements FileAttributesResource { +public class FileAttributesManagementService { private final FileStatusService fileStatusService; private final FileAttributeConfigPersistenceService fileAttributeConfigPersistenceService; @@ -60,9 +53,13 @@ public class FileAttributesController implements FileAttributesResource { private final DossierPersistenceService dossierPersistenceService; private final IndexingService indexingService; + public static String UTF_ENCODING = "UTF-8"; + public static String ASCII_ENCODING = "ASCII"; + public static String ISO_ENCODING = "ISO"; + @Transactional - public ImportCsvResponse importCsv(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @RequestBody ImportCsvRequest importCsvRequest) { + public ImportCsvResponse importCsv(String dossierId, ImportCsvRequest importCsvRequest) { DossierEntity dossier = dossierPersistenceService.getAndValidateDossier(dossierId); @@ -132,14 +129,6 @@ public class FileAttributesController implements FileAttributesResource { } - public void setFileAttributes(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody Map fileAttributesMap) { - - fileStatusPersistenceService.setFileAttributes(dossierId, fileId, fileAttributesMap); - fileStatusService.setStatusReprocess(dossierId, fileId, true); - indexingService.addToIndexingQueue(IndexMessageType.UPDATE, null, dossierId, fileId, 2); - } - - @SuppressFBWarnings("RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE") private List> getCsvRecords(byte[] csv, String delimiter, String encoding) { @@ -157,13 +146,25 @@ public class FileAttributesController implements FileAttributesResource { return records; } + private Charset parseEncoding(String encoding) { - if (ASCII_ENCODING.equalsIgnoreCase(encoding)) + + if (ASCII_ENCODING.equalsIgnoreCase(encoding)) { return StandardCharsets.US_ASCII; - if (ISO_ENCODING.equalsIgnoreCase(encoding)) + } + if (ISO_ENCODING.equalsIgnoreCase(encoding)) { return StandardCharsets.ISO_8859_1; + } return StandardCharsets.UTF_8; } + + public void setFileAttributes(String dossierId, String fileId, Map fileAttributesMap) { + + fileStatusPersistenceService.setFileAttributes(dossierId, fileId, fileAttributesMap); + fileStatusService.setStatusReprocess(dossierId, fileId, true); + indexingService.addToIndexingQueue(IndexMessageType.UPDATE, null, dossierId, fileId, 2); + } + } diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/FileManagementStorageService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileManagementStorageService.java similarity index 85% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/FileManagementStorageService.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileManagementStorageService.java index fffb9ad28..73979cc60 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/FileManagementStorageService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileManagementStorageService.java @@ -1,16 +1,16 @@ -package com.iqser.red.service.peristence.v1.server.service; +package com.iqser.red.service.persistence.management.v1.processor.service; import java.io.InputStream; import org.apache.commons.io.IOUtils; import org.springframework.stereotype.Service; -import com.iqser.red.service.peristence.v1.server.utils.StorageIdUtils; import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileType; -import com.iqser.red.service.redaction.v1.model.ImportedRedactions; -import com.iqser.red.service.redaction.v1.model.RedactionLog; -import com.iqser.red.service.redaction.v1.model.SectionGrid; +import com.iqser.red.service.persistence.management.v1.processor.utils.StorageIdUtils; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLog; +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.imported.ImportedRedactions; +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.section.SectionGrid; import com.iqser.red.storage.commons.exception.StorageObjectDoesNotExist; import com.iqser.red.storage.commons.service.StorageService; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/FileService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileService.java similarity index 84% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/FileService.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileService.java index 84c439a33..6b9f5368b 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/FileService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileService.java @@ -1,11 +1,18 @@ -package com.iqser.red.service.peristence.v1.server.service; +package com.iqser.red.service.persistence.management.v1.processor.service; + +import static com.iqser.red.service.persistence.management.v1.processor.exception.DossierNotFoundException.DOSSIER_NOT_FOUND_MESSAGE; import java.time.OffsetDateTime; +import java.time.temporal.ChronoUnit; import java.util.Arrays; +import java.util.Set; + +import javax.transaction.Transactional; import org.springframework.stereotype.Service; import com.iqser.red.service.persistence.management.v1.processor.exception.ConflictException; +import com.iqser.red.service.persistence.management.v1.processor.exception.DossierNotFoundException; import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.ViewedPagesPersistenceService; @@ -16,11 +23,11 @@ import com.iqser.red.service.persistence.management.v1.processor.service.persist import com.iqser.red.service.persistence.management.v1.processor.service.persistence.annotations.LegalBasisChangePersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.annotations.RemoveRedactionPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.annotations.ResizeRedactionPersistenceService; -import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.AddFileRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileModel; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileType; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.AddFileRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus; import com.iqser.red.service.search.v1.model.IndexMessageType; import lombok.RequiredArgsConstructor; @@ -46,6 +53,7 @@ public class FileService { private final LegalBasisChangePersistenceService legalBasisChangePersistenceService; private final ResizeRedactionPersistenceService resizeRedactionPersistenceService; private final IndexingService indexingService; + private final DossierService dossierService; public JSONPrimitive upload(AddFileRequest request, boolean keepManualRedactions) { @@ -89,6 +97,20 @@ public class FileService { } + @Transactional + public void deleteFile(String dossierId, String fileId) { + + var dossier = dossierService.getDossierById(dossierId); + if (dossier.getSoftDeletedTime() != null) { + throw new DossierNotFoundException(String.format(DOSSIER_NOT_FOUND_MESSAGE, dossierId)); + } + + OffsetDateTime softDeleteTime = OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS); + softDeleteFile(dossierId, fileId, softDeleteTime); + fileStatusService.setFileStatusDeleted(fileId, softDeleteTime); + } + + public void softDeleteFile(String dossierId, String fileId, OffsetDateTime softDeletedTime) { forceRedactionPersistenceService.findForceRedactions(fileId, false).forEach(annotation -> { @@ -132,6 +154,21 @@ public class FileService { } + public void hardDeleteFiles(String dossierId, Set fileIds) { + + var dossier = dossierService.getDossierById(dossierId); + if (dossier.getSoftDeletedTime() != null) { + throw new DossierNotFoundException(String.format(DOSSIER_NOT_FOUND_MESSAGE, dossierId)); + } + + for (String fileId : fileIds) { + hardDeleteFile(dossierId, fileId); + fileStatusService.setFileStatusHardDeleted(fileId); + } + + } + + public void hardDeleteFile(String dossierId, String fileId) { Arrays.stream(FileType.values()).forEach(fileType -> { @@ -176,6 +213,24 @@ public class FileService { } + public void undeleteFiles(String dossierId, Set fileIds) { + + var dossier = dossierService.getDossierById(dossierId); + if (dossier.getSoftDeletedTime() != null) { + throw new DossierNotFoundException(String.format(DOSSIER_NOT_FOUND_MESSAGE, dossierId)); + } + + for (String fileId : fileIds) { + + FileModel fileStatus = fileStatusService.getStatus(fileId); + OffsetDateTime softDeletedTime = fileStatus.getDeleted(); + + undeleteFile(dossier.getDossierTemplateId(), dossierId, fileId, softDeletedTime); + fileStatusService.setFileStatusUndeleted(fileId); + } + } + + public void undeleteFile(String dossierTemplateId, String dossierId, String fileId, OffsetDateTime softDeletedTime) { forceRedactionPersistenceService.findForceRedactions(fileId, true).forEach(annotation -> { diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/FileStatusController.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileStatusManagementService.java similarity index 53% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/FileStatusController.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileStatusManagementService.java index 8f1200d95..c27a0d5db 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/FileStatusController.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileStatusManagementService.java @@ -1,31 +1,23 @@ -package com.iqser.red.service.peristence.v1.server.controller; +package com.iqser.red.service.persistence.management.v1.processor.service; import java.time.OffsetDateTime; import java.util.List; import java.util.Set; import java.util.stream.Collectors; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.stereotype.Service; -import com.iqser.red.service.peristence.v1.server.service.AnalysisFlagsCalculationService; -import com.iqser.red.service.peristence.v1.server.service.ExcludeFromAnalysisService; -import com.iqser.red.service.peristence.v1.server.service.FileStatusService; -import com.iqser.red.service.peristence.v1.server.service.IndexingService; import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; -import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileModel; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus; -import com.iqser.red.service.persistence.service.v1.api.resources.StatusResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus; import com.iqser.red.service.search.v1.model.IndexMessageType; import lombok.RequiredArgsConstructor; -@RestController +@Service @RequiredArgsConstructor -public class FileStatusController implements StatusResource { +public class FileStatusManagementService { private final FileStatusService fileStatusService; private final ExcludeFromAnalysisService excludeFromAnalysis; @@ -33,29 +25,25 @@ public class FileStatusController implements StatusResource { private final IndexingService indexingService; - @Override - public JSONPrimitive hasChangesSince(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @RequestBody JSONPrimitive since) { + public JSONPrimitive hasChangesSince(String dossierId, JSONPrimitive since) { return JSONPrimitive.of(fileStatusService.hasChangesSince(dossierId, since.getValue())); } - @Override - public List getDossierStatus(@PathVariable(DOSSIER_ID_PARAM) String dossierId) { + public List getDossierStatus(String dossierId) { return fileStatusService.getDossierStatus(dossierId).stream().filter(f -> !f.isSoftOrHardDeleted()).collect(Collectors.toList()); } - @Override - public List getAllDossierStatus(@PathVariable(DOSSIER_ID_PARAM) String dossierId) { + public List getAllDossierStatus(String dossierId) { return fileStatusService.getDossierStatus(dossierId); } - @Override - public List getSoftDeletedDossierStatus(@PathVariable(DOSSIER_ID_PARAM) String dossierId) { + public List getSoftDeletedDossierStatus(String dossierId) { return fileStatusService.getDossierStatus(dossierId) .stream() @@ -65,39 +53,32 @@ public class FileStatusController implements StatusResource { } - public List getSoftDeletedForDossierList(@RequestBody List dossierIds) { + public List getSoftDeletedForDossierList(List dossierIds) { return fileStatusService.getSoftDeletedForDossierList(dossierIds); } - @Override - public FileModel getFileStatus(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId) { + public FileModel getFileStatus(String fileId) { return fileStatusService.getStatus(fileId); } - @Override - public void updateFileModificationDate(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId) { + public void updateFileModificationDate(String fileId) { this.fileStatusService.updateFileModificationDate(fileId, OffsetDateTime.now()); } - @Override - public void setCurrentFileAssignee(@PathVariable(DOSSIER_ID_PARAM) String dossierId, - @PathVariable(FILE_ID) String fileId, - @RequestParam(value = ASSIGNEE_ID_REQUEST_PARAM, required = false) String assigneeId) { + public void setCurrentFileAssignee(String dossierId, String fileId, String assigneeId) { fileStatusService.setAssignee(fileId, assigneeId); indexingService.addToIndexingQueue(IndexMessageType.UPDATE, null, dossierId, fileId, 2); } - public void setStatusUnderReview(@PathVariable(DOSSIER_ID_PARAM) String dossierId, - @PathVariable(FILE_ID) String fileId, - @RequestParam(value = USER_ID_REQUEST_PARAM, required = false) String userId) { + public void setStatusUnderReview(String dossierId, String fileId, String userId) { FileModel fileStatus = fileStatusService.getStatus(fileId); String assignee = fileStatus.getAssignee(); @@ -111,9 +92,7 @@ public class FileStatusController implements StatusResource { } - public void setStatusUnderApproval(@PathVariable(DOSSIER_ID_PARAM) String dossierId, - @PathVariable(FILE_ID) String fileId, - @RequestParam(value = APPROVER_ID_REQUEST_PARAM, required = false) String approverId) { + public void setStatusUnderApproval(String dossierId, String fileId, String approverId) { FileModel fileStatus = fileStatusService.getStatus(fileId); String assignee = fileStatus.getAssignee(); @@ -128,9 +107,7 @@ public class FileStatusController implements StatusResource { } - public void setStatusApproved(@PathVariable(DOSSIER_ID_PARAM) String dossierId, - @PathVariable(FILE_ID) String fileId, - @RequestParam(value = APPROVER_ID_REQUEST_PARAM, required = false) String approverId) { + public void setStatusApproved(String dossierId, String fileId, String approverId) { FileModel fileStatus = fileStatusService.getStatus(fileId); String assignee = fileStatus.getAssignee(); @@ -147,7 +124,7 @@ public class FileStatusController implements StatusResource { } - public void setStatusNew(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId) { + public void setStatusNew(String dossierId, String fileId) { FileModel fileStatus = fileStatusService.getStatus(fileId); if (!WorkflowStatus.UNDER_REVIEW.equals(fileStatus.getWorkflowStatus())) { @@ -158,23 +135,21 @@ public class FileStatusController implements StatusResource { } - public void toggleExclusion(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestParam(EXCLUDED_STATUS_PARAM) boolean excluded) { + public void toggleExclusion(String dossierId, String fileId, boolean excluded) { excludeFromAnalysis.toggleExclusion(dossierId, fileId, excluded); } - public void toggleAutomaticAnalysis(@PathVariable(DOSSIER_ID_PARAM) String dossierId, - @PathVariable(FILE_ID) String fileId, - @RequestParam(EXCLUDED_STATUS_PARAM) boolean excludedFromAutomaticAnalysis) { + public void toggleAutomaticAnalysis(String dossierId, String fileId, boolean excludedFromAutomaticAnalysis) { excludeFromAnalysis.toggleAutomaticAnalysis(dossierId, fileId, excludedFromAutomaticAnalysis); } - public void excludePages(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody Set pages) { + public void excludePages(String dossierId, String fileId, Set pages) { FileModel fileStatus = fileStatusService.getStatus(fileId); Set excludedPages = fileStatus.getExcludedPages(); @@ -185,7 +160,7 @@ public class FileStatusController implements StatusResource { } - public void includePages(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody Set pages) { + public void includePages(String dossierId, String fileId, Set pages) { FileModel fileStatus = fileStatusService.getStatus(fileId); Set excludedPages = fileStatus.getExcludedPages(); diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/FileStatusProcessingUpdateService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileStatusProcessingUpdateService.java similarity index 93% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/FileStatusProcessingUpdateService.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileStatusProcessingUpdateService.java index eec2fb2a8..53da67756 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/FileStatusProcessingUpdateService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileStatusProcessingUpdateService.java @@ -1,16 +1,18 @@ -package com.iqser.red.service.peristence.v1.server.service; +package com.iqser.red.service.persistence.management.v1.processor.service; + +import javax.transaction.Transactional; import org.springframework.retry.support.RetryTemplate; import org.springframework.web.bind.annotation.RestController; -import com.iqser.red.service.pdftron.redaction.v1.api.model.UntouchedDocumentResponse; -import com.iqser.red.service.peristence.v1.server.settings.FileManagementServiceSettings; import com.iqser.red.service.persistence.management.v1.processor.exception.ConflictException; import com.iqser.red.service.persistence.management.v1.processor.model.OCRStatusUpdateResponse; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus; -import com.iqser.red.service.redaction.v1.model.AnalyzeResult; +import com.iqser.red.service.persistence.management.v1.processor.settings.FileManagementServiceSettings; +import com.iqser.red.service.persistence.service.v1.api.shared.model.AnalyzeResult; +import com.iqser.red.service.persistence.service.v1.api.shared.model.UntouchedDocumentResponse; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.ProcessingStatus; import com.iqser.red.service.search.v1.model.IndexMessageType; import lombok.RequiredArgsConstructor; @@ -71,6 +73,7 @@ public class FileStatusProcessingUpdateService { } + @Transactional public void preprocessingSuccessful(String dossierId, String fileId, UntouchedDocumentResponse untouchedDocumentResponse) { @@ -105,6 +108,16 @@ public class FileStatusProcessingUpdateService { } + private void setStatusError(String dossierId, String fileId, String reason) { + + retryTemplate.execute(retryContext -> { + log.warn("Retrying {} time to set ERROR status for file {} in dossier {} with reason {} ", retryContext.getRetryCount(), fileId, dossierId, reason); + fileStatusService.setStatusError(fileId); + return null; + }); + } + + public void ocrProcessing(String dossierId, String fileId) { var fileEntity = fileStatusPersistenceService.getStatus(fileId); @@ -176,14 +189,4 @@ public class FileStatusProcessingUpdateService { setStatusError(dossierId, fileId, "indexingFailed"); } - - private void setStatusError(String dossierId, String fileId, String reason) { - - retryTemplate.execute(retryContext -> { - log.warn("Retrying {} time to set ERROR status for file {} in dossier {} with reason {} ", retryContext.getRetryCount(), fileId, dossierId, reason); - fileStatusService.setStatusError(fileId); - return null; - }); - } - } diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/FileStatusService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileStatusService.java similarity index 92% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/FileStatusService.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileStatusService.java index d3cc5c88b..3917100b7 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/FileStatusService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileStatusService.java @@ -1,6 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.service; - -import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; +package com.iqser.red.service.persistence.management.v1.processor.service; import java.time.OffsetDateTime; import java.util.ArrayList; @@ -19,16 +17,14 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.collect.Sets; import com.iqser.red.service.pdftron.redaction.v1.api.model.DocumentRequest; import com.iqser.red.service.pdftron.redaction.v1.api.model.ProcessUntouchedDocumentRequest; -import com.iqser.red.service.peristence.v1.server.configuration.MessagingConfiguration; -import com.iqser.red.service.peristence.v1.server.model.CvAnalysisServiceRequest; -import com.iqser.red.service.peristence.v1.server.model.NerServiceRequest; -import com.iqser.red.service.peristence.v1.server.model.image.ImageServiceRequest; -import com.iqser.red.service.peristence.v1.server.settings.FileManagementServiceSettings; -import com.iqser.red.service.peristence.v1.server.utils.FileModelMapper; +import com.iqser.red.service.persistence.management.v1.processor.configuration.MessagingConfiguration; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileAttributeEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity; import com.iqser.red.service.persistence.management.v1.processor.exception.InternalServerErrorException; +import com.iqser.red.service.persistence.management.v1.processor.model.CvAnalysisServiceRequest; +import com.iqser.red.service.persistence.management.v1.processor.model.NerServiceRequest; import com.iqser.red.service.persistence.management.v1.processor.model.OCRStatusUpdateResponse; +import com.iqser.red.service.persistence.management.v1.processor.model.image.ImageServiceRequest; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileAttributeConfigPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService; @@ -40,13 +36,17 @@ import com.iqser.red.service.persistence.management.v1.processor.service.persist import com.iqser.red.service.persistence.management.v1.processor.service.persistence.annotations.LegalBasisChangePersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.annotations.RemoveRedactionPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.annotations.ResizeRedactionPersistenceService; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileModel; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileType; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus; -import com.iqser.red.service.redaction.v1.model.AnalyzeRequest; -import com.iqser.red.service.redaction.v1.model.AnalyzeResult; -import com.iqser.red.service.redaction.v1.model.MessageType; +import com.iqser.red.service.persistence.management.v1.processor.settings.FileManagementServiceSettings; +import com.iqser.red.service.persistence.management.v1.processor.utils.FileModelMapper; +import com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter; +import com.iqser.red.service.persistence.service.v1.api.shared.model.AnalyzeRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.AnalyzeResult; +import com.iqser.red.service.persistence.service.v1.api.shared.model.FileAttribute; +import com.iqser.red.service.persistence.service.v1.api.shared.model.MessageType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.ProcessingStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; @@ -81,7 +81,7 @@ public class FileStatusService { public List getAllRelevantStatusesForReanalysisScheduler() { var fileEntities = fileStatusPersistenceService.getAllRelevantStatusesForReanalysisScheduler(fileManagementServiceSettings.getMaxErrorRetries()); - var convertedList = convert(fileEntities, FileModel.class, new FileModelMapper()); + var convertedList = MagicConverter.convert(fileEntities, FileModel.class, new FileModelMapper()); return reanalysisRequiredStatusService.enhanceFileStatusWithAnalysisRequirements(convertedList).stream().filter(FileModel::isAnalysisRequired).collect(Collectors.toList()); } @@ -90,7 +90,7 @@ public class FileStatusService { public List getActiveFiles(String dossierId) { var fileEntities = fileStatusPersistenceService.getActiveFiles(dossierId); - var convertedList = convert(fileEntities, FileModel.class, new FileModelMapper()); + var convertedList = MagicConverter.convert(fileEntities, FileModel.class, new FileModelMapper()); return reanalysisRequiredStatusService.enhanceFileStatusWithAnalysisRequirements(convertedList); } @@ -99,15 +99,16 @@ public class FileStatusService { public List getDossierStatus(String dossierId) { var fileEntities = new ArrayList<>(fileStatusPersistenceService.getStatusesForDossier(dossierId)); - var convertedList = convert(fileEntities, FileModel.class, new FileModelMapper()); + var convertedList = MagicConverter.convert(fileEntities, FileModel.class, new FileModelMapper()); return reanalysisRequiredStatusService.enhanceFileStatusWithAnalysisRequirements(convertedList); } + @Transactional public List getStatusesForDossiersAndTimePeriod(Set dossierIds, OffsetDateTime start, OffsetDateTime end) { var fileEntities = fileStatusPersistenceService.getStatusesForDossiersAndTimePeriod(dossierIds, start, end); - var convertedList = convert(fileEntities, FileModel.class, new FileModelMapper()); + var convertedList = MagicConverter.convert(fileEntities, FileModel.class, new FileModelMapper()); return reanalysisRequiredStatusService.enhanceFileStatusWithAnalysisRequirements(convertedList); } @@ -115,7 +116,7 @@ public class FileStatusService { public List getSoftDeletedForDossierList(List dossierIds) { var fileEntities = fileStatusPersistenceService.getSoftDeletedFiles(dossierIds); - var convertedList = convert(fileEntities, FileModel.class, new FileModelMapper()); + var convertedList = MagicConverter.convert(fileEntities, FileModel.class, new FileModelMapper()); return reanalysisRequiredStatusService.enhanceFileStatusWithAnalysisRequirements(convertedList); } @@ -124,11 +125,12 @@ public class FileStatusService { public FileModel getStatus(String fileId) { var fileEntity = fileStatusPersistenceService.getStatus(fileId); - var converted = convert(fileEntity, FileModel.class, new FileModelMapper()); + var converted = MagicConverter.convert(fileEntity, FileModel.class, new FileModelMapper()); return reanalysisRequiredStatusService.enhanceFileStatusWithAnalysisRequirements(converted); } + @Transactional public void updateProcessingStatusPreprocessed(String dossierId, String fileId, boolean hasHighlights, long fileSize) { fileStatusPersistenceService.updateProcessingStatusPreprocessed(fileId, hasHighlights, fileSize); @@ -137,9 +139,108 @@ public class FileStatusService { } - public void setExcludedPages(String fileId, Set excludedPages) { + @Transactional + protected void addToAnalysisQueue(String dossierId, String fileId, boolean priority, Set sectionsToReanalyse, boolean manualRedactionReanalyse) { - fileStatusPersistenceService.setExcludedPages(fileId, excludedPages); + var dossier = dossierPersistenceService.getAndValidateDossier(dossierId); + var fileEntity = fileStatusPersistenceService.getStatus(fileId); + + if (!fileManagementStorageService.objectExists(dossierId, fileId, FileType.ORIGIN)) { + addToPreprocessingQueue(dossierId, fileId, fileEntity.getFilename()); + return; + } + + if (fileEntity.isExcluded()) { + log.debug("File {} is excluded", fileEntity.getId()); + setStatusProcessed(fileId); + return; + } + + if (settings.isFigureDetectionEnabled() && !fileManagementStorageService.objectExists(dossierId, fileId, FileType.FIGURE)) { + log.debug("Add file: {} from dossier {} to Figure Detection queue", fileId, dossierId); + addToFigureDetectionRequestQueue(dossierId, fileId); + return; + } + + if (settings.isCvTableParsingEnabled() && !fileManagementStorageService.objectExists(dossierId, fileId, FileType.TABLES)) { + log.debug("Add file: {} from dossier {} to Cv Service queue", fileId, dossierId); + addToTableParsingRequestQueue(dossierId, fileId); + return; + } + + if (settings.isImageServiceEnabled() && !fileManagementStorageService.objectExists(dossierId, fileId, FileType.IMAGE_INFO)) { + log.debug("Add file: {} from dossier {} to Image queue", fileId, dossierId); + addToImageQueue(dossierId, fileId); + return; + } + + var fileModel = MagicConverter.convert(fileEntity, FileModel.class, new FileModelMapper()); + reanalysisRequiredStatusService.enhanceFileStatusWithAnalysisRequirements(fileModel, true); + + if (settings.isOcrByDefault() && fileModel.getOcrEndTime() == null) { + log.debug("Add file: {} from dossier {} to OCR queue", fileId, dossierId); + setStatusOcrQueued(dossierId, fileId); + return; + } + + MessageType messageType = null; + + if (!fileManagementStorageService.objectExists(dossierId, fileId, FileType.TEXT)) { + messageType = MessageType.STRUCTURE_ANALYSE; + } + + if (messageType == null && settings.isNerServiceEnabled() && !fileManagementStorageService.objectExists(dossierId, fileId, FileType.NER_ENTITIES)) { + log.debug("Add file: {} from dossier {} to NER queue", fileId, dossierId); + addToNerQueue(dossierId, fileId); + return; + } + + if (messageType == null) { + boolean reanalyse = fileModel.isReanalysisRequired() || manualRedactionReanalyse; + messageType = calculateMessageType(reanalyse, fileModel.getProcessingStatus(), fileModel); + } + + var analyseRequest = AnalyzeRequest.builder() + .messageType(messageType) + .dossierId(dossierId) + .analysisNumber(fileModel.getNumberOfAnalyses() + 1) + .sectionsToReanalyse(sectionsToReanalyse) + .fileId(fileId) + .manualRedactions(manualRedactionProviderService.getManualRedactions(fileId)) + .dossierTemplateId(dossier.getDossierTemplateId()) + .lastProcessed(fileModel.getLastProcessed()) + .fileAttributes(convertAttributes(fileEntity.getFileAttributes(), dossier.getDossierTemplateId())) + .excludedPages(fileModel.getExcludedPages()) + .build(); + + log.info("Add file: {} from dossier {} to Analysis queue with MessageType {}", fileId, dossierId, messageType); + + if (messageType.equals(MessageType.REANALYSE)) { + setStatusProcessing(fileId); + } else { + setStatusFullProcessing(fileId); + } + + try { + if (priority) { + rabbitTemplate.convertAndSend(MessagingConfiguration.REDACTION_PRIORITY_QUEUE, objectMapper.writeValueAsString(analyseRequest)); + } else { + rabbitTemplate.convertAndSend(MessagingConfiguration.REDACTION_QUEUE, objectMapper.writeValueAsString(analyseRequest)); + } + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } + + + @SneakyThrows + public void addToPreprocessingQueue(String dossierId, String fileId, String filename) { + + var processUntouchedDocumentRequest = ProcessUntouchedDocumentRequest.builder().dossierId(dossierId).fileId(fileId).fileName(filename).build(); + + setStatusPreProcessingQueued(fileId); + + rabbitTemplate.convertAndSend(MessagingConfiguration.PRE_PROCESSING_QUEUE, objectMapper.writeValueAsString(processUntouchedDocumentRequest)); } @@ -149,9 +250,150 @@ public class FileStatusService { } - public void setStatusPreProcessingQueued(String fileId) { + public void addToFigureDetectionRequestQueue(String dossierId, String fileId) { - fileStatusPersistenceService.updateProcessingStatus(fileId, ProcessingStatus.PRE_PROCESSING_QUEUED); + fileStatusPersistenceService.updateProcessingStatus(fileId, ProcessingStatus.FIGURE_DETECTION_ANALYZING); + + try { + rabbitTemplate.convertAndSend(MessagingConfiguration.CV_ANALYSIS_QUEUE, + objectMapper.writeValueAsString(CvAnalysisServiceRequest.builder() + .dossierId(dossierId) + .fileId(fileId) + .operation(CvAnalysisServiceRequest.OPERATION_FIGURE_DETECTION) + .targetFileExtension(CvAnalysisServiceRequest.TARGET_FILE_EXTENSION) + .responseFileExtension(CvAnalysisServiceRequest.FIGURE_DETECTION_FILE_EXTENSION) + .build()), + message -> { + message.getMessageProperties().setPriority(1); + return message; + }); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } + + + public void addToTableParsingRequestQueue(String dossierId, String fileId) { + + fileStatusPersistenceService.updateProcessingStatus(fileId, ProcessingStatus.TABLE_PARSING_ANALYZING); + + try { + rabbitTemplate.convertAndSend(MessagingConfiguration.CV_ANALYSIS_QUEUE, + objectMapper.writeValueAsString(CvAnalysisServiceRequest.builder() + .dossierId(dossierId) + .fileId(fileId) + .operation(CvAnalysisServiceRequest.OPERATION_TABLE_PARSING) + .targetFileExtension(CvAnalysisServiceRequest.TARGET_FILE_EXTENSION) + .responseFileExtension(CvAnalysisServiceRequest.TABLE_PARSING_FILE_EXTENSION) + .build()), + message -> { + message.getMessageProperties().setPriority(1); + return message; + }); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } + + + public void addToImageQueue(String dossierId, String fileId) { + + setStatusImageAnalyzing(fileId); + try { + rabbitTemplate.convertAndSend(MessagingConfiguration.IMAGE_SERVICE_QUEUE, + objectMapper.writeValueAsString(ImageServiceRequest.builder() + .dossierId(dossierId) + .fileId(fileId) + .targetFileExtension(ImageServiceRequest.TARGET_FILE_EXTENSION) + .responseFileExtension(ImageServiceRequest.RESPONSE_FILE_EXTENSION) + .build()), + message -> { + message.getMessageProperties().setPriority(1); + return message; + }); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } + + + public void setStatusOcrQueued(String dossierId, String fileId) { + + FileEntity fileStatus = fileStatusPersistenceService.getStatus(fileId); + + if (fileStatus.isExcluded()) { + log.debug("File {} is excluded", fileId); + return; + } + + updateOCRStartTime(fileId); + fileStatusPersistenceService.updateProcessingStatus(fileId, ProcessingStatus.OCR_PROCESSING_QUEUED); + addToOcrQueue(dossierId, fileId, 2); + } + + + protected void addToNerQueue(String dossierId, String fileId) { + + setStatusNerAnalyzing(fileId); + try { + rabbitTemplate.convertAndSend(MessagingConfiguration.NER_SERVICE_QUEUE, + objectMapper.writeValueAsString(NerServiceRequest.builder() + .dossierId(dossierId) + .fileId(fileId) + .targetFileExtension(NerServiceRequest.TARGET_FILE_EXTENSION) + .responseFileExtension(NerServiceRequest.RESPONSE_FILE_EXTENSION) + .build()), + message -> { + message.getMessageProperties().setPriority(1); + return message; + }); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } + + + private MessageType calculateMessageType(boolean reanalyse, ProcessingStatus processingStatus, FileModel fileModel) { + + if (ProcessingStatus.NER_ANALYZING.equals(processingStatus)) { + return MessageType.ANALYSE; + } + + if (reanalyse) { + if (fileModel.getLastFileAttributeChange() != null && fileModel.getLastProcessed().isBefore(fileModel.getLastFileAttributeChange())) { + return MessageType.ANALYSE; + } else { + return MessageType.REANALYSE; + } + } + + return MessageType.ANALYSE; + } + + + private List convertAttributes(List fileAttributes, String dossierTemplateId) { + + List fileAttributeList = new ArrayList<>(); + + var fileAttributeConfigs = fileAttributeConfigPersistenceService.getFileAttributes(dossierTemplateId); + + for (FileAttributeEntity fileAttribute : fileAttributes) { + + var config = fileAttributeConfigs.stream() + .filter(fac -> fac.getId().equals(fileAttribute.getFileAttributeId().getFileAttributeConfigId())) + .findFirst() + .orElseThrow(() -> new InternalServerErrorException("File Attribute config not defined for attribute :" + fileAttribute.getFileAttributeId())); + + var attribute = FileAttribute.builder() + .id(fileAttribute.getFileAttributeId().getFileAttributeConfigId()) + .label(config.getLabel()) + .placeholder(config.getPlaceholder()) + .value(fileAttribute.getValue()) + .build(); + fileAttributeList.add(attribute); + } + + return fileAttributeList; } @@ -167,12 +409,49 @@ public class FileStatusService { } + public void setStatusPreProcessingQueued(String fileId) { + + fileStatusPersistenceService.updateProcessingStatus(fileId, ProcessingStatus.PRE_PROCESSING_QUEUED); + } + + public void setStatusImageAnalyzing(String fileId) { fileStatusPersistenceService.updateProcessingStatus(fileId, ProcessingStatus.IMAGE_ANALYZING); } + public void updateOCRStartTime(String fileId) { + + fileStatusPersistenceService.updateOCRStartTime(fileId, OffsetDateTime.now()); + } + + + private void addToOcrQueue(String dossierId, String fileId, int priority) { + + try { + rabbitTemplate.convertAndSend(MessagingConfiguration.OCR_QUEUE, objectMapper.writeValueAsString(new DocumentRequest(dossierId, fileId)), message -> { + message.getMessageProperties().setPriority(priority); + return message; + }); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } + + + public void setStatusNerAnalyzing(String fileId) { + + fileStatusPersistenceService.updateProcessingStatus(fileId, ProcessingStatus.NER_ANALYZING); + } + + + public void setExcludedPages(String fileId, Set excludedPages) { + + fileStatusPersistenceService.setExcludedPages(fileId, excludedPages); + } + + public void setStatusSuccessful(String fileId, AnalyzeResult analyzeResult) { fileStatusPersistenceService.updateProcessingStatus(fileId, @@ -187,6 +466,25 @@ public class FileStatusService { } + public void setStatusSuccessful(String fileId, WorkflowStatus workflowStatus) { + + fileStatusPersistenceService.updateWorkflowStatus(fileId, workflowStatus, false); + } + + + public void setApprovalStatusSuccessful(String dossierId, String fileId, WorkflowStatus workflowStatus) { + + fileStatusPersistenceService.updateWorkflowStatus(fileId, workflowStatus, true); + } + + + @Transactional + public void setStatusReprocess(String dossierId, String fileId, boolean priority) { + + setStatusReprocess(dossierId, fileId, priority, Sets.newHashSet(), false, false); + } + + @Transactional public void setStatusReprocess(String dossierId, String fileId, @@ -214,56 +512,6 @@ public class FileStatusService { } - public void setStatusSuccessful(String fileId, WorkflowStatus workflowStatus) { - - fileStatusPersistenceService.updateWorkflowStatus(fileId, workflowStatus, false); - } - - - public void setApprovalStatusSuccessful(String dossierId, String fileId, WorkflowStatus workflowStatus) { - - fileStatusPersistenceService.updateWorkflowStatus(fileId, workflowStatus, true); - } - - - @Transactional - public void setStatusFullReprocess(String dossierId, String fileId, boolean priority, boolean requiresStructureAnalysis) { - - FileEntity fileStatus = fileStatusPersistenceService.getStatus(fileId); - - if (fileStatus.isExcluded()) { - log.debug("File {} is excluded", fileStatus.getId()); - return; - } - - if (requiresStructureAnalysis) { - log.info("Delete text and NER entities from file {} in dossier {}", fileId, dossierId); - fileManagementStorageService.deleteObject(dossierId, fileId, FileType.TEXT); - fileManagementStorageService.deleteObject(dossierId, fileId, FileType.NER_ENTITIES); - } - - addToAnalysisQueue(dossierId, fileId, priority, Sets.newHashSet(), false); - } - - - @SneakyThrows - public void addToPreprocessingQueue(String dossierId, String fileId, String filename) { - - var processUntouchedDocumentRequest = ProcessUntouchedDocumentRequest.builder().dossierId(dossierId).fileId(fileId).fileName(filename).build(); - - setStatusPreProcessingQueued(fileId); - - rabbitTemplate.convertAndSend(MessagingConfiguration.PRE_PROCESSING_QUEUE, objectMapper.writeValueAsString(processUntouchedDocumentRequest)); - } - - - @Transactional - public void setStatusReprocess(String dossierId, String fileId, boolean priority) { - - setStatusReprocess(dossierId, fileId, priority, Sets.newHashSet(), false, false); - } - - @Transactional public void setStatusReprocessForManual(String dossierId, String fileId, boolean priority) { @@ -361,6 +609,26 @@ public class FileStatusService { } + @Transactional + public void setStatusFullReprocess(String dossierId, String fileId, boolean priority, boolean requiresStructureAnalysis) { + + FileEntity fileStatus = fileStatusPersistenceService.getStatus(fileId); + + if (fileStatus.isExcluded()) { + log.debug("File {} is excluded", fileStatus.getId()); + return; + } + + if (requiresStructureAnalysis) { + log.info("Delete text and NER entities from file {} in dossier {}", fileId, dossierId); + fileManagementStorageService.deleteObject(dossierId, fileId, FileType.TEXT); + fileManagementStorageService.deleteObject(dossierId, fileId, FileType.NER_ENTITIES); + } + + addToAnalysisQueue(dossierId, fileId, priority, Sets.newHashSet(), false); + } + + @Transactional public void toggleAutomaticAnalysis(String dossierId, String fileId, boolean excludedFromAutomaticAnalysis) { @@ -372,27 +640,6 @@ public class FileStatusService { } - public void setStatusNerAnalyzing(String fileId) { - - fileStatusPersistenceService.updateProcessingStatus(fileId, ProcessingStatus.NER_ANALYZING); - } - - - public void setStatusOcrQueued(String dossierId, String fileId) { - - FileEntity fileStatus = fileStatusPersistenceService.getStatus(fileId); - - if (fileStatus.isExcluded()) { - log.debug("File {} is excluded", fileId); - return; - } - - updateOCRStartTime(fileId); - fileStatusPersistenceService.updateProcessingStatus(fileId, ProcessingStatus.OCR_PROCESSING_QUEUED); - addToOcrQueue(dossierId, fileId, 2); - } - - public void setStatusPreProcessing(String fileId, int processingErrorCount) { fileStatusPersistenceService.updateProcessingStatus(fileId, ProcessingStatus.PRE_PROCESSING, processingErrorCount); @@ -405,79 +652,6 @@ public class FileStatusService { } - public void addToImageQueue(String dossierId, String fileId) { - - setStatusImageAnalyzing(fileId); - try { - rabbitTemplate.convertAndSend(MessagingConfiguration.IMAGE_SERVICE_QUEUE, - objectMapper.writeValueAsString(ImageServiceRequest.builder() - .dossierId(dossierId) - .fileId(fileId) - .targetFileExtension(ImageServiceRequest.TARGET_FILE_EXTENSION) - .responseFileExtension(ImageServiceRequest.RESPONSE_FILE_EXTENSION) - .build()), - message -> { - message.getMessageProperties().setPriority(1); - return message; - }); - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } - } - - - public void addToFigureDetectionRequestQueue(String dossierId, String fileId) { - - fileStatusPersistenceService.updateProcessingStatus(fileId, ProcessingStatus.FIGURE_DETECTION_ANALYZING); - - try { - rabbitTemplate.convertAndSend(MessagingConfiguration.CV_ANALYSIS_QUEUE, - objectMapper.writeValueAsString(CvAnalysisServiceRequest.builder() - .dossierId(dossierId) - .fileId(fileId) - .operation(CvAnalysisServiceRequest.OPERATION_FIGURE_DETECTION) - .targetFileExtension(CvAnalysisServiceRequest.TARGET_FILE_EXTENSION) - .responseFileExtension(CvAnalysisServiceRequest.FIGURE_DETECTION_FILE_EXTENSION) - .build()), - message -> { - message.getMessageProperties().setPriority(1); - return message; - }); - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } - } - - - public void addToTableParsingRequestQueue(String dossierId, String fileId) { - - fileStatusPersistenceService.updateProcessingStatus(fileId, ProcessingStatus.TABLE_PARSING_ANALYZING); - - try { - rabbitTemplate.convertAndSend(MessagingConfiguration.CV_ANALYSIS_QUEUE, - objectMapper.writeValueAsString(CvAnalysisServiceRequest.builder() - .dossierId(dossierId) - .fileId(fileId) - .operation(CvAnalysisServiceRequest.OPERATION_TABLE_PARSING) - .targetFileExtension(CvAnalysisServiceRequest.TARGET_FILE_EXTENSION) - .responseFileExtension(CvAnalysisServiceRequest.TABLE_PARSING_FILE_EXTENSION) - .build()), - message -> { - message.getMessageProperties().setPriority(1); - return message; - }); - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } - } - - - public void updateOCRStartTime(String fileId) { - - fileStatusPersistenceService.updateOCRStartTime(fileId, OffsetDateTime.now()); - } - - @Transactional public void overwriteFile(String dossierId, String fileId, String uploader, String filename, boolean keepManualRedactions) { @@ -571,178 +745,6 @@ public class FileStatusService { } - @Transactional - protected void addToAnalysisQueue(String dossierId, String fileId, boolean priority, Set sectionsToReanalyse, boolean manualRedactionReanalyse) { - - var dossier = dossierPersistenceService.getAndValidateDossier(dossierId); - var fileEntity = fileStatusPersistenceService.getStatus(fileId); - - if (!fileManagementStorageService.objectExists(dossierId, fileId, FileType.ORIGIN)) { - addToPreprocessingQueue(dossierId, fileId, fileEntity.getFilename()); - return; - } - - if (fileEntity.isExcluded()) { - log.debug("File {} is excluded", fileEntity.getId()); - setStatusProcessed(fileId); - return; - } - - if (settings.isFigureDetectionEnabled() && !fileManagementStorageService.objectExists(dossierId, fileId, FileType.FIGURE)) { - log.debug("Add file: {} from dossier {} to Figure Detection queue", fileId, dossierId); - addToFigureDetectionRequestQueue(dossierId, fileId); - return; - } - - if (settings.isCvTableParsingEnabled() && !fileManagementStorageService.objectExists(dossierId, fileId, FileType.TABLES)) { - log.debug("Add file: {} from dossier {} to Cv Service queue", fileId, dossierId); - addToTableParsingRequestQueue(dossierId, fileId); - return; - } - - if (settings.isImageServiceEnabled() && !fileManagementStorageService.objectExists(dossierId, fileId, FileType.IMAGE_INFO)) { - log.debug("Add file: {} from dossier {} to Image queue", fileId, dossierId); - addToImageQueue(dossierId, fileId); - return; - } - - var fileModel = convert(fileEntity, FileModel.class, new FileModelMapper()); - reanalysisRequiredStatusService.enhanceFileStatusWithAnalysisRequirements(fileModel, true); - - if (settings.isOcrByDefault() && fileModel.getOcrEndTime() == null) { - log.debug("Add file: {} from dossier {} to OCR queue", fileId, dossierId); - setStatusOcrQueued(dossierId, fileId); - return; - } - - MessageType messageType = null; - - if (!fileManagementStorageService.objectExists(dossierId, fileId, FileType.TEXT)) { - messageType = MessageType.STRUCTURE_ANALYSE; - } - - if (messageType == null && settings.isNerServiceEnabled() && !fileManagementStorageService.objectExists(dossierId, fileId, FileType.NER_ENTITIES)) { - log.debug("Add file: {} from dossier {} to NER queue", fileId, dossierId); - addToNerQueue(dossierId, fileId); - return; - } - - if (messageType == null) { - boolean reanalyse = fileModel.isReanalysisRequired() || manualRedactionReanalyse; - messageType = calculateMessageType(reanalyse, fileModel.getProcessingStatus(), fileModel); - } - - var analyseRequest = AnalyzeRequest.builder() - .messageType(messageType) - .dossierId(dossierId) - .analysisNumber(fileModel.getNumberOfAnalyses() + 1) - .sectionsToReanalyse(sectionsToReanalyse) - .fileId(fileId) - .manualRedactions(manualRedactionProviderService.getManualRedactions(fileId)) - .dossierTemplateId(dossier.getDossierTemplateId()) - .lastProcessed(fileModel.getLastProcessed()) - .fileAttributes(convertAttributes(fileEntity.getFileAttributes(), dossier.getDossierTemplateId())) - .excludedPages(fileModel.getExcludedPages()) - .build(); - - log.info("Add file: {} from dossier {} to Analysis queue with MessageType {}", fileId, dossierId, messageType); - - if (messageType.equals(MessageType.REANALYSE)) { - setStatusProcessing(fileId); - } else { - setStatusFullProcessing(fileId); - } - - try { - if (priority) { - rabbitTemplate.convertAndSend(MessagingConfiguration.REDACTION_PRIORITY_QUEUE, objectMapper.writeValueAsString(analyseRequest)); - } else { - rabbitTemplate.convertAndSend(MessagingConfiguration.REDACTION_QUEUE, objectMapper.writeValueAsString(analyseRequest)); - } - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } - } - - - protected void addToNerQueue(String dossierId, String fileId) { - - setStatusNerAnalyzing(fileId); - try { - rabbitTemplate.convertAndSend(MessagingConfiguration.NER_SERVICE_QUEUE, - objectMapper.writeValueAsString(NerServiceRequest.builder() - .dossierId(dossierId) - .fileId(fileId) - .targetFileExtension(NerServiceRequest.TARGET_FILE_EXTENSION) - .responseFileExtension(NerServiceRequest.RESPONSE_FILE_EXTENSION) - .build()), - message -> { - message.getMessageProperties().setPriority(1); - return message; - }); - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } - } - - - private MessageType calculateMessageType(boolean reanalyse, ProcessingStatus processingStatus, FileModel fileModel) { - - if (ProcessingStatus.NER_ANALYZING.equals(processingStatus)) { - return MessageType.ANALYSE; - } - - if (reanalyse) { - if (fileModel.getLastFileAttributeChange() != null && fileModel.getLastProcessed().isBefore(fileModel.getLastFileAttributeChange())) { - return MessageType.ANALYSE; - } else { - return MessageType.REANALYSE; - } - } - - return MessageType.ANALYSE; - } - - - private void addToOcrQueue(String dossierId, String fileId, int priority) { - - try { - rabbitTemplate.convertAndSend(MessagingConfiguration.OCR_QUEUE, objectMapper.writeValueAsString(new DocumentRequest(dossierId, fileId)), message -> { - message.getMessageProperties().setPriority(priority); - return message; - }); - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } - } - - - private List convertAttributes(List fileAttributes, String dossierTemplateId) { - - List fileAttributeList = new ArrayList<>(); - - var fileAttributeConfigs = fileAttributeConfigPersistenceService.getFileAttributes(dossierTemplateId); - - for (FileAttributeEntity fileAttribute : fileAttributes) { - - var config = fileAttributeConfigs.stream() - .filter(fac -> fac.getId().equals(fileAttribute.getFileAttributeId().getFileAttributeConfigId())) - .findFirst() - .orElseThrow(() -> new InternalServerErrorException("File Attribute config not defined for attribute :" + fileAttribute.getFileAttributeId())); - - com.iqser.red.service.redaction.v1.model.FileAttribute attribute = com.iqser.red.service.redaction.v1.model.FileAttribute.builder() - .id(fileAttribute.getFileAttributeId().getFileAttributeConfigId()) - .label(config.getLabel()) - .placeholder(config.getPlaceholder()) - .value(fileAttribute.getValue()) - .build(); - fileAttributeList.add(attribute); - } - - return fileAttributeList; - } - - public void updateOCRStatus(OCRStatusUpdateResponse response) { fileStatusPersistenceService.updateOCRStatus(response); diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/ImageMessageReceiver.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ImageMessageReceiver.java similarity index 83% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/ImageMessageReceiver.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ImageMessageReceiver.java index cdcebe237..adc404bba 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/ImageMessageReceiver.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ImageMessageReceiver.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.service; +package com.iqser.red.service.persistence.management.v1.processor.service; import java.io.IOException; import java.util.HashMap; @@ -10,8 +10,9 @@ import org.springframework.stereotype.Service; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import com.iqser.red.service.peristence.v1.server.configuration.MessagingConfiguration; -import com.iqser.red.service.peristence.v1.server.settings.FileManagementServiceSettings; +import com.iqser.red.service.persistence.management.v1.processor.configuration.MessagingConfiguration; +import com.iqser.red.service.persistence.management.v1.processor.settings.FileManagementServiceSettings; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; @@ -22,11 +23,9 @@ import lombok.extern.slf4j.Slf4j; @RequiredArgsConstructor public class ImageMessageReceiver { - private final FileManagementStorageService fileManagementStorageService; private final FileStatusService fileStatusService; private final ObjectMapper objectMapper; private final FileStatusProcessingUpdateService fileStatusProcessingUpdateService; - private final FileManagementServiceSettings settings; @SneakyThrows diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/IndexingService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/IndexingService.java similarity index 96% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/IndexingService.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/IndexingService.java index 492f4928a..88f4a55b9 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/IndexingService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/IndexingService.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.service; +package com.iqser.red.service.persistence.management.v1.processor.service; import java.util.ArrayList; import java.util.List; @@ -11,7 +11,7 @@ import org.springframework.stereotype.Service; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import com.iqser.red.service.peristence.v1.server.configuration.MessagingConfiguration; +import com.iqser.red.service.persistence.management.v1.processor.configuration.MessagingConfiguration; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/LicenseReportService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/LicenseReportService.java similarity index 94% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/LicenseReportService.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/LicenseReportService.java index b50047ed5..954c29d1f 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/LicenseReportService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/LicenseReportService.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.service; +package com.iqser.red.service.persistence.management.v1.processor.service; import java.time.Duration; import java.time.Instant; @@ -16,9 +16,9 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierEntity; -import com.iqser.red.service.persistence.service.v1.api.model.license.LicenseReport; -import com.iqser.red.service.persistence.service.v1.api.model.license.LicenseReportRequest; -import com.iqser.red.service.persistence.service.v1.api.model.license.ReportData; +import com.iqser.red.service.persistence.service.v1.api.shared.model.license.LicenseReport; +import com.iqser.red.service.persistence.service.v1.api.shared.model.license.LicenseReportRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.license.ReportData; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/ManualRedactionProviderService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ManualRedactionProviderService.java similarity index 81% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/ManualRedactionProviderService.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ManualRedactionProviderService.java index 47ac59c35..b83f230a4 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/ManualRedactionProviderService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ManualRedactionProviderService.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.service; +package com.iqser.red.service.persistence.management.v1.processor.service; import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; @@ -14,9 +14,6 @@ import javax.transaction.Transactional; import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.stereotype.Service; -import com.iqser.red.service.peristence.v1.server.utils.ManualImageRecategorizationMapper; -import com.iqser.red.service.peristence.v1.server.utils.ManualRedactionMapper; -import com.iqser.red.service.peristence.v1.server.utils.ManualResizeRedactionMapper; import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.CommentEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ManualRedactionEntryEntity; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.annotations.AddRedactionPersistenceService; @@ -26,14 +23,18 @@ import com.iqser.red.service.persistence.management.v1.processor.service.persist import com.iqser.red.service.persistence.management.v1.processor.service.persistence.annotations.LegalBasisChangePersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.annotations.RemoveRedactionPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.annotations.ResizeRedactionPersistenceService; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.Comment; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.ManualRedactions; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.entitymapped.IdRemoval; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.entitymapped.ManualForceRedaction; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.entitymapped.ManualImageRecategorization; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.entitymapped.ManualLegalBasisChange; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.entitymapped.ManualRedactionEntry; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.entitymapped.ManualResizeRedaction; +import com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter; +import com.iqser.red.service.persistence.management.v1.processor.utils.ManualImageRecategorizationMapper; +import com.iqser.red.service.persistence.management.v1.processor.utils.ManualRedactionMapper; +import com.iqser.red.service.persistence.management.v1.processor.utils.ManualResizeRedactionMapper; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.Comment; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ManualRedactions; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.IdRemoval; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualForceRedaction; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualImageRecategorization; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualLegalBasisChange; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualRedactionEntry; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualResizeRedaction; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -80,6 +81,12 @@ public class ManualRedactionProviderService { } + private Set convertEntriesToAdd(List source) { + + return source.stream().map(entry -> convert(entry, ManualRedactionEntry.class, new ManualRedactionMapper())).collect(Collectors.toSet()); + } + + public void hardDeleteManualRedactions(String fileId, String annotationId) { try { @@ -119,10 +126,4 @@ public class ManualRedactionProviderService { } } - - private Set convertEntriesToAdd(List source) { - - return source.stream().map(entry -> convert(entry, ManualRedactionEntry.class, new ManualRedactionMapper())).collect(Collectors.toSet()); - } - } diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/ManualRedactionService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ManualRedactionService.java similarity index 91% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/ManualRedactionService.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ManualRedactionService.java index 80d76b104..ea3594e53 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/ManualRedactionService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ManualRedactionService.java @@ -1,6 +1,5 @@ -package com.iqser.red.service.peristence.v1.server.service; +package com.iqser.red.service.persistence.management.v1.processor.service; -import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; import static com.iqser.red.service.persistence.management.v1.processor.utils.TypeIdUtils.toTypeId; import java.nio.charset.StandardCharsets; @@ -13,18 +12,16 @@ import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; -import javax.transaction.Transactional; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.hash.HashFunction; import com.google.common.hash.Hashing; -import com.iqser.red.service.peristence.v1.server.configuration.MessagingConfiguration; -import com.iqser.red.service.peristence.v1.server.controller.DictionaryController; -import com.iqser.red.service.peristence.v1.server.utils.ManualRedactionMapper; +import com.iqser.red.service.persistence.management.v1.processor.configuration.MessagingConfiguration; import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.AnnotationEntityId; import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.CommentEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.IdRemovalEntity; @@ -48,25 +45,27 @@ import com.iqser.red.service.persistence.management.v1.processor.service.persist import com.iqser.red.service.persistence.management.v1.processor.service.persistence.annotations.LegalBasisChangePersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.annotations.RemoveRedactionPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.annotations.ResizeRedactionPersistenceService; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.AddRedactionRequest; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.CommentRequest; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.ForceRedactionRequest; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.ImageRecategorizationRequest; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.LegalBasisChangeRequest; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.ManualAddResponse; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.ManualRedactions; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.RemoveRedactionRequest; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.ResizeRedactionRequest; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.entitymapped.IdRemoval; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.entitymapped.ManualRedactionEntry; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.DictionaryEntryType; -import com.iqser.red.service.redaction.v1.model.AnalyzeRequest; -import com.iqser.red.service.redaction.v1.model.MessageType; -import com.iqser.red.service.redaction.v1.model.RedactionLog; -import com.iqser.red.service.redaction.v1.model.RedactionLogEntry; +import com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter; +import com.iqser.red.service.persistence.management.v1.processor.utils.ManualRedactionMapper; +import com.iqser.red.service.persistence.service.v1.api.shared.model.AnalyzeRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.MessageType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AddRedactionRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.CommentRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ForceRedactionRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ImageRecategorizationRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.LegalBasisChangeRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ManualAddResponse; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ManualRedactions; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.RemoveRedactionRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ResizeRedactionRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.IdRemoval; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualRedactionEntry; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.ProcessingStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionaryEntryType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLog; +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLogEntry; import feign.FeignException; import lombok.RequiredArgsConstructor; @@ -84,7 +83,6 @@ public class ManualRedactionService { private final ForceRedactionPersistenceService forceRedactionPersistenceService; private final CommentPersistenceService commentPersistenceService; private final FileStatusPersistenceService fileStatusPersistenceService; - private final DictionaryController dictionaryController; private final DictionaryPersistenceService dictionaryPersistenceService; private final FileManagementStorageService fileManagementStorageService; private final ImageRecategorizationPersistenceService recategorizationPersistenceService; @@ -97,10 +95,11 @@ public class ManualRedactionService { private final RabbitTemplate rabbitTemplate; private final ObjectMapper objectMapper; private final RedactionLogService redactionLogService; - + private final DictionaryManagementService dictionaryService; private final HashFunction hashFunction = Hashing.murmur3_128(); + @Transactional public List addAddRedaction(String dossierId, String fileId, List addRedactionRequests) { var response = new ArrayList(); @@ -145,7 +144,7 @@ public class ManualRedactionService { reprocess(dossierId, fileId); } else { - var manualTextRedactions = convert(response.stream() + var manualTextRedactions = MagicConverter.convert(response.stream() .map(r -> getAddRedaction(fileId, r.getAnnotationId())) .filter(m -> !m.isAddToDictionary() && !m.isAddToDossierDictionary() && !m.isRectangle()) .collect(Collectors.toList()), ManualRedactionEntry.class, new ManualRedactionMapper()); @@ -181,6 +180,100 @@ public class ManualRedactionService { } + private CommentEntity addComment(String fileId, String annotationId, String comment, String user) { + + return commentPersistenceService.insert(CommentEntity.builder() + .text(comment) + .fileId(fileId) + .annotationId(annotationId) + .user(user) + .date(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS)) + .build()); + } + + + private boolean handleAddToDictionary(String fileId, + String annotationId, + String typeId, + String value, + AnnotationStatus status, + boolean addToDictionary, + boolean addToDossierDictionary, + boolean revert, + String dossierId, + DictionaryEntryType dictionaryEntryType) { + + if (status == AnnotationStatus.APPROVED) { + addRedactionPersistenceService.updateStatus(fileId, annotationId, status, addToDictionary, addToDossierDictionary); + + if (addToDictionary || addToDossierDictionary) { + if (revert) { + removeFromDictionary(typeId, value, dossierId, fileId, dictionaryEntryType); + } else { + addToDictionary(typeId, value, dossierId, fileId, dictionaryEntryType); + } + return true; + } + + } + return false; + } + + + private void reprocess(String dossierId, String fileId) { + + fileStatusService.setStatusReprocessForManual(dossierId, fileId, true); + } + + @Transactional + public ManualRedactionEntryEntity getAddRedaction(String fileId, String annotationId) { + + return addRedactionPersistenceService.findAddRedaction(fileId, annotationId); + } + + + private void addManualRedactionToAnalysisQueue(String dossierId, String fileId, ManualRedactions manualRedactions) { + + fileStatusPersistenceService.updateProcessingStatus(fileId, ProcessingStatus.SURROUNDING_TEXT_PROCESSING); + + var analyseRequest = AnalyzeRequest.builder().messageType(MessageType.SURROUNDING_TEXT).dossierId(dossierId).fileId(fileId) + .manualRedactions(manualRedactions) + .build(); + + try { + rabbitTemplate.convertAndSend(MessagingConfiguration.REDACTION_QUEUE, objectMapper.writeValueAsString(analyseRequest), message -> { + message.getMessageProperties().setPriority(1); + return message; + }); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + + } + + + private void removeFromDictionary(String typeId, String value, String dossierId, String fileId, DictionaryEntryType dictionaryEntryType) { + + try { + log.debug("Deleting entries to {} for {} / {}", typeId, dossierId, fileId); + dictionaryService.deleteEntries(typeId, List.of(value), dictionaryEntryType != null ? dictionaryEntryType : DictionaryEntryType.ENTRY); + } catch (FeignException e) { + throw new BadRequestException(e.getMessage()); + } + } + + + private void addToDictionary(String typeId, String value, String dossierId, String fileId, DictionaryEntryType dictionaryEntryType) { + + try { + log.debug("Adding entry: {} to {} for {} / {}", value, typeId, dossierId, fileId); + dictionaryService.addEntries(typeId, List.of(value), false, false, dictionaryEntryType != null ? dictionaryEntryType : DictionaryEntryType.ENTRY); + } catch (Exception e) { + throw new BadRequestException(e.getMessage()); + } + } + + @Transactional public List addRemoveRedaction(String dossierId, String fileId, List removeRedactionRequests) { RedactionLog redactionLog = null; @@ -198,7 +291,7 @@ public class ManualRedactionService { } else { log.info("add removeRedaction for file {} and annotation {}", fileId, removeRedactionRequest.getAnnotationId()); - var idRemoval = convert(removeRedactionPersistenceService.insert(fileId, removeRedactionRequest), IdRemoval.class); + var idRemoval = MagicConverter.convert(removeRedactionPersistenceService.insert(fileId, removeRedactionRequest), IdRemoval.class); if (redactionLog == null) { redactionLog = fileManagementStorageService.getRedactionLog(dossier.getId(), fileId); @@ -249,6 +342,73 @@ public class ManualRedactionService { } + private boolean manualAddRedactionsContains(ManualRedactions manualRedactions, String annotationId) { + + return manualRedactions.getEntriesToAdd().stream().anyMatch(m -> annotationId.equals(m.getAnnotationId())); + } + + + private boolean handleRemoveFromDictionary(RedactionLog redactionLog, + DossierEntity dossier, + String fileId, + String annotationId, + AnnotationStatus status, + boolean removeFromDictionary, + boolean revert) { + + if (status == AnnotationStatus.APPROVED) { + removeRedactionPersistenceService.updateStatus(fileId, annotationId, status, removeFromDictionary); + if (removeFromDictionary) { + + Optional redactionLogEntryOptional = redactionLog.getRedactionLogEntry() + .stream() + .filter(entry -> entry.getId().equals(annotationId)) + .findFirst(); + + if (redactionLogEntryOptional.isEmpty()) { + throw new NotFoundException("Annotation does not exist in redaction log."); + } + + var redactionLogEntry = redactionLogEntryOptional.get(); + + if (revert) { + addToDictionary(buildTypeId(redactionLogEntry, dossier), redactionLogEntry.getValue(), dossier.getId(), fileId, DictionaryEntryType.ENTRY); + } else { + removeFromDictionary(buildTypeId(redactionLogEntry, dossier), redactionLogEntry.getValue(), dossier.getId(), fileId, DictionaryEntryType.ENTRY); + + // This is needed to remove resizeRedactions with addToDictionary. + removeResizeRedactionsWithAddToDictionary(dossier.getDossierTemplateId(), redactionLogEntry.getValue()); + } + return true; + } + } + return false; + } + + + private String buildTypeId(RedactionLogEntry redactionLogEntry, DossierEntity dossier) { + + if (redactionLogEntry.isDossierDictionaryEntry()) { + return toTypeId(redactionLogEntry.getType(), dossier.getDossierTemplateId(), dossier.getId()); + } else { + return toTypeId(redactionLogEntry.getType(), dossier.getDossierTemplateId()); + } + } + + + private void removeResizeRedactionsWithAddToDictionary(String dossierTemplateId, String redactionLogEntryValue) { + + var resizeRedactionsWithSameValue = resizeRedactionPersistenceService.findByAnnotationStatusAndValue(AnnotationStatus.APPROVED, redactionLogEntryValue); + resizeRedactionsWithSameValue.forEach(resizeRedaction -> { + var file = fileStatusPersistenceService.getStatus(resizeRedaction.getId().getFileId()); + var dossierForResizeRedaction = dossierPersistenceService.findByDossierId(file.getDossierId()); + if (!file.getWorkflowStatus().equals(WorkflowStatus.APPROVED) && dossierTemplateId.equals(dossierForResizeRedaction.getDossierTemplateId())) { + resizeRedactionPersistenceService.hardDelete(resizeRedaction.getId().getFileId(), resizeRedaction.getId().getAnnotationId()); + } + }); + } + + @Transactional public List addForceRedaction(String dossierId, String fileId, List forceRedactionRequests) { var response = new ArrayList(); @@ -276,7 +436,7 @@ public class ManualRedactionService { return response; } - + @Transactional public List addLegalBasisChange(String dossierId, String fileId, List legalBasisChangeRequests) { var response = new ArrayList(); @@ -298,7 +458,7 @@ public class ManualRedactionService { return response; } - + @Transactional public List addImageRecategorization(String dossierId, String fileId, List imageRecategorizationRequests) { var response = new ArrayList(); @@ -341,48 +501,7 @@ public class ManualRedactionService { } - public ManualRedactionEntryEntity getAddRedaction(String fileId, String annotationId) { - - return addRedactionPersistenceService.findAddRedaction(fileId, annotationId); - } - - - public IdRemovalEntity getRemoveRedaction(String fileId, String annotationId) { - - return removeRedactionPersistenceService.findRemoveRedaction(fileId, annotationId); - } - - - public ManualForceRedactionEntity getForceRedaction(String fileId, String annotationId) { - - return forceRedactionPersistenceService.findForceRedaction(fileId, annotationId); - } - - - public ManualLegalBasisChangeEntity getLegalBasisChange(String fileId, String annotationId) { - - return legalBasisChangePersistenceService.findLegalBasisChange(fileId, annotationId); - } - - - public ManualImageRecategorizationEntity getImageRecategorization(String fileId, String annotationId) { - - return recategorizationPersistenceService.findRecategorization(fileId, annotationId); - } - - - public CommentEntity getComment(long commentId) { - - return commentPersistenceService.findComment(commentId); - } - - - public ManualResizeRedactionEntity getResizeRedaction(String fileId, String annotationId) { - - return resizeRedactionPersistenceService.findResizeRedaction(fileId, annotationId); - } - - + @Transactional public void deleteAddRedaction(String dossierId, String fileId, List annotationIds) { var dossier = dossierPersistenceService.getAndValidateDossier(dossierId); @@ -411,6 +530,7 @@ public class ManualRedactionService { } + @Transactional public void deleteRemoveRedaction(String dossierId, String fileId, List annotationIds) { var dossier = dossierPersistenceService.getAndValidateDossier(dossierId); @@ -441,6 +561,13 @@ public class ManualRedactionService { } + private IdRemovalEntity getRemoveRedaction(String fileId, String annotationId) { + + return removeRedactionPersistenceService.findRemoveRedaction(fileId, annotationId); + } + + + @Transactional public void deleteForceRedaction(String dossierId, String fileId, List annotationIds) { var now = OffsetDateTime.now(); @@ -453,6 +580,7 @@ public class ManualRedactionService { } + @Transactional public void deleteLegalBasisChange(String dossierId, String fileId, List annotationIds) { for (var annotationId : annotationIds) { @@ -463,6 +591,7 @@ public class ManualRedactionService { } + @Transactional public void deleteImageRecategorization(String dossierId, String fileId, List annotationIds) { var actionPerformed = false; @@ -481,6 +610,13 @@ public class ManualRedactionService { } + private ManualImageRecategorizationEntity getImageRecategorization(String fileId, String annotationId) { + + return recategorizationPersistenceService.findRecategorization(fileId, annotationId); + } + + + @Transactional public void deleteComment(String fileId, List commentIds) { for (var commentId : commentIds) { @@ -491,6 +627,7 @@ public class ManualRedactionService { } + @Transactional public void deleteResizeRedaction(String dossierId, String fileId, List annotationIds) { OffsetDateTime now = OffsetDateTime.now(); @@ -500,7 +637,7 @@ public class ManualRedactionService { analysisFlagsCalculationService.calculateFlags(dossierId, fileId); } - + @Transactional public List addResizeRedaction(String dossierId, String fileId, List resizeRedactionRequests) { var response = new ArrayList(); @@ -573,7 +710,7 @@ public class ManualRedactionService { } } - + @Transactional @SuppressWarnings("PMD") public void updateRemoveRedactionStatus(String dossierId, String fileId, List annotationIds, AnnotationStatus annotationStatus) { @@ -581,7 +718,7 @@ public class ManualRedactionService { RedactionLog redactionLog = redactionLogService.getRedactionLog(dossierId, fileId, true, true); for (var annotationId : annotationIds) { - var idRemoval = convert(removeRedactionPersistenceService.findRemoveRedaction(fileId, annotationId), IdRemoval.class); + var idRemoval = MagicConverter.convert(removeRedactionPersistenceService.findRemoveRedaction(fileId, annotationId), IdRemoval.class); Optional redactionLogEntryOptional = redactionLog.getRedactionLogEntry() .stream() @@ -620,6 +757,31 @@ public class ManualRedactionService { } + private void approveStatusForRedactionsWithSameValue(DossierEntity dossier, boolean addToDictionary, boolean addToDossierDictionary, String value) { + + List dossiers = new ArrayList<>(); + if (addToDictionary) { + dossiers = dossierTemplatePersistenceService.getDossierTemplate(dossier.getDossierTemplateId()).getDossiers(); + + } + if (addToDossierDictionary) { + dossiers.add(dossier); + } + + Set fileIds = new HashSet<>(); + for (DossierEntity d : dossiers) { + var files = fileStatusService.getDossierStatus(d.getId()); + files.forEach(f -> fileIds.add(f.getId())); + } + + if (!fileIds.isEmpty()) { + log.debug("Approve status for requested redactions with same value '{}' for files {}", value, fileIds); + addRedactionPersistenceService.approveStatusForRequestedRedactionsWithSameValue(fileIds, value); + } + } + + + @Transactional public void updateForceRedactionStatus(String dossierId, String fileId, List annotationIds, AnnotationStatus annotationStatus) { dossierPersistenceService.getAndValidateDossier(dossierId); @@ -659,7 +821,7 @@ public class ManualRedactionService { analysisFlagsCalculationService.calculateFlags(dossierId, fileId); } - + @Transactional public void updateImageRecategorizationStatus(String dossierId, String fileId, List annotationIds, AnnotationStatus annotationStatus) { dossierPersistenceService.getAndValidateDossier(dossierId); @@ -692,6 +854,7 @@ public class ManualRedactionService { } + @Transactional public void updateResizeRedactionStatus(String dossierId, String fileId, List annotationIds, AnnotationStatus annotationStatus) { dossierPersistenceService.getAndValidateDossier(dossierId); @@ -720,6 +883,7 @@ public class ManualRedactionService { @SuppressWarnings("PMD") + @Transactional public void updateAddRedactionStatus(String dossierId, String fileId, List annotationIds, AnnotationStatus annotationStatus) { var dossier = dossierPersistenceService.getAndValidateDossier(dossierId); @@ -791,181 +955,4 @@ public class ManualRedactionService { } } - - private void addManualRedactionToAnalysisQueue(String dossierId, String fileId, ManualRedactions manualRedactions) { - - fileStatusPersistenceService.updateProcessingStatus(fileId, ProcessingStatus.SURROUNDING_TEXT_PROCESSING); - - var analyseRequest = AnalyzeRequest.builder().messageType(MessageType.SURROUNDING_TEXT).dossierId(dossierId).fileId(fileId).manualRedactions(manualRedactions).build(); - - try { - rabbitTemplate.convertAndSend(MessagingConfiguration.REDACTION_QUEUE, objectMapper.writeValueAsString(analyseRequest), message -> { - message.getMessageProperties().setPriority(1); - return message; - }); - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } - - } - - - private void approveStatusForRedactionsWithSameValue(DossierEntity dossier, boolean addToDictionary, boolean addToDossierDictionary, String value) { - - List dossiers = new ArrayList<>(); - if (addToDictionary) { - dossiers = dossierTemplatePersistenceService.getDossierTemplate(dossier.getDossierTemplateId()).getDossiers(); - - } - if (addToDossierDictionary) { - dossiers.add(dossier); - } - - Set fileIds = new HashSet<>(); - for (DossierEntity d : dossiers) { - var files = fileStatusService.getDossierStatus(d.getId()); - files.forEach(f -> fileIds.add(f.getId())); - } - - if (!fileIds.isEmpty()) { - log.debug("Approve status for requested redactions with same value '{}' for files {}", value, fileIds); - addRedactionPersistenceService.approveStatusForRequestedRedactionsWithSameValue(fileIds, value); - } - } - - - private void reprocess(String dossierId, String fileId) { - - fileStatusService.setStatusReprocessForManual(dossierId, fileId, true); - } - - - private boolean handleRemoveFromDictionary(RedactionLog redactionLog, - DossierEntity dossier, - String fileId, - String annotationId, - AnnotationStatus status, - boolean removeFromDictionary, - boolean revert) { - - if (status == AnnotationStatus.APPROVED) { - removeRedactionPersistenceService.updateStatus(fileId, annotationId, status, removeFromDictionary); - if (removeFromDictionary) { - - Optional redactionLogEntryOptional = redactionLog.getRedactionLogEntry() - .stream() - .filter(entry -> entry.getId().equals(annotationId)) - .findFirst(); - - if (redactionLogEntryOptional.isEmpty()) { - throw new NotFoundException("Annotation does not exist in redaction log."); - } - - var redactionLogEntry = redactionLogEntryOptional.get(); - - if (revert) { - addToDictionary(buildTypeId(redactionLogEntry, dossier), redactionLogEntry.getValue(), dossier.getId(), fileId, DictionaryEntryType.ENTRY); - } else { - removeFromDictionary(buildTypeId(redactionLogEntry, dossier), redactionLogEntry.getValue(), dossier.getId(), fileId, DictionaryEntryType.ENTRY); - - // This is needed to remove resizeRedactions with addToDictionary. - removeResizeRedactionsWithAddToDictionary(dossier.getDossierTemplateId(), redactionLogEntry.getValue()); - } - return true; - } - } - return false; - } - - - private void removeResizeRedactionsWithAddToDictionary(String dossierTemplateId, String redactionLogEntryValue) { - - var resizeRedactionsWithSameValue = resizeRedactionPersistenceService.findByAnnotationStatusAndValue(AnnotationStatus.APPROVED, redactionLogEntryValue); - resizeRedactionsWithSameValue.forEach(resizeRedaction -> { - var file = fileStatusPersistenceService.getStatus(resizeRedaction.getId().getFileId()); - var dossierForResizeRedaction = dossierPersistenceService.findByDossierId(file.getDossierId()); - if (!file.getWorkflowStatus().equals(WorkflowStatus.APPROVED) && dossierTemplateId.equals(dossierForResizeRedaction.getDossierTemplateId())) { - resizeRedactionPersistenceService.hardDelete(resizeRedaction.getId().getFileId(), resizeRedaction.getId().getAnnotationId()); - } - }); - } - - - private void addToDictionary(String typeId, String value, String dossierId, String fileId, DictionaryEntryType dictionaryEntryType) { - - try { - log.debug("Adding entry: {} to {} for {} / {}", value, typeId, dossierId, fileId); - dictionaryController.addEntries(typeId, List.of(value), false, false, dictionaryEntryType != null ? dictionaryEntryType : DictionaryEntryType.ENTRY); - } catch (Exception e) { - throw new BadRequestException(e.getMessage()); - } - } - - - private void removeFromDictionary(String typeId, String value, String dossierId, String fileId, DictionaryEntryType dictionaryEntryType) { - - try { - log.debug("Deleting entries to {} for {} / {}", typeId, dossierId, fileId); - dictionaryController.deleteEntries(typeId, List.of(value), dictionaryEntryType != null ? dictionaryEntryType : DictionaryEntryType.ENTRY); - } catch (FeignException e) { - throw new BadRequestException(e.getMessage()); - } - } - - - private CommentEntity addComment(String fileId, String annotationId, String comment, String user) { - - return commentPersistenceService.insert(CommentEntity.builder() - .text(comment) - .fileId(fileId) - .annotationId(annotationId) - .user(user) - .date(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS)) - .build()); - } - - - private boolean handleAddToDictionary(String fileId, - String annotationId, - String typeId, - String value, - AnnotationStatus status, - boolean addToDictionary, - boolean addToDossierDictionary, - boolean revert, - String dossierId, - DictionaryEntryType dictionaryEntryType) { - - if (status == AnnotationStatus.APPROVED) { - addRedactionPersistenceService.updateStatus(fileId, annotationId, status, addToDictionary, addToDossierDictionary); - - if (addToDictionary || addToDossierDictionary) { - if (revert) { - removeFromDictionary(typeId, value, dossierId, fileId, dictionaryEntryType); - } else { - addToDictionary(typeId, value, dossierId, fileId, dictionaryEntryType); - } - return true; - } - - } - return false; - } - - - private String buildTypeId(RedactionLogEntry redactionLogEntry, DossierEntity dossier) { - - if (redactionLogEntry.isDossierDictionaryEntry()) { - return toTypeId(redactionLogEntry.getType(), dossier.getDossierTemplateId(), dossier.getId()); - } else { - return toTypeId(redactionLogEntry.getType(), dossier.getDossierTemplateId()); - } - } - - - private boolean manualAddRedactionsContains(ManualRedactions manualRedactions, String annotationId) { - - return manualRedactions.getEntriesToAdd().stream().anyMatch(m -> annotationId.equals(m.getAnnotationId())); - } - } diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/NerMessageReceiver.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/NerMessageReceiver.java similarity index 91% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/NerMessageReceiver.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/NerMessageReceiver.java index f2581694d..3715e9637 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/NerMessageReceiver.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/NerMessageReceiver.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.service; +package com.iqser.red.service.persistence.management.v1.processor.service; import java.io.IOException; import java.util.HashMap; @@ -9,7 +9,7 @@ import org.springframework.stereotype.Service; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; -import com.iqser.red.service.peristence.v1.server.configuration.MessagingConfiguration; +import com.iqser.red.service.persistence.management.v1.processor.configuration.MessagingConfiguration; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/OCRProcessingMessageReceiver.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/OCRProcessingMessageReceiver.java similarity index 88% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/OCRProcessingMessageReceiver.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/OCRProcessingMessageReceiver.java index 34961d76e..c231b05cd 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/OCRProcessingMessageReceiver.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/OCRProcessingMessageReceiver.java @@ -1,11 +1,11 @@ -package com.iqser.red.service.peristence.v1.server.service; +package com.iqser.red.service.persistence.management.v1.processor.service; import org.springframework.amqp.core.Message; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Service; import com.fasterxml.jackson.databind.ObjectMapper; -import com.iqser.red.service.peristence.v1.server.configuration.MessagingConfiguration; +import com.iqser.red.service.persistence.management.v1.processor.configuration.MessagingConfiguration; import com.iqser.red.service.persistence.management.v1.processor.model.OCRStatusUpdateResponse; import lombok.RequiredArgsConstructor; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/ReanalysisRequiredStatusService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ReanalysisRequiredStatusService.java similarity index 92% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/ReanalysisRequiredStatusService.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ReanalysisRequiredStatusService.java index 8ecd8c7bc..c5a75b918 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/ReanalysisRequiredStatusService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ReanalysisRequiredStatusService.java @@ -1,8 +1,8 @@ -package com.iqser.red.service.peristence.v1.server.service; +package com.iqser.red.service.persistence.management.v1.processor.service; -import static com.iqser.red.service.peristence.v1.server.service.ReanalysisRequiredStatusService.VersionType.DICTIONARY; -import static com.iqser.red.service.peristence.v1.server.service.ReanalysisRequiredStatusService.VersionType.LEGAL_BASIS; -import static com.iqser.red.service.peristence.v1.server.service.ReanalysisRequiredStatusService.VersionType.RULES; +import static com.iqser.red.service.persistence.management.v1.processor.service.ReanalysisRequiredStatusService.VersionType.DICTIONARY; +import static com.iqser.red.service.persistence.management.v1.processor.service.ReanalysisRequiredStatusService.VersionType.LEGAL_BASIS; +import static com.iqser.red.service.persistence.management.v1.processor.service.ReanalysisRequiredStatusService.VersionType.RULES; import java.util.Collections; import java.util.HashMap; @@ -17,8 +17,8 @@ import com.iqser.red.service.persistence.management.v1.processor.service.persist import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.LegalBasisMappingPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.RulesPersistenceService; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileModel; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.ProcessingStatus; import lombok.AllArgsConstructor; import lombok.Data; @@ -42,18 +42,6 @@ public class ReanalysisRequiredStatusService { } - public FileModel enhanceFileStatusWithAnalysisRequirements(FileModel fileModel, boolean ignoreProcessingStates) { - - return enhanceFileStatusWithAnalysisRequirements(Collections.singletonList(fileModel), ignoreProcessingStates).iterator().next(); - } - - - public List enhanceFileStatusWithAnalysisRequirements(List fileModels) { - - return enhanceFileStatusWithAnalysisRequirements(fileModels, false); - } - - public List enhanceFileStatusWithAnalysisRequirements(List fileModels, boolean ignoreProcessingStates) { Map> dossierTemplateVersionMap = new HashMap<>(); @@ -155,12 +143,6 @@ public class ReanalysisRequiredStatusService { } - private Long getDossierVersionData(String dossierId) { - - return dictionaryPersistenceService.getVersionForDossier(dossierId); - } - - private Map buildVersionData(String dossierTemplateId) { var versions = new HashMap(); @@ -173,6 +155,24 @@ public class ReanalysisRequiredStatusService { } + private Long getDossierVersionData(String dossierId) { + + return dictionaryPersistenceService.getVersionForDossier(dossierId); + } + + + public FileModel enhanceFileStatusWithAnalysisRequirements(FileModel fileModel, boolean ignoreProcessingStates) { + + return enhanceFileStatusWithAnalysisRequirements(Collections.singletonList(fileModel), ignoreProcessingStates).iterator().next(); + } + + + public List enhanceFileStatusWithAnalysisRequirements(List fileModels) { + + return enhanceFileStatusWithAnalysisRequirements(fileModels, false); + } + + public enum VersionType { RULES, DICTIONARY, diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ReanalysisController.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ReanalysisService.java similarity index 73% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ReanalysisController.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ReanalysisService.java index 0f4daaace..98ac5cd1d 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ReanalysisController.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ReanalysisService.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.controller; +package com.iqser.red.service.persistence.management.v1.processor.service; import java.time.OffsetDateTime; import java.time.temporal.ChronoUnit; @@ -8,164 +8,47 @@ import java.util.List; import java.util.Set; import java.util.stream.Collectors; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.stereotype.Service; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.collect.Sets; import com.iqser.red.service.pdftron.redaction.v1.api.model.ByteContentDocument; import com.iqser.red.service.pdftron.redaction.v1.api.model.highlights.TextHighlightConversionOperation; import com.iqser.red.service.pdftron.redaction.v1.api.model.highlights.TextHighlightConversionRequest; -import com.iqser.red.service.peristence.v1.server.service.FileManagementStorageService; -import com.iqser.red.service.peristence.v1.server.service.FileStatusService; -import com.iqser.red.service.peristence.v1.server.service.IndexingService; -import com.iqser.red.service.persistence.management.v1.processor.client.PDFTronRedactionClient; +import com.iqser.red.service.persistence.management.v1.processor.client.pdftronredactionservice.PDFTronClient; import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; import com.iqser.red.service.persistence.management.v1.processor.exception.ConflictException; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierPersistenceService; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.DeleteImportedRedactionsRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileModel; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileType; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus; -import com.iqser.red.service.persistence.service.v1.api.resources.ReanalysisResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.DeleteImportedRedactionsRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.ProcessingStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @Slf4j -@RestController +@Service @RequiredArgsConstructor -public class ReanalysisController implements ReanalysisResource { +public class ReanalysisService { private final FileStatusService fileStatusService; private final DossierPersistenceService dossierPersistenceService; private final IndexingService indexingService; - private final PDFTronRedactionClient pDFTronRedactionClient; + private final PDFTronClient pDFTronRedactionClient; private final FileManagementStorageService fileManagementStorageService; private final ObjectMapper objectMapper; - @Override - public void reanalyzeDossier(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @RequestParam(value = "force", required = false, defaultValue = FALSE) boolean force) { + public void reanalyzeDossier(String dossierId, boolean force) { var relevantFiles = getAllFilesForDossier(dossierId, true); reanalyseFiles(dossierId, force, relevantFiles); } - @Override - public void reanalyzeFiles(@PathVariable(DOSSIER_ID_PARAM) String dossierId, - @RequestBody Set fileIds, - @RequestParam(value = "force", required = false, defaultValue = FALSE) boolean force) { - - var relevantFiles = getRelevantFiles(dossierId, fileIds); - reanalyseFiles(dossierId, force, relevantFiles); - } - - - public void ocrDossier(@PathVariable(DOSSIER_ID_PARAM) String dossierId) { - - var relevantFiles = getAllFilesForDossier(dossierId, true); - - relevantFiles.stream() - .filter(fileStatus -> fileStatus.getOcrStartTime() == null) - .filter(fileStatus -> fileStatus.getProcessingStatus().equals(ProcessingStatus.PROCESSED)) - .forEach(fileStatus -> fileStatusService.setStatusOcrQueued(dossierId, fileStatus.getId())); - } - - - public void ocrFiles(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @RequestBody Set fileIds) { - - var relevantFiles = getRelevantFiles(dossierId, fileIds); - - if (relevantFiles.stream() - .anyMatch(fileStatus -> !fileStatus.getProcessingStatus().equals(ProcessingStatus.PROCESSED) && !fileStatus.getProcessingStatus() - .equals(ProcessingStatus.OCR_PROCESSING_QUEUED) && !fileStatus.getProcessingStatus().equals(ProcessingStatus.OCR_PROCESSING))) { - throw new ConflictException("File is not processed"); - } - - relevantFiles.stream() - .filter(fileStatus -> fileStatus.getOcrStartTime() == null) - .forEach(fileStatus -> fileStatusService.setStatusOcrQueued(dossierId, fileStatus.getId())); - } - - - public void ocrFile(@PathVariable(DOSSIER_ID_PARAM) String dossierId, - @PathVariable(FILE_ID_PARAM) String fileId, - @RequestParam(value = "force", required = false, defaultValue = FALSE) boolean force) { - - dossierPersistenceService.getAndValidateDossier(dossierId); - FileModel dossierFile = fileStatusService.getStatus(fileId); - - if (!dossierFile.getProcessingStatus().equals(ProcessingStatus.PROCESSED) && !dossierFile.getProcessingStatus() - .equals(ProcessingStatus.OCR_PROCESSING_QUEUED) && !dossierFile.getProcessingStatus().equals(ProcessingStatus.OCR_PROCESSING)) { - throw new ConflictException("File is not processed"); - } - - if (force) { - fileStatusService.setStatusOcrQueued(dossierId, fileId); - } else { - if (dossierFile.isSoftOrHardDeleted() || dossierFile.getWorkflowStatus().equals(WorkflowStatus.APPROVED)) { - throw new ConflictException("Cannot analyse a deleted/approved file"); - } - if (dossierFile.getOcrStartTime() != null) { - throw new ConflictException("File already has been OCR processed"); - } - - ocrFiles(dossierId, Sets.newHashSet(fileId)); - } - } - - - public void importRedactions(@RequestBody ByteContentDocument documentRequest) { - - try { - pDFTronRedactionClient.importRedactions(documentRequest); - } catch (Exception e) { - throw new BadRequestException("File Not Valid PDF or number of pages do not match"); - } - fileStatusService.setStatusFullReprocess(documentRequest.getDossierId(), documentRequest.getFileId(), true, false); - } - - - @SneakyThrows - public void deleteImportedRedactions(@RequestBody DeleteImportedRedactionsRequest deleteImportedRedactionsRequest) { - - var importedRedactions = fileManagementStorageService.getImportedRedactions(deleteImportedRedactionsRequest.getDossierId(), deleteImportedRedactionsRequest.getFileId()); - importedRedactions.getImportedRedactions().forEach((key, value) -> value.removeIf(v -> deleteImportedRedactionsRequest.getAnnotationIds().contains(v.getId()))); - fileManagementStorageService.storeJSONObject(deleteImportedRedactionsRequest.getDossierId(), - deleteImportedRedactionsRequest.getFileId(), - FileType.IMPORTED_REDACTIONS, - importedRedactions); - fileStatusService.setStatusFullReprocess(deleteImportedRedactionsRequest.getDossierId(), deleteImportedRedactionsRequest.getFileId(), true, false); - } - - - public void reindex(@RequestParam(value = DOSSIER_ID_PARAM, required = false) String dossierId, - @RequestParam(value = "dropIndex", required = false, defaultValue = FALSE) boolean dropIndex, - @RequestBody Set fileIds) { - - indexingService.reindex(dossierId, fileIds, dropIndex); - } - - - public void convertTextHighlights(@RequestBody TextHighlightConversionRequest textHighlightRequest) { - - boolean hasTextHighlights = pDFTronRedactionClient.convertTextHighlights(textHighlightRequest); - - fileStatusService.updateHasHighlights(textHighlightRequest.getFileId(), hasTextHighlights); - fileStatusService.updateFileModificationDate(textHighlightRequest.getFileId(), OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS)); - - if (textHighlightRequest.getOperation().equals(TextHighlightConversionOperation.CONVERT)) { - fileStatusService.setStatusFullReprocess(textHighlightRequest.getDossierId(), textHighlightRequest.getFileId(), true, false); - } - } - - private List getAllFilesForDossier(String dossierId, boolean filterOnlyValidFiles) { var dossier = dossierPersistenceService.getAndValidateDossier(dossierId); @@ -183,6 +66,28 @@ public class ReanalysisController implements ReanalysisResource { } + private void reanalyseFiles(String dossierId, boolean force, List filesToReanalyse) { + + if (force) { + filesToReanalyse.forEach(file -> { + fileStatusService.setStatusReprocess(dossierId, file.getId(), filesToReanalyse.size() == 1, true); + }); + } else { + filesToReanalyse.stream() + .filter(FileModel::isReanalysisRequired) + .forEach(file -> fileStatusService.setStatusReprocess(dossierId, file.getId(), filesToReanalyse.size() == 1, true)); + } + + } + + + public void reanalyzeFiles(String dossierId, Set fileIds, boolean force) { + + var relevantFiles = getRelevantFiles(dossierId, fileIds); + reanalyseFiles(dossierId, force, relevantFiles); + } + + private List getRelevantFiles(String dossierId, Collection fileIds) { var dossierFiles = getAllFilesForDossier(dossierId, false); @@ -209,18 +114,98 @@ public class ReanalysisController implements ReanalysisResource { } - private void reanalyseFiles(String dossierId, boolean force, List filesToReanalyse) { + public void ocrDossier(String dossierId) { - if (force) { - filesToReanalyse.forEach(file -> { - fileStatusService.setStatusReprocess(dossierId, file.getId(), filesToReanalyse.size() == 1, true); - }); - } else { - filesToReanalyse.stream() - .filter(FileModel::isReanalysisRequired) - .forEach(file -> fileStatusService.setStatusReprocess(dossierId, file.getId(), filesToReanalyse.size() == 1, true)); + var relevantFiles = getAllFilesForDossier(dossierId, true); + + relevantFiles.stream() + .filter(fileStatus -> fileStatus.getOcrStartTime() == null) + .filter(fileStatus -> fileStatus.getProcessingStatus().equals(ProcessingStatus.PROCESSED)) + .forEach(fileStatus -> fileStatusService.setStatusOcrQueued(dossierId, fileStatus.getId())); + } + + + public void ocrFile(String dossierId, String fileId, boolean force) { + + dossierPersistenceService.getAndValidateDossier(dossierId); + FileModel dossierFile = fileStatusService.getStatus(fileId); + + if (!dossierFile.getProcessingStatus().equals(ProcessingStatus.PROCESSED) && !dossierFile.getProcessingStatus() + .equals(ProcessingStatus.OCR_PROCESSING_QUEUED) && !dossierFile.getProcessingStatus().equals(ProcessingStatus.OCR_PROCESSING)) { + throw new ConflictException("File is not processed"); } + if (force) { + fileStatusService.setStatusOcrQueued(dossierId, fileId); + } else { + if (dossierFile.isSoftOrHardDeleted() || dossierFile.getWorkflowStatus().equals(WorkflowStatus.APPROVED)) { + throw new ConflictException("Cannot analyse a deleted/approved file"); + } + if (dossierFile.getOcrStartTime() != null) { + throw new ConflictException("File already has been OCR processed"); + } + + ocrFiles(dossierId, Sets.newHashSet(fileId)); + } + } + + + public void ocrFiles(String dossierId, Set fileIds) { + + var relevantFiles = getRelevantFiles(dossierId, fileIds); + + if (relevantFiles.stream() + .anyMatch(fileStatus -> !fileStatus.getProcessingStatus().equals(ProcessingStatus.PROCESSED) && !fileStatus.getProcessingStatus() + .equals(ProcessingStatus.OCR_PROCESSING_QUEUED) && !fileStatus.getProcessingStatus().equals(ProcessingStatus.OCR_PROCESSING))) { + throw new ConflictException("File is not processed"); + } + + relevantFiles.stream() + .filter(fileStatus -> fileStatus.getOcrStartTime() == null) + .forEach(fileStatus -> fileStatusService.setStatusOcrQueued(dossierId, fileStatus.getId())); + } + + + public void importRedactions(ByteContentDocument documentRequest) { + + try { + pDFTronRedactionClient.importRedactions(documentRequest); + } catch (Exception e) { + throw new BadRequestException("File Not Valid PDF or number of pages do not match"); + } + fileStatusService.setStatusFullReprocess(documentRequest.getDossierId(), documentRequest.getFileId(), true, false); + } + + + @SneakyThrows + public void deleteImportedRedactions(DeleteImportedRedactionsRequest deleteImportedRedactionsRequest) { + + var importedRedactions = fileManagementStorageService.getImportedRedactions(deleteImportedRedactionsRequest.getDossierId(), deleteImportedRedactionsRequest.getFileId()); + importedRedactions.getImportedRedactions().forEach((key, value) -> value.removeIf(v -> deleteImportedRedactionsRequest.getAnnotationIds().contains(v.getId()))); + fileManagementStorageService.storeJSONObject(deleteImportedRedactionsRequest.getDossierId(), + deleteImportedRedactionsRequest.getFileId(), + FileType.IMPORTED_REDACTIONS, + importedRedactions); + fileStatusService.setStatusFullReprocess(deleteImportedRedactionsRequest.getDossierId(), deleteImportedRedactionsRequest.getFileId(), true, false); + } + + + public void reindex(String dossierId, boolean dropIndex, Set fileIds) { + + indexingService.reindex(dossierId, fileIds, dropIndex); + } + + + public void convertTextHighlights(TextHighlightConversionRequest textHighlightRequest) { + + boolean hasTextHighlights = pDFTronRedactionClient.convertTextHighlights(textHighlightRequest); + + fileStatusService.updateHasHighlights(textHighlightRequest.getFileId(), hasTextHighlights); + fileStatusService.updateFileModificationDate(textHighlightRequest.getFileId(), OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS)); + + if (textHighlightRequest.getOperation().equals(TextHighlightConversionOperation.CONVERT)) { + fileStatusService.setStatusFullReprocess(textHighlightRequest.getDossierId(), textHighlightRequest.getFileId(), true, false); + } } } diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/RedactionLogService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/RedactionLogService.java similarity index 74% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/RedactionLogService.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/RedactionLogService.java index cdc9c5063..0f914ba5c 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/RedactionLogService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/RedactionLogService.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.service; +package com.iqser.red.service.persistence.management.v1.processor.service; import java.time.OffsetDateTime; import java.util.ArrayList; @@ -8,15 +8,18 @@ import java.util.List; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; -import com.iqser.red.service.peristence.v1.server.client.RedactionClient; -import com.iqser.red.service.peristence.v1.server.controller.DictionaryController; import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DictionaryPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierPersistenceService; -import com.iqser.red.service.persistence.service.v1.api.model.redactionlog.FilteredRedactionLogRequest; -import com.iqser.red.service.redaction.v1.model.RedactionLog; -import com.iqser.red.service.redaction.v1.model.RedactionLogEntry; -import com.iqser.red.service.redaction.v1.model.RedactionRequest; -import com.iqser.red.service.redaction.v1.model.SectionGrid; +import com.iqser.red.service.persistence.management.v1.processor.service.redactionlog.RedactionLogMergeService; +import com.iqser.red.service.persistence.management.v1.processor.service.redactionlog.RedactionRequest; +import com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.Colors; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.Type; +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.FilteredRedactionLogRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLog; +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLogEntry; +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.section.SectionGrid; import feign.FeignException; import lombok.RequiredArgsConstructor; @@ -27,10 +30,11 @@ public class RedactionLogService { private final FileManagementStorageService fileManagementStorageService; private final ManualRedactionProviderService manualRedactionService; - private final RedactionClient redactionClient; private final DossierPersistenceService dossierPersistenceService; private final FileStatusService fileStatusService; - private final DictionaryController dictionaryController; + private final ColorsService colorsService; + private final DictionaryPersistenceService dictionaryPersistenceService; + private final RedactionLogMergeService redactionLogMergeService; public RedactionLog getRedactionLog(String dossierId, String fileId, boolean withManualRedactions, boolean includeFalsePositives) { @@ -48,13 +52,13 @@ public class RedactionLogService { if (withManualRedactions) { var dossier = dossierPersistenceService.findByDossierId(dossierId); var manualRedactions = manualRedactionService.getManualRedactions(fileId); - var colors = dictionaryController.getColors(dossier.getDossierTemplateId()); - var types = dictionaryController.getAllTypesForDossierTemplate(dossier.getDossierTemplateId(), true); - var dossierTypes = dictionaryController.getAllTypesForDossier(dossierId, true); + var colors = MagicConverter.convert(colorsService.getColors(dossier.getDossierTemplateId()), Colors.class); + var types = MagicConverter.convert(dictionaryPersistenceService.getAllTypesForDossierTemplate(dossier.getDossierTemplateId(), true), Type.class); + var dossierTypes = MagicConverter.convert(dictionaryPersistenceService.getAllTypesForDossier(dossierId, true), Type.class); types.addAll(dossierTypes); try { - redactionLog = redactionClient.getRedactionLog(RedactionRequest.builder() + redactionLog = redactionLogMergeService.provideRedactionLog(RedactionRequest.builder() .dossierId(dossierId) .fileId(fileId) .manualRedactions(manualRedactions) diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/ReportTemplateService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ReportTemplateService.java similarity index 86% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/ReportTemplateService.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ReportTemplateService.java index e168f9834..35b2a3dc7 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/ReportTemplateService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ReportTemplateService.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.service; +package com.iqser.red.service.persistence.management.v1.processor.service; import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; @@ -8,12 +8,12 @@ import java.util.UUID; import org.springframework.stereotype.Service; -import com.iqser.red.service.peristence.v1.server.utils.StorageIdUtils; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.ReportTemplateEntity; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.ReportTemplatePersistenceService; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.ReportTemplate; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.ReportTemplateUpdateRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.ReportTemplateUploadRequest; +import com.iqser.red.service.persistence.management.v1.processor.utils.StorageIdUtils; +import com.iqser.red.service.persistence.service.v1.api.shared.model.ReportTemplateUpdateRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.ReportTemplate; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.ReportTemplateUploadRequest; import com.iqser.red.storage.commons.service.StorageService; import lombok.RequiredArgsConstructor; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/StopwordService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/StopwordService.java similarity index 77% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/StopwordService.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/StopwordService.java index af6c7606b..287d313e0 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/StopwordService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/StopwordService.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.service; +package com.iqser.red.service.persistence.management.v1.processor.service; import java.util.HashSet; import java.util.Locale; @@ -8,7 +8,7 @@ import javax.annotation.PostConstruct; import org.springframework.stereotype.Service; -import com.iqser.red.service.peristence.v1.server.utils.ResourceLoader; +import com.iqser.red.service.persistence.management.v1.processor.utils.ResourceLoader; import lombok.RequiredArgsConstructor; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/TenantManagementService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/TenantManagementService.java similarity index 94% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/TenantManagementService.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/TenantManagementService.java index b718bf956..2f01ef3d4 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/TenantManagementService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/TenantManagementService.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.service; +package com.iqser.red.service.persistence.management.v1.processor.service; import java.net.URI; import java.net.URISyntaxException; @@ -19,23 +19,22 @@ import org.springframework.core.io.ResourceLoader; import org.springframework.jdbc.datasource.SingleConnectionDataSource; import org.springframework.stereotype.Service; -import com.iqser.red.service.peristence.v1.server.migration.AsyncMigrationStarterService; import com.iqser.red.service.persistence.management.v1.processor.exception.ConflictException; import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; +import com.iqser.red.service.persistence.management.v1.processor.migration.AsyncMigrationStarterService; import com.iqser.red.service.persistence.management.v1.processor.multitenancy.entity.AzureStorageConnectionEntity; import com.iqser.red.service.persistence.management.v1.processor.multitenancy.entity.DatabaseConnectionEntity; import com.iqser.red.service.persistence.management.v1.processor.multitenancy.entity.S3StorageConnectionEntity; import com.iqser.red.service.persistence.management.v1.processor.multitenancy.entity.SearchConnectionEntity; import com.iqser.red.service.persistence.management.v1.processor.multitenancy.entity.TenantEntity; -import com.iqser.red.service.persistence.management.v1.processor.service.EncryptionDecryptionService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.mulitenancy.repository.TenantRepository; import com.iqser.red.service.persistence.management.v1.processor.utils.jdbc.JDBCUtils; -import com.iqser.red.service.persistence.service.v1.api.model.multitenancy.AzureStorageConnection; -import com.iqser.red.service.persistence.service.v1.api.model.multitenancy.DatabaseConnection; -import com.iqser.red.service.persistence.service.v1.api.model.multitenancy.S3StorageConnection; -import com.iqser.red.service.persistence.service.v1.api.model.multitenancy.SearchConnection; -import com.iqser.red.service.persistence.service.v1.api.model.multitenancy.TenantRequest; -import com.iqser.red.service.persistence.service.v1.api.model.multitenancy.TenantResponse; +import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.AzureStorageConnection; +import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.DatabaseConnection; +import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.S3StorageConnection; +import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.SearchConnection; +import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.TenantRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.TenantResponse; import liquibase.exception.LiquibaseException; import liquibase.integration.spring.SpringLiquibase; @@ -150,6 +149,32 @@ public class TenantManagementService { } + @SneakyThrows + private void validateJdbcUrl(String jdbcUrl) { + + try { + // just create a URI object to check if the string is a valid URI + var uri = new URI(jdbcUrl); + var subUri = new URI(uri.getSchemeSpecificPart()); + + if (uri.getScheme() == null || subUri.getScheme() == null || !uri.getScheme().equals("jdbc") || !SUPPORTED_DATABASES.contains(subUri.getScheme())) { + throw new IllegalArgumentException("Your jdbcUrl is not valid."); + } + } catch (URISyntaxException e) { + throw new IllegalArgumentException("Your jdbcUrl is not valid.", e); + } + + } + + + + private void runLiquibase(DataSource dataSource) throws LiquibaseException { + + SpringLiquibase liquibase = getSpringLiquibase(dataSource); + liquibase.afterPropertiesSet(); + } + + private void handleClientException(PSQLException e) { if (e.getSQLState().equals("28000") || e.getSQLState().equals("28P01")) { @@ -169,36 +194,23 @@ public class TenantManagementService { } + protected SpringLiquibase getSpringLiquibase(DataSource dataSource) { + + SpringLiquibase liquibase = new SpringLiquibase(); + liquibase.setResourceLoader(resourceLoader); + liquibase.setDataSource(dataSource); + liquibase.setChangeLog(liquibaseProperties.getChangeLog()); + liquibase.setContexts(liquibaseProperties.getContexts()); + return liquibase; + } + + public List getTenants() { return tenantRepository.findAll().stream().map(this::convert).collect(Collectors.toList()); } - public TenantResponse getTenant(String tenantId) { - - return tenantRepository.findById(tenantId).map(this::convert).orElseThrow(() -> new NotFoundException("Tenant does not exist")); - } - - - @SneakyThrows - private void validateJdbcUrl(String jdbcUrl) { - - try { - // just create a URI object to check if the string is a valid URI - var uri = new URI(jdbcUrl); - var subUri = new URI(uri.getSchemeSpecificPart()); - - if (uri.getScheme() == null || subUri.getScheme() == null || !uri.getScheme().equals("jdbc") || !SUPPORTED_DATABASES.contains(subUri.getScheme())) { - throw new IllegalArgumentException("Your jdbcUrl is not valid."); - } - } catch (URISyntaxException e) { - throw new IllegalArgumentException("Your jdbcUrl is not valid.", e); - } - - } - - private TenantResponse convert(TenantEntity entity) { var tenantResponse = TenantResponse.builder() @@ -248,21 +260,9 @@ public class TenantManagementService { } - private void runLiquibase(DataSource dataSource) throws LiquibaseException { + public TenantResponse getTenant(String tenantId) { - SpringLiquibase liquibase = getSpringLiquibase(dataSource); - liquibase.afterPropertiesSet(); + return tenantRepository.findById(tenantId).map(this::convert).orElseThrow(() -> new NotFoundException("Tenant does not exist")); } - - protected SpringLiquibase getSpringLiquibase(DataSource dataSource) { - - SpringLiquibase liquibase = new SpringLiquibase(); - liquibase.setResourceLoader(resourceLoader); - liquibase.setDataSource(dataSource); - liquibase.setChangeLog(liquibaseProperties.getChangeLog()); - liquibase.setContexts(liquibaseProperties.getContexts()); - return liquibase; - } - -} \ No newline at end of file +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/UploadService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/UploadService.java new file mode 100644 index 000000000..15339e860 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/UploadService.java @@ -0,0 +1,99 @@ +package com.iqser.red.service.persistence.management.v1.processor.service; + +import static com.iqser.red.keycloak.commons.roles.ActionRoles.UPLOAD_FILE; +import static com.iqser.red.keycloak.commons.roles.ActionRoles.WRITE_FILE_ATTRIBUTES; + +import java.io.ByteArrayInputStream; +import java.nio.charset.StandardCharsets; +import java.util.Collections; +import java.util.Map; + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.stereotype.Service; + +import com.google.common.collect.Lists; +import com.google.common.hash.HashFunction; +import com.google.common.hash.Hashing; +import com.iqser.red.keycloak.commons.KeycloakSecurity; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.utils.StorageIdUtils; +import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; +import com.iqser.red.service.persistence.service.v1.api.shared.model.FileUploadResult; +import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.ImportCsvRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.ImportCsvResponse; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.AddFileRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; +import com.iqser.red.storage.commons.service.StorageService; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Service +@RequiredArgsConstructor +public class UploadService { + + private final HashFunction hashFunction = Hashing.murmur3_128(); + private final FileService fileService; + private final DossierManagementService dossierManagementService; + private final AuditPersistenceService auditPersistenceService; + private final FileAttributesManagementService fileAttributesManagementService; + private final StorageService storageService; + + + @PreAuthorize("hasAuthority('" + WRITE_FILE_ATTRIBUTES + "')") + public FileUploadResult importCsv(String dossierId, byte[] fileContent) { + + ImportCsvResponse response = fileAttributesManagementService.importCsv(dossierId, new ImportCsvRequest(fileContent)); + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(dossierId) + .category(AuditCategory.DOSSIER.name()) + .message("File attributes csv processed.") + .build()); + + return FileUploadResult.builder() + .processedAttributes(Lists.newArrayList(response.getAffectedFileIds())) + .processedFileIds(Lists.newArrayList(response.getAffectedFileIds())) + .build(); + } + + + @PreAuthorize("hasAuthority('" + UPLOAD_FILE + "')") + public FileUploadResult processSingleFile(String dossierId, String fileName, byte[] fileContent, boolean keepManualRedactions) { + + dossierManagementService.getDossierById(dossierId, false, false); + + var fileId = generateFileId(fileName, dossierId); + var storageId = StorageIdUtils.getStorageId(dossierId, fileId, FileType.UNTOUCHED); + + try { + + storageService.storeObject(storageId, new ByteArrayInputStream(fileContent)); + fileService.upload(new AddFileRequest(fileName, fileId, dossierId, KeycloakSecurity.getUserId()), keepManualRedactions); + + } catch (Exception e) { + storageService.deleteObject(storageId); + throw e; + } + + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(dossierId) + .category(AuditCategory.DOSSIER.name()) + .message("File has been uploaded.") + .details(Map.of("fileId", fileId)) + .build()); + + return FileUploadResult.builder().fileIds(Collections.singletonList(fileId)).build(); + + } + + + private String generateFileId(String fileName, String dossierId) { + + return hashFunction.hashBytes((fileName + dossierId).getBytes(StandardCharsets.UTF_8)).toString(); + } + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/UserService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/UserService.java new file mode 100644 index 000000000..f1e777ac3 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/UserService.java @@ -0,0 +1,567 @@ +package com.iqser.red.service.persistence.management.v1.processor.service; + +import static com.iqser.red.keycloak.commons.UserCacheBuilder.USERS_CACHE; +import static com.iqser.red.keycloak.commons.roles.ApplicationRoles.RED_ADMIN_ROLE; +import static com.iqser.red.keycloak.commons.roles.ApplicationRoles.RED_MANAGER_ROLE; +import static com.iqser.red.keycloak.commons.roles.ApplicationRoles.RED_USER_ADMIN_ROLE; +import static com.iqser.red.keycloak.commons.roles.ApplicationRoles.RED_USER_ROLE; +import static com.iqser.red.keycloak.commons.roles.ApplicationRoles.validateRoles; + +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.TreeSet; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +import javax.validation.constraints.NotNull; +import javax.ws.rs.ClientErrorException; +import javax.ws.rs.NotAuthorizedException; +import javax.ws.rs.NotFoundException; +import javax.ws.rs.core.Response; + +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.validator.routines.EmailValidator; +import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder; +import org.jboss.resteasy.client.jaxrs.internal.ResteasyClientBuilderImpl; +import org.keycloak.OAuth2Constants; +import org.keycloak.admin.client.KeycloakBuilder; +import org.keycloak.admin.client.resource.UserResource; +import org.keycloak.representations.idm.CredentialRepresentation; +import org.keycloak.representations.idm.RoleRepresentation; +import org.keycloak.representations.idm.UserRepresentation; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.stereotype.Service; + +import com.google.common.collect.Lists; +import com.iqser.red.keycloak.commons.KeyCloakSettings; +import com.iqser.red.keycloak.commons.KeycloakSecurity; +import com.iqser.red.keycloak.commons.RealmService; +import com.iqser.red.keycloak.commons.UserListingService; +import com.iqser.red.keycloak.commons.model.User; +import com.iqser.red.keycloak.commons.roles.ApplicationRoles; +import com.iqser.red.service.persistence.management.v1.processor.acl.custom.dossier.DossierACLService; +import com.iqser.red.service.persistence.management.v1.processor.acl.custom.service.CustomPermissionService; +import com.iqser.red.service.persistence.management.v1.processor.exception.AuthenticationFailedException; +import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; +import com.iqser.red.service.persistence.management.v1.processor.exception.ConflictException; +import com.iqser.red.service.persistence.management.v1.processor.exception.NotAllowedException; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.NotificationPersistenceService; +import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; +import com.iqser.red.service.persistence.service.v1.api.shared.model.CreateUserRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.ResetPasswordRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.UpdateMyProfileRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.UpdateProfileRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AddNotificationRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.CreateOrUpdateDossierRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.Dossier; +import com.iqser.red.service.persistence.service.v1.api.shared.model.notification.NotificationType; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Service +@RequiredArgsConstructor +public class UserService { + + private final RealmService realmService; + private final KeyCloakSettings keyCloakSettings; + private final DossierManagementService dossierManagementService; + private final FileStatusManagementService fileStatusManagementService; + private final AuditPersistenceService auditPersistenceService; + private final NotificationPersistenceService notificationPersistenceService; + private final DossierACLService dossierACLService; + private final CustomPermissionService customPermissionService; + private final UserListingService userListingService; + + + @CacheEvict(value = USERS_CACHE, allEntries = true) + public void evictUserCache() { + + } + + + @CacheEvict(value = USERS_CACHE, allEntries = true, beforeInvocation = true) + public User createUser(CreateUserRequest user) { + + if (!realmService.realm().users().search(user.getEmail()).isEmpty()) { + throw new ConflictException("User with this username already exists"); + } + + if (!EmailValidator.getInstance().isValid(user.getEmail())) { + throw new BadRequestException("Email address format is not valid"); + } + + validateRoles(user.getRoles()); + + UserRepresentation userRepresentation = new UserRepresentation(); + userRepresentation.setUsername(user.getEmail()); + userRepresentation.setEmail(user.getEmail()); + userRepresentation.setEnabled(true); + userRepresentation.setFirstName(user.getFirstName()); + userRepresentation.setLastName(user.getLastName()); + + try (var response = realmService.realm().users().create(userRepresentation)) { + + if (response.getStatusInfo().getFamily() != Response.Status.Family.SUCCESSFUL) { + if (response.getStatusInfo().getStatusCode() == 409) { + throw new ConflictException(response.getStatusInfo().getReasonPhrase()); + } + if (response.getStatusInfo().getStatusCode() == 400) { + throw new BadRequestException(response.getStatusInfo().getReasonPhrase()); + } + throw new BadRequestException("Cannot create user ... "); + } + + var createdUser = getUserByUsername(user.getEmail()); + + try { + sendResetPasswordEmail(createdUser.getUserId()); + } catch (Exception e) { + log.debug("Activation E-mail could not be sent!", e); + } + + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(createdUser.getUserId()) + .category(AuditCategory.USER.name()) + .message("User created") + .build()); + + if(!user.getRoles().isEmpty()) { + setRoles(createdUser.getUserId(), user.getRoles()); + } + + customPermissionService.syncAllCustomPermissions(); + + return getUserByUsername(user.getEmail()); + } + } + + + private User getUserByUsername(String username) { + + var userList = realmService.realm().users().search(username); + if (userList.isEmpty()) { + throw new NotFoundException("User with this username already exists"); + } + + return convert(userList.iterator().next()); + } + + + private void sendResetPasswordEmail(String userId) { + + try { + realmService.realm().users().get(userId).executeActionsEmail(Collections.singletonList("UPDATE_PASSWORD"), 86400); + } catch (Exception e) { + throw new BadRequestException("Failed to send email", e); + } + } + + @CacheEvict(value = USERS_CACHE, allEntries = true, beforeInvocation = true) + public void setRoles(String userId, List roles, List currentUserRoles) { + + roles.forEach(role -> { + if (!ApplicationRoles.ROLE_DATA.containsKey(role)) { + throw new BadRequestException("Invalid role: " + role); + } + }); + + var userResource = getUserResource(userId); + var userRoles = userResource.roles().realmLevel().listEffective().stream().map(RoleRepresentation::getName).collect(Collectors.toList()); + + var isUser = userRoles.contains(RED_USER_ROLE); // || currentRoles.contains(RED_MANAGER_ROLE); + var isManager = userRoles.contains(RED_MANAGER_ROLE); + var isAdmin = currentUserRoles.contains(RED_ADMIN_ROLE); + + if (!isAdmin && roles.contains(RED_ADMIN_ROLE)) { + throw new BadRequestException("Cannot assign admin-role. You're not an admin!"); + } + + if (!isAdmin && userRoles.contains(RED_ADMIN_ROLE) && !roles.contains(RED_ADMIN_ROLE)) { + throw new BadRequestException("Cannot remove admin role of a user"); + } + + if (userId.equalsIgnoreCase(KeycloakSecurity.getUserId()) && isAdmin && !roles.contains(RED_ADMIN_ROLE)) { + log.info("Admin can not remove admin role from himself."); + throw new ConflictException("Admin could not remove admin role from himself."); + } + + if (!roles.contains(RED_MANAGER_ROLE) && isManager) { + removeUserFromDossiers(userId, UserRemovalModel.REMOVE_MANAGER); + } + + if (!roles.contains(RED_USER_ROLE) && !roles.contains(RED_MANAGER_ROLE) && isUser) { + removeUserFromDossiers(userId, UserRemovalModel.REMOVE_USER); + } + + var currentRolesAsRoleRepresentation = ApplicationRoles.ROLE_DATA.keySet().stream().map(this::getRoleRepresentation).collect(Collectors.toList()); + var newRoles = roles.stream().map(this::getRoleRepresentation).collect(Collectors.toList()); + + userResource.roles().realmLevel().remove(currentRolesAsRoleRepresentation); + userResource.roles().realmLevel().add(newRoles); + + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(userId) + .category(AuditCategory.USER.name()) + .message("Roles updated for user") + .details(Map.of("CurrentRoles", roles)) + .build()); + } + + + @CacheEvict(value = USERS_CACHE, allEntries = true, beforeInvocation = true) + public void setRoles(String userId, List roles) { + + var currentUserResource = getUserResource(KeycloakSecurity.getUserId()); + var currentUserRoles = currentUserResource.roles().realmLevel().listEffective().stream().map(RoleRepresentation::getName).collect(Collectors.toList()); + + setRoles(userId, roles, currentUserRoles); + + + } + + + private User convert(UserRepresentation userRepresentation) { + + var user = userListingService.convertBasicUser(userRepresentation); + user.setRoles(getRoles(user.getUserId())); + if (user.getRoles().contains(RED_MANAGER_ROLE)) { + user.getRoles().add(RED_USER_ROLE); + } + if (user.getRoles().contains(RED_ADMIN_ROLE)) { + user.getRoles().add(RED_USER_ADMIN_ROLE); + } + return user; + } + + + public UserResource getUserResource(String userId) { + + if (StringUtils.isBlank(userId)) { + throw new BadRequestException("No id provided."); + } + try { + return realmService.realm().users().get(userId); + } catch (NotFoundException e) { + throw new NotFoundException("User with id: " + userId + " does not exist", e); + } + } + + + private void removeUserFromDossiers(String userId, UserRemovalModel mode) { + + dossierManagementService.getAllDossiers(true, true).forEach(dossier -> { + + dossierACLService.enhanceDossierWithACLData(dossier); + + updateDossierUsers(userId, mode, dossier); + }); + + } + + + private RoleRepresentation getRoleRepresentation(String role) { + + RoleRepresentation realmRole; + try { + realmRole = realmService.realm().roles().get(role).toRepresentation(); + } catch (NotFoundException e) { + log.warn("The realm role {} is not found.", role); + throw new NotFoundException("The realm role " + role + " is not found.", e); + } + return realmRole; + } + + + private Set getRoles(String id) { + + List realmMappings = realmService.realm().users().get(id).roles().getAll().getRealmMappings(); + if (realmMappings == null) { + log.warn("User with id=" + id + " contains null role mappings."); + return new TreeSet<>(); + } + return realmMappings.stream().map(RoleRepresentation::getName).filter(name -> name.startsWith(keyCloakSettings.getRolePrefix())).collect(Collectors.toSet()); + } + + + public void updateDossierUsers(String userId, UserRemovalModel mode, Dossier dossier) { + + if (mode == UserRemovalModel.REMOVE_USER || mode == UserRemovalModel.PERMANENT) { + // remove from members in case we removed the user role or we permanently removed this user + dossier.getMemberIds().remove(userId); + dossier.getApproverIds().remove(userId); + } + fileStatusManagementService.getAllDossierStatus(dossier.getId()).forEach(fileStatus -> { + if (userId.equals(fileStatus.getAssignee()) && (mode == UserRemovalModel.REMOVE_USER || mode == UserRemovalModel.PERMANENT)) { + fileStatusManagementService.setCurrentFileAssignee(dossier.getId(), fileStatus.getId(), null); + } + }); + + if (userId.equals(dossier.getOwnerId()) && (mode == UserRemovalModel.REMOVE_MANAGER || mode == UserRemovalModel.PERMANENT)) { + dossier.setOwnerId(null); + + dossier.getMemberIds() + .forEach(member -> notificationPersistenceService.insertNotification(AddNotificationRequest.builder() + .userId(member) + .issuerId(KeycloakSecurity.getUserId()) + .notificationType(NotificationType.DOSSIER_OWNER_DELETED.name()) + .target(Map.of("dossierId", dossier.getId())) + .build())); + } + + dossierManagementService.updateDossier(CreateOrUpdateDossierRequest.builder() + .dossierTemplateId(dossier.getDossierTemplateId()) + .dossierName(dossier.getDossierName()) + .description(dossier.getDescription()) + .dossierTemplateId(dossier.getDossierTemplateId()) + .downloadFileTypes(dossier.getDownloadFileTypes()) + .dueDate(dossier.getDueDate()) + .reportTemplateIds(Lists.newArrayList(dossier.getReportTemplateIds())) + .watermarkId(dossier.getWatermarkId()) + .previewWatermarkId(dossier.getPreviewWatermarkId()) + .dossierStatusId(dossier.getDossierStatusId()) + .build(), dossier.getId()); + + dossierACLService.updateDossierACL(dossier.getMemberIds(), dossier.getApproverIds(), dossier.getOwnerId(), dossier.getId()); + } + + + public Optional getUserById(String userId) { + + return userListingService.getAllUsers().stream().filter(u -> u.getUserId().equalsIgnoreCase(userId)).findAny(); + } + + + public List getUsersByIds(Collection userIds) { + + return userListingService.getAllUsers().stream().filter(u -> userIds.contains(u.getUserId())).collect(Collectors.toList()); + } + + + @CacheEvict(value = USERS_CACHE, allEntries = true, beforeInvocation = true) + public void updateMyProfile(UpdateMyProfileRequest updateProfileRequest) { + + var user = realmService.realm().users().get(KeycloakSecurity.getUserId()); + var userRepresentation = user.toRepresentation(); + + if (userRepresentation.getFederatedIdentities() != null && !userRepresentation.getFederatedIdentities().isEmpty() && !updateProfileRequest.getEmail() + .equals(userRepresentation.getEmail())) { + throw new NotAllowedException("It is not allowed to change the email from a federated identity"); + } + + if (!updateProfileRequest.getEmail().equals(userRepresentation.getEmail())) { + validatePassword(userRepresentation.getUsername(), updateProfileRequest.getPassword()); + } + + userRepresentation.setFirstName(updateProfileRequest.getFirstName()); + userRepresentation.setLastName(updateProfileRequest.getLastName()); + userRepresentation.setEmail(updateProfileRequest.getEmail()); + userRepresentation.setUsername(updateProfileRequest.getEmail()); + + try { + user.update(userRepresentation); + } catch (ClientErrorException e) { + if (e.getResponse().getStatus() == 409) { + throw new ConflictException("E-mail already in use"); + } + throw e; + } + + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(KeycloakSecurity.getUserId()) + .category(AuditCategory.USER.name()) + .message("Profile updated for user") + .details(Map.of("Profile", updateProfileRequest)) + .build()); + } + + + private void validatePassword(String username, String password) { + + if (password == null || password.isEmpty()) { + throw new AuthenticationFailedException(); + } + + var changeEmailClient = KeycloakBuilder.builder() + + .serverUrl(keyCloakSettings.getServerUrl()) + .realm(keyCloakSettings.getRealm()) + .username(username) + .password(password) + .clientId(keyCloakSettings.getClientId()) + .clientSecret(keyCloakSettings.getClientSecret()) + .grantType(OAuth2Constants.PASSWORD) + .resteasyClient(new ResteasyClientBuilderImpl().connectionTTL(2, TimeUnit.SECONDS) + .hostnameVerification(ResteasyClientBuilder.HostnameVerificationPolicy.ANY) + .connectionPoolSize(keyCloakSettings.getConnectionPoolSize()) + .disableTrustManager() + .build()) + .build(); + + try { + changeEmailClient.tokenManager().getAccessTokenString(); + } catch (NotAuthorizedException e) { + throw new AuthenticationFailedException(e); + } + + changeEmailClient.close(); + + } + + + @CacheEvict(value = USERS_CACHE, allEntries = true, beforeInvocation = true) + public void deleteUser(String userId) { + + if (KeycloakSecurity.getUserId().equalsIgnoreCase(userId)) { + throw new ConflictException("Cannot delete self"); + } + + var currentUserResource = getUserResource(KeycloakSecurity.getUserId()); + var currentRoles = currentUserResource.roles().realmLevel().listEffective().stream().map(RoleRepresentation::getName).collect(Collectors.toList()); + + var userResource = getUserResource(userId); + var userRoles = userResource.roles().realmLevel().listEffective().stream().map(RoleRepresentation::getName).collect(Collectors.toList()); + + var isCurrentUserOnlyUserAdmin = currentRoles.contains(RED_USER_ADMIN_ROLE) && !currentRoles.contains(RED_ADMIN_ROLE); + var isUserToBeDeletedAdmin = userRoles.contains(RED_ADMIN_ROLE); + + if (isCurrentUserOnlyUserAdmin && isUserToBeDeletedAdmin) { + throw new NotAllowedException("It is not allowed to delete a user with RED-ADMIN role"); + } + + removeUserFromDossiers(userId, UserRemovalModel.PERMANENT); + + realmService.realm().users().get(userId).remove(); + customPermissionService.syncAllCustomPermissions(); + + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(userId) + .category(AuditCategory.USER.name()) + .message("User removed") + .build()); + + } + + + /* + * If a user is deleted via Keycloak, the user ist still in the RedactManager database, thus we have to clean this + */ + public Set removeDeletedUsers(@NotNull Set userIds) { + + var users = userListingService.getAllUsers(); + Set deletedUsers = new HashSet<>(); + + for (String userId : userIds) { + if (users.stream().filter(u -> u.getUserId().equalsIgnoreCase(userId)).findAny().isEmpty()) { + log.info("Will delete {} user", userId); + + removeUserFromDossiers(userId, UserRemovalModel.PERMANENT); + realmService.realm().users().delete(userId); + + auditPersistenceService.audit(AuditRequest.builder().objectId(userId).category(AuditCategory.USER.name()).message("User removed automatically").build()); + deletedUsers.add(userId); + } + } + + customPermissionService.syncAllCustomPermissions(); + return deletedUsers; + } + + + @CacheEvict(value = USERS_CACHE, allEntries = true, beforeInvocation = true) + public void updateProfile(String userId, UpdateProfileRequest updateProfileRequest) { + + var user = realmService.realm().users().get(userId); + var userRepresentation = user.toRepresentation(); + + if (userRepresentation.getFederatedIdentities() != null && !userRepresentation.getFederatedIdentities().isEmpty() && !updateProfileRequest.getEmail() + .equals(userRepresentation.getEmail())) { + throw new NotAllowedException("It is not allowed to change the email from a federated identity"); + } + + if (!EmailValidator.getInstance().isValid(updateProfileRequest.getEmail())) { + throw new BadRequestException("Email address format is not valid"); + } + + userRepresentation.setFirstName(updateProfileRequest.getFirstName()); + userRepresentation.setLastName(updateProfileRequest.getLastName()); + userRepresentation.setEmail(updateProfileRequest.getEmail()); + + user.update(userRepresentation); + + setRoles(userId, updateProfileRequest.getRoles()); + + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(KeycloakSecurity.getUserId()) + .category(AuditCategory.USER.name()) + .message("Profile updated for user") + .details(Map.of("Profile", updateProfileRequest)) + .build()); + } + + + public User activateProfile(String userId, boolean isActive) { + + var user = realmService.realm().users().get(userId); + var userRepresentation = user.toRepresentation(); + + userRepresentation.setEnabled(isActive); + user.update(userRepresentation); + + var currentRoles = getRoles(userId); + if (isActive && currentRoles.isEmpty()) { // add RED_USER role + setRoles(userId, List.of(RED_USER_ROLE)); + } + + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(KeycloakSecurity.getUserId()) + .category(AuditCategory.USER.name()) + .message("Profile activated/deactivated for user") + .details(Map.of("Profile activated", isActive)) + .build()); + + return convert(realmService.realm().users().get(userId).toRepresentation()); + } + + + public void resetPassword(String userId, ResetPasswordRequest resetPasswordRequest) { + + try { + CredentialRepresentation request = new CredentialRepresentation(); + request.setType("password"); + request.setTemporary(resetPasswordRequest.isTemporary()); + request.setValue(resetPasswordRequest.getPassword()); + realmService.realm().users().get(userId).resetPassword(request); + } catch (Exception e) { + throw new BadRequestException("Failed to send email", e); + } + } + + + public List getAllUsers() { + + return userListingService.getAllUsers(); + } + + + public enum UserRemovalModel { + PERMANENT, + REMOVE_MANAGER, + REMOVE_USER + } + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/WatermarkService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/WatermarkService.java index 982c9c393..3615f6c95 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/WatermarkService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/WatermarkService.java @@ -18,7 +18,7 @@ import com.iqser.red.service.persistence.management.v1.processor.exception.NotFo import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierTemplatePersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierRepository; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.WatermarkRepository; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.Watermark; +import com.iqser.red.service.persistence.service.v1.api.shared.model.WatermarkModel; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -51,7 +51,7 @@ public class WatermarkService { @Transactional - public WatermarkEntity createOrUpdateWatermark(Watermark watermark) { + public WatermarkEntity createOrUpdateWatermark(WatermarkModel watermark) { validateWatermark(watermark); if (watermark.getId() != null) { // update @@ -87,7 +87,7 @@ public class WatermarkService { } - private void validateWatermark(Watermark watermark) { + private void validateWatermark(WatermarkModel watermark) { if (StringUtils.isBlank(watermark.getName())) { throw new BadRequestException("The watermark name must not be empty"); diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/download/DownloadDLQMessageReceiver.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/download/DownloadDLQMessageReceiver.java similarity index 88% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/download/DownloadDLQMessageReceiver.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/download/DownloadDLQMessageReceiver.java index 04c3eac27..230568c45 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/download/DownloadDLQMessageReceiver.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/download/DownloadDLQMessageReceiver.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.service.download; +package com.iqser.red.service.persistence.management.v1.processor.service.download; import java.io.IOException; @@ -8,10 +8,10 @@ import org.springframework.retry.support.RetryTemplate; import org.springframework.stereotype.Service; import com.fasterxml.jackson.databind.ObjectMapper; -import com.iqser.red.service.peristence.v1.server.configuration.MessagingConfiguration; -import com.iqser.red.service.peristence.v1.server.model.DownloadJob; +import com.iqser.red.service.persistence.management.v1.processor.configuration.MessagingConfiguration; +import com.iqser.red.service.persistence.management.v1.processor.model.DownloadJob; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DownloadStatusPersistenceService; -import com.iqser.red.service.persistence.service.v1.api.model.download.DownloadStatusValue; +import com.iqser.red.service.persistence.service.v1.api.shared.model.download.DownloadStatusValue; import com.iqser.red.service.redaction.report.v1.api.model.ReportRequestMessage; import com.iqser.red.service.redaction.report.v1.api.model.ReportResultMessage; @@ -37,6 +37,16 @@ public class DownloadDLQMessageReceiver { } + public void setDownloadFailed(String userId, String downloadId) { + + retryTemplate.execute(retryContext -> { + log.warn("Retrying {} time to set FAILED status for downloadJob userId: {} storageId: {}", retryContext.getRetryCount(), userId, downloadId); + downloadStatusPersistenceService.updateStatus(downloadId, DownloadStatusValue.FAILED); + return null; + }); + } + + @RabbitListener(queues = MessagingConfiguration.REPORT_DLQ) public void handleReportDlqMessage(Message failedMessage) throws IOException { @@ -54,14 +64,4 @@ public class DownloadDLQMessageReceiver { setDownloadFailed(reportResultMessage.getUserId(), reportResultMessage.getDownloadId()); } - - public void setDownloadFailed(String userId, String downloadId) { - - retryTemplate.execute(retryContext -> { - log.warn("Retrying {} time to set FAILED status for downloadJob userId: {} storageId: {}", retryContext.getRetryCount(), userId, downloadId); - downloadStatusPersistenceService.updateStatus(downloadId, DownloadStatusValue.FAILED); - return null; - }); - } - } diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/download/DownloadMessageReceiver.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/download/DownloadMessageReceiver.java similarity index 85% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/download/DownloadMessageReceiver.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/download/DownloadMessageReceiver.java index 46796ff3e..dfe25a1e9 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/download/DownloadMessageReceiver.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/download/DownloadMessageReceiver.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.service.download; +package com.iqser.red.service.persistence.management.v1.processor.service.download; import org.springframework.amqp.AmqpRejectAndDontRequeueException; import org.springframework.amqp.core.Message; @@ -8,8 +8,8 @@ import org.springframework.stereotype.Service; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import com.iqser.red.service.peristence.v1.server.configuration.MessagingConfiguration; -import com.iqser.red.service.peristence.v1.server.model.DownloadJob; +import com.iqser.red.service.persistence.management.v1.processor.configuration.MessagingConfiguration; +import com.iqser.red.service.persistence.management.v1.processor.model.DownloadJob; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/download/DownloadPreparationService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/download/DownloadPreparationService.java similarity index 93% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/download/DownloadPreparationService.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/download/DownloadPreparationService.java index 605f766eb..c3f483890 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/download/DownloadPreparationService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/download/DownloadPreparationService.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.service.download; +package com.iqser.red.service.persistence.management.v1.processor.service.download; import java.io.IOException; import java.util.Collection; @@ -20,24 +20,24 @@ import com.iqser.red.service.pdftron.redaction.v1.api.model.RedactionMessage; import com.iqser.red.service.pdftron.redaction.v1.api.model.RedactionResultDetail; import com.iqser.red.service.pdftron.redaction.v1.api.model.RedactionResultMessage; import com.iqser.red.service.pdftron.redaction.v1.api.model.RedactionType; -import com.iqser.red.service.peristence.v1.server.configuration.MessagingConfiguration; -import com.iqser.red.service.peristence.v1.server.service.FileManagementStorageService; -import com.iqser.red.service.peristence.v1.server.settings.FileManagementServiceSettings; -import com.iqser.red.service.peristence.v1.server.utils.FileSystemBackedArchiver; +import com.iqser.red.service.persistence.management.v1.processor.configuration.MessagingConfiguration; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.ReportTemplateEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.download.DownloadStatusEntity; import com.iqser.red.service.persistence.management.v1.processor.service.ColorsService; +import com.iqser.red.service.persistence.management.v1.processor.service.FileManagementStorageService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DownloadStatusPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.NotificationPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.ReportTemplatePersistenceService; -import com.iqser.red.service.persistence.service.v1.api.model.audit.AddNotificationRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DownloadFileType; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileType; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus; -import com.iqser.red.service.persistence.service.v1.api.model.download.DownloadStatusValue; +import com.iqser.red.service.persistence.management.v1.processor.settings.FileManagementServiceSettings; +import com.iqser.red.service.persistence.management.v1.processor.utils.FileSystemBackedArchiver; +import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AddNotificationRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DownloadFileType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.download.DownloadStatusValue; import com.iqser.red.service.redaction.report.v1.api.model.ReportResultMessage; import com.iqser.red.service.redaction.report.v1.api.model.StoredFileInformation; import com.iqser.red.storage.commons.service.StorageService; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/download/DownloadProcessorService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/download/DownloadProcessorService.java similarity index 86% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/download/DownloadProcessorService.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/download/DownloadProcessorService.java index a95348972..20d810e22 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/download/DownloadProcessorService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/download/DownloadProcessorService.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.service.download; +package com.iqser.red.service.persistence.management.v1.processor.service.download; import java.util.Comparator; import java.util.List; @@ -11,14 +11,14 @@ import org.springframework.stereotype.Service; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import com.iqser.red.service.peristence.v1.server.configuration.MessagingConfiguration; -import com.iqser.red.service.peristence.v1.server.model.DownloadJob; -import com.iqser.red.service.peristence.v1.server.service.DossierService; +import com.iqser.red.service.persistence.management.v1.processor.configuration.MessagingConfiguration; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.ReportTemplateEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.download.DownloadStatusEntity; +import com.iqser.red.service.persistence.management.v1.processor.model.DownloadJob; +import com.iqser.red.service.persistence.management.v1.processor.service.DossierService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DownloadStatusPersistenceService; -import com.iqser.red.service.persistence.service.v1.api.model.download.DownloadStatusValue; +import com.iqser.red.service.persistence.service.v1.api.shared.model.download.DownloadStatusValue; import com.iqser.red.service.redaction.report.v1.api.model.ReportRequestMessage; import lombok.RequiredArgsConstructor; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/download/DownloadReportCleanupService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/download/DownloadReportCleanupService.java similarity index 77% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/download/DownloadReportCleanupService.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/download/DownloadReportCleanupService.java index aebb291c2..c2a69b616 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/download/DownloadReportCleanupService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/download/DownloadReportCleanupService.java @@ -1,11 +1,11 @@ -package com.iqser.red.service.peristence.v1.server.service.download; +package com.iqser.red.service.persistence.management.v1.processor.service.download; import java.util.Collection; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; -import com.iqser.red.service.peristence.v1.server.service.FileManagementStorageService; +import com.iqser.red.service.persistence.management.v1.processor.service.FileManagementStorageService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/download/DownloadReportMessageReceiver.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/download/DownloadReportMessageReceiver.java similarity index 90% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/download/DownloadReportMessageReceiver.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/download/DownloadReportMessageReceiver.java index f2c7b205a..56c45a3eb 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/download/DownloadReportMessageReceiver.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/download/DownloadReportMessageReceiver.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.service.download; +package com.iqser.red.service.persistence.management.v1.processor.service.download; import org.springframework.amqp.AmqpRejectAndDontRequeueException; import org.springframework.amqp.core.Message; @@ -8,7 +8,7 @@ import org.springframework.stereotype.Service; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import com.iqser.red.service.peristence.v1.server.configuration.MessagingConfiguration; +import com.iqser.red.service.persistence.management.v1.processor.configuration.MessagingConfiguration; import com.iqser.red.service.redaction.report.v1.api.model.ReportResultMessage; import lombok.AccessLevel; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/download/RedactionDlqMessageReceiver.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/download/RedactionDlqMessageReceiver.java similarity index 86% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/download/RedactionDlqMessageReceiver.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/download/RedactionDlqMessageReceiver.java index a1041a219..1becab0ec 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/download/RedactionDlqMessageReceiver.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/download/RedactionDlqMessageReceiver.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.service.download; +package com.iqser.red.service.persistence.management.v1.processor.service.download; import org.springframework.amqp.rabbit.annotation.RabbitHandler; import org.springframework.amqp.rabbit.annotation.RabbitListener; @@ -7,9 +7,9 @@ import org.springframework.stereotype.Service; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import com.iqser.red.service.peristence.v1.server.configuration.MessagingConfiguration; +import com.iqser.red.service.persistence.management.v1.processor.configuration.MessagingConfiguration; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DownloadStatusPersistenceService; -import com.iqser.red.service.persistence.service.v1.api.model.download.DownloadStatusValue; +import com.iqser.red.service.persistence.service.v1.api.shared.model.download.DownloadStatusValue; import lombok.AccessLevel; import lombok.RequiredArgsConstructor; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/download/RedactionResultMessageReceiver.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/download/RedactionResultMessageReceiver.java similarity index 90% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/download/RedactionResultMessageReceiver.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/download/RedactionResultMessageReceiver.java index e7d053d4d..e1210982d 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/download/RedactionResultMessageReceiver.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/download/RedactionResultMessageReceiver.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.service.download; +package com.iqser.red.service.persistence.management.v1.processor.service.download; import org.springframework.amqp.AmqpRejectAndDontRequeueException; import org.springframework.amqp.core.Message; @@ -9,7 +9,7 @@ import org.springframework.stereotype.Service; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.iqser.red.service.pdftron.redaction.v1.api.model.RedactionResultMessage; -import com.iqser.red.service.peristence.v1.server.configuration.MessagingConfiguration; +import com.iqser.red.service.persistence.management.v1.processor.configuration.MessagingConfiguration; import lombok.AccessLevel; import lombok.RequiredArgsConstructor; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/export/DossierTemplateExportService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/export/DossierTemplateExportService.java similarity index 86% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/export/DossierTemplateExportService.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/export/DossierTemplateExportService.java index 1a797c8bb..ab897652c 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/export/DossierTemplateExportService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/export/DossierTemplateExportService.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.service.export; +package com.iqser.red.service.persistence.management.v1.processor.service.export; import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; @@ -16,17 +16,15 @@ import org.springframework.stereotype.Service; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import com.iqser.red.service.peristence.v1.server.configuration.MessagingConfiguration; -import com.iqser.red.service.peristence.v1.server.model.DownloadJob; -import com.iqser.red.service.peristence.v1.server.service.FileManagementStorageService; -import com.iqser.red.service.peristence.v1.server.utils.FileSystemBackedArchiver; -import com.iqser.red.service.peristence.v1.server.utils.StorageIdUtils; +import com.iqser.red.service.persistence.management.v1.processor.configuration.MessagingConfiguration; import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.BaseDictionaryEntry; import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.TypeEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.download.DownloadStatusEntity; import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; +import com.iqser.red.service.persistence.management.v1.processor.model.DownloadJob; import com.iqser.red.service.persistence.management.v1.processor.service.ColorsService; +import com.iqser.red.service.persistence.management.v1.processor.service.FileManagementStorageService; import com.iqser.red.service.persistence.management.v1.processor.service.WatermarkService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DictionaryPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierAttributeConfigPersistenceService; @@ -38,21 +36,23 @@ import com.iqser.red.service.persistence.management.v1.processor.service.persist import com.iqser.red.service.persistence.management.v1.processor.service.persistence.LegalBasisMappingPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.ReportTemplatePersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.RulesPersistenceService; -import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierAttributeConfig; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierTemplate; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.FileAttributesGeneralConfiguration; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.ReportTemplate; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.Colors; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.Watermark; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierStatusInfo; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileAttributeConfig; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.importexport.ExportDownloadRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.importexport.ExportFilename; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.legalbasis.LegalBasis; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.DictionaryEntryType; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.Type; -import com.iqser.red.service.persistence.service.v1.api.model.download.DownloadStatusValue; +import com.iqser.red.service.persistence.management.v1.processor.utils.FileSystemBackedArchiver; +import com.iqser.red.service.persistence.management.v1.processor.utils.StorageIdUtils; +import com.iqser.red.service.persistence.service.v1.api.shared.model.WatermarkModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierAttributeConfig; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierTemplate; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.FileAttributesGeneralConfiguration; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.ReportTemplate; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.Colors; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.DossierStatusInfo; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileAttributeConfig; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.importexport.ExportDownloadRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.importexport.ExportFilename; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.legalbasis.LegalBasis; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionaryEntryType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.Type; +import com.iqser.red.service.persistence.service.v1.api.shared.model.download.DownloadStatusValue; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; @@ -98,6 +98,19 @@ public class DossierTemplateExportService { } + private void addToExportDownloadQueue(DownloadJob downloadJob, int priority) { + + try { + rabbitTemplate.convertAndSend(MessagingConfiguration.EXPORT_DOWNLOAD_QUEUE, objectMapper.writeValueAsString(downloadJob), message -> { + message.getMessageProperties().setPriority(priority); + return message; + }); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } + + @SneakyThrows @Transactional public void createDownloadArchive(DownloadJob downloadJob) { @@ -118,7 +131,7 @@ public class DossierTemplateExportService { var watermarkList = watermarkService.getWatermarksForDossierTemplateId(dossierTemplateId); fileSystemBackedArchiver.addEntry(new FileSystemBackedArchiver.ArchiveModel(null, getFilename(ExportFilename.WATERMARK, JSON_EXT), - objectMapper.writeValueAsBytes(convert(watermarkList, Watermark.class)))); + objectMapper.writeValueAsBytes(convert(watermarkList, WatermarkModel.class)))); //add colors json file var colors = colorsService.getColors(dossierTemplateId); @@ -218,6 +231,13 @@ public class DossierTemplateExportService { } + private String extractDossierTemplateId(String fileName) { + + var lastIndexOfDot = fileName.lastIndexOf("."); + return fileName.substring(0, lastIndexOfDot); + } + + private String getFilename(ExportFilename exportFilename, String extension) { return exportFilename.getFilename() + extension; @@ -248,24 +268,4 @@ public class DossierTemplateExportService { log.info("Successfully stored zip for downloadId {}, took {}", storageId, System.currentTimeMillis() - start); } - - private String extractDossierTemplateId(String fileName) { - - var lastIndexOfDot = fileName.lastIndexOf("."); - return fileName.substring(0, lastIndexOfDot); - } - - - private void addToExportDownloadQueue(DownloadJob downloadJob, int priority) { - - try { - rabbitTemplate.convertAndSend(MessagingConfiguration.EXPORT_DOWNLOAD_QUEUE, objectMapper.writeValueAsString(downloadJob), message -> { - message.getMessageProperties().setPriority(priority); - return message; - }); - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } - } - } diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/export/ExportDownloadMessageReceiver.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/export/ExportDownloadMessageReceiver.java similarity index 79% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/export/ExportDownloadMessageReceiver.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/export/ExportDownloadMessageReceiver.java index 8c85e7f8e..dc7204a51 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/export/ExportDownloadMessageReceiver.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/export/ExportDownloadMessageReceiver.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.service.export; +package com.iqser.red.service.persistence.management.v1.processor.service.export; import org.springframework.amqp.rabbit.annotation.RabbitHandler; import org.springframework.amqp.rabbit.annotation.RabbitListener; @@ -6,8 +6,8 @@ import org.springframework.stereotype.Service; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import com.iqser.red.service.peristence.v1.server.configuration.MessagingConfiguration; -import com.iqser.red.service.peristence.v1.server.model.DownloadJob; +import com.iqser.red.service.persistence.management.v1.processor.configuration.MessagingConfiguration; +import com.iqser.red.service.persistence.management.v1.processor.model.DownloadJob; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/job/AutomaticAnalysisJob.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/job/AutomaticAnalysisJob.java similarity index 88% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/job/AutomaticAnalysisJob.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/job/AutomaticAnalysisJob.java index f7bbcea2a..624bb17d9 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/job/AutomaticAnalysisJob.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/job/AutomaticAnalysisJob.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.service.job; +package com.iqser.red.service.persistence.management.v1.processor.service.job; import java.util.Comparator; import java.util.List; @@ -8,12 +8,12 @@ import org.quartz.JobExecutionContext; import org.springframework.amqp.core.AmqpAdmin; import org.springframework.stereotype.Service; -import com.iqser.red.service.peristence.v1.server.configuration.MessagingConfiguration; -import com.iqser.red.service.peristence.v1.server.service.FileStatusService; -import com.iqser.red.service.peristence.v1.server.settings.FileManagementServiceSettings; +import com.iqser.red.service.persistence.management.v1.processor.configuration.MessagingConfiguration; +import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.mulitenancy.repository.TenantRepository; +import com.iqser.red.service.persistence.management.v1.processor.settings.FileManagementServiceSettings; import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileModel; import lombok.RequiredArgsConstructor; import lombok.Setter; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/job/DeletedFilesCleanupJob.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/job/DeletedFilesCleanupJob.java similarity index 88% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/job/DeletedFilesCleanupJob.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/job/DeletedFilesCleanupJob.java index 2099863c5..03f5d1950 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/job/DeletedFilesCleanupJob.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/job/DeletedFilesCleanupJob.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.service.job; +package com.iqser.red.service.persistence.management.v1.processor.service.job; import java.time.OffsetDateTime; import java.util.List; @@ -7,11 +7,11 @@ import org.quartz.Job; import org.quartz.JobExecutionContext; import org.springframework.stereotype.Service; -import com.iqser.red.service.peristence.v1.server.service.DossierService; -import com.iqser.red.service.peristence.v1.server.service.FileService; -import com.iqser.red.service.peristence.v1.server.service.FileStatusService; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierEntity; import com.iqser.red.service.persistence.management.v1.processor.service.ApplicationConfigService; +import com.iqser.red.service.persistence.management.v1.processor.service.DossierService; +import com.iqser.red.service.persistence.management.v1.processor.service.FileService; +import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.mulitenancy.repository.TenantRepository; import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/job/DownloadCleanupJob.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/job/DownloadCleanupJob.java similarity index 94% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/job/DownloadCleanupJob.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/job/DownloadCleanupJob.java index e94e77504..bd7d331be 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/job/DownloadCleanupJob.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/job/DownloadCleanupJob.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.service.job; +package com.iqser.red.service.persistence.management.v1.processor.service.job; import java.time.OffsetDateTime; import java.time.temporal.ChronoUnit; @@ -8,9 +8,9 @@ import org.quartz.Job; import org.quartz.JobExecutionContext; import org.springframework.stereotype.Service; -import com.iqser.red.service.peristence.v1.server.service.DossierService; import com.iqser.red.service.persistence.management.v1.processor.entity.download.DownloadStatusEntity; import com.iqser.red.service.persistence.management.v1.processor.service.ApplicationConfigService; +import com.iqser.red.service.persistence.management.v1.processor.service.DossierService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DownloadStatusPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.mulitenancy.repository.TenantRepository; import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; @@ -74,7 +74,7 @@ public class DownloadCleanupJob implements Job { private void deleteDownload(DownloadStatusEntity downloadStatus) { - log.info("Deleting download status {}", downloadStatus); + log.info("Deleting download status {}", downloadStatus.getStorageId()); try { storageService.deleteObject(downloadStatus.getStorageId()); } catch (Exception e) { diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/job/SendNotificationEmailJob.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/job/SendNotificationEmailJob.java similarity index 94% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/job/SendNotificationEmailJob.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/job/SendNotificationEmailJob.java index 98f50781b..8f8a681fc 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/job/SendNotificationEmailJob.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/job/SendNotificationEmailJob.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.service.job; +package com.iqser.red.service.persistence.management.v1.processor.service.job; import java.time.DayOfWeek; import java.time.OffsetDateTime; @@ -13,7 +13,7 @@ import com.iqser.red.service.persistence.management.v1.processor.service.persist import com.iqser.red.service.persistence.management.v1.processor.service.persistence.NotificationPreferencesPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.mulitenancy.repository.TenantRepository; import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; -import com.iqser.red.service.persistence.service.v1.api.model.notification.EmailNotificationType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.notification.EmailNotificationType; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/AuditPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/AuditPersistenceService.java index 42557e801..2d3aa2447 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/AuditPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/AuditPersistenceService.java @@ -9,6 +9,8 @@ import java.time.OffsetDateTime; import java.time.temporal.ChronoUnit; import java.util.List; +import javax.transaction.Transactional; + import org.springframework.beans.BeanUtils; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; @@ -18,9 +20,9 @@ import org.springframework.stereotype.Service; import com.iqser.red.service.persistence.management.v1.processor.entity.audit.AuditEntity; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.AuditRepository; -import com.iqser.red.service.persistence.service.v1.api.model.audit.AuditRequest; -import com.iqser.red.service.persistence.service.v1.api.model.audit.AuditSearchRequest; -import com.iqser.red.service.persistence.service.v1.api.model.audit.CategoryModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditSearchRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.CategoryModel; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; @@ -32,6 +34,12 @@ public class AuditPersistenceService { private final AuditRepository auditRepository; + public void audit(AuditRequest auditRequest) { + + insertRecord(auditRequest); + } + + @SneakyThrows public void insertRecord(AuditRequest auditRequest) { diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DictionaryPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DictionaryPersistenceService.java index ce1191195..80b3aebe0 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DictionaryPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DictionaryPersistenceService.java @@ -19,7 +19,7 @@ import com.iqser.red.service.persistence.management.v1.processor.service.persist import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierTemplateRepository; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.EntryRepository; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.TypeRepository; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.DictionarySummaryResponse; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionarySummaryResponse; import lombok.RequiredArgsConstructor; @@ -77,7 +77,25 @@ public class DictionaryPersistenceService { .softDeletedTime(null) .build(); - return typeRepository.save(t); + return typeRepository.saveAndFlush(t); + } + + + private void checkRankAlreadyExists(String type, String dossierTemplateId, int rank, String dossierId) { + + Optional existingTypeValueForRank = getTypeForRank(dossierTemplateId, rank, dossierId); + + if (existingTypeValueForRank.isPresent() && !existingTypeValueForRank.get().isDeleted() && !existingTypeValueForRank.get().getType().equalsIgnoreCase(type)) { + throw new BadRequestException("Rank already exists: " + rank + " on type: " + existingTypeValueForRank.get().getType()); + } + + } + + + private Optional getTypeForRank(String dossierTemplateId, int rank, String dossierId) { + + return typeRepository.findOneByDossierTemplateIdAndDossierIdAndRank(dossierTemplateId, dossierId, rank); + } @@ -117,24 +135,6 @@ public class DictionaryPersistenceService { } - private Optional getTypeForRank(String dossierTemplateId, int rank, String dossierId) { - - return typeRepository.findOneByDossierTemplateIdAndDossierIdAndRank(dossierTemplateId, dossierId, rank); - - } - - - private void checkRankAlreadyExists(String type, String dossierTemplateId, int rank, String dossierId) { - - Optional existingTypeValueForRank = getTypeForRank(dossierTemplateId, rank, dossierId); - - if (existingTypeValueForRank.isPresent() && !existingTypeValueForRank.get().isDeleted() && !existingTypeValueForRank.get().getType().equalsIgnoreCase(type)) { - throw new BadRequestException("Rank already exists: " + rank + " on type: " + existingTypeValueForRank.get().getType()); - } - - } - - public List getCumulatedTypes(String dossierTemplateId, String dossierId, boolean includeDeleted) { var types = typeRepository.findAllTypesByDossierTemplateIdOrDossierId(dossierTemplateId, dossierId); @@ -142,6 +142,16 @@ public class DictionaryPersistenceService { } + private List filterDeleted(List types, boolean includeDeleted) { + + if (!includeDeleted) { + return types.stream().filter(t -> !t.isDeleted()).collect(Collectors.toList()); + } else { + return types; + } + } + + public List getAllTypesForDossierTemplate(String dossierTemplateId, boolean includeDeleted) { var types = typeRepository.getAllTypesForDossierTemplate(dossierTemplateId); @@ -163,16 +173,6 @@ public class DictionaryPersistenceService { } - private List filterDeleted(List types, boolean includeDeleted) { - - if (!includeDeleted) { - return types.stream().filter(t -> !t.isDeleted()).collect(Collectors.toList()); - } else { - return types; - } - } - - @Transactional public void deleteType(String typeId) { diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierAttributeConfigPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierAttributeConfigPersistenceService.java index 6854618bc..9ad086e2a 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierAttributeConfigPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierAttributeConfigPersistenceService.java @@ -30,6 +30,25 @@ public class DossierAttributeConfigPersistenceService { private final DossierTemplateRepository dossierTemplateRepository; + @Transactional + public List setDossierAttributesConfig(String dossierTemplateId, List dossierAttributesConfig) { + + Set toSetIds = dossierAttributesConfig.stream().map(DossierAttributeConfigEntity::getId).filter(Objects::nonNull).collect(Collectors.toSet()); + var currentConfigs = dossierAttributeConfigRepository.findAllByDossierTemplateId(dossierTemplateId); + Set configsToRemove = currentConfigs.stream().filter(c -> !toSetIds.contains(c.getId())).collect(Collectors.toSet()); + + dossierAttributesConfig.forEach(fac -> addOrUpdateDossierAttribute(dossierTemplateId, fac)); + + configsToRemove.forEach(ctr -> { + dossierAttributeRepository.deleteByDossierAttributeConfigId(ctr.getId()); + dossierAttributeConfigRepository.deleteById(ctr.getId()); + }); + + return getDossierAttributes(dossierTemplateId); + + } + + public DossierAttributeConfigEntity addOrUpdateDossierAttribute(String dossierTemplateId, DossierAttributeConfigEntity dossierAttributeConfig) { var dossierTemplate = dossierTemplateRepository.getOne(dossierTemplateId); @@ -62,53 +81,12 @@ public class DossierAttributeConfigPersistenceService { } - @Transactional - public List setDossierAttributesConfig(String dossierTemplateId, List dossierAttributesConfig) { - - Set toSetIds = dossierAttributesConfig.stream().map(DossierAttributeConfigEntity::getId).filter(Objects::nonNull).collect(Collectors.toSet()); - var currentConfigs = dossierAttributeConfigRepository.findAllByDossierTemplateId(dossierTemplateId); - Set configsToRemove = currentConfigs.stream().filter(c -> !toSetIds.contains(c.getId())).collect(Collectors.toSet()); - - dossierAttributesConfig.forEach(fac -> addOrUpdateDossierAttribute(dossierTemplateId, fac)); - - configsToRemove.forEach(ctr -> { - dossierAttributeRepository.deleteByDossierAttributeConfigId(ctr.getId()); - dossierAttributeConfigRepository.deleteById(ctr.getId()); - }); - - return getDossierAttributes(dossierTemplateId); - - } - - - @Transactional - public void deleteDossierAttribute(String dossierAttributeId) { - - dossierAttributeRepository.deleteByDossierAttributeConfigId(dossierAttributeId); - dossierAttributeConfigRepository.deleteById(dossierAttributeId); - } - - - @Transactional - public void deleteDossierAttributes(List dossierAttributeIds) { - - dossierAttributeIds.forEach(this::deleteDossierAttribute); - } - - public List getDossierAttributes(String dossierTemplateId) { return dossierAttributeConfigRepository.findAllByDossierTemplateId(dossierTemplateId); } - public String getDossierAttributeByIdOrName(String dossierTemplateId, String dossierAttributeId, String label) { - - Optional result = dossierAttributeConfigRepository.findAttributeByIdOrDossierTemplateIdAndLabel(dossierTemplateId, dossierAttributeId, label); - return result.isPresent() ? result.get().getId() : null; - } - - private void setPlaceholder(DossierAttributeConfigEntity dossierAttributeConfig) { if (dossierAttributeConfig.getPlaceholder() == null || dossierAttributeConfig.getPlaceholder().isEmpty()) { @@ -131,4 +109,26 @@ public class DossierAttributeConfigPersistenceService { } + + @Transactional + public void deleteDossierAttributes(List dossierAttributeIds) { + + dossierAttributeIds.forEach(this::deleteDossierAttribute); + } + + + @Transactional + public void deleteDossierAttribute(String dossierAttributeId) { + + dossierAttributeRepository.deleteByDossierAttributeConfigId(dossierAttributeId); + dossierAttributeConfigRepository.deleteById(dossierAttributeId); + } + + + public String getDossierAttributeByIdOrName(String dossierTemplateId, String dossierAttributeId, String label) { + + Optional result = dossierAttributeConfigRepository.findAttributeByIdOrDossierTemplateIdAndLabel(dossierTemplateId, dossierAttributeId, label); + return result.isPresent() ? result.get().getId() : null; + } + } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierAttributePersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierAttributePersistenceService.java index 0a213cc7e..faee140ab 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierAttributePersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierAttributePersistenceService.java @@ -9,9 +9,7 @@ import org.springframework.stereotype.Service; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierAttributeEntity; import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierAttributeConfigRepository; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierAttributeRepository; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierRepository; import lombok.RequiredArgsConstructor; @@ -20,9 +18,7 @@ import lombok.RequiredArgsConstructor; @SuppressWarnings("PMD.TooManyStaticImports") public class DossierAttributePersistenceService { - private final DossierAttributeConfigRepository dossierAttributeConfigRepository; private final DossierAttributeRepository dossierAttributeRepository; - private final DossierRepository dossierRepository; @Transactional diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierPersistenceService.java index e6ac1ea5d..863fb173c 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierPersistenceService.java @@ -23,8 +23,8 @@ import com.iqser.red.service.persistence.management.v1.processor.service.persist import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierTemplateRepository; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.FileRepository; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.ReportTemplateRepository; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.CreateOrUpdateDossierRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierChange; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.CreateOrUpdateDossierRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.DossierChange; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -61,30 +61,6 @@ public class DossierPersistenceService { } - @Transactional - public void update(String dossierId, CreateOrUpdateDossierRequest createOrUpdateDossierRequest) { - - dossierRepository.findById(dossierId).ifPresent(dossier -> { - BeanUtils.copyProperties(createOrUpdateDossierRequest, dossier, "watermarkId", "previewWatermarkId"); - dossier.setDossierTemplate(dossierTemplateRepository.getOne(createOrUpdateDossierRequest.getDossierTemplateId())); - dossier.setLastUpdated(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS)); - - dossier.getReportTemplates() - .forEach(t -> t.getDossiers().removeIf(d -> d.getId().equals(dossierId) && !createOrUpdateDossierRequest.getReportTemplateIds().contains(t.getTemplateId()))); - var reportTemplates = reportTemplateRepository.findAllById(createOrUpdateDossierRequest.getReportTemplateIds()); - reportTemplates.forEach(r -> { - if (!r.getDossiers().stream().map(DossierEntity::getId).collect(Collectors.toSet()).contains(dossierId)) { - r.getDossiers().add(dossier); - } - }); - dossier.setReportTemplates(reportTemplates); - this.handleDossierStatus(createOrUpdateDossierRequest, dossier); - this.handleWatermark(createOrUpdateDossierRequest, dossier); - }); - - } - - private void handleDossierStatus(CreateOrUpdateDossierRequest createOrUpdateDossierRequest, DossierEntity dossier) { if (createOrUpdateDossierRequest.getDossierStatusId() != null) { @@ -137,6 +113,30 @@ public class DossierPersistenceService { } + @Transactional + public void update(String dossierId, CreateOrUpdateDossierRequest createOrUpdateDossierRequest) { + + dossierRepository.findById(dossierId).ifPresent(dossier -> { + BeanUtils.copyProperties(createOrUpdateDossierRequest, dossier, "watermarkId", "previewWatermarkId"); + dossier.setDossierTemplate(dossierTemplateRepository.getOne(createOrUpdateDossierRequest.getDossierTemplateId())); + dossier.setLastUpdated(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS)); + + dossier.getReportTemplates() + .forEach(t -> t.getDossiers().removeIf(d -> d.getId().equals(dossierId) && !createOrUpdateDossierRequest.getReportTemplateIds().contains(t.getTemplateId()))); + var reportTemplates = reportTemplateRepository.findAllById(createOrUpdateDossierRequest.getReportTemplateIds()); + reportTemplates.forEach(r -> { + if (!r.getDossiers().stream().map(DossierEntity::getId).collect(Collectors.toSet()).contains(dossierId)) { + r.getDossiers().add(dossier); + } + }); + dossier.setReportTemplates(reportTemplates); + this.handleDossierStatus(createOrUpdateDossierRequest, dossier); + this.handleWatermark(createOrUpdateDossierRequest, dossier); + }); + + } + + public DossierEntity getActiveOrArchivedDossier(String dossierId) { var dossier = findByDossierId(dossierId); @@ -149,6 +149,12 @@ public class DossierPersistenceService { } + public DossierEntity findByDossierId(String dossierId) { + + return dossierRepository.findById(dossierId).orElseThrow(() -> new DossierNotFoundException(String.format(DOSSIER_NOT_FOUND_MESSAGE, dossierId))); + } + + public DossierEntity getAndValidateDossier(String dossierId) { // check whether the dossierId exists and is not deleted var dossier = findByDossierId(dossierId); @@ -160,12 +166,6 @@ public class DossierPersistenceService { } - public DossierEntity findByDossierId(String dossierId) { - - return dossierRepository.findById(dossierId).orElseThrow(() -> new DossierNotFoundException(String.format(DOSSIER_NOT_FOUND_MESSAGE, dossierId))); - } - - public List findAllDossiers() { return dossierRepository.findAll(); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierStatusPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierStatusPersistenceService.java index cb8f9eefd..c1417d4f4 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierStatusPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierStatusPersistenceService.java @@ -16,8 +16,8 @@ import com.iqser.red.service.persistence.management.v1.processor.exception.BadRe import com.iqser.red.service.persistence.management.v1.processor.exception.ConflictException; import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierStatusRepository; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.CreateOrUpdateDossierStatusRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierStatusInfo; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.CreateOrUpdateDossierStatusRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.DossierStatusInfo; import lombok.RequiredArgsConstructor; @@ -72,6 +72,16 @@ public class DossierStatusPersistenceService { } + private void validateDossierTemplateNameIsUnique(String dossierStatusName, String dossierTemplateId, String dossierStatusId) { + + getAllDossierStatusForTemplate(dossierTemplateId).forEach(existing -> { + if (existing.getName().equals(dossierStatusName) && !existing.getId().equals(dossierStatusId)) { + throw new ConflictException("DossierStatus name must be unique within the same dossier template"); + } + }); + } + + public List getAllDossierStatusForTemplate(String dossierTemplateId) { return dossierStatusRepository.getAllDossierStatusForDossierTemplate(Collections.singletonList(dossierTemplateId)); @@ -127,14 +137,4 @@ public class DossierStatusPersistenceService { } - - private void validateDossierTemplateNameIsUnique(String dossierStatusName, String dossierTemplateId, String dossierStatusId) { - - getAllDossierStatusForTemplate(dossierTemplateId).forEach(existing -> { - if (existing.getName().equals(dossierStatusName) && !existing.getId().equals(dossierStatusId)) { - throw new ConflictException("DossierStatus name must be unique within the same dossier template"); - } - }); - } - } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierTemplatePersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierTemplatePersistenceService.java index bdd62b1b9..cefa00591 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierTemplatePersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierTemplatePersistenceService.java @@ -17,8 +17,8 @@ import com.iqser.red.service.persistence.management.v1.processor.exception.BadRe import com.iqser.red.service.persistence.management.v1.processor.exception.ConflictException; import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierTemplateRepository; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.CreateOrUpdateDossierTemplateRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierTemplateStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.CreateOrUpdateDossierTemplateRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierTemplateStatus; import lombok.RequiredArgsConstructor; @@ -73,7 +73,18 @@ public class DossierTemplatePersistenceService { } + @Transactional + public void validateDossierTemplateNameIsUnique(String templateName) { + getAllDossierTemplates().forEach(existing -> { + if (existing.getName().equals(templateName)) { + throw new ConflictException("DossierTemplate name must be unique"); + } + }); + } + + + @Transactional public DossierTemplateStatus computeDossierTemplateStatus(DossierTemplateEntity dossierTemplate) { var legalBasis = legalBasisMappingPersistenceService.getLegalBasisMapping(dossierTemplate.getId()); @@ -96,16 +107,7 @@ public class DossierTemplatePersistenceService { } - public void validateDossierTemplateNameIsUnique(String templateName) { - - getAllDossierTemplates().forEach(existing -> { - if (existing.getName().equals(templateName)) { - throw new ConflictException("DossierTemplate name must be unique"); - } - }); - } - - + @Transactional public List getAllDossierTemplates() { var allDossierTemplates = dossierTemplateRepository.findAllWhereDeletedIsFalse(); @@ -115,6 +117,7 @@ public class DossierTemplatePersistenceService { } + @Transactional public DossierTemplateEntity getDossierTemplate(String dossierTemplateId) { var dossierTemplate = dossierTemplateRepository.findByIdAndNotDeleted(dossierTemplateId) diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DownloadStatusPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DownloadStatusPersistenceService.java index 2dc4fce91..6b461488b 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DownloadStatusPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DownloadStatusPersistenceService.java @@ -17,8 +17,8 @@ import com.iqser.red.service.persistence.management.v1.processor.exception.NotFo import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DownloadStatusRepository; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.FileRepository; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.ReportTemplateRepository; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DownloadFileType; -import com.iqser.red.service.persistence.service.v1.api.model.download.DownloadStatusValue; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DownloadFileType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.download.DownloadStatusValue; import lombok.RequiredArgsConstructor; @@ -31,6 +31,13 @@ public class DownloadStatusPersistenceService { private final ReportTemplateRepository reportTemplateRepository; + // use this to create a status for export dossier template. + public void createStatus(String userId, String storageId, String filename, String mimeType) { + + this.createStatus(userId, storageId, null, filename, mimeType, null, null, null, null); + } + + public void createStatus(String userId, String storageId, DossierEntity dossier, @@ -57,13 +64,6 @@ public class DownloadStatusPersistenceService { } - // use this to create a status for export dossier template. - public void createStatus(String userId, String storageId, String filename, String mimeType) { - - this.createStatus(userId, storageId, null, filename, mimeType, null, null, null, null); - } - - @Transactional public void updateStatus(String storageId, DownloadStatusValue status) { diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/EntryPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/EntryPersistenceService.java index b3d7deb0d..0209004b0 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/EntryPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/EntryPersistenceService.java @@ -17,7 +17,7 @@ import com.iqser.red.service.persistence.management.v1.processor.service.persist import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.FalseRecommendationEntryRepository; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.TypeRepository; import com.iqser.red.service.persistence.management.v1.processor.utils.jdbc.JDBCWriteUtils; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.DictionaryEntryType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionaryEntryType; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -97,7 +97,7 @@ public class EntryPersistenceService { } } - + @Transactional public void addEntries(String typeId, Set entries, long version, DictionaryEntryType dictionaryEntryType) { var type = typeRepository.getById(typeId); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/FileAttributeConfigPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/FileAttributeConfigPersistenceService.java index bbbd9972a..9e7cb4e76 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/FileAttributeConfigPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/FileAttributeConfigPersistenceService.java @@ -1,5 +1,9 @@ package com.iqser.red.service.persistence.management.v1.processor.service.persistence; +import static com.iqser.red.service.persistence.management.v1.processor.service.FileAttributesManagementService.ASCII_ENCODING; +import static com.iqser.red.service.persistence.management.v1.processor.service.FileAttributesManagementService.ISO_ENCODING; +import static com.iqser.red.service.persistence.management.v1.processor.service.FileAttributesManagementService.UTF_ENCODING; + import java.util.List; import java.util.Objects; import java.util.Optional; @@ -24,8 +28,6 @@ import com.iqser.red.service.persistence.management.v1.processor.service.persist import lombok.RequiredArgsConstructor; -import static com.iqser.red.service.persistence.service.v1.api.resources.FileAttributesConfigResource.*; - @Service @RequiredArgsConstructor public class FileAttributeConfigPersistenceService { @@ -36,6 +38,64 @@ public class FileAttributeConfigPersistenceService { private final FileAttributesRepository fileAttributesRepository; + @Transactional + public void updatePrimaryAttribute(String fileAttribute) { + + fileAttributeConfigRepository.updatePrimaryAttributeValueToTrue(fileAttribute); + } + + + public FileAttributesGeneralConfigurationEntity setFileAttributesGeneralConfig(String dossierTemplateId, FileAttributesGeneralConfigurationEntity fileAttributesConfig) { + + fileAttributesConfig.setDossierTemplateId(dossierTemplateId); + fileAttributesConfig.setDossierTemplate(dossierTemplateRepository.getOne(dossierTemplateId)); + fileAttributesConfig.setEncoding(this.getValidatedEncoding(fileAttributesConfig.getEncoding())); + return fileAttributesGeneralConfigurationRepository.save(fileAttributesConfig); + } + + + private String getValidatedEncoding(String encoding) { + + if (StringUtils.isBlank(encoding)) { + return UTF_ENCODING; + } + if (UTF_ENCODING.equalsIgnoreCase(encoding.trim())) { + return UTF_ENCODING; + } + if (ASCII_ENCODING.equalsIgnoreCase(encoding.trim())) { + return ASCII_ENCODING; + } + if (ISO_ENCODING.equalsIgnoreCase(encoding.trim())) { + return ISO_ENCODING; + } + return UTF_ENCODING; + } + + + public FileAttributesGeneralConfigurationEntity getFileAttributesGeneralConfiguration(String dossierTemplateId) { + + return fileAttributesGeneralConfigurationRepository.findById(dossierTemplateId).orElseThrow(() -> new NotFoundException("File Attribute Config not found")); + } + + + @Transactional + public List setFileAttributesConfig(String dossierTemplateId, List fileAttributesConfig) { + + Set toSetIds = fileAttributesConfig.stream().map(FileAttributeConfigEntity::getId).filter(Objects::nonNull).collect(Collectors.toSet()); + var currentConfigs = fileAttributeConfigRepository.findByDossierTemplateId(dossierTemplateId); + Set configsToRemove = currentConfigs.stream().filter(c -> !toSetIds.contains(c.getId())).collect(Collectors.toSet()); + + fileAttributesConfig.forEach(fac -> addOrUpdateFileAttribute(dossierTemplateId, fac)); + + configsToRemove.forEach(ctr -> { + fileAttributesRepository.deleteByFileAttributeConfigId(ctr.getId()); + fileAttributeConfigRepository.deleteById(ctr.getId()); + }); + + return getFileAttributes(dossierTemplateId); + } + + @Transactional public FileAttributeConfigEntity addOrUpdateFileAttribute(String dossierTemplateId, FileAttributeConfigEntity fileAttributeConfig) { @@ -76,77 +136,12 @@ public class FileAttributeConfigPersistenceService { } - @Transactional - public void updatePrimaryAttribute(String fileAttribute) { - - fileAttributeConfigRepository.updatePrimaryAttributeValueToTrue(fileAttribute); - } - - - public FileAttributesGeneralConfigurationEntity setFileAttributesGeneralConfig(String dossierTemplateId, FileAttributesGeneralConfigurationEntity fileAttributesConfig) { - - fileAttributesConfig.setDossierTemplateId(dossierTemplateId); - fileAttributesConfig.setDossierTemplate(dossierTemplateRepository.getOne(dossierTemplateId)); - fileAttributesConfig.setEncoding(this.getValidatedEncoding(fileAttributesConfig.getEncoding())); - return fileAttributesGeneralConfigurationRepository.save(fileAttributesConfig); - } - - - public FileAttributesGeneralConfigurationEntity getFileAttributesGeneralConfiguration(String dossierTemplateId) { - - return fileAttributesGeneralConfigurationRepository.findById(dossierTemplateId).orElseThrow(() -> new NotFoundException("File Attribute Config not found")); - } - - - @Transactional - public List setFileAttributesConfig(String dossierTemplateId, List fileAttributesConfig) { - - Set toSetIds = fileAttributesConfig.stream().map(FileAttributeConfigEntity::getId).filter(Objects::nonNull).collect(Collectors.toSet()); - var currentConfigs = fileAttributeConfigRepository.findByDossierTemplateId(dossierTemplateId); - Set configsToRemove = currentConfigs.stream().filter(c -> !toSetIds.contains(c.getId())).collect(Collectors.toSet()); - - fileAttributesConfig.forEach(fac -> addOrUpdateFileAttribute(dossierTemplateId, fac)); - - configsToRemove.forEach(ctr -> { - fileAttributesRepository.deleteByFileAttributeConfigId(ctr.getId()); - fileAttributeConfigRepository.deleteById(ctr.getId()); - }); - - return getFileAttributes(dossierTemplateId); - } - - - @Transactional - public void deleteFileAttribute(String fileAttributeId) { - - fileAttributesRepository.deleteByFileAttributeConfigId(fileAttributeId); - fileAttributeConfigRepository.deleteById(fileAttributeId); - } - - - @Transactional - public void deleteFileAttributes(List fileAttributeIds) { - - fileAttributeIds.forEach(fileAttributeId -> { - fileAttributesRepository.deleteByFileAttributeConfigId(fileAttributeId); - fileAttributeConfigRepository.deleteById(fileAttributeId); - }); - } - - public List getFileAttributes(String dossierTemplateId) { return fileAttributeConfigRepository.findByDossierTemplateId(dossierTemplateId); } - public String getFileAttributeByIdOrName(String dossierTemplateId, String fileAttributeId, String label) { - - Optional result = fileAttributeConfigRepository.findByIdOrDossierTemplateIdAndLabel(dossierTemplateId, fileAttributeId, label); - return result.isPresent() ? result.get().getId() : null; - } - - private void setPlaceholder(FileAttributeConfigEntity fileAttributeConfig) { if (fileAttributeConfig.getPlaceholder() == null || fileAttributeConfig.getPlaceholder().isEmpty()) { @@ -168,16 +163,29 @@ public class FileAttributeConfigPersistenceService { }); } - private String getValidatedEncoding(String encoding) { - if (StringUtils.isBlank(encoding)) - return UTF_ENCODING; - if (UTF_ENCODING.equalsIgnoreCase(encoding.trim())) - return UTF_ENCODING; - if (ASCII_ENCODING.equalsIgnoreCase(encoding.trim())) - return ASCII_ENCODING; - if (ISO_ENCODING.equalsIgnoreCase(encoding.trim())) - return ISO_ENCODING; - return UTF_ENCODING; + + @Transactional + public void deleteFileAttribute(String fileAttributeId) { + + fileAttributesRepository.deleteByFileAttributeConfigId(fileAttributeId); + fileAttributeConfigRepository.deleteById(fileAttributeId); + } + + + @Transactional + public void deleteFileAttributes(List fileAttributeIds) { + + fileAttributeIds.forEach(fileAttributeId -> { + fileAttributesRepository.deleteByFileAttributeConfigId(fileAttributeId); + fileAttributeConfigRepository.deleteById(fileAttributeId); + }); + } + + + public String getFileAttributeByIdOrName(String dossierTemplateId, String fileAttributeId, String label) { + + Optional result = fileAttributeConfigRepository.findByIdOrDossierTemplateIdAndLabel(dossierTemplateId, fileAttributeId, label); + return result.isPresent() ? result.get().getId() : null; } } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/FileStatusPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/FileStatusPersistenceService.java index f8a240616..6f01394a9 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/FileStatusPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/FileStatusPersistenceService.java @@ -21,9 +21,9 @@ import com.iqser.red.service.persistence.management.v1.processor.exception.NotFo import com.iqser.red.service.persistence.management.v1.processor.model.OCRStatusUpdateResponse; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.FileAttributesRepository; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.FileRepository; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus; -import com.iqser.red.service.redaction.v1.model.FileAttribute; +import com.iqser.red.service.persistence.service.v1.api.shared.model.FileAttribute; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.ProcessingStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -74,6 +74,29 @@ public class FileStatusPersistenceService { } + private boolean isFileDeleted(String fileId) { + + return fileRepository.findById(fileId).map(FileEntity::isSoftOrHardDeleted).orElse(false); + } + + + private int calculateProcessingErrorCounter(String fileId, ProcessingStatus processingStatus) { + + switch (processingStatus) { + case ERROR: + return fileRepository.findById(fileId).map(FileEntity::getProcessingErrorCounter).orElse(0) + 1; + + case PROCESSED: + case REPROCESS: + return 0; + + default: + return fileRepository.findById(fileId).map(FileEntity::getProcessingErrorCounter).orElse(0); + } + + } + + @Transactional public void updateProcessingStatus(String fileId, int numberOfPages, @@ -225,6 +248,27 @@ public class FileStatusPersistenceService { } + private List convertFileAttributes(String dossierId, FileEntity file, Map fileAttributesMap) { + + var dossier = dossierService.getAndValidateDossier(dossierId); + List configuration = fileAttributeConfigPersistenceService.getFileAttributes(dossier.getDossierTemplateId()); + + return fileAttributesMap.entrySet().stream().map(entry -> { + var fa = new FileAttributeEntity(); + var id = new FileAttributeEntity.FileAttributeEntityId(); + id.setFileId(file.getId()); + id.setFileAttributeConfigId(configuration.stream() + .filter(c -> c.getId().equals(entry.getKey())) + .findAny() + .map(FileAttributeConfigEntity::getId) + .orElseThrow(() -> new BadRequestException("Invalid File Attribute Id"))); + fa.setFileAttributeId(id); + fa.setValue(StringUtils.isBlank(entry.getValue()) ? null : entry.getValue()); + return fa; + }).collect(Collectors.toList()); + } + + @Transactional(value = Transactional.TxType.REQUIRES_NEW) public void addFileAttributes(String dossierId, String fileId, Set fileAttributes) { @@ -252,14 +296,6 @@ public class FileStatusPersistenceService { } - @Transactional - public void deleteFileAttributes(String fileId) { - - fileAttributesRepository.deleteByFileId(fileId); - - } - - public FileEntity getStatus(String fileId) { return fileRepository.findById(fileId).orElseThrow(() -> new NotFoundException("Unknown file=" + fileId)); @@ -422,6 +458,14 @@ public class FileStatusPersistenceService { } + @Transactional + public void deleteFileAttributes(String fileId) { + + fileAttributesRepository.deleteByFileId(fileId); + + } + + @Transactional public void setLastRedactionModificationDateForFile(String fileId, OffsetDateTime changeDate) { @@ -474,50 +518,6 @@ public class FileStatusPersistenceService { } - private int calculateProcessingErrorCounter(String fileId, ProcessingStatus processingStatus) { - - switch (processingStatus) { - case ERROR: - return fileRepository.findById(fileId).map(FileEntity::getProcessingErrorCounter).orElse(0) + 1; - - case PROCESSED: - case REPROCESS: - return 0; - - default: - return fileRepository.findById(fileId).map(FileEntity::getProcessingErrorCounter).orElse(0); - } - - } - - - private boolean isFileDeleted(String fileId) { - - return fileRepository.findById(fileId).map(FileEntity::isSoftOrHardDeleted).orElse(false); - } - - - private List convertFileAttributes(String dossierId, FileEntity file, Map fileAttributesMap) { - - var dossier = dossierService.getAndValidateDossier(dossierId); - List configuration = fileAttributeConfigPersistenceService.getFileAttributes(dossier.getDossierTemplateId()); - - return fileAttributesMap.entrySet().stream().map(entry -> { - var fa = new FileAttributeEntity(); - var id = new FileAttributeEntity.FileAttributeEntityId(); - id.setFileId(file.getId()); - id.setFileAttributeConfigId(configuration.stream() - .filter(c -> c.getId().equals(entry.getKey())) - .findAny() - .map(FileAttributeConfigEntity::getId) - .orElseThrow(() -> new BadRequestException("Invalid File Attribute Id"))); - fa.setFileAttributeId(id); - fa.setValue(StringUtils.isBlank(entry.getValue()) ? null : entry.getValue()); - return fa; - }).collect(Collectors.toList()); - } - - public void updateOCRStatus(OCRStatusUpdateResponse response) { fileRepository.updateOCRStatus(response.getFileId(), @@ -526,4 +526,5 @@ public class FileStatusPersistenceService { response.isOcrFinished() ? OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS) : null, OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS)); } + } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/LegalBasisMappingPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/LegalBasisMappingPersistenceService.java index 7c74457dd..41db7acd2 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/LegalBasisMappingPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/LegalBasisMappingPersistenceService.java @@ -13,7 +13,7 @@ import org.springframework.stereotype.Service; import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.LegalBasisEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.LegalBasisMappingEntity; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.LegalBasisMappingRepository; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.legalbasis.LegalBasis; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.legalbasis.LegalBasis; import lombok.RequiredArgsConstructor; @@ -37,6 +37,20 @@ public class LegalBasisMappingPersistenceService { } + private LegalBasisMappingEntity getLegalBasisMappingOrCreate(String dossierTemplateId) { + + return legalBasisMappingRepository.findById(dossierTemplateId).orElseGet(() -> { + // create on get if not present + var lbm = new LegalBasisMappingEntity(); + lbm.setDossierTemplateId(dossierTemplateId); + lbm.setLegalBasis(new ArrayList<>()); + lbm.setVersion(1); + return legalBasisMappingRepository.save(lbm); + + }); + } + + @Transactional public void addOrUpdateLegalBasis(String dossierTemplateId, LegalBasis legalBasis) { @@ -80,20 +94,6 @@ public class LegalBasisMappingPersistenceService { } - private LegalBasisMappingEntity getLegalBasisMappingOrCreate(String dossierTemplateId) { - - return legalBasisMappingRepository.findById(dossierTemplateId).orElseGet(() -> { - // create on get if not present - var lbm = new LegalBasisMappingEntity(); - lbm.setDossierTemplateId(dossierTemplateId); - lbm.setLegalBasis(new ArrayList<>()); - lbm.setVersion(1); - return legalBasisMappingRepository.save(lbm); - - }); - } - - public long getVersion(String dossierTemplateId) { return legalBasisMappingRepository.findById(dossierTemplateId).map(LegalBasisMappingEntity::getVersion).orElse(0L); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/NotificationEmailService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/NotificationEmailService.java index b8096ee43..c6d178f24 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/NotificationEmailService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/NotificationEmailService.java @@ -5,7 +5,7 @@ import java.util.List; import org.springframework.stereotype.Service; import com.iqser.red.service.persistence.management.v1.processor.entity.notification.NotificationEntity; -import com.iqser.red.service.persistence.service.v1.api.model.notification.EmailNotificationType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.notification.EmailNotificationType; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -30,9 +30,9 @@ public class NotificationEmailService { } - private void sendWeeklySummaryEmail(String userId, List notifications) { + private void sendDailyEmail(String userId, List notifications) { - log.info("Should send weekly notification summary email for {}", userId); + log.info("Should send daily notification email for {}", userId); // TODO } @@ -44,9 +44,9 @@ public class NotificationEmailService { } - private void sendDailyEmail(String userId, List notifications) { + private void sendWeeklySummaryEmail(String userId, List notifications) { - log.info("Should send daily notification email for {}", userId); + log.info("Should send weekly notification summary email for {}", userId); // TODO } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/NotificationPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/NotificationPersistenceService.java index a6473be89..a6af880e4 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/NotificationPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/NotificationPersistenceService.java @@ -12,8 +12,8 @@ import org.springframework.stereotype.Service; import com.iqser.red.service.persistence.management.v1.processor.entity.notification.NotificationEntity; import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.NotificationRepository; -import com.iqser.red.service.persistence.service.v1.api.model.audit.AddNotificationRequest; -import com.iqser.red.service.persistence.service.v1.api.model.notification.EmailNotificationType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AddNotificationRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.notification.EmailNotificationType; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; @@ -37,6 +37,7 @@ public class NotificationPersistenceService { @SneakyThrows + @Transactional public void insertNotification(AddNotificationRequest addNotificationRequest) { var notification = new NotificationEntity(); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/NotificationPreferencesPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/NotificationPreferencesPersistenceService.java index d6605b8ec..0ebf575e6 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/NotificationPreferencesPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/NotificationPreferencesPersistenceService.java @@ -17,8 +17,9 @@ import org.springframework.stereotype.Service; import com.iqser.red.service.persistence.management.v1.processor.entity.notification.NotificationPreferencesEntity; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.NotificationPreferencesRepository; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.NotificationRepository; -import com.iqser.red.service.persistence.service.v1.api.model.notification.NotificationPreferences; -import com.iqser.red.service.persistence.service.v1.api.model.notification.NotificationType; +import com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter; +import com.iqser.red.service.persistence.service.v1.api.shared.model.notification.NotificationPreferences; +import com.iqser.red.service.persistence.service.v1.api.shared.model.notification.NotificationType; import lombok.AccessLevel; import lombok.RequiredArgsConstructor; @@ -72,7 +73,7 @@ public class NotificationPreferencesPersistenceService { // This method intentionally does not have a @Transactional annotation, since it needs to handle an underlying transaction exception. - public NotificationPreferencesEntity getOrCreateNotificationPreferences(String userId) { + public NotificationPreferences getOrCreateNotificationPreferences(String userId) { try { // The method called here will fail if it is called concurrently (more than 1 thread), since it will always try to create @@ -80,7 +81,7 @@ public class NotificationPreferencesPersistenceService { // In that case we can just fetch the data from the db. return notificationPreferencesRepositoryWrapper.getOrCreateNotificationPreferences(userId); } catch (DataIntegrityViolationException ex) { - return notificationPreferencesRepository.getByUserId(userId); + return notificationPreferencesRepositoryWrapper.getByUserId(userId); } } @@ -105,11 +106,17 @@ public class NotificationPreferencesPersistenceService { NotificationPreferencesRepository notificationPreferencesRepository; + @Transactional(Transactional.TxType.REQUIRES_NEW) + public NotificationPreferences getByUserId(String userId){ + return convertPreferences(notificationPreferencesRepository.getByUserId(userId)); + } + + @Transactional(Transactional.TxType.REQUIRES_NEW) - public NotificationPreferencesEntity getOrCreateNotificationPreferences(String userId) { + public NotificationPreferences getOrCreateNotificationPreferences(String userId) { - return notificationPreferencesRepository.findByUserId(userId).orElseGet(() -> { + var preferences = notificationPreferencesRepository.findByUserId(userId).orElseGet(() -> { var notificationPreference = new NotificationPreferencesEntity(); notificationPreference.setUserId(userId); @@ -118,6 +125,16 @@ public class NotificationPreferencesPersistenceService { notificationPreference.setInAppNotifications(Arrays.stream(NotificationType.values()).map(Enum::name).collect(Collectors.toList())); return notificationPreferencesRepository.save(notificationPreference); }); + + return convertPreferences(preferences); + + } + + private NotificationPreferences convertPreferences(NotificationPreferencesEntity preferences){ + var result = MagicConverter.convert(preferences, NotificationPreferences.class); + result.setInAppNotifications(new ArrayList<>(preferences.getInAppNotifications())); + result.setEmailNotifications(new ArrayList<>(preferences.getEmailNotifications())); + return result; } } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/ReportTemplatePersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/ReportTemplatePersistenceService.java index 77d891973..682cc72b9 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/ReportTemplatePersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/ReportTemplatePersistenceService.java @@ -12,7 +12,7 @@ import com.iqser.red.service.persistence.management.v1.processor.entity.dossier. import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierTemplateRepository; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.ReportTemplateRepository; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.ReportTemplateUpdateRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.ReportTemplateUpdateRequest; import lombok.RequiredArgsConstructor; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/SMTPConfigurationService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/SMTPConfigurationService.java index bc0d03a56..69c3b17a7 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/SMTPConfigurationService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/SMTPConfigurationService.java @@ -1,23 +1,90 @@ package com.iqser.red.service.persistence.management.v1.processor.service.persistence; +import javax.transaction.Transactional; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.SMTPConfigurationEntity; import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; +import com.iqser.red.service.persistence.management.v1.processor.service.EmailService; import com.iqser.red.service.persistence.management.v1.processor.service.EncryptionDecryptionService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.SMTPRepository; +import com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.SMTPConfiguration; + import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import javax.transaction.Transactional; @Slf4j @Service @RequiredArgsConstructor public class SMTPConfigurationService { - private final SMTPRepository smtpRepository; - + private final static String DEFAULT_PASSWORD = "********"; private final EncryptionDecryptionService encryptionDecryptionService; + private final SMTPRepository smtpRepository; + private final EmailService emailService; + + + public void updateSMTPConfiguration(SMTPConfiguration smtpConfiguration) { + + updatePassword(smtpConfiguration); + saveConfiguration(MagicConverter.convert(smtpConfiguration, SMTPConfigurationEntity.class)); + } + + + private void updatePassword(SMTPConfiguration smtpConfiguration) { + + if (DEFAULT_PASSWORD.equals(smtpConfiguration.getPassword())) { + try { + var currentSMTPConfig = getCurrentSMTPConfiguration(false); + smtpConfiguration.setPassword(currentSMTPConfig.getPassword()); + } catch (Exception e) { + log.debug("No current SMTP Config exists", e); + } + } else { + smtpConfiguration.setPassword(encryptionDecryptionService.encrypt(smtpConfiguration.getPassword())); + } + } + + + private SMTPConfigurationEntity saveConfiguration(SMTPConfigurationEntity smtpConfiguration) { + + return smtpRepository.save(smtpConfiguration); + } + + + public SMTPConfiguration getCurrentSMTPConfiguration(boolean maskPassword) { + + var smtpConfiguration = getConfiguration(); + if (smtpConfiguration.isAuth() && maskPassword) { + smtpConfiguration.setPassword(DEFAULT_PASSWORD); + } + return MagicConverter.convert(smtpConfiguration, SMTPConfiguration.class); + } + + + private SMTPConfigurationEntity getConfiguration() { + + return smtpRepository.findById(SMTPConfigurationEntity.ID).orElseThrow(() -> new NotFoundException("SMTP Configuration not found")); + } + + + public void testSMTPConfiguration(String testEmail, SMTPConfiguration smtpConfiguration) { + + String targetEmail = null; + if (StringUtils.isBlank(testEmail)) { + // will send e-mail to self in case testEmail is not set + targetEmail = smtpConfiguration.getFrom(); + } else { + targetEmail = testEmail; + } + + updatePassword(smtpConfiguration); + smtpConfiguration.setPassword(encryptionDecryptionService.decrypt(smtpConfiguration.getPassword())); + emailService.send(smtpConfiguration, targetEmail, "Redaction Test Message", "This is a test message"); + } @Transactional @@ -27,22 +94,12 @@ public class SMTPConfigurationService { } - public SMTPConfigurationEntity getConfiguration() { - - return smtpRepository.findById(SMTPConfigurationEntity.ID).orElseThrow(() -> new NotFoundException("SMTP Configuration not found")); - } - - - public SMTPConfigurationEntity saveConfiguration(SMTPConfigurationEntity smtpConfiguration) { - - return smtpRepository.save(smtpConfiguration); - } - @Transactional public void encryptPasswordIfNecessary() { + var smtpConfigurationOptional = smtpRepository.findById(SMTPConfigurationEntity.ID); - if(smtpConfigurationOptional.isPresent()) { + if (smtpConfigurationOptional.isPresent()) { var smtpConfiguration = smtpConfigurationOptional.get(); try { // this makes the migration idempotent, since an exception will be thrown if the password can't be decrypted @@ -54,7 +111,7 @@ public class SMTPConfigurationService { log.info("Encrypting SMTP Password for id {}", smtpConfiguration.getId()); smtpConfiguration.setPassword(encryptionDecryptionService.encrypt(smtpConfiguration.getPassword())); } - }else{ + } else { log.info("NO SMPT Configuration present for migration!"); } } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/annotations/AddRedactionPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/annotations/AddRedactionPersistenceService.java index 9e441dcbb..d82202d53 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/annotations/AddRedactionPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/annotations/AddRedactionPersistenceService.java @@ -16,10 +16,10 @@ import com.iqser.red.service.persistence.management.v1.processor.entity.annotati import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.RectangleEntity; import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.ManualRedactionRepository; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.AddRedactionRequest; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.Rectangle; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.entitymapped.ManualRedactionEntry; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AddRedactionRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.Rectangle; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualRedactionEntry; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -51,13 +51,6 @@ public class AddRedactionPersistenceService { } - @Transactional - public void updateSurroundingText(AnnotationEntityId id, String textBefore, String textAfter) { - - manualRedactionRepository.updateSurroundingText(id, textBefore, textAfter); - } - - private List convert(List positions) { List rectangleEntities = new ArrayList<>(); @@ -70,6 +63,13 @@ public class AddRedactionPersistenceService { } + @Transactional + public void updateSurroundingText(AnnotationEntityId id, String textBefore, String textAfter) { + + manualRedactionRepository.updateSurroundingText(id, textBefore, textAfter); + } + + public ManualRedactionEntryEntity findAddRedaction(String fileId, String annotationId) { return manualRedactionRepository.findAddRedaction(new AnnotationEntityId(annotationId, fileId)) diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/annotations/ForceRedactionPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/annotations/ForceRedactionPersistenceService.java index 1687606fd..5d3ff12b3 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/annotations/ForceRedactionPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/annotations/ForceRedactionPersistenceService.java @@ -14,9 +14,8 @@ import com.iqser.red.service.persistence.management.v1.processor.entity.annotati import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ManualForceRedactionEntity; import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.ForceRedactionRepository; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.ForceRedactionRequest; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.entitymapped.ManualForceRedaction; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ForceRedactionRequest; import lombok.RequiredArgsConstructor; @@ -77,6 +76,7 @@ public class ForceRedactionPersistenceService { return new HashSet<>(forceRedactionRepository.findByFileIdIncludeDeletions(fileId, includeDeletions)); } + @Transactional public void markAsProcessed(String annotationId, String fileId) { diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/annotations/ImageRecategorizationPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/annotations/ImageRecategorizationPersistenceService.java index 62863f025..044756cd5 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/annotations/ImageRecategorizationPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/annotations/ImageRecategorizationPersistenceService.java @@ -13,9 +13,8 @@ import com.iqser.red.service.persistence.management.v1.processor.entity.annotati import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ManualImageRecategorizationEntity; import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.ImageRecategorizationRepository; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.ImageRecategorizationRequest; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.entitymapped.ManualImageRecategorization; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ImageRecategorizationRequest; import lombok.RequiredArgsConstructor; @@ -78,6 +77,7 @@ public class ImageRecategorizationPersistenceService { } + @Transactional public void markAsProcessed(String annotationId, String fileId) { diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/annotations/LegalBasisChangePersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/annotations/LegalBasisChangePersistenceService.java index 4c6bff0e9..c821905d1 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/annotations/LegalBasisChangePersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/annotations/LegalBasisChangePersistenceService.java @@ -14,8 +14,8 @@ import com.iqser.red.service.persistence.management.v1.processor.entity.annotati import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ManualLegalBasisChangeEntity; import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.LegalBasisChangeRepository; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.LegalBasisChangeRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.LegalBasisChangeRequest; import lombok.RequiredArgsConstructor; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/annotations/RemoveRedactionPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/annotations/RemoveRedactionPersistenceService.java index 27e3af474..84ac2a931 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/annotations/RemoveRedactionPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/annotations/RemoveRedactionPersistenceService.java @@ -15,9 +15,9 @@ import com.iqser.red.service.persistence.management.v1.processor.entity.annotati import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.IdRemovalEntity; import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.RemoveRedactionRepository; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.RemoveRedactionRequest; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.entitymapped.IdRemoval; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.RemoveRedactionRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.IdRemoval; import lombok.RequiredArgsConstructor; @@ -89,9 +89,7 @@ public class RemoveRedactionPersistenceService { @Transactional public void updateStatus(String fileId, String annotationId, AnnotationStatus annotationStatus, boolean isAddOrRemoveFromDictionary) { - removeRedactionRepository.updateStatusAndRemoveFromDictionary(new AnnotationEntityId(annotationId, fileId), - annotationStatus, - isAddOrRemoveFromDictionary); + removeRedactionRepository.updateStatusAndRemoveFromDictionary(new AnnotationEntityId(annotationId, fileId), annotationStatus, isAddOrRemoveFromDictionary); } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/annotations/ResizeRedactionPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/annotations/ResizeRedactionPersistenceService.java index 4f6d4d719..198183408 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/annotations/ResizeRedactionPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/annotations/ResizeRedactionPersistenceService.java @@ -1,7 +1,5 @@ package com.iqser.red.service.persistence.management.v1.processor.service.persistence.annotations; -import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; - import java.time.OffsetDateTime; import java.time.temporal.ChronoUnit; import java.util.List; @@ -16,8 +14,9 @@ import com.iqser.red.service.persistence.management.v1.processor.entity.annotati import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.RectangleEntity; import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.ResizeRedactionRepository; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.ResizeRedactionRequest; +import com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ResizeRedactionRequest; import lombok.RequiredArgsConstructor; @@ -34,10 +33,11 @@ public class ResizeRedactionPersistenceService { ManualResizeRedactionEntity manualResizeRedaction = new ManualResizeRedactionEntity(); manualResizeRedaction.setId(new AnnotationEntityId(resizeRedactionRequest.getAnnotationId(), fileId)); BeanUtils.copyProperties(resizeRedactionRequest, manualResizeRedaction); - manualResizeRedaction.setPositions(convert(resizeRedactionRequest.getPositions(), RectangleEntity.class)); + manualResizeRedaction.setPositions(MagicConverter.convert(resizeRedactionRequest.getPositions(), RectangleEntity.class)); manualResizeRedaction.setRequestDate(OffsetDateTime.now()); - if (manualResizeRedaction.getStatus().equals(AnnotationStatus.APPROVED) && (manualResizeRedaction.getUpdateDictionary() == null || !manualResizeRedaction.getUpdateDictionary())) { + if (manualResizeRedaction.getStatus() + .equals(AnnotationStatus.APPROVED) && (manualResizeRedaction.getUpdateDictionary() == null || !manualResizeRedaction.getUpdateDictionary())) { manualResizeRedaction.setProcessedDate(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS)); } @@ -98,7 +98,9 @@ public class ResizeRedactionPersistenceService { return resizeRedactionRepository.findByStatusAndValue(status, value); } - public void markAsProcessed(String annotationId, String fileId){ + + public void markAsProcessed(String annotationId, String fileId) { + resizeRedactionRepository.markAsProcessed(new AnnotationEntityId(annotationId, fileId), OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS)); } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/mulitenancy/DynamicDataSourceBasedMultiTenantConnectionProvider.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/mulitenancy/DynamicDataSourceBasedMultiTenantConnectionProvider.java index ced7a24bf..66d62f68a 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/mulitenancy/DynamicDataSourceBasedMultiTenantConnectionProvider.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/mulitenancy/DynamicDataSourceBasedMultiTenantConnectionProvider.java @@ -66,24 +66,6 @@ public class DynamicDataSourceBasedMultiTenantConnectionProvider extends Abstrac } - @Override - protected DataSource selectAnyDataSource() { - - return masterDataSource; - } - - - @Override - public DataSource selectDataSource(String tenantIdentifier) { - - try { - return tenantDataSources.get(tenantIdentifier); - } catch (ExecutionException e) { - throw new RuntimeException("Failed to load DataSource for tenant: " + tenantIdentifier); - } - } - - private DataSource createAndConfigureDataSource(TenantEntity tenant) { String decryptedPassword = encryptionService.decrypt(tenant.getDatabaseConnection().getPassword()); @@ -103,6 +85,21 @@ public class DynamicDataSourceBasedMultiTenantConnectionProvider extends Abstrac } + @Override + protected DataSource selectAnyDataSource() { + return masterDataSource; + } + + + @Override + public DataSource selectDataSource(String tenantIdentifier) { + + try { + return tenantDataSources.get(tenantIdentifier); + } catch (ExecutionException e) { + throw new RuntimeException("Failed to load DataSource for tenant: " + tenantIdentifier); + } + } } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/mulitenancy/MultiTenantDataSource.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/mulitenancy/MultiTenantDataSource.java new file mode 100644 index 000000000..888e32447 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/mulitenancy/MultiTenantDataSource.java @@ -0,0 +1,96 @@ +package com.iqser.red.service.persistence.management.v1.processor.service.persistence.mulitenancy; + +import java.io.PrintWriter; +import java.sql.Connection; +import java.sql.ConnectionBuilder; +import java.sql.SQLException; +import java.sql.SQLFeatureNotSupportedException; +import java.sql.ShardingKeyBuilder; +import java.util.logging.Logger; + +import javax.sql.DataSource; + +import org.springframework.stereotype.Component; + +import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; + +import lombok.RequiredArgsConstructor; + +@Component +@RequiredArgsConstructor +public class MultiTenantDataSource implements DataSource { + + private final DynamicDataSourceBasedMultiTenantConnectionProvider dsd; + + private DataSource getActiveDataSource(){ + return dsd.selectDataSource(TenantContext.getTenantId()); + } + + @Override + public Connection getConnection() throws SQLException { + return getActiveDataSource().getConnection(); + } + + + @Override + public Connection getConnection(String username, String password) throws SQLException { + return getActiveDataSource().getConnection(username,password); + } + + + @Override + public PrintWriter getLogWriter() throws SQLException { + return getActiveDataSource().getLogWriter(); + } + + + @Override + public void setLogWriter(PrintWriter out) throws SQLException { + getActiveDataSource().setLogWriter(out); + } + + + @Override + public void setLoginTimeout(int seconds) throws SQLException { + getActiveDataSource().setLoginTimeout(seconds); + } + + + @Override + public int getLoginTimeout() throws SQLException { + return getActiveDataSource().getLoginTimeout(); + } + + + @Override + public ConnectionBuilder createConnectionBuilder() throws SQLException { + + return DataSource.super.createConnectionBuilder(); + } + + + @Override + public Logger getParentLogger() throws SQLFeatureNotSupportedException { + return getActiveDataSource().getParentLogger(); + } + + + @Override + public ShardingKeyBuilder createShardingKeyBuilder() throws SQLException { + return DataSource.super.createShardingKeyBuilder(); + } + + + @Override + public T unwrap(Class iface) throws SQLException { + + return getActiveDataSource().unwrap(iface); + } + + + @Override + public boolean isWrapperFor(Class iface) throws SQLException { + return getActiveDataSource().isWrapperFor(iface); + } + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/projection/FileProcessingStatusProjection.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/projection/FileProcessingStatusProjection.java index a28f5c11e..95612a89c 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/projection/FileProcessingStatusProjection.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/projection/FileProcessingStatusProjection.java @@ -1,6 +1,6 @@ package com.iqser.red.service.persistence.management.v1.processor.service.persistence.projection; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.ProcessingStatus; public interface FileProcessingStatusProjection { diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/projection/FileWorkflowStatusProjection.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/projection/FileWorkflowStatusProjection.java index aea0c6aa8..b74041d1f 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/projection/FileWorkflowStatusProjection.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/projection/FileWorkflowStatusProjection.java @@ -1,6 +1,6 @@ package com.iqser.red.service.persistence.management.v1.processor.service.persistence.projection; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus; public interface FileWorkflowStatusProjection { diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/AuditRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/AuditRepository.java index 4da24ce92..96bf4e592 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/AuditRepository.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/AuditRepository.java @@ -9,7 +9,7 @@ import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.Query; import com.iqser.red.service.persistence.management.v1.processor.entity.audit.AuditEntity; -import com.iqser.red.service.persistence.service.v1.api.model.audit.CategoryModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.CategoryModel; public interface AuditRepository extends JpaRepository, JpaSpecificationExecutor { @@ -37,7 +37,7 @@ public interface AuditRepository extends JpaRepository, JpaSp } - @Query("SELECT new com.iqser.red.service.persistence.service.v1.api.model.audit.CategoryModel(a.category, count(a)) FROM AuditEntity a GROUP BY a.category") + @Query("SELECT new com.iqser.red.service.persistence.service.v1.api.shared.model.audit.CategoryModel(a.category, count(a)) FROM AuditEntity a GROUP BY a.category") List findCategories(); } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/CustomPermissionRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/CustomPermissionRepository.java new file mode 100644 index 000000000..7814a4ea8 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/CustomPermissionRepository.java @@ -0,0 +1,18 @@ +package com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository; + +import java.util.List; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; + +import com.iqser.red.service.persistence.management.v1.processor.entity.permissions.CustomPermissionEntity; + +public interface CustomPermissionRepository extends JpaRepository { + + List findByTargetObject(String targetObject); + + + @Modifying(flushAutomatically = true, clearAutomatically = true) + void deleteByTargetObject(String targetObject); + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DossierStatusRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DossierStatusRepository.java index e1da1ed37..0872e9e4e 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DossierStatusRepository.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DossierStatusRepository.java @@ -8,15 +8,15 @@ import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierStatusEntity; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierStatusInfo; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.DossierStatusInfo; public interface DossierStatusRepository extends JpaRepository { - @Query("select new com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierStatusInfo(s.id, s.name," + "s.description, s.color, s.dossierTemplateId, s.rank, count(d)) from DossierStatusEntity s " + "left outer join s.dossiers d where s.dossierTemplateId in (:dossierTemplateIds) group by s order by s.rank ASC") + @Query("select new com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.DossierStatusInfo(s.id, s.name," + "s.description, s.color, s.dossierTemplateId, s.rank, count(d)) from DossierStatusEntity s " + "left outer join s.dossiers d where s.dossierTemplateId in (:dossierTemplateIds) group by s order by s.rank ASC") List getAllDossierStatusForDossierTemplate(List dossierTemplateIds); - @Query("select new com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierStatusInfo(s.id, s.name," + "s.description, s.color, s.dossierTemplateId, s.rank, count(d)) from DossierStatusEntity s left outer join s.dossiers d where s.id = :dossierStatusId group by s") + @Query("select new com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.DossierStatusInfo(s.id, s.name," + "s.description, s.color, s.dossierTemplateId, s.rank, count(d)) from DossierStatusEntity s left outer join s.dossiers d where s.id = :dossierStatusId group by s") Optional findProjectionById(String dossierStatusId); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DownloadStatusRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DownloadStatusRepository.java index a95c7991c..385575f15 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DownloadStatusRepository.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DownloadStatusRepository.java @@ -8,7 +8,7 @@ import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import com.iqser.red.service.persistence.management.v1.processor.entity.download.DownloadStatusEntity; -import com.iqser.red.service.persistence.service.v1.api.model.download.DownloadStatusValue; +import com.iqser.red.service.persistence.service.v1.api.shared.model.download.DownloadStatusValue; public interface DownloadStatusRepository extends JpaRepository { diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/EntryRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/EntryRepository.java index 469e6bc02..6dc829216 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/EntryRepository.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/EntryRepository.java @@ -31,7 +31,7 @@ public interface EntryRepository extends JpaRepository findByTypeIdAndVersionGreaterThan(String typeId, long version); - @Modifying + @Modifying(flushAutomatically = true, clearAutomatically = true) @Transactional @Query("update DictionaryEntryEntity e set e.deleted = true, e.version = :version where e.typeId = :typeId") void deleteAllEntriesForTypeId(String typeId, long version); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/FileRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/FileRepository.java index 52577bf5e..61ecef7f4 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/FileRepository.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/FileRepository.java @@ -14,8 +14,8 @@ import com.iqser.red.service.persistence.management.v1.processor.entity.dossier. import com.iqser.red.service.persistence.management.v1.processor.service.persistence.projection.FilePageCountsProjection; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.projection.FileProcessingStatusProjection; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.projection.FileWorkflowStatusProjection; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.ProcessingStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus; public interface FileRepository extends JpaRepository { @@ -82,7 +82,7 @@ public interface FileRepository extends JpaRepository { void updateProcessingStatus(String fileId, ProcessingStatus processingStatus, OffsetDateTime lastUpdated, int processingErrorCounter); - @Modifying(clearAutomatically = true) + @Modifying(clearAutomatically = true, flushAutomatically = true) @Query("update FileEntity f set f.processingStatus = :processingStatus, f.lastUpdated = :lastUpdated, f.lastProcessed = :lastProcessed, f.processingErrorCounter = :processingErrorCounter " + "where f.id = :fileId") void updateProcessingStatus(String fileId, ProcessingStatus processingStatus, OffsetDateTime lastUpdated, OffsetDateTime lastProcessed, int processingErrorCounter); @@ -125,7 +125,7 @@ public interface FileRepository extends JpaRepository { @Modifying @Query("update FileEntity f set f.assignee = :assignee, f.lastReviewer = :lastReviewer, f.lastApprover = :lastApprover, " + "f.lastUpdated = :lastUpdated where f.id = :fileId") int setAssignee(String fileId, String assignee, String lastReviewer, String lastApprover, OffsetDateTime lastUpdated); - + @Modifying(clearAutomatically = true) @Query("update FileEntity f set f.excluded = :excluded, f.lastUpdated = :lastUpdated where f.id = :fileId") diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/ForceRedactionRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/ForceRedactionRepository.java index 80e2cdacc..daf5f0c43 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/ForceRedactionRepository.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/ForceRedactionRepository.java @@ -10,7 +10,7 @@ import org.springframework.data.jpa.repository.Query; import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.AnnotationEntityId; import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ManualForceRedactionEntity; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; public interface ForceRedactionRepository extends JpaRepository { diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/ImageRecategorizationRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/ImageRecategorizationRepository.java index 977e0602e..af5c554fb 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/ImageRecategorizationRepository.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/ImageRecategorizationRepository.java @@ -10,7 +10,7 @@ import org.springframework.data.jpa.repository.Query; import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.AnnotationEntityId; import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ManualImageRecategorizationEntity; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; public interface ImageRecategorizationRepository extends JpaRepository { diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/LegalBasisChangeRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/LegalBasisChangeRepository.java index d3cc4d58e..db4a2bca2 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/LegalBasisChangeRepository.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/LegalBasisChangeRepository.java @@ -10,7 +10,7 @@ import org.springframework.data.jpa.repository.Query; import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.AnnotationEntityId; import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ManualLegalBasisChangeEntity; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; public interface LegalBasisChangeRepository extends JpaRepository { diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/ManualRedactionRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/ManualRedactionRepository.java index 8eb8f8cae..7647db454 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/ManualRedactionRepository.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/ManualRedactionRepository.java @@ -11,7 +11,7 @@ import org.springframework.data.jpa.repository.Query; import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.AnnotationEntityId; import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ManualRedactionEntryEntity; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; public interface ManualRedactionRepository extends JpaRepository { diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/RemoveRedactionRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/RemoveRedactionRepository.java index 1214a0d7d..17444e82f 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/RemoveRedactionRepository.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/RemoveRedactionRepository.java @@ -10,7 +10,7 @@ import org.springframework.data.jpa.repository.Query; import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.AnnotationEntityId; import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.IdRemovalEntity; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; public interface RemoveRedactionRepository extends JpaRepository { diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/ResizeRedactionRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/ResizeRedactionRepository.java index 4dcb6e4b5..1fcf852ee 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/ResizeRedactionRepository.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/ResizeRedactionRepository.java @@ -10,7 +10,7 @@ import org.springframework.data.jpa.repository.Query; import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.AnnotationEntityId; import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ManualResizeRedactionEntity; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; public interface ResizeRedactionRepository extends JpaRepository { @@ -42,6 +42,7 @@ public interface ResizeRedactionRepository extends JpaRepository findByStatusAndValue(AnnotationStatus status, String value); + @Modifying @Query("update ManualResizeRedactionEntity mir set mir.processedDate = :processedDate where mir.id = :annotationEntityId") void markAsProcessed(AnnotationEntityId annotationEntityId, OffsetDateTime processedDate); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/TypeRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/TypeRepository.java index 280654224..cd8e77e74 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/TypeRepository.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/TypeRepository.java @@ -9,7 +9,7 @@ import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.TypeEntity; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.DictionarySummaryResponse; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionarySummaryResponse; public interface TypeRepository extends JpaRepository { @@ -45,7 +45,7 @@ public interface TypeRepository extends JpaRepository { long getVersionForDossierTemplateId(String dossierTemplateId); - @Query("select new com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.DictionarySummaryResponse(dt.id, t.id, t.type, t.label, count(e)) " + "from DossierTemplateEntity dt " + "left join TypeEntity t on t.dossierTemplateId = dt.id " + "left join DictionaryEntryEntity e on e.typeId = t.id " + "where t.softDeletedTime is null and dt.id in :dossierTemplateIds and t.dossierId is null and (e.id is null or e.deleted = false) " + "group by dt.id, t.id, t.type, t.label ") + @Query("select new com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionarySummaryResponse(dt.id, t.id, t.type, t.label, count(e)) " + "from DossierTemplateEntity dt " + "left join TypeEntity t on t.dossierTemplateId = dt.id " + "left join DictionaryEntryEntity e on e.typeId = t.id " + "where t.softDeletedTime is null and dt.id in :dossierTemplateIds and t.dossierId is null and (e.id is null or e.deleted = false) " + "group by dt.id, t.id, t.type, t.label ") List findDictionarySummaryList(Set dossierTemplateIds); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/redactionlog/RedactionLogMergeService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/redactionlog/RedactionLogMergeService.java new file mode 100644 index 000000000..7e3844031 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/redactionlog/RedactionLogMergeService.java @@ -0,0 +1,527 @@ +package com.iqser.red.service.persistence.management.v1.processor.service.redactionlog; + +import java.awt.Color; +import java.time.OffsetDateTime; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; + +import org.springframework.stereotype.Service; + +import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; +import com.iqser.red.service.persistence.management.v1.processor.service.FileManagementStorageService; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.Comment; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ManualRedactions; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.IdRemoval; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualForceRedaction; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualImageRecategorization; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualLegalBasisChange; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualRedactionEntry; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualResizeRedaction; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.Colors; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.Type; +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Change; +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.ChangeType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.ManualChange; +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.ManualRedactionType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Point; +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Rectangle; +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLog; +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLogComment; +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLogEntry; +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.section.SectionGrid; + +import io.micrometer.core.annotation.Timed; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Service +@RequiredArgsConstructor +public class RedactionLogMergeService { + + private static final String DELETED_TYPE_COLOR = "#9398a0"; + private final SectionTextService sectionTextService; + private final FileManagementStorageService fileManagementStorageService; + + + @Timed("redactmanager_getMergedRedactionLog") + public RedactionLog provideRedactionLog(RedactionRequest redactionRequest) { + + log.debug("Requested preview for: {}", redactionRequest); + + var redactionLog = fileManagementStorageService.getRedactionLog(redactionRequest.getDossierId(), redactionRequest.getFileId()); + + if (redactionLog == null) { + throw new NotFoundException("RedactionLog not present"); + } + + var sectionGrid = fileManagementStorageService.getSectionGrid(redactionRequest.getDossierId(), redactionRequest.getFileId()); + + + log.debug("Loaded redaction log with computationalVersion: {}", redactionLog.getAnalysisVersion()); + var merged = mergeRedactionLogData(redactionLog, + sectionGrid, + redactionRequest.getManualRedactions(), + redactionRequest.getExcludedPages(), + redactionRequest.getTypes(), + redactionRequest.getColors()); + + merged.getRedactionLogEntry().removeIf(e -> e.isFalsePositive() && !redactionRequest.isIncludeFalsePositives()); + + return merged; + } + + + private RedactionLog mergeRedactionLogData(RedactionLog redactionLog, + SectionGrid sectionGrid, + ManualRedactions manualRedactions, + Set excludedPages, + List types, + Colors colors) { + + var skippedImportedRedactions = new HashSet<>(); + log.info("Merging Redaction log with manual redactions"); + if (manualRedactions != null) { + + var manualRedactionLogEntries = addManualAddEntries(sectionGrid, + manualRedactions.getEntriesToAdd(), + manualRedactions.getComments(), + colors, + types, + redactionLog.getAnalysisNumber()); + + redactionLog.getRedactionLogEntry().addAll(manualRedactionLogEntries); + + var manualRedactionWrappers = createManualRedactionWrappers(manualRedactions); + + for (RedactionLogEntry entry : redactionLog.getRedactionLogEntry()) { + + processRedactionLogEntry(manualRedactionWrappers.stream().filter(mr -> entry.getId().equals(mr.getId())).collect(Collectors.toList()), entry, types, colors); + + if (entry.isImported() && !entry.isRedacted()) { + skippedImportedRedactions.add(entry.getId()); + } + + entry.setComments(convert(manualRedactions.getComments().get(entry.getId()))); + + if (excludedPages != null && !excludedPages.isEmpty()) { + entry.getPositions().forEach(pos -> { + if (!entry.isLocalManualRedaction() && excludedPages.contains(pos.getPage())) { + entry.setExcluded(true); + } + }); + } + } + + } + + Set processedIds = new HashSet<>(); + redactionLog.getRedactionLogEntry().removeIf(entry -> { + + if (entry.getImportedRedactionIntersections() != null) { + entry.getImportedRedactionIntersections().removeAll(skippedImportedRedactions); + if (!entry.getImportedRedactionIntersections().isEmpty() && (!entry.isImage() || entry.isImage() && !(entry.getType().equals("image") || entry.getType() + .equals("ocr")))) { + return true; + } + } + if (processedIds.contains(entry.getId())) { + log.info("Duplicate annotation found with id {}", entry.getId()); + return true; + } + processedIds.add(entry.getId()); + return false; + }); + return redactionLog; + } + + + private List createManualRedactionWrappers(ManualRedactions manualRedactions) { + + List manualRedactionWrappers = new ArrayList<>(); + + manualRedactions.getImageRecategorization().forEach(item -> { + if (item.getSoftDeletedTime() == null) { + manualRedactionWrappers.add(new ManualRedactionWrapper(item.getAnnotationId(), item.getRequestDate(), item)); + } + }); + + manualRedactions.getIdsToRemove().forEach(item -> { + if (item.getSoftDeletedTime() == null) { + manualRedactionWrappers.add(new ManualRedactionWrapper(item.getAnnotationId(), item.getRequestDate(), item)); + } + }); + + manualRedactions.getForceRedactions().forEach(item -> { + if (item.getSoftDeletedTime() == null) { + manualRedactionWrappers.add(new ManualRedactionWrapper(item.getAnnotationId(), item.getRequestDate(), item)); + } + }); + + manualRedactions.getLegalBasisChanges().forEach(item -> { + if (item.getSoftDeletedTime() == null) { + manualRedactionWrappers.add(new ManualRedactionWrapper(item.getAnnotationId(), item.getRequestDate(), item)); + } + }); + + manualRedactions.getResizeRedactions().forEach(item -> { + if (item.getSoftDeletedTime() == null) { + manualRedactionWrappers.add(new ManualRedactionWrapper(item.getAnnotationId(), item.getRequestDate(), item)); + } + }); + + Collections.sort(manualRedactionWrappers); + + return manualRedactionWrappers; + } + + + private void processRedactionLogEntry(List manualRedactionWrappers, RedactionLogEntry redactionLogEntry, List types, Colors colors) { + + manualRedactionWrappers.forEach(mrw -> { + + if (mrw.getItem() instanceof ManualImageRecategorization) { + var imageRecategorization = (ManualImageRecategorization) mrw.getItem(); + String manualOverrideReason = null; + if (imageRecategorization.getStatus().equals(AnnotationStatus.APPROVED)) { + + redactionLogEntry.setType(imageRecategorization.getType()); + redactionLogEntry.setSection("Image:" + redactionLogEntry.getType()); + + if (isHint(types, imageRecategorization.getType())) { + redactionLogEntry.setRedacted(false); + redactionLogEntry.setHint(true); + } else { + redactionLogEntry.setHint(false); + } + + manualOverrideReason = mergeReasonIfNecessary(redactionLogEntry.getReason(), ", recategorized by manual override"); + } else if (imageRecategorization.getStatus().equals(AnnotationStatus.REQUESTED)) { + manualOverrideReason = mergeReasonIfNecessary(redactionLogEntry.getReason(), ", requested to recategorize"); + redactionLogEntry.setColor(getColor(redactionLogEntry.getType(), colors, false, redactionLogEntry.isRedacted(), false, types)); + } + + if (manualOverrideReason != null) { + redactionLogEntry.setReason(manualOverrideReason); + } + + redactionLogEntry.getManualChanges() + .add(ManualChange.from(imageRecategorization) + .withManualRedactionType(ManualRedactionType.RECATEGORIZE) + .withChange("type", imageRecategorization.getType())); + } + + if (mrw.getItem() instanceof IdRemoval) { + var manualRemoval = (IdRemoval) mrw.getItem(); + if (manualRemoval.getStatus().equals(AnnotationStatus.APPROVED) && manualRemoval.isRemoveFromDictionary()) { + log.debug("Skipping merge for dictionary-modifying entry"); + } else { + String manualOverrideReason = null; + if (manualRemoval.getStatus().equals(AnnotationStatus.APPROVED)) { + redactionLogEntry.setRedacted(false); + manualOverrideReason = mergeReasonIfNecessary(redactionLogEntry.getReason(), ", removed by manual override"); + redactionLogEntry.setColor(getColor(redactionLogEntry.getType(), colors, false, redactionLogEntry.isRedacted(), true, types)); + redactionLogEntry.setHint(false); + } else if (manualRemoval.getStatus().equals(AnnotationStatus.REQUESTED)) { + manualOverrideReason = mergeReasonIfNecessary(redactionLogEntry.getReason(), ", requested to remove"); + redactionLogEntry.setColor(getColor(redactionLogEntry.getType(), colors, true, redactionLogEntry.isRedacted(), false, types)); + } + + if (manualOverrideReason != null) { + redactionLogEntry.setReason(manualOverrideReason); + } + } + + redactionLogEntry.getManualChanges() + .add(ManualChange.from(manualRemoval) + .withManualRedactionType(manualRemoval.isRemoveFromDictionary() ? ManualRedactionType.REMOVE_FROM_DICTIONARY : ManualRedactionType.REMOVE_LOCALLY)); + } + + if (mrw.getItem() instanceof ManualForceRedaction) { + var manualForceRedact = (ManualForceRedaction) mrw.getItem(); + String manualOverrideReason = null; + var dictionaryIsHint = isHint(types, redactionLogEntry.getType()); + if (manualForceRedact.getStatus().equals(AnnotationStatus.APPROVED)) { + // Forcing a skipped hint should result in a hint + if (dictionaryIsHint) { + redactionLogEntry.setHint(true); + } else { + redactionLogEntry.setRedacted(true); + } + redactionLogEntry.setColor(getColor(redactionLogEntry.getType(), colors, false, redactionLogEntry.isRedacted(), false, types)); + manualOverrideReason = mergeReasonIfNecessary(redactionLogEntry.getReason(), ", forced by manual override"); + redactionLogEntry.setLegalBasis(manualForceRedact.getLegalBasis()); + } else if (manualForceRedact.getStatus().equals(AnnotationStatus.REQUESTED)) { + manualOverrideReason = mergeReasonIfNecessary(redactionLogEntry.getReason(), ", requested to force " + (dictionaryIsHint ? "hint" : "redact")); + redactionLogEntry.setColor(getColor(redactionLogEntry.getType(), colors, true, redactionLogEntry.isRedacted(), false, types)); + redactionLogEntry.setLegalBasis(manualForceRedact.getLegalBasis()); + } + + if (manualOverrideReason != null) { + redactionLogEntry.setReason(manualOverrideReason); + } + + var manualChange = ManualChange.from(manualForceRedact) + .withManualRedactionType(dictionaryIsHint ? ManualRedactionType.FORCE_HINT : ManualRedactionType.FORCE_REDACT); + + redactionLogEntry.getManualChanges().add(manualChange); + + } + + if (mrw.getItem() instanceof ManualLegalBasisChange) { + var manualLegalBasisChange = (ManualLegalBasisChange) mrw.getItem(); + String manualOverrideReason = null; + if (manualLegalBasisChange.getStatus().equals(AnnotationStatus.APPROVED)) { + manualOverrideReason = mergeReasonIfNecessary(redactionLogEntry.getReason(), ", legal basis was manually changed"); + redactionLogEntry.setLegalBasis(manualLegalBasisChange.getLegalBasis()); + redactionLogEntry.setRedacted(true); + if (manualLegalBasisChange.getSection() != null) { + redactionLogEntry.setSection(manualLegalBasisChange.getSection()); + } + if (redactionLogEntry.isRectangle() && manualLegalBasisChange.getValue() != null) { + redactionLogEntry.setValue(manualLegalBasisChange.getValue()); + } + } else if (manualLegalBasisChange.getStatus().equals(AnnotationStatus.REQUESTED)) { + manualOverrideReason = mergeReasonIfNecessary(redactionLogEntry.getReason(), ", legal basis change requested"); + redactionLogEntry.setColor(getColor(redactionLogEntry.getType(), colors, true, redactionLogEntry.isRedacted(), false, types)); + } + + if (manualOverrideReason != null) { + redactionLogEntry.setReason(manualOverrideReason); + } + + var manualChange = ManualChange.from(manualLegalBasisChange).withManualRedactionType(ManualRedactionType.LEGAL_BASIS_CHANGE); + manualChange.withChange("legalBasis", manualLegalBasisChange.getLegalBasis()); + if (manualLegalBasisChange.getSection() != null) { + manualChange.withChange("section", manualLegalBasisChange.getSection()); + } + if (redactionLogEntry.isRectangle() && manualLegalBasisChange.getValue() != null) { + manualChange.withChange("value", manualLegalBasisChange.getValue()); + } + redactionLogEntry.getManualChanges().add(manualChange); + } + + if (mrw.getItem() instanceof ManualResizeRedaction) { + var manualResizeRedact = (ManualResizeRedaction) mrw.getItem(); + String manualOverrideReason = null; + if (manualResizeRedact.getStatus().equals(AnnotationStatus.APPROVED)) { + redactionLogEntry.setColor(getColor(redactionLogEntry.getType(), colors, false, redactionLogEntry.isRedacted(), false, types)); + redactionLogEntry.setPositions(convertPositions(manualResizeRedact.getPositions())); + if (!"signature".equalsIgnoreCase(redactionLogEntry.getType()) && !"logo".equalsIgnoreCase(redactionLogEntry.getType())) { + redactionLogEntry.setValue(manualResizeRedact.getValue()); + } + // This is for backwards compatibility, now the text after/before is calculated during reanalysis because we need to find dict entries on positions where entries are resized to smaller. + if (manualResizeRedact.getTextBefore() != null || manualResizeRedact.getTextAfter() != null) { + redactionLogEntry.setTextBefore(manualResizeRedact.getTextBefore()); + redactionLogEntry.setTextAfter(manualResizeRedact.getTextAfter()); + } + manualOverrideReason = mergeReasonIfNecessary(redactionLogEntry.getReason(), ", resized by manual override"); + } else if (manualResizeRedact.getStatus().equals(AnnotationStatus.REQUESTED)) { + manualOverrideReason = mergeReasonIfNecessary(redactionLogEntry.getReason(), ", requested to resize redact"); + redactionLogEntry.setColor(getColor(redactionLogEntry.getType(), colors, true, redactionLogEntry.isRedacted(), false, types)); + redactionLogEntry.setPositions(convertPositions(manualResizeRedact.getPositions())); + + // This is for backwards compatibility, now the text after/before is calculated during reanalysis because we need to find dict entries on positions where entries are resized to smaller. + if (manualResizeRedact.getTextBefore() != null || manualResizeRedact.getTextAfter() != null) { + redactionLogEntry.setTextBefore(manualResizeRedact.getTextBefore()); + redactionLogEntry.setTextAfter(manualResizeRedact.getTextAfter()); + } + } + + redactionLogEntry.setReason(manualOverrideReason); + redactionLogEntry.getManualChanges() + .add(ManualChange.from(manualResizeRedact).withManualRedactionType(ManualRedactionType.RESIZE).withChange("value", manualResizeRedact.getValue())); + } + + }); + + } + + + private String mergeReasonIfNecessary(String currentReason, String addition) { + + if (currentReason != null) { + if (!currentReason.contains(addition)) { + return currentReason + addition; + } + return currentReason; + } else { + return ""; + } + } + + + public List addManualAddEntries(SectionGrid sectionGrid, + Set manualAdds, + Map> comments, + Colors colors, + List types, + int analysisNumber) { + + List redactionLogEntries = new ArrayList<>(); + + for (ManualRedactionEntry manualRedactionEntry : manualAdds) { + + if (shouldCreateManualEntry(manualRedactionEntry)) { + RedactionLogEntry redactionLogEntry = createRedactionLogEntry(manualRedactionEntry, manualRedactionEntry.getAnnotationId(), colors, types, analysisNumber); + redactionLogEntry.setPositions(convertPositions(manualRedactionEntry.getPositions())); + redactionLogEntry.setComments(convert(comments.get(manualRedactionEntry.getAnnotationId()))); + redactionLogEntry.setTextBefore(manualRedactionEntry.getTextBefore()); + redactionLogEntry.setTextAfter(manualRedactionEntry.getTextAfter()); + + sectionTextService.handleSectionText(sectionGrid, redactionLogEntry); + + redactionLogEntries.add(redactionLogEntry); + } + } + + return redactionLogEntries; + } + + + private List convert(List comments) { + + return comments == null ? null : comments.stream() + .map(c -> new RedactionLogComment(c.getId(), c.getUser(), c.getText(), c.getAnnotationId(), c.getFileId(), c.getDate(), c.getSoftDeletedTime())) + .collect(Collectors.toList()); + } + + + private List convertPositions(List positions) { + + return positions.stream() + .map(pos -> new Rectangle(new Point(pos.getTopLeftX(), pos.getTopLeftY()), pos.getWidth(), pos.getHeight(), pos.getPage())) + .collect(Collectors.toList()); + } + + + @SuppressWarnings("PMD.UselessParentheses") + private boolean shouldCreateManualEntry(ManualRedactionEntry manualRedactionEntry) { + + return (!manualRedactionEntry.isAddToDictionary() && !manualRedactionEntry.isAddToDossierDictionary()) || ((manualRedactionEntry.isAddToDictionary() || manualRedactionEntry.isAddToDossierDictionary()) && manualRedactionEntry.getProcessedDate() == null); + } + + + private RedactionLogEntry createRedactionLogEntry(ManualRedactionEntry manualRedactionEntry, String id, Colors colors, List types, int analysisNumber) { + + var addToDictionary = manualRedactionEntry.isAddToDictionary() || manualRedactionEntry.isAddToDossierDictionary(); + + var change = ManualChange.from(manualRedactionEntry).withManualRedactionType(addToDictionary ? ManualRedactionType.ADD_TO_DICTIONARY : ManualRedactionType.ADD_LOCALLY); + List changeList = new ArrayList<>(); + changeList.add(change); + + return RedactionLogEntry.builder() + .id(id) + .color(getColorForManualAdd(manualRedactionEntry.getType(), colors, manualRedactionEntry.getStatus(), types)) + .reason(manualRedactionEntry.getReason()) + .isDictionaryEntry(manualRedactionEntry.isAddToDictionary()) + .isDossierDictionaryEntry(manualRedactionEntry.isAddToDossierDictionary()) + .legalBasis(manualRedactionEntry.getLegalBasis()) + .value(manualRedactionEntry.getValue()) + .sourceId(manualRedactionEntry.getSourceId()) + .section(manualRedactionEntry.getSection()) + .type(manualRedactionEntry.getType()) + .redacted(true) + .isHint(false) + .sectionNumber(-1) + .rectangle(manualRedactionEntry.isRectangle()) + .manualChanges(changeList) + .changes(List.of(new Change(analysisNumber + 1, ChangeType.ADDED, manualRedactionEntry.getRequestDate()))) + .build(); + } + + + private float[] getColor(String type, Colors colors, boolean requested, boolean isRedaction, boolean skipped, List types) { + + if (requested) { + return convertColor(colors.getRequestRemoveColor()); + } + if (skipped || !isRedaction && !isHint(types, type)) { + return convertColor(colors.getSkippedColor()); + } + return getColor(types, type); + } + + + private float[] getColorForManualAdd(String type, Colors colors, AnnotationStatus status, List types) { + + if (status.equals(AnnotationStatus.REQUESTED)) { + return convertColor(colors.getRequestAddColor()); + } else if (status.equals(AnnotationStatus.DECLINED)) { + return convertColor(colors.getSkippedColor()); + } + return getColor(types, type); + } + + + private float[] getColor(List types, String type) { + + var matchingTypes = getMatchingTypes(types, type); + Optional foundAndNotDeletedType = matchingTypes.stream().filter(t -> !isDeletedType(t)).findFirst(); + if (foundAndNotDeletedType.isPresent()) { + return convertColor(foundAndNotDeletedType.get().getHexColor()); + } + Optional firstDeletedType = matchingTypes.stream().findFirst(); + return firstDeletedType.map(value -> convertColor(value.getHexColor())).orElseGet(() -> convertColor(DELETED_TYPE_COLOR)); + } + + + boolean isHint(List types, String type) { + + var matchingTypes = getMatchingTypes(types, type); + Optional foundAndNotDeletedType = matchingTypes.stream().filter(t -> !isDeletedType(t)).findFirst(); + if (foundAndNotDeletedType.isPresent()) { + return foundAndNotDeletedType.get().isHint(); + } + Optional firstDeletedType = matchingTypes.stream().findFirst(); + return firstDeletedType.map(Type::isHint).orElse(false); + } + + + private float[] convertColor(String hex) { + + Color color = Color.decode(hex); + return new float[]{color.getRed() / 255f, color.getGreen() / 255f, color.getBlue() / 255f}; + } + + + private List getMatchingTypes(List types, String type) { + + return types.stream().filter(t -> t.getType().equals(type)).collect(Collectors.toList()); + } + + + private boolean isDeletedType(Type type) { + + return type.getSoftDeletedTime() != null; + } + + + @Data + @AllArgsConstructor + private static class ManualRedactionWrapper implements Comparable { + + private String id; + private OffsetDateTime date; + private Object item; + + + @Override + public int compareTo(ManualRedactionWrapper o) { + + return this.date.compareTo(o.date); + } + + } + +} + diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/redactionlog/RedactionRequest.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/redactionlog/RedactionRequest.java new file mode 100644 index 000000000..b1fc89777 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/redactionlog/RedactionRequest.java @@ -0,0 +1,34 @@ +package com.iqser.red.service.persistence.management.v1.processor.service.redactionlog; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ManualRedactions; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.Colors; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.Type; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class RedactionRequest { + + private String dossierId; + private String fileId; + private String dossierTemplateId; + private ManualRedactions manualRedactions; + @Builder.Default + private Set excludedPages = new HashSet<>(); + + private Colors colors; + private List types; + + private boolean includeFalsePositives; + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/redactionlog/SectionTextService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/redactionlog/SectionTextService.java new file mode 100644 index 000000000..45e04bc6b --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/redactionlog/SectionTextService.java @@ -0,0 +1,41 @@ +package com.iqser.red.service.persistence.management.v1.processor.service.redactionlog; + +import org.springframework.stereotype.Service; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLogEntry; +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.section.SectionGrid; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Service +public class SectionTextService { + + public void handleSectionText(SectionGrid sectionGrid, RedactionLogEntry redactionLogEntry) { + + if (redactionLogEntry.getSection() != null) { + // set by UI + return; + } + + if (sectionGrid != null) { + var firstPosition = !redactionLogEntry.getPositions().isEmpty() ? redactionLogEntry.getPositions().iterator().next() : null; + + if (firstPosition != null) { + + for (var section : sectionGrid.getSections()) { + if (section.getPages().contains(firstPosition.getPage())) { + for (var sectionArea : section.getSectionAreas()) { + if (sectionArea.contains(firstPosition)) { + redactionLogEntry.setSection(section.getHeadline()); + redactionLogEntry.setSectionNumber(section.getSectionNumber()); + return; + } + } + } + } + } + } + } + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/settings/DossierDictionarySettings.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/settings/DossierDictionarySettings.java new file mode 100644 index 000000000..b781f1d71 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/settings/DossierDictionarySettings.java @@ -0,0 +1,17 @@ +package com.iqser.red.service.persistence.management.v1.processor.settings; + +import lombok.Data; + +@Data +public class DossierDictionarySettings { + + private String name = "dossier_redaction"; + private String hexColor = "#9398a0"; + private int rank = 1500; + private boolean hint; + private boolean caseInsensitive; + private boolean recommendation; + private String description = "Entries in this dictionary will only be redacted in this dossier"; + private boolean addToDictionaryAction; + +} diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/settings/FileManagementServiceSettings.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/settings/FileManagementServiceSettings.java similarity index 71% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/settings/FileManagementServiceSettings.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/settings/FileManagementServiceSettings.java index ccdf43cd5..cf6ee8e28 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/settings/FileManagementServiceSettings.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/settings/FileManagementServiceSettings.java @@ -1,9 +1,10 @@ -package com.iqser.red.service.peristence.v1.server.settings; +package com.iqser.red.service.persistence.management.v1.processor.settings; + +import java.util.HashSet; +import java.util.Set; import org.springframework.boot.context.properties.ConfigurationProperties; -import com.iqser.red.service.persistence.management.v1.processor.settings.FileUploadSettings; - import lombok.Data; @Data @@ -40,4 +41,9 @@ public class FileManagementServiceSettings { private double compressionThresholdRatio = 10; + private String applicationName = "RedactManager"; + private Set defaultFilterTypes = new HashSet<>(); + private Set defaultFilterHintTypes = new HashSet<>(); + private DossierDictionarySettings dossierDictionarySettings = new DossierDictionarySettings(); + } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/ColorUtils.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/ColorUtils.java new file mode 100644 index 000000000..920e25faf --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/ColorUtils.java @@ -0,0 +1,26 @@ +package com.iqser.red.service.persistence.management.v1.processor.utils; + +import java.util.Locale; +import java.util.regex.Pattern; + +import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; + +import lombok.experimental.UtilityClass; + +@UtilityClass +public final class ColorUtils { + + public static final Pattern COLOR_PATTERN = Pattern.compile("^#[\\da-f]{6,6}$"); + + + public static void validateColor(String color) { + + if (color == null) { + throw new BadRequestException("Color not set"); + } + if (!COLOR_PATTERN.matcher(color.toLowerCase(Locale.ROOT)).matches()) { + throw new BadRequestException("The specified color: " + color + " is malformed."); + } + } + +} diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/utils/DossierMapper.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/DossierMapper.java similarity index 77% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/utils/DossierMapper.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/DossierMapper.java index 72a4868da..061deb52e 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/utils/DossierMapper.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/DossierMapper.java @@ -1,11 +1,11 @@ -package com.iqser.red.service.peristence.v1.server.utils; +package com.iqser.red.service.persistence.management.v1.processor.utils; import java.util.function.BiConsumer; import java.util.stream.Collectors; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.ReportTemplateEntity; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.Dossier; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.Dossier; public class DossierMapper implements BiConsumer { diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/DossierStatusMapper.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/DossierStatusMapper.java new file mode 100644 index 000000000..2c00093fc --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/DossierStatusMapper.java @@ -0,0 +1,16 @@ +package com.iqser.red.service.persistence.management.v1.processor.utils; + +import java.util.function.BiConsumer; + +import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierStatusEntity; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.DossierStatusInfo; + +public class DossierStatusMapper implements BiConsumer { + + @Override + public void accept(DossierStatusEntity dossierStatusEntity, DossierStatusInfo dossierStatusInfo) { + + dossierStatusInfo.setDossierCount((long) dossierStatusEntity.getDossiers().size()); + } + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/DownloadBufferUtils.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/DownloadBufferUtils.java new file mode 100644 index 000000000..17905c69e --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/DownloadBufferUtils.java @@ -0,0 +1,30 @@ +package com.iqser.red.service.persistence.management.v1.processor.utils; + +import java.io.InputStream; + +import org.springframework.core.io.FileSystemResource; +import org.springframework.web.context.request.RequestContextHolder; + +import lombok.SneakyThrows; +import lombok.experimental.UtilityClass; + +@UtilityClass +public final class DownloadBufferUtils { + + public static final String DOWNLOAD_TEMP_FILE_BUFFER_LOCATION = "DOWNLOAD_TEMP_FILE_BUFFER_LOCATION"; + + + @SneakyThrows + public static FileSystemResource fileProxyStreamForDownload(InputStream inputStream) { + + var tempFile = FileUtils.createTempFile("download", "pdf"); + org.apache.commons.io.FileUtils.copyInputStreamToFile(inputStream, tempFile); + + if (RequestContextHolder.getRequestAttributes() != null) { + RequestContextHolder.getRequestAttributes().setAttribute(DOWNLOAD_TEMP_FILE_BUFFER_LOCATION, tempFile.getAbsolutePath(), 0); + } + + return new FileSystemResource(tempFile); + } + +} diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/utils/FileModelMapper.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/FileModelMapper.java similarity index 71% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/utils/FileModelMapper.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/FileModelMapper.java index c0431cacd..e01823312 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/utils/FileModelMapper.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/FileModelMapper.java @@ -1,9 +1,9 @@ -package com.iqser.red.service.peristence.v1.server.utils; +package com.iqser.red.service.persistence.management.v1.processor.utils; import java.util.function.BiConsumer; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileModel; public class FileModelMapper implements BiConsumer { diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/utils/FileSystemBackedArchiver.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/FileSystemBackedArchiver.java similarity index 97% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/utils/FileSystemBackedArchiver.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/FileSystemBackedArchiver.java index 0f2ed0de2..4b0d16d6c 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/utils/FileSystemBackedArchiver.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/FileSystemBackedArchiver.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.utils; +package com.iqser.red.service.persistence.management.v1.processor.utils; import java.io.BufferedInputStream; import java.io.File; @@ -47,18 +47,6 @@ public class FileSystemBackedArchiver implements AutoCloseable { } - @SneakyThrows - public InputStream toInputStream() { - - try { - zipOutputStream.close(); - } catch (IOException e) { - log.debug(e.getMessage()); - } - return new BufferedInputStream(new FileInputStream(tempFile)); - } - - @SneakyThrows public void addEntry(ArchiveModel archiveModel) { // begin writing a new ZIP entry, positions the stream to the start of the entry entity @@ -77,6 +65,18 @@ public class FileSystemBackedArchiver implements AutoCloseable { } + @SneakyThrows + public InputStream toInputStream() { + + try { + zipOutputStream.close(); + } catch (IOException e) { + log.debug(e.getMessage()); + } + return new BufferedInputStream(new FileInputStream(tempFile)); + } + + @Override public void close() { diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/utils/FileUtils.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/FileUtils.java similarity index 96% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/utils/FileUtils.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/FileUtils.java index 84831fd10..6c2f524b1 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/utils/FileUtils.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/FileUtils.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.utils; +package com.iqser.red.service.persistence.management.v1.processor.utils; import java.io.File; import java.io.FileOutputStream; @@ -40,18 +40,6 @@ public class FileUtils { } - public File createTempFile(byte[] content, String filenamePrefix, String filenameSuffix) throws IOException { - - File tempFile = Files.createTempFile(filenamePrefix, filenameSuffix).toFile(); - setRWPermissionsOnlyForOwner(tempFile); - - try (FileOutputStream outputStream = new FileOutputStream(tempFile)) { - IOUtils.write(content, outputStream); - } - return tempFile; - } - - // We don't need to check the results of the permission setters below, // since we're manipulating a file we created ourselves. @SuppressWarnings("ResultOfMethodCallIgnored") @@ -71,4 +59,16 @@ public class FileUtils { } } + + public File createTempFile(byte[] content, String filenamePrefix, String filenameSuffix) throws IOException { + + File tempFile = Files.createTempFile(filenamePrefix, filenameSuffix).toFile(); + setRWPermissionsOnlyForOwner(tempFile); + + try (FileOutputStream outputStream = new FileOutputStream(tempFile)) { + IOUtils.write(content, outputStream); + } + return tempFile; + } + } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/JSONDownloadFileTypeConverter.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/JSONDownloadFileTypeConverter.java index e4d2a4c79..6ac017194 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/JSONDownloadFileTypeConverter.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/JSONDownloadFileTypeConverter.java @@ -8,7 +8,7 @@ import javax.persistence.Converter; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DownloadFileType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DownloadFileType; import lombok.SneakyThrows; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/MagicConverter.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/MagicConverter.java index 218b5432d..98e4b4bca 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/MagicConverter.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/MagicConverter.java @@ -12,7 +12,7 @@ import javax.persistence.EmbeddedId; import org.springframework.beans.BeanUtils; import com.google.common.collect.Lists; -import com.iqser.red.service.persistence.service.v1.api.model.common.Page; +import com.iqser.red.service.persistence.service.v1.api.shared.model.common.Page; import lombok.SneakyThrows; @@ -31,35 +31,6 @@ public class MagicConverter { } - @SneakyThrows - public static List convert(List sources, Class target, BiConsumer deltaMapper) { - - if (deltaMapper != null) { - var targetList = convert(sources, target); - for (int i = 0; i < targetList.size(); i++) { - deltaMapper.accept(sources.get(i), targetList.get(i)); - } - return targetList; - } else { - return convert(sources, target); - } - - } - - - @SneakyThrows - public static Page convert(org.springframework.data.domain.Page sources, Class target) { - - Page result = new Page<>(); - result.setElements(convert(Lists.newArrayList(sources), target)); - result.setPage(sources.getNumber()); - result.setPageSize(sources.getSize()); - result.setTotalHits(sources.getTotalElements()); - return result; - - } - - @SneakyThrows public static T convert(S source, Class target) { @@ -68,34 +39,6 @@ public class MagicConverter { } - @SneakyThrows - public static List convert(List sources, Class target) { - - var noArgsConstructor = target.getConstructor(); - - List targetList = new ArrayList<>(); - for (var s : sources) { - targetList.add(convertOne(s, target, noArgsConstructor)); - } - return targetList; - - } - - - @SneakyThrows - public static Set convert(Set sources, Class target) { - - var noArgsConstructor = target.getConstructor(); - - Set targetList = new HashSet<>(); - for (var s : sources) { - targetList.add(convertOne(s, target, noArgsConstructor)); - } - return targetList; - - } - - @SneakyThrows public static T convertOne(S source, Class target, Constructor constructor) { @@ -123,4 +66,61 @@ public class MagicConverter { return newInstance; } + + @SneakyThrows + public static List convert(List sources, Class target, BiConsumer deltaMapper) { + + if (deltaMapper != null) { + var targetList = convert(sources, target); + for (int i = 0; i < targetList.size(); i++) { + deltaMapper.accept(sources.get(i), targetList.get(i)); + } + return targetList; + } else { + return convert(sources, target); + } + + } + + + @SneakyThrows + public static List convert(List sources, Class target) { + + var noArgsConstructor = target.getConstructor(); + + List targetList = new ArrayList<>(); + for (var s : sources) { + targetList.add(convertOne(s, target, noArgsConstructor)); + } + return targetList; + + } + + + @SneakyThrows + public static Page convert(org.springframework.data.domain.Page sources, Class target) { + + Page result = new Page<>(); + result.setElements(convert(Lists.newArrayList(sources), target)); + result.setPage(sources.getNumber()); + result.setPageSize(sources.getSize()); + result.setTotalHits(sources.getTotalElements()); + return result; + + } + + + @SneakyThrows + public static Set convert(Set sources, Class target) { + + var noArgsConstructor = target.getConstructor(); + + Set targetList = new HashSet<>(); + for (var s : sources) { + targetList.add(convertOne(s, target, noArgsConstructor)); + } + return targetList; + + } + } diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/utils/ManualImageRecategorizationMapper.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/ManualImageRecategorizationMapper.java similarity index 75% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/utils/ManualImageRecategorizationMapper.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/ManualImageRecategorizationMapper.java index a404eb794..567236630 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/utils/ManualImageRecategorizationMapper.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/ManualImageRecategorizationMapper.java @@ -1,9 +1,9 @@ -package com.iqser.red.service.peristence.v1.server.utils; +package com.iqser.red.service.persistence.management.v1.processor.utils; import java.util.function.BiConsumer; import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ManualImageRecategorizationEntity; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.entitymapped.ManualImageRecategorization; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualImageRecategorization; public class ManualImageRecategorizationMapper implements BiConsumer { diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/utils/ManualRedactionMapper.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/ManualRedactionMapper.java similarity index 54% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/utils/ManualRedactionMapper.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/ManualRedactionMapper.java index 982274c52..642a22299 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/utils/ManualRedactionMapper.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/ManualRedactionMapper.java @@ -1,12 +1,10 @@ -package com.iqser.red.service.peristence.v1.server.utils; - -import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; +package com.iqser.red.service.persistence.management.v1.processor.utils; import java.util.function.BiConsumer; import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ManualRedactionEntryEntity; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.Rectangle; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.entitymapped.ManualRedactionEntry; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.Rectangle; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualRedactionEntry; public class ManualRedactionMapper implements BiConsumer { @@ -14,7 +12,7 @@ public class ManualRedactionMapper implements BiConsumer { + + @Override + public void accept(ManualResizeRedactionEntity manualResizeRedactionEntity, ManualResizeRedaction manualRedaction) { + + manualRedaction.setPositions(MagicConverter.convert(manualResizeRedactionEntity.getPositions(), Rectangle.class)); + } + +} diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/utils/ResourceLoader.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/ResourceLoader.java similarity index 92% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/utils/ResourceLoader.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/ResourceLoader.java index 3db0aa0b0..71d8a24c5 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/utils/ResourceLoader.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/ResourceLoader.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.utils; +package com.iqser.red.service.persistence.management.v1.processor.utils; import java.io.BufferedReader; import java.io.IOException; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/utils/StorageIdUtils.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/StorageIdUtils.java similarity index 80% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/utils/StorageIdUtils.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/StorageIdUtils.java index 37dfa3ca1..01a053bb0 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/utils/StorageIdUtils.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/StorageIdUtils.java @@ -1,6 +1,6 @@ -package com.iqser.red.service.peristence.v1.server.utils; +package com.iqser.red.service.persistence.management.v1.processor.utils; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; import lombok.experimental.UtilityClass; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/StringEncodingUtils.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/StringEncodingUtils.java new file mode 100644 index 000000000..ea215d0b1 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/StringEncodingUtils.java @@ -0,0 +1,33 @@ +package com.iqser.red.service.persistence.management.v1.processor.utils; + +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; + +import org.apache.commons.lang3.StringUtils; + +import lombok.experimental.UtilityClass; + +@UtilityClass +public final class StringEncodingUtils { + + Character COMMA = ','; + + + public static String urlEncode(String input) { + + if (input == null) { + return null; + } + + var result = new StringBuilder(); + for (var i = 0; i < input.length(); i++) { + if (StringUtils.isAsciiPrintable(Character.toString(input.charAt(i))) && input.charAt(i) != COMMA) { + result.append(input.charAt(i)); + } else { + result.append(URLEncoder.encode(Character.toString(input.charAt(i)), StandardCharsets.UTF_8)); + } + } + return result.toString(); + } + +} diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/TextNormalizationUtilities.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/TextNormalizationUtilities.java similarity index 85% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/TextNormalizationUtilities.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/TextNormalizationUtilities.java index 79f1128d1..9ad55194d 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/TextNormalizationUtilities.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/TextNormalizationUtilities.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server; +package com.iqser.red.service.persistence.management.v1.processor.utils; import lombok.experimental.UtilityClass; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/TypeMapper.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/TypeMapper.java new file mode 100644 index 000000000..73e246e0a --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/TypeMapper.java @@ -0,0 +1,18 @@ +package com.iqser.red.service.persistence.management.v1.processor.utils; + +import java.util.function.BiConsumer; + +import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.TypeEntity; +import com.iqser.red.service.persistence.service.v1.api.shared.model.TypeValue; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.Type; + +public class TypeMapper implements BiConsumer { + + @Override + public void accept(TypeEntity typeEntity, Type type) { + + type.setDossierTemplateId(typeEntity.getDossierTemplate().getId()); + + } + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/TypeValueMapper.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/TypeValueMapper.java new file mode 100644 index 000000000..92caf035e --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/TypeValueMapper.java @@ -0,0 +1,22 @@ +package com.iqser.red.service.persistence.management.v1.processor.utils; + +import java.util.function.BiConsumer; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.TypeValue; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.Type; + +public class TypeValueMapper implements BiConsumer { + + @Override + public void accept(Type type, TypeValue typeValue) { + + typeValue.setTypeId(type.getId()); + typeValue.setHint(type.isHint()); + typeValue.setCaseInsensitive(type.isCaseInsensitive()); + typeValue.setRecommendation(type.isRecommendation()); + typeValue.setSystemManaged(type.isSystemManaged()); + typeValue.setDossierTemplateId(type.getDossierTemplateId()); + + } + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/jdbc/JDBCUtils.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/jdbc/JDBCUtils.java index 6b7d3e978..b63c27994 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/jdbc/JDBCUtils.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/jdbc/JDBCUtils.java @@ -1,7 +1,7 @@ package com.iqser.red.service.persistence.management.v1.processor.utils.jdbc; import com.iqser.red.service.persistence.management.v1.processor.multitenancy.entity.DatabaseConnectionEntity; -import com.iqser.red.service.persistence.service.v1.api.model.multitenancy.DatabaseConnection; +import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.DatabaseConnection; import lombok.experimental.UtilityClass; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/jdbc/JDBCWriteUtils.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/jdbc/JDBCWriteUtils.java index b454885dd..e75bf3a22 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/jdbc/JDBCWriteUtils.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/jdbc/JDBCWriteUtils.java @@ -14,10 +14,13 @@ import java.util.stream.Collectors; import javax.persistence.Column; import javax.persistence.EntityManager; import javax.persistence.Table; +import javax.transaction.Transactional; import org.apache.commons.lang3.StringUtils; import org.springframework.jdbc.core.BatchPreparedStatementSetter; import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.datasource.DataSourceUtils; +import org.springframework.jdbc.datasource.SingleConnectionDataSource; import org.springframework.stereotype.Service; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.mulitenancy.DynamicDataSourceBasedMultiTenantConnectionProvider; @@ -32,21 +35,17 @@ import lombok.SneakyThrows; @RequiredArgsConstructor public class JDBCWriteUtils { - private final JdbcTemplate jdbcTemplate; - private final String SQL_TEMPLATE = "INSERT INTO %s (%s) values (%s)"; private final Map, EntityMetadata> entityMetadataMap = new HashMap<>(); private final EntityManager entityManager; - private final DynamicDataSourceBasedMultiTenantConnectionProvider dynamicDataSourceBasedMultiTenantConnectionProvider; - + @SneakyThrows + @Transactional public void saveBatch(final List entities) { - jdbcTemplate.setDataSource(dynamicDataSourceBasedMultiTenantConnectionProvider.selectDataSource(TenantContext.getTenantId())); - if (entities.isEmpty()) { return; } @@ -55,30 +54,20 @@ public class JDBCWriteUtils { final int batchSize = 500; + var query = entityManager.createNativeQuery(metadata.getSqlStatement()); for (int j = 0; j < entities.size(); j += batchSize) { final List batchList = entities.subList(j, Math.min(j + batchSize, entities.size())); - jdbcTemplate.batchUpdate(metadata.getSqlStatement(), new BatchPreparedStatementSetter() { - @SneakyThrows - @Override - public void setValues(PreparedStatement ps, int i) { - - T entity = batchList.get(i); - - int paramIndex = 1; - for (var mapping : metadata.getFieldMethodMap().entrySet()) { - ps.setObject(paramIndex++, mapping.getValue().invoke(entity)); - } + for (var entity : batchList) { + int paramIndex = 1; + for (var mapping : metadata.getFieldMethodMap().entrySet()) { + query.setParameter(paramIndex++, mapping.getValue().invoke(entity)); } + query.executeUpdate(); - @Override - public int getBatchSize() { - - return batchList.size(); - } - }); + } } @@ -104,6 +93,13 @@ public class JDBCWriteUtils { } + private String getTableName(T entity) { + + var tableAnnot = entity.getClass().getDeclaredAnnotation(Table.class); + return tableAnnot.name(); + } + + @SneakyThrows private Map getArgs(T entity) { @@ -123,16 +119,6 @@ public class JDBCWriteUtils { } - private String getMethodName(Field field) { - - var prefix = "get"; - if (field.getType().equals(Boolean.class) || field.getType().equals(boolean.class)) { - prefix = "is"; - } - return prefix + capitalize(field.getName()); - } - - private String toSnakeCase(String name) { String ret = name.replaceAll("([A-Z]{1,100})([A-Z][a-z])", "$1_$2").replaceAll("([a-z])([A-Z])", "$1_$2"); @@ -140,10 +126,13 @@ public class JDBCWriteUtils { } - private String getTableName(T entity) { + private String getMethodName(Field field) { - var tableAnnot = entity.getClass().getDeclaredAnnotation(Table.class); - return tableAnnot.name(); + var prefix = "get"; + if (field.getType().equals(Boolean.class) || field.getType().equals(boolean.class)) { + prefix = "is"; + } + return prefix + capitalize(field.getName()); } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/multitenancy/TenantContext.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/multitenancy/TenantContext.java index bfd50c90f..b9e04a2b4 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/multitenancy/TenantContext.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/multitenancy/TenantContext.java @@ -5,7 +5,13 @@ import lombok.extern.slf4j.Slf4j; @Slf4j public final class TenantContext { - private static InheritableThreadLocal currentTenant = new InheritableThreadLocal<>(); + private static final InheritableThreadLocal currentTenant = new InheritableThreadLocal<>(); + + + public static String getTenantId() { + + return currentTenant.get(); + } public static void setTenantId(String tenantId) { @@ -15,15 +21,9 @@ public final class TenantContext { } - public static String getTenantId() { - - return currentTenant.get(); - } - - public static void clear() { currentTenant.remove(); } -} \ No newline at end of file +} diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/validation/DictionaryValidator.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/validation/DictionaryValidator.java similarity index 96% rename from persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/validation/DictionaryValidator.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/validation/DictionaryValidator.java index ec43c65bb..5d2716955 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/validation/DictionaryValidator.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/validation/DictionaryValidator.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.peristence.v1.server.validation; +package com.iqser.red.service.persistence.management.v1.processor.validation; import java.awt.Color; import java.util.Optional; @@ -22,12 +22,6 @@ public class DictionaryValidator { } - public Optional validateDictionaryEntry(String value) { - - return validateValue(value, ValueType.ENTRY); - } - - private Optional validateValue(String value, ValueType valueType) { if (StringUtils.isBlank(value)) { @@ -41,6 +35,12 @@ public class DictionaryValidator { } + public Optional validateDictionaryEntry(String value) { + + return validateValue(value, ValueType.ENTRY); + } + + public Optional validateColor(String hexColor) { if (hexColor == null) { diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/db.changelog-master.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/db.changelog-master.yaml similarity index 100% rename from persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/db.changelog-master.yaml rename to persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/db.changelog-master.yaml diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/db.changelog-tenant.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/db.changelog-tenant.yaml similarity index 94% rename from persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/db.changelog-tenant.yaml rename to persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/db.changelog-tenant.yaml index 89cd55cdb..a304d8de9 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/db.changelog-tenant.yaml +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/db.changelog-tenant.yaml @@ -113,3 +113,11 @@ databaseChangeLog: file: db/changelog/tenant/sql/43-add-applied-redaction-color.sql - include: file: db/changelog/tenant/sql/45-unique-dossier-name.sql + - include: + file: db/changelog/tenant/101-spring-acl.changelog.yaml + - include: + file: db/changelog/tenant/102-custom-permissions-acl.changelog.yaml + - include: + file: db/changelog/tenant/sql/201-acl-duplicate-cleanup.sql + - include: + file: db/changelog/tenant/sql/202-acl-duplicate-cleanup.sql diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/master/1-initial-schema.changelog.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/master/1-initial-schema.changelog.yaml similarity index 100% rename from persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/master/1-initial-schema.changelog.yaml rename to persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/master/1-initial-schema.changelog.yaml diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/master/2-quartz.changelog.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/master/2-quartz.changelog.yaml similarity index 100% rename from persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/master/2-quartz.changelog.yaml rename to persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/master/2-quartz.changelog.yaml diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/master/3-detailed-db-connection.changelog.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/master/3-detailed-db-connection.changelog.yaml similarity index 100% rename from persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/master/3-detailed-db-connection.changelog.yaml rename to persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/master/3-detailed-db-connection.changelog.yaml diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/1-initial-schema.changelog.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/1-initial-schema.changelog.yaml similarity index 100% rename from persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/1-initial-schema.changelog.yaml rename to persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/1-initial-schema.changelog.yaml diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/10-added-file-manipulation-date.changelog.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/10-added-file-manipulation-date.changelog.yaml similarity index 100% rename from persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/10-added-file-manipulation-date.changelog.yaml rename to persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/10-added-file-manipulation-date.changelog.yaml diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/101-spring-acl.changelog.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/101-spring-acl.changelog.yaml new file mode 100644 index 000000000..05722c97a --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/101-spring-acl.changelog.yaml @@ -0,0 +1,93 @@ +databaseChangeLog: + - changeSet: + id: ACL Table Creation + author: timo + changes: + - createTable: + columns: + - column: + constraints: + nullable: false + primaryKey: true + primaryKeyName: ACL_CLASS_PKEY + name: id + type: BIGSERIAL + - column: + name: CLASS_ID_TYPE + type: VARCHAR(500) + - column: + name: CLASS + type: VARCHAR(500) + tableName: ACL_CLASS + - createTable: + columns: + - column: + constraints: + nullable: false + primaryKey: true + primaryKeyName: ACL_SID_PKEY + name: id + type: BIGSERIAL + - column: + name: SID + type: VARCHAR(500) + - column: + name: PRINCIPAL + type: BOOLEAN + tableName: ACL_SID + - createTable: + columns: + - column: + constraints: + nullable: false + primaryKey: true + primaryKeyName: ACL_OBJECT_IDENTITY_PKEY + name: id + type: BIGSERIAL + - column: + name: OBJECT_ID_CLASS + type: BIGINT + - column: + name: OBJECT_ID_IDENTITY + type: VARCHAR(500) + - column: + name: PARENT_OBJECT + type: BIGINT + - column: + name: OWNER_SID + type: BIGINT + - column: + name: ENTRIES_INHERITING + type: BOOLEAN + tableName: ACL_OBJECT_IDENTITY + - createTable: + columns: + - column: + constraints: + nullable: false + primaryKey: true + primaryKeyName: ACL_ENTRY_PKEY + name: id + type: BIGSERIAL + - column: + name: ACL_OBJECT_IDENTITY + type: BIGINT + - column: + name: ACE_ORDER + type: INTEGER + - column: + name: SID + type: BIGINT + - column: + name: MASK + type: INTEGER + - column: + name: GRANTING + type: BOOLEAN + - column: + name: AUDIT_SUCCESS + type: BOOLEAN + - column: + name: AUDIT_FAILURE + type: BOOLEAN + tableName: ACL_ENTRY diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/102-custom-permissions-acl.changelog.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/102-custom-permissions-acl.changelog.yaml new file mode 100644 index 000000000..c1f084f38 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/102-custom-permissions-acl.changelog.yaml @@ -0,0 +1,29 @@ +databaseChangeLog: + - changeSet: + id: ACL Custom Permissions + author: timo + changes: + - createTable: + columns: + - column: + constraints: + nullable: false + primaryKey: true + primaryKeyName: ACL_CUSTOM_PERMISSIONS_PKEY + name: TARGET_PERMISSION_MASK + type: INTEGER + - column: + constraints: + nullable: false + primaryKey: true + primaryKeyName: ACL_CUSTOM_PERMISSIONS_PKEY + name: EXISTING_PERMISSION_MASK + type: INTEGER + - column: + constraints: + nullable: false + primaryKey: true + primaryKeyName: ACL_CUSTOM_PERMISSIONS_PKEY + name: TARGET_OBJECT + type: VARCHAR(500) + tableName: ACL_CUSTOM_PERMISSIONS diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/11-added-dictionary_false_positive_tables.changelog.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/11-added-dictionary_false_positive_tables.changelog.yaml similarity index 100% rename from persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/11-added-dictionary_false_positive_tables.changelog.yaml rename to persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/11-added-dictionary_false_positive_tables.changelog.yaml diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/12-added-rank-dossier-status.changelog.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/12-added-rank-dossier-status.changelog.yaml similarity index 100% rename from persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/12-added-rank-dossier-status.changelog.yaml rename to persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/12-added-rank-dossier-status.changelog.yaml diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/12-dossier-visibility.changelog.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/12-dossier-visibility.changelog.yaml similarity index 100% rename from persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/12-dossier-visibility.changelog.yaml rename to persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/12-dossier-visibility.changelog.yaml diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/13-file-manual-change-date.changelog.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/13-file-manual-change-date.changelog.yaml similarity index 90% rename from persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/13-file-manual-change-date.changelog.yaml rename to persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/13-file-manual-change-date.changelog.yaml index 59fa2ea4a..1604808f6 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/13-file-manual-change-date.changelog.yaml +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/13-file-manual-change-date.changelog.yaml @@ -5,7 +5,7 @@ databaseChangeLog: changes: - removeColumn: columns: - - name: last_manual_redaction + - name: last_manual_redaction tableName: file - addColumn: columns: diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/14-add-redaction-source-id.changelog.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/14-add-redaction-source-id.changelog.yaml similarity index 100% rename from persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/14-add-redaction-source-id.changelog.yaml rename to persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/14-add-redaction-source-id.changelog.yaml diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/15-dossier-remove-dossier-state.changelog.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/15-dossier-remove-dossier-state.changelog.yaml similarity index 83% rename from persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/15-dossier-remove-dossier-state.changelog.yaml rename to persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/15-dossier-remove-dossier-state.changelog.yaml index ba365ca19..9a5896cac 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/15-dossier-remove-dossier-state.changelog.yaml +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/15-dossier-remove-dossier-state.changelog.yaml @@ -5,5 +5,5 @@ databaseChangeLog: changes: - removeColumn: columns: - - name: dossier_status + - name: dossier_status tableName: dossier diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/16-added-has-dictionary-to-entities.changelog.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/16-added-has-dictionary-to-entities.changelog.yaml similarity index 100% rename from persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/16-added-has-dictionary-to-entities.changelog.yaml rename to persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/16-added-has-dictionary-to-entities.changelog.yaml diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/17-digital-signature-kms.changelog.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/17-digital-signature-kms.changelog.yaml similarity index 100% rename from persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/17-digital-signature-kms.changelog.yaml rename to persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/17-digital-signature-kms.changelog.yaml diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/18-add-migration-table.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/18-add-migration-table.yaml similarity index 100% rename from persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/18-add-migration-table.yaml rename to persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/18-add-migration-table.yaml diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/19-added-has-highlights-to-file.changelog.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/19-added-has-highlights-to-file.changelog.yaml similarity index 100% rename from persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/19-added-has-highlights-to-file.changelog.yaml rename to persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/19-added-has-highlights-to-file.changelog.yaml diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/2-ignored-hint-color.changelog.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/2-ignored-hint-color.changelog.yaml similarity index 100% rename from persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/2-ignored-hint-color.changelog.yaml rename to persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/2-ignored-hint-color.changelog.yaml diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/20-add-index-information-table.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/20-add-index-information-table.yaml similarity index 100% rename from persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/20-add-index-information-table.yaml rename to persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/20-add-index-information-table.yaml diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/21-added-auto-hide-skipped-to-entities.changelog.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/21-added-auto-hide-skipped-to-entities.changelog.yaml similarity index 100% rename from persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/21-added-auto-hide-skipped-to-entities.changelog.yaml rename to persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/21-added-auto-hide-skipped-to-entities.changelog.yaml diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/22-add-soft-delete-time-to-entity.changelog.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/22-add-soft-delete-time-to-entity.changelog.yaml similarity index 100% rename from persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/22-add-soft-delete-time-to-entity.changelog.yaml rename to persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/22-add-soft-delete-time-to-entity.changelog.yaml diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/23-quartz.changelog.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/23-quartz.changelog.yaml similarity index 100% rename from persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/23-quartz.changelog.yaml rename to persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/23-quartz.changelog.yaml diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/24-add-unique-constraint-for-dictionary.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/24-add-unique-constraint-for-dictionary.yaml similarity index 100% rename from persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/24-add-unique-constraint-for-dictionary.yaml rename to persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/24-add-unique-constraint-for-dictionary.yaml diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/25-add-index-to-dictionary-entry-tables.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/25-add-index-to-dictionary-entry-tables.yaml similarity index 100% rename from persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/25-add-index-to-dictionary-entry-tables.yaml rename to persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/25-add-index-to-dictionary-entry-tables.yaml diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/26-application-config-table.changelog.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/26-application-config-table.changelog.yaml similarity index 100% rename from persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/26-application-config-table.changelog.yaml rename to persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/26-application-config-table.changelog.yaml diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/28-add-update-dictionary-to-manual-resize-redactions.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/28-add-update-dictionary-to-manual-resize-redactions.yaml similarity index 100% rename from persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/28-add-update-dictionary-to-manual-resize-redactions.yaml rename to persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/28-add-update-dictionary-to-manual-resize-redactions.yaml diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/3-added-annotation-modification-date.changelog.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/3-added-annotation-modification-date.changelog.yaml similarity index 100% rename from persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/3-added-annotation-modification-date.changelog.yaml rename to persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/3-added-annotation-modification-date.changelog.yaml diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/31-add-file-size-column.changelog.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/31-add-file-size-column.changelog.yaml similarity index 100% rename from persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/31-add-file-size-column.changelog.yaml rename to persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/31-add-file-size-column.changelog.yaml diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/32-added-skipped-color-type-table.changelog.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/32-added-skipped-color-type-table.changelog.yaml similarity index 100% rename from persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/32-added-skipped-color-type-table.changelog.yaml rename to persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/32-added-skipped-color-type-table.changelog.yaml diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/33-add-file-processing-error-counter-column.changelog.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/33-add-file-processing-error-counter-column.changelog.yaml similarity index 100% rename from persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/33-add-file-processing-error-counter-column.changelog.yaml rename to persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/33-add-file-processing-error-counter-column.changelog.yaml diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/34-add-reports-information-column.changelog.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/34-add-reports-information-column.changelog.yaml similarity index 100% rename from persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/34-add-reports-information-column.changelog.yaml rename to persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/34-add-reports-information-column.changelog.yaml diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/36-revert-reports-information-column.changelog.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/36-revert-reports-information-column.changelog.yaml similarity index 100% rename from persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/36-revert-reports-information-column.changelog.yaml rename to persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/36-revert-reports-information-column.changelog.yaml diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/4-archived-dossier.changelog.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/4-archived-dossier.changelog.yaml similarity index 100% rename from persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/4-archived-dossier.changelog.yaml rename to persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/4-archived-dossier.changelog.yaml diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/40-remove-quartz.changelog.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/40-remove-quartz.changelog.yaml similarity index 100% rename from persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/40-remove-quartz.changelog.yaml rename to persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/40-remove-quartz.changelog.yaml diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/43-add-reports-information-column.changelog.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/43-add-reports-information-column.changelog.yaml new file mode 100644 index 000000000..1f114db45 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/43-add-reports-information-column.changelog.yaml @@ -0,0 +1,40 @@ +databaseChangeLog: + - changeSet: + id: add-reports-info-table + author: corinaolariu + changes: + - createTable: + columns: + - column: + constraints: + nullable: false + name: download_status_entity_storage_id + type: VARCHAR(255) + - column: + constraints: + nullable: false + name: reports_template_id + type: VARCHAR(255) + tableName: download_status_reports + - addForeignKeyConstraint: + baseColumnNames: reports_template_id + baseTableName: download_status_reports + constraintName: download_status_reports_to_report_templates + deferrable: false + initiallyDeferred: false + onDelete: NO ACTION + onUpdate: NO ACTION + referencedColumnNames: template_id + referencedTableName: report_template + validate: true + - addForeignKeyConstraint: + baseColumnNames: download_status_entity_storage_id + baseTableName: download_status_reports + constraintName: download_status_reports_to_download_status + deferrable: false + initiallyDeferred: false + onDelete: NO ACTION + onUpdate: NO ACTION + referencedColumnNames: storage_id + referencedTableName: download_status + validate: true diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/44-add-redaction-preview-color-column.changelog.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/44-add-redaction-preview-color-column.changelog.yaml similarity index 100% rename from persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/44-add-redaction-preview-color-column.changelog.yaml rename to persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/44-add-redaction-preview-color-column.changelog.yaml diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/5-excluded-from-automatic-analysis-file-column.changelog.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/5-excluded-from-automatic-analysis-file-column.changelog.yaml similarity index 65% rename from persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/5-excluded-from-automatic-analysis-file-column.changelog.yaml rename to persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/5-excluded-from-automatic-analysis-file-column.changelog.yaml index 0812016b0..258841460 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/5-excluded-from-automatic-analysis-file-column.changelog.yaml +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/5-excluded-from-automatic-analysis-file-column.changelog.yaml @@ -14,10 +14,10 @@ databaseChangeLog: id: updated-excluded-from-automatic-analysis-column author: timo changes: - - update: - columns: - - column: - name: excluded_from_automatic_analysis - value: true - tableName: file - where: workflow_status = 'APPROVED' + - update: + columns: + - column: + name: excluded_from_automatic_analysis + value: true + tableName: file + where: workflow_status = 'APPROVED' diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/6-dossier-status-table.changelog.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/6-dossier-status-table.changelog.yaml similarity index 100% rename from persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/6-dossier-status-table.changelog.yaml rename to persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/6-dossier-status-table.changelog.yaml diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/7-json-column-mapping.changelog.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/7-json-column-mapping.changelog.yaml similarity index 100% rename from persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/7-json-column-mapping.changelog.yaml rename to persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/7-json-column-mapping.changelog.yaml diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/8-remove-old-dossier-status-column.changelog.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/8-remove-old-dossier-status-column.changelog.yaml similarity index 100% rename from persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/8-remove-old-dossier-status-column.changelog.yaml rename to persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/8-remove-old-dossier-status-column.changelog.yaml diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/9-changed-annotation-modification-date.changelog.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/9-changed-annotation-modification-date.changelog.yaml similarity index 100% rename from persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/9-changed-annotation-modification-date.changelog.yaml rename to persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/9-changed-annotation-modification-date.changelog.yaml diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/release-3.2.0/1-add-index-on-dictionary-entry.changelog.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/release-3.2.0/1-add-index-on-dictionary-entry.changelog.yaml similarity index 100% rename from persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/release-3.2.0/1-add-index-on-dictionary-entry.changelog.yaml rename to persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/release-3.2.0/1-add-index-on-dictionary-entry.changelog.yaml diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/release-3.3.12/1-fix-dossier-dictionary.sql b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/release-3.3.12/1-fix-dossier-dictionary.sql new file mode 100644 index 000000000..80b32ac60 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/release-3.3.12/1-fix-dossier-dictionary.sql @@ -0,0 +1,4 @@ +update entity +set has_dictionary= true +where dossier_id is not null + and has_dictionary = false; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/release-3.3.13/1-update-soft-deleted-processed-flag.sql b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/release-3.3.13/1-update-soft-deleted-processed-flag.sql new file mode 100644 index 000000000..1158dd799 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/release-3.3.13/1-update-soft-deleted-processed-flag.sql @@ -0,0 +1,3 @@ +update file +set processing_status = 'PROCESSED' +where deleted is not null; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/release-3.3.14/1-bump-rules-version.sql b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/release-3.3.14/1-bump-rules-version.sql new file mode 100644 index 000000000..e85ed8b2b --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/release-3.3.14/1-bump-rules-version.sql @@ -0,0 +1,2 @@ +update rule_set +set version = version + 1; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/10-set-file-manipulation-date.sql b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/10-set-file-manipulation-date.sql new file mode 100644 index 000000000..058608859 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/10-set-file-manipulation-date.sql @@ -0,0 +1,3 @@ +update file +set file_manipulation_date = GREATEST(lastocrtime, last_updated); + diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/201-acl-duplicate-cleanup.sql b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/201-acl-duplicate-cleanup.sql new file mode 100644 index 000000000..ffd4729ee --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/201-acl-duplicate-cleanup.sql @@ -0,0 +1,29 @@ +update acl_entry e set acl_object_identity = ( + select min(id) + from acl_object_identity oi2 + where oi2.object_id_identity = ( + select object_id_identity from acl_object_identity oi1 where oi1.id = e.acl_object_identity + ) +); + + +update acl_entry e set sid = ( + select min(id) + from acl_sid sid2 + where sid2.sid = ( + select sid from acl_sid sid1 where sid1.id = e.sid + ) +); + + +update acl_object_identity e set owner_sid = ( + select min(id) + from acl_sid sid2 + where sid2.sid = ( + select sid from acl_sid sid1 where sid1.id = e.owner_sid + ) +); + + +delete from acl_sid s1 where s1.id != ( select min(s2.id) from acl_sid s2 where s2.sid = s1.sid); +delete from acl_object_identity s1 where s1.id != ( select min(s2.id) from acl_object_identity s2 where s2.object_id_identity = s1.object_id_identity); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/202-acl-duplicate-cleanup.sql b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/202-acl-duplicate-cleanup.sql new file mode 100644 index 000000000..f8926a617 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/202-acl-duplicate-cleanup.sql @@ -0,0 +1,26 @@ +update acl_entry e set acl_object_identity = ( + select min(id) + from acl_object_identity oi2 + where oi2.object_id_identity = ( + select object_id_identity from acl_object_identity oi1 where oi1.id = e.acl_object_identity + ) +); + +update acl_entry e set sid = ( + select min(id) + from acl_sid sid2 + where sid2.sid = ( + select sid from acl_sid sid1 where sid1.id = e.sid + ) +); + +update acl_object_identity e set owner_sid = ( + select min(id) + from acl_sid sid2 + where sid2.sid = ( + select sid from acl_sid sid1 where sid1.id = e.owner_sid + ) +); + +delete from acl_sid s1 where s1.id != ( select min(s2.id) from acl_sid s2 where s2.sid = s1.sid); +delete from acl_object_identity s1 where s1.id != ( select min(s2.id) from acl_object_identity s2 where s2.object_id_identity = s1.object_id_identity); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/22-update-file-dossier-attributes.sql b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/22-update-file-dossier-attributes.sql new file mode 100644 index 000000000..9e430af2c --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/22-update-file-dossier-attributes.sql @@ -0,0 +1,6 @@ +update file_attribute +set value = null +where trim(value) = ''; +update dossier_attribute +set value = null +where trim(value) = ''; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/24.0-clean-up-duplicate-dictionary-entries.sql b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/24.0-clean-up-duplicate-dictionary-entries.sql new file mode 100644 index 000000000..7be92da26 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/24.0-clean-up-duplicate-dictionary-entries.sql @@ -0,0 +1,26 @@ +delete +from dictionary_entry de1 +where exists( + select type_id, value + from dictionary_entry de2 + where de2.type_id = de1.type_id + and de2.value = de1.value + and (de1.version < de2.version or (de1.version = de2.version and de1.entry_id < de2.entry_id))); + +delete +from dictionary_false_recommendation_entry dfre1 +where exists( + select type_id, value + from dictionary_false_recommendation_entry dfre2 + where dfre2.type_id = dfre1.type_id + and dfre2.value = dfre1.value + and (dfre1.version < dfre2.version or (dfre1.version = dfre2.version and dfre1.entry_id < dfre2.entry_id))); + +delete +from dictionary_false_positive_entry dfpe1 +where exists( + select type_id, value + from dictionary_false_positive_entry dfpe2 + where dfpe2.type_id = dfpe1.type_id + and dfpe2.value = dfpe1.value + and (dfpe1.version < dfpe2.version or (dfpe1.version = dfpe2.version and dfpe1.entry_id < dfpe2.entry_id))); diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/26-initiliaze-application-configuration-table.sql b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/26-initiliaze-application-configuration-table.sql similarity index 100% rename from persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/26-initiliaze-application-configuration-table.sql rename to persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/26-initiliaze-application-configuration-table.sql diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/27-update-soft-delete-date.sql b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/27-update-soft-delete-date.sql new file mode 100644 index 000000000..33b25822d --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/27-update-soft-delete-date.sql @@ -0,0 +1,9 @@ +update file +set deleted = CURRENT_TIMESTAMP, + processing_status = 'PROCESSED' +where deleted is null + and hard_deleted_time is null + and processing_status = 'DELETED'; +update file +set processing_status = 'PROCESSED' +where processing_status = 'DELETED'; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/30-change-bigint-to-serial.sql b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/30-change-bigint-to-serial.sql new file mode 100644 index 000000000..307ef233f --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/30-change-bigint-to-serial.sql @@ -0,0 +1,10 @@ +ALTER TABLE dictionary_entry + ALTER entry_id ADD GENERATED ALWAYS AS IDENTITY; +ALTER TABLE dictionary_false_recommendation_entry + ALTER entry_id ADD GENERATED ALWAYS AS IDENTITY; +ALTER TABLE dictionary_false_positive_entry + ALTER entry_id ADD GENERATED ALWAYS AS IDENTITY; + +SELECT setval(pg_get_serial_sequence('dictionary_entry', 'entry_id'), (select coalesce(max(entry_id) + 1, 1) from dictionary_entry)); +SELECT setval(pg_get_serial_sequence('dictionary_false_recommendation_entry', 'entry_id'), (select coalesce(max(entry_id) + 1, 1) from dictionary_false_recommendation_entry)); +SELECT setval(pg_get_serial_sequence('dictionary_false_positive_entry', 'entry_id'), (select coalesce(max(entry_id) + 1, 1) from dictionary_false_positive_entry)); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/31-watermark-configuration.sql b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/31-watermark-configuration.sql new file mode 100644 index 000000000..5b415b684 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/31-watermark-configuration.sql @@ -0,0 +1,45 @@ +-- add the generated id to watermark_configuration table +alter table watermark_configuration + add column id BIGINT GENERATED ALWAYS AS IDENTITY; +alter table watermark_configuration + add column name VARCHAR(255), + add column enabled BOOLEAN DEFAULT TRUE, + add column created_by VARCHAR(255), + add column date_added TIMESTAMP WITHOUT TIME ZONE, + add column date_modified TIMESTAMP WITHOUT TIME ZONE; +--initialise the new columns for the current watermark configurations +update watermark_configuration +set name = 'Watermark ' || id, + enabled = true; + +-- update the primary key constraint based on the new configuration and add the foreign key contraints to the dossier and dossier_template tables +alter table watermark_configuration + drop constraint watermark_configuration_pkey; +alter table watermark_configuration + add constraint watermark_configuration_pkey PRIMARY KEY (id); +delete +from watermark_configuration +where dossier_template_id not in (select id from dossier_template); +alter table watermark_configuration + add constraint watermark_dossier_template_id_fk FOREIGN KEY (dossier_template_id) REFERENCES dossier_template (id); +-- add the link to watermark_configuration to dossier table and the foreign key contraints +alter table dossier + add column watermark_id BIGINT; +alter table dossier + add column preview_watermark_id BIGINT; +alter table dossier + add constraint watermark_id_fk FOREIGN KEY (watermark_id) REFERENCES watermark_configuration (id); +alter table dossier + add constraint preview_watermark_id_fk FOREIGN KEY (preview_watermark_id) REFERENCES watermark_configuration (id); +-- update the dossier table with the corresponding watermark based on the dossier template given +update dossier d +set watermark_id = (select id from watermark_configuration w where w.dossier_template_id = d.dossier_template_id) +where d.watermark_enabled = true; +update dossier d +set preview_watermark_id = (select id from watermark_configuration w where w.dossier_template_id = d.dossier_template_id) +where d.watermark_preview_enabled = true; +-- remove the previous columns, not needed anymore +alter table dossier + drop column watermark_enabled; +alter table dossier + drop column watermark_preview_enabled; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/33-set-file-processing-error-counter.sql b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/33-set-file-processing-error-counter.sql new file mode 100644 index 000000000..f112342ab --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/33-set-file-processing-error-counter.sql @@ -0,0 +1,3 @@ +update file +set processing_error_counter = 0 +where processing_error_counter is null; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/35-update-skipped-color-existing-types.sql b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/35-update-skipped-color-existing-types.sql new file mode 100644 index 000000000..94d4c008a --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/35-update-skipped-color-existing-types.sql @@ -0,0 +1,3 @@ +update entity e +set skipped_hex_color = (select not_redacted from color_configuration c where c.dossier_template_id = e.dossier_template_id) +where skipped_hex_color is null; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/37-update-colors.sql b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/37-update-colors.sql new file mode 100644 index 000000000..800e7c985 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/37-update-colors.sql @@ -0,0 +1,43 @@ +-- color configuration general fixes +alter table color_configuration + add column request_add_color VARCHAR(255); +alter table color_configuration + add column request_remove_color VARCHAR(255); +alter table color_configuration + add column recommendation_color VARCHAR(255); +alter table color_configuration + add column skipped_color VARCHAR(255); +alter table color_configuration + add column redaction_color VARCHAR(255); +alter table color_configuration + add column hint_color VARCHAR(255); + +update color_configuration +set request_add_color = request_add; +update color_configuration +set request_remove_color = request_remove; +update color_configuration +set skipped_color = not_redacted; +update color_configuration +set redaction_color = preview_color; +update color_configuration +set hint_color = '#fa98f7'; -- UI Hardcoded value +update color_configuration +set recommendation_color = '#c5d3eb'; -- UI Hardcoded value + +alter table color_configuration + drop column manual_redaction_color; +alter table color_configuration + drop column request_add; +alter table color_configuration + drop column request_remove; +alter table color_configuration + drop column not_redacted; + +-- update color values for existing +update entity e +set recommendation_hex_color = (select recommendation_color from color_configuration c where c.dossier_template_id = e.dossier_template_id) +where recommendation_hex_color is null; +update entity e +set skipped_hex_color = '#ec9090' +where e.dossier_id is not null; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/38-update-soft-deleted-processed-flag.sql b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/38-update-soft-deleted-processed-flag.sql new file mode 100644 index 000000000..1158dd799 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/38-update-soft-deleted-processed-flag.sql @@ -0,0 +1,3 @@ +update file +set processing_status = 'PROCESSED' +where deleted is not null; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/39-update-manual-redaction-source-id.sql b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/39-update-manual-redaction-source-id.sql similarity index 100% rename from persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/39-update-manual-redaction-source-id.sql rename to persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/39-update-manual-redaction-source-id.sql diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/41-update-ocr-file-columns.sql b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/41-update-ocr-file-columns.sql new file mode 100644 index 000000000..e6f136e77 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/41-update-ocr-file-columns.sql @@ -0,0 +1,10 @@ +ALTER TABLE file + RENAME COLUMN lastocrtime TO ocr_start_time; +ALTER TABLE file + ADD COLUMN ocr_end_time TIMESTAMP WITHOUT TIME ZONE; +update file +set ocr_end_time = ocr_start_time; +ALTER TABLE FILE + ADD COLUMN number_of_pages_to_ocr BIGINT; +ALTER TABLE FILE + ADD COLUMN number_of_ocred_pages BIGINT; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/42-add-encoding-column-file-attribute-config.sql b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/42-add-encoding-column-file-attribute-config.sql new file mode 100644 index 000000000..76e617de1 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/42-add-encoding-column-file-attribute-config.sql @@ -0,0 +1,4 @@ +ALTER TABLE file_attribute_general_configuration + ADD COLUMN encoding VARCHAR(255); +update file_attribute_general_configuration +set encoding = 'UTF-8'; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/43-add-applied-redaction-color.sql b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/43-add-applied-redaction-color.sql new file mode 100644 index 000000000..a32e8bfc1 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/43-add-applied-redaction-color.sql @@ -0,0 +1,7 @@ +-- add new column +alter table color_configuration + add column applied_redaction_color VARCHAR(255); + +update color_configuration +set applied_redaction_color = '#000000'; -- default is black + diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/45-unique-dossier-name.sql b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/45-unique-dossier-name.sql new file mode 100644 index 000000000..c1b9794d2 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/45-unique-dossier-name.sql @@ -0,0 +1,13 @@ +-- update duplicate dossier names +update dossier d1 +set dossier_name = (select case + when cnt = 1 then dossier_name + else dossier_name || ' ' || rn + end as dossier_name + from (select *, row_number() over w rn, count(*) over w cnt + from dossier + window w as (partition by dossier_name)) t + where t.id = d1.id); + +-- create unique index on dossier_name and hard_deleted_time +CREATE UNIQUE INDEX dossier_name_index ON dossier (dossier_name, (hard_deleted_time IS NULL)) WHERE hard_deleted_time IS NULL; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/7.1-set-json-fields.sql b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/7.1-set-json-fields.sql new file mode 100644 index 000000000..aff859416 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/7.1-set-json-fields.sql @@ -0,0 +1,38 @@ +update file +set excluded_pages = + (select '[' || STRING_AGG(excluded_pages || '', ', ') || ']' from file_entity_excluded_pages fe where fe.file_entity_id = file.id group by fe.file_entity_id); + +update dossier +set members = + (select '[' || STRING_AGG('"' || member_ids || '"', ', ') || ']' + from dossier_entity_member_ids dem + where dem.dossier_entity_id = dossier.id + group by dem.dossier_entity_id); + +update dossier +set approvers = + (select '[' || STRING_AGG('"' || approver_ids || '"', ', ') || ']' + from dossier_entity_approver_ids dem + where dem.dossier_entity_id = dossier.id + group by dem.dossier_entity_id); + +update dossier +set download_file_types = + (select '[' || STRING_AGG('"' || download_file_types || '"', ', ') || ']' + from dossier_entity_download_file_types dem + where dem.dossier_entity_id = dossier.id + group by dem.dossier_entity_id); + +update dossier_template +set download_file_types = + (select '[' || STRING_AGG('"' || download_file_types || '"', ', ') || ']' + from dossier_template_entity_download_file_types dem + where dem.dossier_template_entity_id = dossier_template.id + group by dem.dossier_template_entity_id); + +update download_status +set download_file_types = + (select '[' || STRING_AGG('"' || download_file_types || '"', ', ') || ']' + from download_status_entity_download_file_types dem + where dem.download_status_entity_storage_id = download_status.storage_id + group by dem.download_status_entity_storage_id); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/7.2-set-dossier-status.sql b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/7.2-set-dossier-status.sql new file mode 100644 index 000000000..65794be8a --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/7.2-set-dossier-status.sql @@ -0,0 +1,10 @@ +update dossier +set dossier_status = 'ACTIVE' +where status = 0 + or status is null; +update dossier +set dossier_status = 'DELETED' +where status = 1; +update dossier +set dossier_status = 'ARCHIVED' +where status = 2; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/files/stopwords.txt b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/files/stopwords.txt similarity index 100% rename from persistence-service-v1/persistence-service-server-v1/src/main/resources/files/stopwords.txt rename to persistence-service-v1/persistence-service-processor-v1/src/main/resources/files/stopwords.txt diff --git a/persistence-service-v1/persistence-service-server-v1/pom.xml b/persistence-service-v1/persistence-service-server-v1/pom.xml index 6da55d426..3690e3c23 100644 --- a/persistence-service-v1/persistence-service-server-v1/pom.xml +++ b/persistence-service-v1/persistence-service-server-v1/pom.xml @@ -18,154 +18,44 @@ - - - com.iqser.red.service - search-service-api-v1 - - - com.iqser.red.service - pdftron-redaction-service-api-v1 - - - com.iqser.red.service - persistence-service-api-v1 - - - - - com.iqser.red.service - redaction-report-service-api-v1 - - - com.iqser.red.service - pdftron-redaction-service-api-v1 - - - - - com.iqser.red.service - redaction-service-api-v1 - - - com.iqser.red.service - persistence-service-api-v1 - - - com.iqser.red.service - pdftron-redaction-service-api-v1 - - - com.iqser.red.service persistence-service-processor-v1 ${project.version} - - - com.iqser.red.service - redaction-service-api-v1 - - - - - - com.iqser.red.commons - storage-commons - com.iqser.red.service - pdftron-redaction-service-api-v1 - - - com.iqser.red.service - redaction-service-api-v1 - - - com.iqser.red.service - persistence-service-api-v1 - - + org.keycloak + keycloak-admin-client + ${keycloak.version} + compile - - - - com.iqser.red.commons - spring-commons - - - com.iqser.red.commons - jackson-commons - - - org.apache.commons - commons-compress - 1.21 - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - - - - org.postgresql - postgresql - 42.2.23 - - - - org.apache.commons - commons-lang3 - - - com.iqser.red.commons - logging-commons - - - org.slf4j - slf4j-log4j12 - - - org.springframework.boot - spring-boot-starter-web - - - com.iqser.red.commons - spring-boot-starter-web-custom-commons - - - com.iqser.red.commons - metric-commons - - - com.opencsv - opencsv - 5.4 - - - - - org.springframework.cloud - spring-cloud-starter-openfeign - - - - org.springframework.boot - spring-boot-starter-quartz - - - - org.springframework.boot - spring-boot-starter-amqp - - org.springframework.amqp spring-rabbit-test test + + junit + junit + 4.13.2 + compile + + + + + com.github.dasniko + testcontainers-keycloak + 2.3.0 + test + + + keycloak-admin-client + org.keycloak + + + org.testcontainers postgresql @@ -193,6 +83,24 @@ 2.0.0 test + + com.iqser.red.service + persistence-service-external-api-impl-v1 + 1.0-SNAPSHOT + compile + + + com.iqser.red.service + persistence-service-internal-api-impl-v1 + 1.0-SNAPSHOT + compile + + + org.keycloak + keycloak-common + ${keycloak.version} + compile + diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/Application.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/Application.java index 6f892ce2d..4980e88d9 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/Application.java +++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/Application.java @@ -1,43 +1,52 @@ package com.iqser.red.service.peristence.v1.server; +import org.keycloak.adapters.springboot.KeycloakSpringBootProperties; import org.springframework.boot.SpringApplication; import org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration; import org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration; import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Import; import org.springframework.retry.annotation.EnableRetry; -import org.springframework.retry.backoff.ExponentialBackOffPolicy; -import org.springframework.retry.policy.SimpleRetryPolicy; -import org.springframework.retry.support.RetryTemplate; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import com.iqser.red.service.peristence.v1.server.client.RedactionClient; -import com.iqser.red.service.peristence.v1.server.configuration.CleanupDownloadSchedulerConfiguration; -import com.iqser.red.service.peristence.v1.server.configuration.MessagingConfiguration; -import com.iqser.red.service.peristence.v1.server.multitenancy.AsyncConfig; -import com.iqser.red.service.peristence.v1.server.multitenancy.MultiTenancyMessagingConfiguration; -import com.iqser.red.service.peristence.v1.server.multitenancy.MultiTenancyWebConfiguration; -import com.iqser.red.service.peristence.v1.server.settings.FileManagementServiceSettings; +import com.giffing.bucket4j.spring.boot.starter.config.webflux.Bucket4JAutoConfigurationWebfluxFilter; +import com.iqser.red.keycloak.commons.DefaultKeyCloakCommonsConfiguration; +import com.iqser.red.keycloak.commons.KeyCloakSettings; +import com.iqser.red.persistence.service.v1.external.api.impl.PersistenceServiceExternalApiConfiguration; +import com.iqser.red.persistence.service.v1.external.api.impl.cache.PersistenceServiceExternalApiCacheConfiguration; +import com.iqser.red.persistence.service.v1.external.api.impl.swagger.SwaggerAutoConfiguration; import com.iqser.red.service.persistence.management.v1.processor.PersistenceServiceProcessorConfiguration; +import com.iqser.red.service.persistence.management.v1.processor.configuration.CleanupDownloadSchedulerConfiguration; +import com.iqser.red.service.persistence.management.v1.processor.configuration.MessagingConfiguration; +import com.iqser.red.service.persistence.management.v1.processor.multitenancy.AsyncConfig; +import com.iqser.red.service.persistence.management.v1.processor.multitenancy.MultiTenancyMessagingConfiguration; +import com.iqser.red.service.persistence.management.v1.processor.multitenancy.MultiTenancyWebConfiguration; +import com.iqser.red.service.persistence.management.v1.processor.settings.FileManagementServiceSettings; +import com.iqser.red.service.persistence.v1.internal.api.PersistenceServiceInternalApiConfiguration; import io.micrometer.core.aop.TimedAspect; import io.micrometer.core.instrument.MeterRegistry; +import lombok.extern.slf4j.Slf4j; +@Slf4j @EnableAsync @EnableRetry @EnableScheduling -@EnableConfigurationProperties(FileManagementServiceSettings.class) -@SpringBootApplication(exclude = {SecurityAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class, CassandraAutoConfiguration.class, DataSourceAutoConfiguration.class, LiquibaseAutoConfiguration.class, QuartzAutoConfiguration.class}) -@Import({MultiTenancyWebConfiguration.class, PersistenceServiceProcessorConfiguration.class, MessagingConfiguration.class, CleanupDownloadSchedulerConfiguration.class, AsyncConfig.class, MultiTenancyMessagingConfiguration.class}) -@EnableFeignClients(basePackageClasses = {RedactionClient.class}) +@EnableCaching +@EnableConfigurationProperties({KeyCloakSettings.class, KeycloakSpringBootProperties.class, FileManagementServiceSettings.class}) +@SpringBootApplication(exclude = {SecurityAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class, CassandraAutoConfiguration.class, DataSourceAutoConfiguration.class, LiquibaseAutoConfiguration.class, QuartzAutoConfiguration.class, Bucket4JAutoConfigurationWebfluxFilter.class,}) +@Import({PersistenceServiceExternalApiConfiguration.class, PersistenceServiceInternalApiConfiguration.class, SwaggerAutoConfiguration.class, DefaultKeyCloakCommonsConfiguration.class, PersistenceServiceExternalApiCacheConfiguration.class, MultiTenancyWebConfiguration.class, PersistenceServiceProcessorConfiguration.class, MessagingConfiguration.class, CleanupDownloadSchedulerConfiguration.class, AsyncConfig.class, MultiTenancyMessagingConfiguration.class}) public class Application { /** @@ -50,26 +59,28 @@ public class Application { SpringApplication.run(Application.class, args); } + @Bean public TimedAspect timedAspect(MeterRegistry registry) { return new TimedAspect(registry); } + @Bean - public RetryTemplate retryTemplate(FileManagementServiceSettings settings) { + @ConditionalOnProperty(value = "cors.enabled", havingValue = "true") + public WebMvcConfigurer corsConfigurer() { - RetryTemplate retryTemplate = new RetryTemplate(); + return new WebMvcConfigurer() { - ExponentialBackOffPolicy backOffPolicy = new ExponentialBackOffPolicy(); - backOffPolicy.setMaxInterval(settings.getMaxRetryInterval()); - retryTemplate.setBackOffPolicy(backOffPolicy); + @Override + public void addCorsMappings(CorsRegistry registry) { - SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy(); - retryPolicy.setMaxAttempts(settings.getMaxRetryAttempts()); - retryTemplate.setRetryPolicy(retryPolicy); + log.info("Cross Origin Requests are enabled !!!"); + registry.addMapping("/**").allowedOrigins("*").allowedMethods("GET", "POST", "DELETE", "PUT", "HEAD"); - return retryTemplate; + } + }; } } diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/DevConfiguration.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/DevConfiguration.java new file mode 100644 index 000000000..1ca279079 --- /dev/null +++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/DevConfiguration.java @@ -0,0 +1,137 @@ +package com.iqser.red.service.peristence.v1.server; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.util.Set; +import java.util.UUID; + +import javax.annotation.PostConstruct; +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.StatementCallback; +import org.springframework.jdbc.datasource.SingleConnectionDataSource; + +import com.iqser.red.service.persistence.management.v1.processor.service.TenantManagementService; +import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.DatabaseConnection; +import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.S3StorageConnection; +import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.SearchConnection; +import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.TenantRequest; + +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Profile("dev") +@Configuration +public class DevConfiguration { + + @Autowired + private TenantManagementService tenantManagementService; + + @Autowired + @Qualifier("masterDataSource") + private DataSource dataSource; + + @Value("${multitenancy.master.datasource.url:}") + private String masterJDBCURL; + + + @PostConstruct + + public void createDefaultTenant() { + + log.info("Creating Redaction Tenant"); + + if (tenantManagementService.getTenants().isEmpty()) { + + var jdbcUrl = masterJDBCURL.substring(0, masterJDBCURL.lastIndexOf('/') + 1) + "redaction?currentSchema=myschema"; + + createDatabase("redaction", "redaction"); + createSchema(jdbcUrl, "redaction", "redaction"); + + + var tenantRequest = TenantRequest.builder() + .tenantId("redaction") + .displayName("Redaction default") + .guid(UUID.randomUUID().toString()) + .databaseConnection(DatabaseConnection.builder() + .driver("postgresql") + .host("localhost") + .port("5432") + .database("redaction") + .schema("myschema") + .username("redaction") + .password("redaction") + .build()) + .searchConnection(SearchConnection.builder() + .hosts(Set.of("elasticsearchHost")) + .port(9200) + .scheme("https") + .username("elastic") + .password("changeMe") + .numberOfShards("1") + .numberOfReplicas("5") + .build()) + .s3StorageConnection(S3StorageConnection.builder() + .key("key") + .secret("secret") + .signerType("signerType") + .bucketName("bucketName") + .region("eu") + .endpoint("endpoint") + .build()) + .build(); + + tenantManagementService.createTenant(tenantRequest); + + } + } + + + @SneakyThrows + public void createSchema(String jdbcUrl, String username, String password) { + + try (Connection connection = DriverManager.getConnection(jdbcUrl, username, password)) { + DataSource tenantDataSource = new SingleConnectionDataSource(connection, false); + JdbcTemplate insert = new JdbcTemplate(tenantDataSource); + try { + insert.execute((StatementCallback) stmt -> stmt.execute("CREATE SCHEMA myschema")); + } catch (Exception e) { + log.warn("schema already exists"); + } + try { + insert.execute((StatementCallback) stmt -> stmt.execute("GRANT USAGE ON SCHEMA myschema TO " + username)); + } catch (Exception e) { + log.warn("grant invalid"); + } + } + } + + + private void createDatabase(String db, String password) { + + var jdbcTemplate = new JdbcTemplate(dataSource); + try { + jdbcTemplate.execute((StatementCallback) stmt -> stmt.execute("CREATE DATABASE " + db)); + } catch (Exception e) { + log.warn("DB already exists"); + } + try { + jdbcTemplate.execute((StatementCallback) stmt -> stmt.execute("CREATE USER " + db + " WITH ENCRYPTED PASSWORD '" + password + "'")); + } catch (Exception e) { + log.warn("user already exists"); + } + try { + jdbcTemplate.execute((StatementCallback) stmt -> stmt.execute("GRANT ALL PRIVILEGES ON DATABASE " + db + " TO " + db)); + } catch (Exception e) { + log.warn("grant invalid"); + } + } + +} diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ApplicationConfigurationController.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ApplicationConfigurationController.java deleted file mode 100644 index 3a33fb786..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ApplicationConfigurationController.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.iqser.red.service.peristence.v1.server.controller; - -import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; - -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; - -import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.ApplicationConfigurationEntity; -import com.iqser.red.service.persistence.management.v1.processor.service.ApplicationConfigService; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.ApplicationConfig; -import com.iqser.red.service.persistence.service.v1.api.resources.ApplicationConfigurationResource; - -import lombok.RequiredArgsConstructor; - -@RestController -@RequiredArgsConstructor -public class ApplicationConfigurationController implements ApplicationConfigurationResource { - - private final ApplicationConfigService applicationConfigService; - - - public ApplicationConfig createOrUpdateAppConfig(@RequestBody ApplicationConfig appConfig) { - - return convert(applicationConfigService.saveApplicationConfiguration(convert(appConfig, ApplicationConfigurationEntity.class)), ApplicationConfig.class); - } - - - public ApplicationConfig getCurrentApplicationConfig() { - - return convert(applicationConfigService.getApplicationConfig(), ApplicationConfig.class); - } - -} diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/AuditController.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/AuditController.java deleted file mode 100644 index a21ac3d29..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/AuditController.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.iqser.red.service.peristence.v1.server.controller; - -import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; - -import java.util.List; - -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; - -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; -import com.iqser.red.service.persistence.service.v1.api.model.audit.AuditModel; -import com.iqser.red.service.persistence.service.v1.api.model.audit.AuditRequest; -import com.iqser.red.service.persistence.service.v1.api.model.audit.AuditSearchRequest; -import com.iqser.red.service.persistence.service.v1.api.model.audit.CategoryModel; -import com.iqser.red.service.persistence.service.v1.api.model.common.Page; -import com.iqser.red.service.persistence.service.v1.api.resources.AuditResource; - -import lombok.RequiredArgsConstructor; - -@RestController -@RequiredArgsConstructor -public class AuditController implements AuditResource { - - private final AuditPersistenceService auditPersistenceService; - - - @Override - public void audit(@RequestBody AuditRequest auditRequest) { - - auditPersistenceService.insertRecord(auditRequest); - } - - - @Override - public Page search(@RequestBody AuditSearchRequest auditSearchRequest) { - - return convert(auditPersistenceService.search(auditSearchRequest), AuditModel.class); - } - - - @Override - public List getCategories() { - - return auditPersistenceService.getCategories(); - } - -} diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DictionaryController.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DictionaryController.java deleted file mode 100644 index 27a250a8d..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DictionaryController.java +++ /dev/null @@ -1,147 +0,0 @@ -package com.iqser.red.service.peristence.v1.server.controller; - -import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; - -import java.util.List; - -import javax.transaction.Transactional; - -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import com.iqser.red.service.peristence.v1.server.service.DictionaryService; -import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.ColorsEntity; -import com.iqser.red.service.persistence.management.v1.processor.service.ColorsService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DictionaryPersistenceService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.EntryPersistenceService; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.Colors; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.DictionaryEntry; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.DictionaryEntryType; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.Type; -import com.iqser.red.service.persistence.service.v1.api.resources.DictionaryResource; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@RestController -@RequiredArgsConstructor -@Slf4j -public class DictionaryController implements DictionaryResource { - - private final EntryPersistenceService entryPersistenceService; - private final DictionaryPersistenceService dictionaryPersistenceService; - private final ColorsService colorsService; - private final DictionaryService dictionaryService; - - - @Override - public void addEntries(@PathVariable(TYPE_PARAMETER_NAME) String typeId, - @RequestBody List entries, - @RequestParam(value = "removeCurrent", required = false, defaultValue = "false") boolean removeCurrent, - @RequestParam(value = "ignoreInvalidEntries", required = false, defaultValue = "false") boolean ignoreInvalidEntries, - @RequestParam(value = "dictionaryEntryType", required = false, defaultValue = "ENTRY") DictionaryEntryType dictionaryEntryType) { - - dictionaryService.addEntries(typeId, entries, removeCurrent, ignoreInvalidEntries, dictionaryEntryType); - } - - - @Override - public void deleteEntries(@PathVariable(TYPE_PARAMETER_NAME) String typeId, - @RequestBody List entries, - @RequestParam(value = "dictionaryEntryType", required = false, defaultValue = "ENTRY") DictionaryEntryType dictionaryEntryType) { - - dictionaryService.deleteEntries(typeId, entries, dictionaryEntryType); - } - - - @Override - public void updateTypeValue(@PathVariable(TYPE_PARAMETER_NAME) String typeId, @RequestBody Type typeRequest) { - - dictionaryService.updateTypeValue(typeId, typeRequest); - } - - - @Override - public Type addType(@RequestBody Type typeRequest) { - - return dictionaryService.addType(typeRequest); - } - - - @Override - public void deleteType(@PathVariable(TYPE_PARAMETER_NAME) String typeId) { - - dictionaryService.deleteType(typeId); - } - - - @Override - public List getAllTypesForDossierTemplate(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, - @RequestParam(value = INCLUDE_DELETED_PARAMETER_NAME, required = false, defaultValue = "false") boolean includeDeleted) { - - return convert(dictionaryPersistenceService.getAllTypesForDossierTemplate(dossierTemplateId, includeDeleted), Type.class); - } - - - @Override - public List getAllTypesForDossier(@PathVariable(DOSSIER_ID_PARAMETER_NAME) String dossierId, - @RequestParam(value = INCLUDE_DELETED_PARAMETER_NAME, required = false, defaultValue = "false") boolean includeDeleted) { - - return convert(dictionaryPersistenceService.getAllTypesForDossier(dossierId, includeDeleted), Type.class); - } - - - @Override - public Type getDictionaryForType(@PathVariable(TYPE_PARAMETER_NAME) String typeId, @RequestParam(value = FROM_VERSION_PARAM, required = false) Long fromVersion) { - - var entity = dictionaryPersistenceService.getType(typeId); - var target = convert(entity, Type.class); - target.setEntries(convert(entryPersistenceService.getEntries(typeId, DictionaryEntryType.ENTRY, fromVersion), DictionaryEntry.class)); - target.setFalsePositiveEntries(convert(entryPersistenceService.getEntries(typeId, DictionaryEntryType.FALSE_POSITIVE, fromVersion), DictionaryEntry.class)); - target.setFalseRecommendationEntries(convert(entryPersistenceService.getEntries(typeId, DictionaryEntryType.FALSE_RECOMMENDATION, fromVersion), DictionaryEntry.class)); - return target; - } - - - @Override - @Transactional - public List getEntriesForType(@PathVariable(TYPE_PARAMETER_NAME) String typeId, - @RequestParam(value = FROM_VERSION_PARAM, required = false) Long fromVersion, - @RequestParam(value = "dictionaryEntryType", required = false, defaultValue = "ENTRY") DictionaryEntryType dictionaryEntryType) { - - var entries = entryPersistenceService.getEntries(typeId, dictionaryEntryType, fromVersion); - return convert(entries, DictionaryEntry.class); - } - - - @Override - public long getVersion(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId) { - - return dictionaryPersistenceService.getVersion(dossierTemplateId); - } - - - @Override - public long getVersionForDossier(@PathVariable(DOSSIER_ID_PARAMETER_NAME) String dossierId) { - - return dictionaryPersistenceService.getVersionForDossier(dossierId); - } - - - @Override - public void setColors(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, @RequestBody Colors colors) { - - colors.setDossierTemplateId(dossierTemplateId); - colorsService.saveColors(convert(colors, ColorsEntity.class)); - } - - - @Override - public Colors getColors(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId) { - - return convert(colorsService.getColors(dossierTemplateId), Colors.class); - } - -} diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DigitalSignatureController.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DigitalSignatureController.java deleted file mode 100644 index 6e1b7dc96..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DigitalSignatureController.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.iqser.red.service.peristence.v1.server.controller; - -import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; - -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; - -import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.DigitalSignatureEntity; -import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.DigitalSignatureKmsEntity; -import com.iqser.red.service.persistence.management.v1.processor.service.DigitalSignatureKmsService; -import com.iqser.red.service.persistence.management.v1.processor.service.DigitalSignatureService; -import com.iqser.red.service.persistence.management.v1.processor.service.DigitalSignatureTypeService; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.DigitalSignature; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.DigitalSignatureKms; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.DigitalSignatureType; -import com.iqser.red.service.persistence.service.v1.api.resources.DigitalSignatureResource; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@RestController -@RequiredArgsConstructor -public class DigitalSignatureController implements DigitalSignatureResource { - - private final DigitalSignatureTypeService digitalSignatureTypeService; - private final DigitalSignatureService digitalSignatureService; - private final DigitalSignatureKmsService digitalSignatureKmsService; - - - @Override - public DigitalSignatureType getActiveDigitalSignatureType() { - - return digitalSignatureTypeService.getActiveDigitalSignatureType(); - - } - - - @Override - public void setActiveDigitalSignatureType(@PathVariable(DIGITAL_SIGNATURE_TYPE) DigitalSignatureType digitalSignatureType) { - - digitalSignatureTypeService.setActiveDigitalSignatureType(digitalSignatureType); - - } - - - @Override - public DigitalSignature saveDigitalSignature(@RequestBody DigitalSignature digitalSignature) { - - return convert(digitalSignatureService.saveDigitalSignature(convert(digitalSignature, DigitalSignatureEntity.class)), DigitalSignature.class); - } - - - @Override - public void updateDigitalSignature(@RequestBody DigitalSignature digitalSignature) { - - digitalSignatureService.updateDigitalSignature(convert(digitalSignature, DigitalSignatureEntity.class)); - } - - - @Override - public DigitalSignature getDigitalSignature() { - - return convert(digitalSignatureService.getDigitalSignature(), DigitalSignature.class); - } - - - @Override - public void deleteDigitalSignature() { - - digitalSignatureService.deleteDigitalSignature(); - } - - - @Override - public DigitalSignatureKms saveDigitalSignatureKms(@RequestBody DigitalSignatureKms digitalSignature) { - - return convert(digitalSignatureKmsService.saveDigitalSignature(convert(digitalSignature, DigitalSignatureKmsEntity.class)), DigitalSignatureKms.class); - } - - - @Override - public DigitalSignatureKms getDigitalSignatureKms() { - - return convert(digitalSignatureKmsService.getDigitalSignature(), DigitalSignatureKms.class); - } - - - @Override - public void deleteDigitalSignatureKms() { - - digitalSignatureKmsService.deleteDigitalSignature(); - } - -} diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DossierAttributesConfigController.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DossierAttributesConfigController.java deleted file mode 100644 index 6718fafaf..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DossierAttributesConfigController.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.iqser.red.service.peristence.v1.server.controller; - -import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; - -import java.util.List; - -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; - -import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierAttributeConfigEntity; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierAttributeConfigPersistenceService; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierAttributeConfig; -import com.iqser.red.service.persistence.service.v1.api.resources.DossierAttributesConfigResource; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@RestController -@RequiredArgsConstructor -public class DossierAttributesConfigController implements DossierAttributesConfigResource { - - private final DossierAttributeConfigPersistenceService dossierAttributeConfigPersistenceService; - - - @Override - public DossierAttributeConfig addOrUpdateDossierAttribute(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, - @RequestBody DossierAttributeConfig dossierAttributeConfig) { - - return convert(dossierAttributeConfigPersistenceService.addOrUpdateDossierAttribute(dossierTemplateId, convert(dossierAttributeConfig, DossierAttributeConfigEntity.class)), - DossierAttributeConfig.class); - } - - - @Override - public List setDossierAttributesConfig(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, - @RequestBody List dossierAttributesConfig) { - - return convert(dossierAttributeConfigPersistenceService.setDossierAttributesConfig(dossierTemplateId, convert(dossierAttributesConfig, DossierAttributeConfigEntity.class)), - DossierAttributeConfig.class); - } - - - @Override - public void deleteDossierAttribute(@PathVariable(DOSSIER_ATTRIBUTE_ID) String dossierAttributeId) { - - dossierAttributeConfigPersistenceService.deleteDossierAttribute(dossierAttributeId); - } - - - @Override - public void deleteDossierAttributes(@RequestBody List dossierAttributeIds) { - - dossierAttributeConfigPersistenceService.deleteDossierAttributes(dossierAttributeIds); - } - - - @Override - public List getDossierAttributes(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId) { - - return convert(dossierAttributeConfigPersistenceService.getDossierAttributes(dossierTemplateId), DossierAttributeConfig.class); - } - -} diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DossierStatsController.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DossierStatsController.java deleted file mode 100644 index 7b67e3f5a..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DossierStatsController.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.iqser.red.service.peristence.v1.server.controller; - -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; - -import org.springframework.web.bind.annotation.RestController; - -import com.iqser.red.service.peristence.v1.server.service.DossierStatsService; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierStats; -import com.iqser.red.service.persistence.service.v1.api.resources.DossierStatsResource; - -import lombok.RequiredArgsConstructor; - -@RestController -@RequiredArgsConstructor -public class DossierStatsController implements DossierStatsResource { - - private final DossierStatsService dossierStatsService; - - - @Deprecated - @Override - public DossierStats getDossierStats(String dossierId) { - - return dossierStatsService.getDossierStats(dossierId); - } - - - @Deprecated - @Override - public List getDossierStats(Set dossierIds) { - - return dossierIds.stream().map(dossierStatsService::getDossierStats).collect(Collectors.toList()); - } - -} diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DossierStatusController.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DossierStatusController.java deleted file mode 100644 index 096eebe3e..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DossierStatusController.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.iqser.red.service.peristence.v1.server.controller; - -import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; - -import java.util.List; - -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierStatusPersistenceService; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.CreateOrUpdateDossierStatusRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierStatusInfo; -import com.iqser.red.service.persistence.service.v1.api.resources.DossierStatusResource; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@RestController -@RequiredArgsConstructor -public class DossierStatusController implements DossierStatusResource { - - private final DossierStatusPersistenceService dossierStatusPersistenceService; - - - @Override - public DossierStatusInfo createOrUpdateDossierStatus(CreateOrUpdateDossierStatusRequest dossierStatusRequest) { - - return convert(dossierStatusPersistenceService.createOrUpdateDossierStatus(dossierStatusRequest), DossierStatusInfo.class); - } - - - @Override - public List getAllDossierStatusForTemplate(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId) { - - return convert(dossierStatusPersistenceService.getAllDossierStatusForTemplate(dossierTemplateId), DossierStatusInfo.class); - } - - - @Override - public List getAllDossierStatuses(@RequestBody List dossierTemplateIds) { - - return convert(dossierStatusPersistenceService.getAllDossierStatuses(dossierTemplateIds), DossierStatusInfo.class); - } - - - @Override - public DossierStatusInfo getDossierStatus(@PathVariable(DOSSIER_STATUS_ID) String dossierStatusId) { - - return dossierStatusPersistenceService.getDossierStatusInfo(dossierStatusId); - } - - - @Override - public void deleteDossierStatus(String dossierStatusId, @RequestParam(value = DOSSIER_STATUS_REPLACE_ID, required = false) String replaceDossierStatusId) { - - dossierStatusPersistenceService.deleteDossierStatus(dossierStatusId, replaceDossierStatusId); - } - -} diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DossierTemplateController.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DossierTemplateController.java deleted file mode 100644 index 339f54c4f..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DossierTemplateController.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.iqser.red.service.peristence.v1.server.controller; - -import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; - -import java.util.List; - -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import com.iqser.red.service.peristence.v1.server.model.DownloadJob; -import com.iqser.red.service.peristence.v1.server.service.DossierTemplateImportService; -import com.iqser.red.service.peristence.v1.server.service.export.DossierTemplateExportService; -import com.iqser.red.service.persistence.management.v1.processor.service.DossierTemplateCloneService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierTemplatePersistenceService; -import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.CloneDossierTemplateRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.CreateOrUpdateDossierTemplateRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierTemplate; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.importexport.ExportDownloadRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.importexport.ImportDossierTemplateRequest; -import com.iqser.red.service.persistence.service.v1.api.resources.DossierTemplateResource; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@RestController -@RequiredArgsConstructor -public class DossierTemplateController implements DossierTemplateResource { - - private final DossierTemplateExportService dossierTemplateExportService; - private final DossierTemplateImportService dossierTemplateImportService; - private final DossierTemplatePersistenceService dossierTemplatePersistenceService; - private final DossierTemplateCloneService dossierTemplateCloneService; - - - @Override - public DossierTemplate createOrUpdateDossierTemplate(@RequestBody CreateOrUpdateDossierTemplateRequest dossierTemplate) { - - return convert(dossierTemplatePersistenceService.createOrUpdateDossierTemplate(dossierTemplate), DossierTemplate.class); - } - - - @Override - public List getAllDossierTemplates() { - - return convert(dossierTemplatePersistenceService.getAllDossierTemplates(), DossierTemplate.class); - } - - - @Override - public DossierTemplate getDossierTemplate(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId) { - - return convert(dossierTemplatePersistenceService.getDossierTemplate(dossierTemplateId), DossierTemplate.class); - } - - - @Override - public void deleteDossierTemplate(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, @RequestParam(USER_ID_PARAM) String deletingUserId) { - - dossierTemplatePersistenceService.deleteDossierTemplate(dossierTemplateId, deletingUserId); - } - - - @Override - public DossierTemplate cloneDossierTemplate(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, @RequestBody CloneDossierTemplateRequest cloneDossierTemplateRequest) { - - return convert(dossierTemplateCloneService.cloneDossierTemplate(dossierTemplateId, cloneDossierTemplateRequest), DossierTemplate.class); - } - - - @Override - public JSONPrimitive prepareExportDownload(@RequestBody ExportDownloadRequest request) { - - return dossierTemplateExportService.prepareExportDownload(request); - } - - - public void createExportDownload(@RequestParam String userId, @RequestParam String storageId) { - - dossierTemplateExportService.createDownloadArchive(DownloadJob.builder().userId(userId).storageId(storageId).build()); - } - - - public DossierTemplate importDossierTemplate(@RequestBody ImportDossierTemplateRequest request) { - - String dossierTemplateId = dossierTemplateImportService.importDossierTemplate(request); - return convert(dossierTemplatePersistenceService.getDossierTemplate(dossierTemplateId), DossierTemplate.class); - } - -} diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DossierTemplateStatsController.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DossierTemplateStatsController.java deleted file mode 100644 index 088c06e42..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DossierTemplateStatsController.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.iqser.red.service.peristence.v1.server.controller; - -import java.util.List; -import java.util.Set; - -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; - -import com.iqser.red.service.peristence.v1.server.service.DossierTemplateStatsService; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierTemplateDictionaryStats; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierTemplateStats; -import com.iqser.red.service.persistence.service.v1.api.resources.DossierTemplateStatsResource; - -import lombok.RequiredArgsConstructor; - -@RestController -@RequiredArgsConstructor -public class DossierTemplateStatsController implements DossierTemplateStatsResource { - - private final DossierTemplateStatsService dossierTemplateStatsService; - - - @Override - public List getDossierTemplateDictionaryStats(@RequestBody Set dossierTemplateIds) { - - return dossierTemplateStatsService.getDossierTemplateStats(dossierTemplateIds); - } - - - @Override - public DossierTemplateStats getDossierTemplateStats(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId) { - - return dossierTemplateStatsService.getDossierTemplateStats(dossierTemplateId); - } - - - @Override - public List getDossierTemplateStats() { - - return dossierTemplateStatsService.getDossierTemplateStats(); - } - -} diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/FileAttributesConfigController.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/FileAttributesConfigController.java deleted file mode 100644 index 70858bea2..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/FileAttributesConfigController.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.iqser.red.service.peristence.v1.server.controller; - -import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; - -import java.util.List; - -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; - -import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.FileAttributesGeneralConfigurationEntity; -import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileAttributeConfigEntity; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileAttributeConfigPersistenceService; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.FileAttributesGeneralConfiguration; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileAttributeConfig; -import com.iqser.red.service.persistence.service.v1.api.resources.FileAttributesConfigResource; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@RestController -@RequiredArgsConstructor -public class FileAttributesConfigController implements FileAttributesConfigResource { - - private final FileAttributeConfigPersistenceService fileAttributeConfigPersistenceService; - - - @Override - public FileAttributeConfig addOrUpdateFileAttributeConfig(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, @RequestBody FileAttributeConfig fileAttributeConfig) { - - return convert(fileAttributeConfigPersistenceService.addOrUpdateFileAttribute(dossierTemplateId, convert(fileAttributeConfig, FileAttributeConfigEntity.class)), - FileAttributeConfig.class); - } - - - @Override - public FileAttributesGeneralConfiguration setFileAttributesGeneralConfig(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, - @RequestBody FileAttributesGeneralConfiguration fileAttributesConfig) { - - return convert(fileAttributeConfigPersistenceService.setFileAttributesGeneralConfig(dossierTemplateId, - convert(fileAttributesConfig, FileAttributesGeneralConfigurationEntity.class)), FileAttributesGeneralConfiguration.class); - } - - - @Override - public FileAttributesGeneralConfiguration getFileAttributesGeneralConfig(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId) { - - return convert(fileAttributeConfigPersistenceService.getFileAttributesGeneralConfiguration(dossierTemplateId), FileAttributesGeneralConfiguration.class); - } - - - @Override - public List setFileAttributesConfig(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, - @RequestBody List fileAttributesConfig) { - - return convert(fileAttributeConfigPersistenceService.setFileAttributesConfig(dossierTemplateId, convert(fileAttributesConfig, FileAttributeConfigEntity.class)), - FileAttributeConfig.class); - } - - - @Override - public void deleteFileAttributeConfigs(@PathVariable(FILE_ATTRIBUTE_ID) String fileAttributeId) { - - fileAttributeConfigPersistenceService.deleteFileAttribute(fileAttributeId); - } - - - @Override - public void deleteFileAttributeConfigs(@RequestBody List fileAttributeIds) { - - fileAttributeConfigPersistenceService.deleteFileAttributes(fileAttributeIds); - } - - - @Override - public List getFileAttributeConfigs(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId) { - - return convert(fileAttributeConfigPersistenceService.getFileAttributes(dossierTemplateId), FileAttributeConfig.class); - } - -} diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/LegalBasisMappingController.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/LegalBasisMappingController.java deleted file mode 100644 index 3730460a7..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/LegalBasisMappingController.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.iqser.red.service.peristence.v1.server.controller; - -import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; - -import java.util.List; - -import javax.transaction.Transactional; - -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; - -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.LegalBasisMappingPersistenceService; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.legalbasis.LegalBasis; -import com.iqser.red.service.persistence.service.v1.api.resources.LegalBasisMappingResource; - -import lombok.RequiredArgsConstructor; - -@RestController -@RequiredArgsConstructor -public class LegalBasisMappingController implements LegalBasisMappingResource { - - private final LegalBasisMappingPersistenceService legalBasisMappingPersistenceService; - - - @Override - public void deleteLegalBasis(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, @RequestBody List legalBasisNames) { - - legalBasisMappingPersistenceService.deleteLegalBasis(dossierTemplateId, legalBasisNames); - } - - - @Override - public void addOrUpdateLegalBasis(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, @RequestBody LegalBasis legalBasis) { - - legalBasisMappingPersistenceService.addOrUpdateLegalBasis(dossierTemplateId, legalBasis); - } - - - @Override - @Transactional - public void setLegalBasisMapping(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, @RequestBody List legalBasisMapping) { - - legalBasisMappingPersistenceService.setLegalBasisMapping(dossierTemplateId, legalBasisMapping); - - } - - - @Override - @Transactional - public List getLegalBasisMapping(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId) { - - return convert(legalBasisMappingPersistenceService.getLegalBasisMapping(dossierTemplateId), LegalBasis.class); - } - - - @Override - public long getVersion(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId) { - - return legalBasisMappingPersistenceService.getVersion(dossierTemplateId); - } - -} diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/LicenseReportController.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/LicenseReportController.java deleted file mode 100644 index 9de2e407b..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/LicenseReportController.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.iqser.red.service.peristence.v1.server.controller; - -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import com.iqser.red.service.peristence.v1.server.service.LicenseReportService; -import com.iqser.red.service.persistence.service.v1.api.model.license.LicenseReport; -import com.iqser.red.service.persistence.service.v1.api.model.license.LicenseReportRequest; -import com.iqser.red.service.persistence.service.v1.api.resources.LicenseReportResource; - -import lombok.RequiredArgsConstructor; - -@RestController -@RequiredArgsConstructor -public class LicenseReportController implements LicenseReportResource { - - private final LicenseReportService licenseReportService; - - - @Override - public LicenseReport getLicenseReport(@RequestBody LicenseReportRequest licenseReportRequest, - @RequestParam(value = "offset", defaultValue = "0") int offset, - @RequestParam(value = "limit", defaultValue = "20") int limit) { - - return licenseReportService.getLicenseReport(licenseReportRequest, offset, limit); - } - -} diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ManualRedactionController.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ManualRedactionController.java deleted file mode 100644 index 14e50e218..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ManualRedactionController.java +++ /dev/null @@ -1,261 +0,0 @@ -package com.iqser.red.service.peristence.v1.server.controller; - -import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; - -import java.util.List; - -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; - -import com.iqser.red.service.peristence.v1.server.service.ManualRedactionService; -import com.iqser.red.service.peristence.v1.server.utils.ManualImageRecategorizationMapper; -import com.iqser.red.service.peristence.v1.server.utils.ManualRedactionMapper; -import com.iqser.red.service.peristence.v1.server.utils.ManualResizeRedactionMapper; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.AddRedactionRequest; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.Comment; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.CommentRequest; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.ForceRedactionRequest; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.ImageRecategorizationRequest; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.LegalBasisChangeRequest; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.ManualAddResponse; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.ManualRedactions; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.RemoveRedactionRequest; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.ResizeRedactionRequest; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.UpdateRedactionRequest; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.entitymapped.IdRemoval; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.entitymapped.ManualForceRedaction; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.entitymapped.ManualImageRecategorization; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.entitymapped.ManualLegalBasisChange; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.entitymapped.ManualRedactionEntry; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.entitymapped.ManualResizeRedaction; -import com.iqser.red.service.persistence.service.v1.api.resources.ManualRedactionResource; - -import lombok.RequiredArgsConstructor; - -@RestController -@RequiredArgsConstructor -public class ManualRedactionController implements ManualRedactionResource { - - private final ManualRedactionService manualRedactionService; - - - @Override - public List addAddRedaction(@PathVariable(DOSSIER_ID) String dossierId, - @PathVariable(FILE_ID) String fileId, - @RequestBody List addRedactionRequests) { - - return manualRedactionService.addAddRedaction(dossierId, fileId, addRedactionRequests); - } - - - @Override - public List addRemoveRedaction(@PathVariable(DOSSIER_ID) String dossierId, - @PathVariable(FILE_ID) String fileId, - @RequestBody List removeRedactionRequests) { - - return manualRedactionService.addRemoveRedaction(dossierId, fileId, removeRedactionRequests); - } - - - @Override - public List addForceRedaction(@PathVariable(DOSSIER_ID) String dossierId, - @PathVariable(FILE_ID) String fileId, - @RequestBody List forceRedactionRequests) { - - return manualRedactionService.addForceRedaction(dossierId, fileId, forceRedactionRequests); - } - - - @Override - public List addLegalBasisChange(@PathVariable(DOSSIER_ID) String dossierId, - @PathVariable(FILE_ID) String fileId, - @RequestBody List legalBasisChangeRequests) { - - return manualRedactionService.addLegalBasisChange(dossierId, fileId, legalBasisChangeRequests); - } - - - @Override - public List addImageRecategorization(@PathVariable(DOSSIER_ID) String dossierId, - @PathVariable(FILE_ID) String fileId, - @RequestBody List imageRecategorizationRequests) { - - return manualRedactionService.addImageRecategorization(dossierId, fileId, imageRecategorizationRequests); - } - - - @Override - public Comment addComment(@PathVariable(DOSSIER_ID) String dossierId, - @PathVariable(FILE_ID) String fileId, - @PathVariable(ANNOTATION_ID) String annotationId, - @RequestBody CommentRequest comment) { - - return convert(manualRedactionService.addComment(fileId, annotationId, comment), Comment.class); - } - - - @Override - public List addResizeRedaction(@PathVariable(DOSSIER_ID) String dossierId, - @PathVariable(FILE_ID) String fileId, - @RequestBody List resizeRedactionRequests) { - - return manualRedactionService.addResizeRedaction(dossierId, fileId, resizeRedactionRequests); - } - - - @Override - public ManualRedactionEntry getAddRedaction(@PathVariable(FILE_ID) String fileId, @PathVariable(ANNOTATION_ID) String annotationId) { - - return convert(manualRedactionService.getAddRedaction(fileId, annotationId), ManualRedactionEntry.class, new ManualRedactionMapper()); - } - - - @Override - public IdRemoval getRemoveRedaction(@PathVariable(FILE_ID) String fileId, @PathVariable(ANNOTATION_ID) String annotationId) { - - return convert(manualRedactionService.getRemoveRedaction(fileId, annotationId), IdRemoval.class); - } - - - public ManualForceRedaction getForceRedaction(@PathVariable(FILE_ID) String fileId, @PathVariable(ANNOTATION_ID) String annotationId) { - - return convert(manualRedactionService.getForceRedaction(fileId, annotationId), ManualForceRedaction.class); - } - - - public ManualLegalBasisChange getLegalBasisChange(@PathVariable(FILE_ID) String fileId, @PathVariable(ANNOTATION_ID) String annotationId) { - - return convert(manualRedactionService.getLegalBasisChange(fileId, annotationId), ManualLegalBasisChange.class); - } - - - @Override - public ManualImageRecategorization getImageRecategorization(@PathVariable(FILE_ID) String fileId, @PathVariable(ANNOTATION_ID) String annotationId) { - - return convert(manualRedactionService.getImageRecategorization(fileId, annotationId), ManualImageRecategorization.class, new ManualImageRecategorizationMapper()); - } - - - @Override - public Comment getComment(@PathVariable(COMMENT_ID) long commentId) { - - return convert(manualRedactionService.getComment(commentId), Comment.class); - } - - - public ManualResizeRedaction getResizeRedaction(@PathVariable(FILE_ID) String fileId, @PathVariable(ANNOTATION_ID) String annotationId) { - - return convert(manualRedactionService.getResizeRedaction(fileId, annotationId), ManualResizeRedaction.class, new ManualResizeRedactionMapper()); - } - - - @Override - public void deleteAddRedaction(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody List annotationIds) { - - manualRedactionService.deleteAddRedaction(dossierId, fileId, annotationIds); - } - - - @Override - public void deleteRemoveRedaction(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody List annotationIds) { - - manualRedactionService.deleteRemoveRedaction(dossierId, fileId, annotationIds); - } - - - @Override - public void deleteForceRedaction(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody List annotationIds) { - - manualRedactionService.deleteForceRedaction(dossierId, fileId, annotationIds); - } - - - @Override - public void deleteLegalBasisChange(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody List annotationIds) { - - manualRedactionService.deleteLegalBasisChange(dossierId, fileId, annotationIds); - } - - - @Override - public void deleteImageRecategorization(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody List annotationIds) { - - manualRedactionService.deleteImageRecategorization(dossierId, fileId, annotationIds); - } - - - @Override - public void deleteComment(@PathVariable(FILE_ID) String fileId, @RequestBody List commentIds) { - - manualRedactionService.deleteComment(fileId, commentIds); - } - - - @Override - public void deleteResizeRedaction(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody List annotationIds) { - - manualRedactionService.deleteResizeRedaction(dossierId, fileId, annotationIds); - } - - - @Override - public void updateAddRedactionStatus(@PathVariable(DOSSIER_ID) String dossierId, - @PathVariable(FILE_ID) String fileId, - @RequestBody UpdateRedactionRequest updateStatusRequest) { - - manualRedactionService.updateAddRedactionStatus(dossierId, fileId, updateStatusRequest.getAnnotationIds(), updateStatusRequest.getAnnotationStatus()); - } - - - @Override - public void updateRemoveRedactionStatus(@PathVariable(DOSSIER_ID) String dossierId, - @PathVariable(FILE_ID) String fileId, - @RequestBody UpdateRedactionRequest updateStatusRequest) { - - manualRedactionService.updateRemoveRedactionStatus(dossierId, fileId, updateStatusRequest.getAnnotationIds(), updateStatusRequest.getAnnotationStatus()); - } - - - @Override - public void updateForceRedactionStatus(@PathVariable(DOSSIER_ID) String dossierId, - @PathVariable(FILE_ID) String fileId, - @RequestBody UpdateRedactionRequest updateStatusRequest) { - - manualRedactionService.updateForceRedactionStatus(dossierId, fileId, updateStatusRequest.getAnnotationIds(), updateStatusRequest.getAnnotationStatus()); - } - - - public void updateLegalBasisChangeStatus(@PathVariable(DOSSIER_ID) String dossierId, - @PathVariable(FILE_ID) String fileId, - @RequestBody UpdateRedactionRequest updateStatusRequest) { - - manualRedactionService.updateLegalBasisChangeStatus(dossierId, fileId, updateStatusRequest.getAnnotationIds(), updateStatusRequest.getAnnotationStatus()); - } - - - @Override - public void updateImageRecategorizationStatus(@PathVariable(DOSSIER_ID) String dossierId, - @PathVariable(FILE_ID) String fileId, - @RequestBody UpdateRedactionRequest updateStatusRequest) { - - manualRedactionService.updateImageRecategorizationStatus(dossierId, fileId, updateStatusRequest.getAnnotationIds(), updateStatusRequest.getAnnotationStatus()); - } - - - @Override - public void updateResizeRedactionStatus(@PathVariable(DOSSIER_ID) String dossierId, - @PathVariable(FILE_ID) String fileId, - @RequestBody UpdateRedactionRequest updateStatusRequest) { - - manualRedactionService.updateResizeRedactionStatus(dossierId, fileId, updateStatusRequest.getAnnotationIds(), updateStatusRequest.getAnnotationStatus()); - } - - - @Override - public ManualRedactions getManualRedactions(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId) { - - return manualRedactionService.getManualRedactions(fileId); - } - -} diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/NotificationController.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/NotificationController.java deleted file mode 100644 index efd044548..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/NotificationController.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.iqser.red.service.peristence.v1.server.controller; - -import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; - -import java.time.OffsetDateTime; -import java.util.List; - -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.NotificationPersistenceService; -import com.iqser.red.service.persistence.service.v1.api.model.audit.AddNotificationRequest; -import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive; -import com.iqser.red.service.persistence.service.v1.api.model.notification.Notification; -import com.iqser.red.service.persistence.service.v1.api.resources.NotificationResource; - -import lombok.RequiredArgsConstructor; - -@RestController -@RequiredArgsConstructor -public class NotificationController implements NotificationResource { - - private final NotificationPersistenceService notificationPersistenceService; - - - @Override - public JSONPrimitive hasNewNotificationsSince(@PathVariable(USER_ID_PARAM) String userId, @RequestBody JSONPrimitive since) { - - return JSONPrimitive.of(notificationPersistenceService.hasNewNotificationsSince(userId, since.getValue())); - } - - - public void addNotification(@RequestBody AddNotificationRequest addNotificationRequest) { - - notificationPersistenceService.insertNotification(addNotificationRequest); - } - - - public void toggleSeen(@PathVariable(USER_ID_PARAM) String userId, @RequestBody List notificationIds, @RequestParam(SET_SEEN_PARAM) boolean setSeen) { - - notificationIds.forEach(notificationId -> { - if (setSeen) { - notificationPersistenceService.setSeenDate(userId, notificationId, OffsetDateTime.now()); - } else { - notificationPersistenceService.setSeenDate(userId, notificationId, null); - } - }); - } - - - public void toggleRead(@PathVariable(USER_ID_PARAM) String userId, @RequestBody List notificationIds, @RequestParam(SET_READ_PARAM) boolean setRead) { - - notificationIds.forEach(notificationId -> { - if (setRead) { - notificationPersistenceService.setReadDate(userId, notificationId, OffsetDateTime.now()); - } else { - notificationPersistenceService.setReadDate(userId, notificationId, null); - } - }); - - } - - - public void softDelete(@PathVariable(USER_ID_PARAM) String userId, @RequestBody List notificationIds) { - - notificationIds.forEach(notificationId -> { - notificationPersistenceService.softDelete(userId, notificationId); - }); - } - - - public List getNotifications(@PathVariable(USER_ID_PARAM) String userId, @RequestParam(INCLUDE_SEEN_PARAM) boolean includeSeen) { - - return convert(notificationPersistenceService.getNotifications(userId, includeSeen), Notification.class); - } - -} diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/NotificationPreferencesController.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/NotificationPreferencesController.java deleted file mode 100644 index 12a451f73..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/NotificationPreferencesController.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.iqser.red.service.peristence.v1.server.controller; - -import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; - -import org.springframework.web.bind.annotation.RestController; - -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.NotificationPreferencesPersistenceService; -import com.iqser.red.service.persistence.service.v1.api.model.notification.NotificationPreferences; -import com.iqser.red.service.persistence.service.v1.api.resources.NotificationPreferencesResource; - -import lombok.RequiredArgsConstructor; - -@RestController -@RequiredArgsConstructor -public class NotificationPreferencesController implements NotificationPreferencesResource { - - private final NotificationPreferencesPersistenceService notificationPreferencesPersistenceService; - - - @Override - public void setNotificationPreferences(String userId, NotificationPreferences notificationRequest) { - - notificationPreferencesPersistenceService.setNotificationPreference(userId, notificationRequest); - } - - - @Override - public NotificationPreferences getNotificationPreferences(String userId) { - - return convert(notificationPreferencesPersistenceService.getOrCreateNotificationPreferences(userId), NotificationPreferences.class); - } - - - @Override - public void deleteNotificationPreferences(String userId) { - - notificationPreferencesPersistenceService.deleteNotificationPreferences(userId); - } - -} diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/RedactionLogController.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/RedactionLogController.java deleted file mode 100644 index a671aae67..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/RedactionLogController.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.iqser.red.service.peristence.v1.server.controller; - -import java.util.List; - -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import com.iqser.red.service.peristence.v1.server.service.RedactionLogService; -import com.iqser.red.service.persistence.service.v1.api.model.redactionlog.FilteredRedactionLogRequest; -import com.iqser.red.service.persistence.service.v1.api.resources.RedactionLogResource; -import com.iqser.red.service.redaction.v1.model.RedactionLog; -import com.iqser.red.service.redaction.v1.model.SectionGrid; - -import lombok.RequiredArgsConstructor; - -@RestController -@RequiredArgsConstructor -public class RedactionLogController implements RedactionLogResource { - - private final RedactionLogService redactionLogService; - - - public RedactionLog getRedactionLog(@PathVariable(DOSSIER_ID_PARAM) String dossierId, - @PathVariable(FILE_ID) String fileId, - @RequestParam(value = "excludedType", required = false) List excludedTypes, - @RequestParam(value = "withManualRedactions", required = false, defaultValue = "true") boolean withManualRedactions, - @RequestParam(value = "includeFalsePositives", required = false, defaultValue = "false") boolean includeFalsePositives) { - - return redactionLogService.getRedactionLog(dossierId, fileId, excludedTypes, withManualRedactions, includeFalsePositives); - } - - - public SectionGrid getSectionGrid(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId) { - - return redactionLogService.getSectionGrid(dossierId, fileId); - } - - - public RedactionLog getFilteredRedactionLog(@PathVariable(DOSSIER_ID_PARAM) String dossierId, - @PathVariable(FILE_ID) String fileId, - @RequestBody FilteredRedactionLogRequest filteredRedactionLogRequest) { - - return redactionLogService.getFilteredRedactionLog(dossierId, fileId, filteredRedactionLogRequest); - } - -} diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ReportTemplateController.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ReportTemplateController.java deleted file mode 100644 index a87c0b032..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ReportTemplateController.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.iqser.red.service.peristence.v1.server.controller; - -import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; - -import java.io.IOException; -import java.util.List; - -import org.apache.commons.io.IOUtils; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; - -import com.iqser.red.service.peristence.v1.server.service.ReportTemplateService; -import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.ReportTemplatePersistenceService; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.ReportTemplate; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.ReportTemplateDownload; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.ReportTemplateUpdateRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.ReportTemplateUploadRequest; -import com.iqser.red.service.persistence.service.v1.api.resources.ReportTemplateResource; -import com.iqser.red.storage.commons.exception.StorageObjectDoesNotExist; -import com.iqser.red.storage.commons.service.StorageService; - -import lombok.RequiredArgsConstructor; - -@RestController -@RequiredArgsConstructor -public class ReportTemplateController implements ReportTemplateResource { - - private final StorageService storageService; - private final ReportTemplatePersistenceService reportTemplatePersistenceService; - private final ReportTemplateService reportTemplateService; - - - public ReportTemplate uploadTemplate(@RequestBody ReportTemplateUploadRequest reportTemplateUploadRequest) { - - return reportTemplateService.uploadTemplate(reportTemplateUploadRequest); - } - - - public List getAvailableReportTemplates(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId) { - - return convert(reportTemplatePersistenceService.findByDossierTemplateId(dossierTemplateId), ReportTemplate.class); - } - - - public ReportTemplate getReportTemplate(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, @PathVariable(TEMPLATE_ID) String templateId) { - - return convert(reportTemplatePersistenceService.find(templateId), ReportTemplate.class); - } - - - public ReportTemplateDownload downloadReportTemplate(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, @PathVariable(TEMPLATE_ID) String templateId) { - - String storageId = reportTemplatePersistenceService.find(templateId).getStorageId(); - try { - byte[] file = IOUtils.toByteArray(storageService.getObject(storageId).getInputStream()); - return ReportTemplateDownload.builder().file(file).build(); - } catch (StorageObjectDoesNotExist | IOException e) { - throw new NotFoundException("Template does not exist"); - } - } - - - public void deleteTemplate(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, @PathVariable(TEMPLATE_ID) String templateId) { - - String storageId = reportTemplatePersistenceService.find(templateId).getStorageId(); - storageService.deleteObject(storageId); - reportTemplatePersistenceService.delete(templateId); - - } - - - public void updateTemplate(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, - @PathVariable(TEMPLATE_ID) String templateId, - @RequestBody ReportTemplateUpdateRequest reportTemplateUpdateRequest) { - - reportTemplatePersistenceService.updateTemplate(dossierTemplateId, templateId, reportTemplateUpdateRequest); - } - -} diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/RulesController.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/RulesController.java deleted file mode 100644 index a443bf50e..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/RulesController.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.iqser.red.service.peristence.v1.server.controller; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; - -import com.iqser.red.service.peristence.v1.server.client.RedactionClient; -import com.iqser.red.service.peristence.v1.server.exception.InvalidRulesException; -import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.RulesPersistenceService; -import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive; -import com.iqser.red.service.persistence.service.v1.api.resources.RulesResource; - -import feign.FeignException; -import lombok.RequiredArgsConstructor; - -@RestController -@RequiredArgsConstructor -public class RulesController implements RulesResource { - - private final RulesPersistenceService rulesPersistenceService; - private final RedactionClient redactionServiceClient; - - - @Override - public void setRules(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, @RequestBody JSONPrimitive request) { - - try { - redactionServiceClient.testRules(request.getValue()); - } catch (FeignException e) { - if (e.status() == HttpStatus.BAD_REQUEST.value()) { - throw new InvalidRulesException("Rules could not be updated, validation check failed: " + e.getMessage()); - } - throw e; - } - rulesPersistenceService.setRules(request.getValue(), dossierTemplateId); - - } - - - @Override - public JSONPrimitive getRules(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId) { - - return new JSONPrimitive<>(rulesPersistenceService.getRules(dossierTemplateId).getValue()); - } - - - @Override - public long getVersion(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId) { - - try { - return rulesPersistenceService.getRules(dossierTemplateId).getVersion(); - } catch (NotFoundException e) { - return 0; - } - } - -} diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/SMTPConfigurationController.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/SMTPConfigurationController.java deleted file mode 100644 index bee2344c6..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/SMTPConfigurationController.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.iqser.red.service.peristence.v1.server.controller; - -import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; - -import org.apache.commons.lang3.StringUtils; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.SMTPConfigurationEntity; -import com.iqser.red.service.persistence.management.v1.processor.service.EmailService; -import com.iqser.red.service.persistence.management.v1.processor.service.EncryptionDecryptionService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.SMTPConfigurationService; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.SMTPConfiguration; -import com.iqser.red.service.persistence.service.v1.api.resources.SMTPConfigurationResource; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@RestController -@RequiredArgsConstructor -public class SMTPConfigurationController implements SMTPConfigurationResource { - - private final static String DEFAULT_PASSWORD = "********"; - private final EmailService emailService; - private final SMTPConfigurationService smtpConfigurationService; - - private final EncryptionDecryptionService encryptionDecryptionService; - - - @Override - public SMTPConfiguration getCurrentSMTPConfiguration(@RequestParam(value = MASK_PASSWORD, required = false, defaultValue = "true") boolean maskPassword) { - - var smtpConfiguration = smtpConfigurationService.getConfiguration(); - if (smtpConfiguration.isAuth() && maskPassword) { - smtpConfiguration.setPassword(DEFAULT_PASSWORD); - } - return convert(smtpConfiguration, SMTPConfiguration.class); - } - - - @Override - public void updateSMTPConfiguration(@RequestBody SMTPConfiguration smtpConfiguration) { - - updatePassword(smtpConfiguration); - smtpConfigurationService.saveConfiguration(convert(smtpConfiguration, SMTPConfigurationEntity.class)); - } - - - @Override - public void testSMTPConfiguration(@RequestParam(value = TEST_EMAIL, required = false) String testEmail, @RequestBody SMTPConfiguration smtpConfiguration) { - - String targetEmail = null; - if (StringUtils.isBlank(testEmail)) { - // will send e-mail to self in case testEmail is not set - targetEmail = smtpConfiguration.getFrom(); - } else { - targetEmail = testEmail; - } - - updatePassword(smtpConfiguration); - smtpConfiguration.setPassword(encryptionDecryptionService.decrypt(smtpConfiguration.getPassword())); - emailService.send(smtpConfiguration, targetEmail, "Redaction Test Message", "This is a test message"); - } - - - @Override - public void clearSMTPConfiguration() { - - smtpConfigurationService.deleteConfiguration(); - } - - - private void updatePassword(SMTPConfiguration smtpConfiguration) { - - if (DEFAULT_PASSWORD.equals(smtpConfiguration.getPassword())) { - try { - var currentSMTPConfig = getCurrentSMTPConfiguration(false); - smtpConfiguration.setPassword(currentSMTPConfig.getPassword()); - } catch (Exception e) { - log.debug("No current SMTP Config exists", e); - } - } else { - smtpConfiguration.setPassword(encryptionDecryptionService.encrypt(smtpConfiguration.getPassword())); - } - } - -} diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/UploadController.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/UploadController.java deleted file mode 100644 index 859e4d862..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/UploadController.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.iqser.red.service.peristence.v1.server.controller; - -import static com.iqser.red.service.persistence.management.v1.processor.exception.DossierNotFoundException.DOSSIER_NOT_FOUND_MESSAGE; - -import java.time.OffsetDateTime; -import java.time.temporal.ChronoUnit; -import java.util.Set; - -import javax.transaction.Transactional; - -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import com.iqser.red.service.peristence.v1.server.service.DossierService; -import com.iqser.red.service.peristence.v1.server.service.FileService; -import com.iqser.red.service.peristence.v1.server.service.FileStatusService; -import com.iqser.red.service.persistence.management.v1.processor.exception.DossierNotFoundException; -import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.AddFileRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileModel; -import com.iqser.red.service.persistence.service.v1.api.resources.UploadResource; - -import lombok.RequiredArgsConstructor; - -@RestController -@RequiredArgsConstructor -public class UploadController implements UploadResource { - - private final FileService fileService; - private final FileStatusService fileStatusService; - private final DossierService dossierService; - - - @Override - public JSONPrimitive upload(@RequestBody AddFileRequest request, - @RequestParam(value = "keepManualRedactions", required = false, defaultValue = "false") boolean keepManualRedactions) { - - return fileService.upload(request, keepManualRedactions); - } - - - @Override - @Transactional - public void deleteFile(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId) { - - var dossier = dossierService.getDossierById(dossierId); - if (dossier.getSoftDeletedTime() != null) { - throw new DossierNotFoundException(String.format(DOSSIER_NOT_FOUND_MESSAGE, dossierId)); - } - - OffsetDateTime softDeleteTime = OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS); - fileService.softDeleteFile(dossierId, fileId, softDeleteTime); - fileStatusService.setFileStatusDeleted(fileId, softDeleteTime); - } - - - @Override - public void hardDeleteFiles(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @RequestBody Set fileIds) { - - var dossier = dossierService.getDossierById(dossierId); - if (dossier.getSoftDeletedTime() != null) { - throw new DossierNotFoundException(String.format(DOSSIER_NOT_FOUND_MESSAGE, dossierId)); - } - - for (String fileId : fileIds) { - fileService.hardDeleteFile(dossierId, fileId); - fileStatusService.setFileStatusHardDeleted(fileId); - } - - } - - - @Override - public void undeleteFiles(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @RequestBody Set fileIds) { - - var dossier = dossierService.getDossierById(dossierId); - if (dossier.getSoftDeletedTime() != null) { - throw new DossierNotFoundException(String.format(DOSSIER_NOT_FOUND_MESSAGE, dossierId)); - } - - for (String fileId : fileIds) { - - FileModel fileStatus = fileStatusService.getStatus(fileId); - OffsetDateTime softDeletedTime = fileStatus.getDeleted(); - - fileService.undeleteFile(dossier.getDossierTemplateId(), dossierId, fileId, softDeletedTime); - fileStatusService.setFileStatusUndeleted(fileId); - } - } - -} diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ViewedPagesController.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ViewedPagesController.java deleted file mode 100644 index 156d3d0b0..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ViewedPagesController.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.iqser.red.service.peristence.v1.server.controller; - -import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; - -import java.util.List; - -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; - -import com.iqser.red.service.peristence.v1.server.service.AnalysisFlagsCalculationService; -import com.iqser.red.service.peristence.v1.server.service.FileStatusService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.ViewedPagesPersistenceService; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.ViewedPage; -import com.iqser.red.service.persistence.service.v1.api.resources.ViewedPagesResource; - -import lombok.RequiredArgsConstructor; - -@RestController -@RequiredArgsConstructor -public class ViewedPagesController implements ViewedPagesResource { - - private final ViewedPagesPersistenceService viewedPagesPersistenceService; - private final FileStatusService fileStatusService; - private final AnalysisFlagsCalculationService analysisFlagsCalculationService; - - - public void addPage(@PathVariable(FILE_ID) String fileId, @PathVariable(ROLE) String role, @RequestBody Integer page) { - - viewedPagesPersistenceService.insertPage(fileId, role, page); - var file = fileStatusService.getStatus(fileId); - analysisFlagsCalculationService.calculateFlags(file.getDossierId(), fileId); - } - - - public void removePage(@PathVariable(FILE_ID) String fileId, @PathVariable(ROLE) String role, @RequestBody Integer page) { - - viewedPagesPersistenceService.removePage(fileId, role, page); - var file = fileStatusService.getStatus(fileId); - analysisFlagsCalculationService.calculateFlags(file.getDossierId(), fileId); - } - - - public List getViewedPages(@PathVariable(FILE_ID) String fileId, @PathVariable(ROLE) String role) { - - return convert(viewedPagesPersistenceService.findViewedPages(fileId, role), ViewedPage.class); - } - -} diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/WatermarkController.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/WatermarkController.java deleted file mode 100644 index 848d578d8..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/WatermarkController.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.iqser.red.service.peristence.v1.server.controller; - -import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; - -import java.util.List; - -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import com.iqser.red.service.persistence.management.v1.processor.service.WatermarkService; -import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.Watermark; -import com.iqser.red.service.persistence.service.v1.api.resources.WatermarkResource; - -import lombok.RequiredArgsConstructor; - -@RestController -@RequiredArgsConstructor -public class WatermarkController implements WatermarkResource { - - private final WatermarkService watermarkService; - - - public Watermark createOrUpdateWatermark(@RequestBody Watermark watermark) { - - return convert(watermarkService.createOrUpdateWatermark(watermark), Watermark.class); - } - - - public Watermark getWatermark(@PathVariable(WATERMARK_ID_PARAMETER_NAME) long watermarkId) { - - return convert(watermarkService.getWatermark(watermarkId), Watermark.class); - } - - - @Override - public List getWatermarksForDossierTemplateId(@RequestParam(value = DOSSIER_TEMPLATE_ID_PARAMETER_NAME) String dossierTemplateId) { - - return convert(watermarkService.getWatermarksForDossierTemplateId(dossierTemplateId), Watermark.class); - } - - - public void deleteWatermark(@PathVariable(WATERMARK_ID_PARAMETER_NAME) long watermarkId) { - - watermarkService.deleteWatermark(watermarkId); - } - - - public JSONPrimitive isWatermarkUsed(@RequestParam(WATERMARK_ID_PARAMETER_NAME) long watermarkId) { - - return JSONPrimitive.of(watermarkService.isWatermarkUsed(watermarkId)); - } - -} diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/utils/ManualResizeRedactionMapper.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/utils/ManualResizeRedactionMapper.java deleted file mode 100644 index f56ee97dd..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/utils/ManualResizeRedactionMapper.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.iqser.red.service.peristence.v1.server.utils; - -import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; - -import java.util.function.BiConsumer; - -import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ManualResizeRedactionEntity; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.Rectangle; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.entitymapped.ManualResizeRedaction; - -public class ManualResizeRedactionMapper implements BiConsumer { - - @Override - public void accept(ManualResizeRedactionEntity manualResizeRedactionEntity, ManualResizeRedaction manualRedaction) { - - manualRedaction.setPositions(convert(manualResizeRedactionEntity.getPositions(), Rectangle.class)); - } - -} diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/application-dev.yml b/persistence-service-v1/persistence-service-server-v1/src/main/resources/application-dev.yml index 3814d8d79..696e6ca69 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/resources/application-dev.yml +++ b/persistence-service-v1/persistence-service-server-v1/src/main/resources/application-dev.yml @@ -2,7 +2,6 @@ server: port: 8085 redaction-service.url: "http://localhost:8083" -configuration-service.url: "http://localhost:8081" pdftron-redaction-service.url: "http://localhost:8086" redaction-report-service.url: "http://localhost:8084" search-service.url: "http://localhost:8088" @@ -13,17 +12,68 @@ storage: key: minioadmin secret: minioadmin -spring: - datasource: - url: jdbc:postgresql://localhost:5432/redaction - driverClassName: org.postgresql.Driver - username: redaction - password: redaction - platform: org.hibernate.dialect.PostgreSQL95Dialect - jpa: - database-platform: org.hibernate.dialect.PostgreSQL95Dialect - hibernate: - ddl-auto: none - naming-strategy: org.hibernate.cfg.ImprovedNamingStrategy +multitenancy: + datasource-cache: + maximumSize: 100 + expireAfterAccess: 1 + master: + datasource: + url: jdbc:postgresql://${PSQL_HOST:localhost}:${PSQL_PORT:5432}/${PSQL_DATABASE:master}?currentSchema=${PSQL_SCHEMA:public}&cachePrepStmts=true&useServerPrepStmts=true&rewriteBatchedStatements=true + driverClassName: org.postgresql.Driver + username: ${PSQL_USERNAME:redaction} + password: ${PSQL_PASSWORD:redaction} + platform: org.hibernate.dialect.PostgreSQL95Dialect + hikari: + data-source-properties: + cachePrepStmts: true + prepStmtCacheSize: 1000 + prepStmtCacheSqlLimit: 2048 + liquibase: + changeLog: classpath:db/changelog/db.changelog-master.yaml + tenant: + datasource: + driverClassName: org.postgresql.Driver + hikari: + data-source-properties: + cachePrepStmts: true + prepStmtCacheSize: 1000 + prepStmtCacheSqlLimit: 2048 + liquibase: + changeLog: classpath:db/changelog/db.changelog-tenant.yaml monitoring:enabled: true + +token.issuer: '' + +keycloak: + enabled: true + sslRequired: none + auth-server-url: http://localhost:8080 + realm: redaction + resource: redaction + disableTrustManager: true + useResourceRoleMappings: true + + + + +commons: + keycloak: + applicationClientId: redaction + clientId: redaction-system + clientSecret: NSQmQWTBAPH4HwJXIFQQdazigWP8EHgg + realm: redaction + serverUrl: http://localhost:8080 + issuer: '' + + +cors.enabled: true + + +persistence-service: + imageServiceEnabled: false + nerServiceEnabled: false + storeImageFile: false + applicationName: RedactManager +swagger: + enabled: true diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/application.yml b/persistence-service-v1/persistence-service-server-v1/src/main/resources/application.yml index 3ff4fb862..099f39d81 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/resources/application.yml +++ b/persistence-service-v1/persistence-service-server-v1/src/main/resources/application.yml @@ -11,8 +11,10 @@ server: spring: main: - allow-circular-references: true # FIXME + allow-bean-definition-overriding: true + allow-circular-references: true jpa: + open-in-view: true database-platform: org.hibernate.dialect.PostgreSQL95Dialect hibernate: ddl-auto: none @@ -23,7 +25,15 @@ spring: batch_size: 50 order_inserts: true order_updates: true - + cache: + type: redis + mvc: + pathmatch: + matching-strategy: ant-path-matcher + redis: + host: ${REDIS_HOST:localhost} + port: ${REDIS_PORT:6379} + password: ${REDIS_PASSWORD:} profiles: active: kubernetes @@ -52,12 +62,13 @@ spring: org: quartz: jobStore: + class: org.springframework.scheduling.quartz.LocalDataSourceJobStore clusterCheckinInterval: 1000 isClustered: true driverDelegateClass: org.quartz.impl.jdbcjobstore.PostgreSQLDelegate scheduler: instanceId: AUTO - job-store-type: jdbc + job-store-type: JDBC management: endpoint: @@ -84,7 +95,7 @@ multitenancy: expireAfterAccess: 1 master: datasource: - url: jdbc:postgresql://${PSQL_HOST:localhost}:${PSQL_PORT:5432}/${PSQL_DATABASE:master}?currentSchema=${PSQL_SCHEMA:public}&cachePrepStmts=true&useServerPrepStmts=true&rewriteBatchedStatements=true + url: jdbc:postgresql://${PSQL_HOST:localhost}:${PSQL_PORT:5432}/${PSQL_DATABASE:master}?currentSchema=${PSQL_SCHEMA:external}&cachePrepStmts=true&useServerPrepStmts=true&rewriteBatchedStatements=true driverClassName: org.postgresql.Driver username: ${PSQL_USERNAME:redaction} password: ${PSQL_PASSWORD:redaction} @@ -106,3 +117,48 @@ multitenancy: prepStmtCacheSqlLimit: 2048 liquibase: changeLog: classpath:db/changelog/db.changelog-tenant.yaml + + +bucket4j: + enabled: ${rate_limit.enabled:true} + filters: + - cache-name: buckets + expression: "@securityService.username()?: getRemoteAddr()" + url: .* + rate-limits: + - bandwidths: + - capacity: ${rate_limit.capacity:600} + time: ${rate_limit.replenishment:60} + unit: seconds + + +keycloak: + sslRequired: none + auth-server-url: https://red-staging.iqser.cloud/auth + realm: redaction + resource: redaction + disableTrustManager: true + useResourceRoleMappings: true + enabled: true + +commons: + keycloak: + applicationClientId: ${keycloak.resource:redaction} + clientId: ${keycloak.client.id} + clientSecret: ${keycloak.client.secret} + realm: ${keycloak.realm} + serverUrl: ${keycloak.auth-server-url} + issuer: ${token.issuer} + + + +springdoc: + swagger-ui: + path: /api/docs/swagger-ui + operations-sorter: alpha + tags-sorter: alpha + api-docs: + path: /api/docs + pre-loading-enabled: true + packages-to-scan: ['com.iqser.red.persistence.service.v1.external.api'] + diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/43-add-reports-information-column.changelog.yaml b/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/43-add-reports-information-column.changelog.yaml deleted file mode 100644 index 5776aed3c..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/43-add-reports-information-column.changelog.yaml +++ /dev/null @@ -1,40 +0,0 @@ -databaseChangeLog: - - changeSet: - id: add-reports-info-table - author: corinaolariu - changes: - - createTable: - columns: - - column: - constraints: - nullable: false - name: download_status_entity_storage_id - type: VARCHAR(255) - - column: - constraints: - nullable: false - name: reports_template_id - type: VARCHAR(255) - tableName: download_status_reports - - addForeignKeyConstraint: - baseColumnNames: reports_template_id - baseTableName: download_status_reports - constraintName: download_status_reports_to_report_templates - deferrable: false - initiallyDeferred: false - onDelete: NO ACTION - onUpdate: NO ACTION - referencedColumnNames: template_id - referencedTableName: report_template - validate: true - - addForeignKeyConstraint: - baseColumnNames: download_status_entity_storage_id - baseTableName: download_status_reports - constraintName: download_status_reports_to_download_status - deferrable: false - initiallyDeferred: false - onDelete: NO ACTION - onUpdate: NO ACTION - referencedColumnNames: storage_id - referencedTableName: download_status - validate: true diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/release-3.3.12/1-fix-dossier-dictionary.sql b/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/release-3.3.12/1-fix-dossier-dictionary.sql deleted file mode 100644 index 0febd74e1..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/release-3.3.12/1-fix-dossier-dictionary.sql +++ /dev/null @@ -1 +0,0 @@ -update entity set has_dictionary=true where dossier_id is not null and has_dictionary = false; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/release-3.3.13/1-update-soft-deleted-processed-flag.sql b/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/release-3.3.13/1-update-soft-deleted-processed-flag.sql deleted file mode 100644 index 3f8ffef6e..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/release-3.3.13/1-update-soft-deleted-processed-flag.sql +++ /dev/null @@ -1 +0,0 @@ -update file set processing_status = 'PROCESSED' where deleted is not null; \ No newline at end of file diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/release-3.3.14/1-bump-rules-version.sql b/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/release-3.3.14/1-bump-rules-version.sql deleted file mode 100644 index 1f66913f2..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/release-3.3.14/1-bump-rules-version.sql +++ /dev/null @@ -1 +0,0 @@ -update rule_set set version = version + 1; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/10-set-file-manipulation-date.sql b/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/10-set-file-manipulation-date.sql deleted file mode 100644 index bbcfeca50..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/10-set-file-manipulation-date.sql +++ /dev/null @@ -1,2 +0,0 @@ -update file set file_manipulation_date = GREATEST(lastocrtime, last_updated); - diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/22-update-file-dossier-attributes.sql b/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/22-update-file-dossier-attributes.sql deleted file mode 100644 index f197ef07d..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/22-update-file-dossier-attributes.sql +++ /dev/null @@ -1,2 +0,0 @@ -update file_attribute set value = null where trim(value) = ''; -update dossier_attribute set value = null where trim(value) = ''; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/24.0-clean-up-duplicate-dictionary-entries.sql b/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/24.0-clean-up-duplicate-dictionary-entries.sql deleted file mode 100644 index 26f95f4fe..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/24.0-clean-up-duplicate-dictionary-entries.sql +++ /dev/null @@ -1,11 +0,0 @@ -delete from dictionary_entry de1 where exists ( - select type_id, value from dictionary_entry de2 where de2.type_id = de1.type_id - and de2.value = de1.value and (de1.version < de2.version or (de1.version = de2.version and de1.entry_id < de2.entry_id)) ); - -delete from dictionary_false_recommendation_entry dfre1 where exists ( - select type_id, value from dictionary_false_recommendation_entry dfre2 where dfre2.type_id = dfre1.type_id - and dfre2.value = dfre1.value and (dfre1.version < dfre2.version or (dfre1.version = dfre2.version and dfre1.entry_id < dfre2.entry_id)) ); - -delete from dictionary_false_positive_entry dfpe1 where exists ( - select type_id, value from dictionary_false_positive_entry dfpe2 where dfpe2.type_id = dfpe1.type_id - and dfpe2.value = dfpe1.value and (dfpe1.version < dfpe2.version or (dfpe1.version = dfpe2.version and dfpe1.entry_id < dfpe2.entry_id)) ); \ No newline at end of file diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/27-update-soft-delete-date.sql b/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/27-update-soft-delete-date.sql deleted file mode 100644 index ba20bfbf4..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/27-update-soft-delete-date.sql +++ /dev/null @@ -1,2 +0,0 @@ -update file set deleted = CURRENT_TIMESTAMP, processing_status = 'PROCESSED' where deleted is null and hard_deleted_time is null and processing_status = 'DELETED'; -update file set processing_status = 'PROCESSED' where processing_status = 'DELETED'; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/30-change-bigint-to-serial.sql b/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/30-change-bigint-to-serial.sql deleted file mode 100644 index 3cdcbf4cb..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/30-change-bigint-to-serial.sql +++ /dev/null @@ -1,7 +0,0 @@ -ALTER TABLE dictionary_entry ALTER entry_id ADD GENERATED ALWAYS AS IDENTITY; -ALTER TABLE dictionary_false_recommendation_entry ALTER entry_id ADD GENERATED ALWAYS AS IDENTITY; -ALTER TABLE dictionary_false_positive_entry ALTER entry_id ADD GENERATED ALWAYS AS IDENTITY; - -SELECT setval(pg_get_serial_sequence('dictionary_entry', 'entry_id'), (select coalesce(max(entry_id)+1,1) from dictionary_entry)); -SELECT setval(pg_get_serial_sequence('dictionary_false_recommendation_entry', 'entry_id'), (select coalesce(max(entry_id)+1,1) from dictionary_false_recommendation_entry)); -SELECT setval(pg_get_serial_sequence('dictionary_false_positive_entry', 'entry_id'), (select coalesce(max(entry_id)+1,1) from dictionary_false_positive_entry)); diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/31-watermark-configuration.sql b/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/31-watermark-configuration.sql deleted file mode 100644 index f9abeee8c..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/31-watermark-configuration.sql +++ /dev/null @@ -1,22 +0,0 @@ --- add the generated id to watermark_configuration table -alter table watermark_configuration add column id BIGINT GENERATED ALWAYS AS IDENTITY; -alter table watermark_configuration add column name VARCHAR (255), add column enabled BOOLEAN DEFAULT TRUE, add column created_by VARCHAR (255), add column date_added TIMESTAMP WITHOUT TIME ZONE, add column date_modified TIMESTAMP WITHOUT TIME ZONE; ---initialise the new columns for the current watermark configurations -update watermark_configuration set name = 'Watermark ' || id, enabled = true; - --- update the primary key constraint based on the new configuration and add the foreign key contraints to the dossier and dossier_template tables -alter table watermark_configuration drop constraint watermark_configuration_pkey; -alter table watermark_configuration add constraint watermark_configuration_pkey PRIMARY KEY (id); -delete from watermark_configuration where dossier_template_id not in ( select id from dossier_template ); -alter table watermark_configuration add constraint watermark_dossier_template_id_fk FOREIGN KEY (dossier_template_id) REFERENCES dossier_template (id); --- add the link to watermark_configuration to dossier table and the foreign key contraints -alter table dossier add column watermark_id BIGINT; -alter table dossier add column preview_watermark_id BIGINT; -alter table dossier add constraint watermark_id_fk FOREIGN KEY (watermark_id) REFERENCES watermark_configuration (id); -alter table dossier add constraint preview_watermark_id_fk FOREIGN KEY (preview_watermark_id) REFERENCES watermark_configuration (id); --- update the dossier table with the corresponding watermark based on the dossier template given -update dossier d set watermark_id = (select id from watermark_configuration w where w.dossier_template_id = d.dossier_template_id) where d.watermark_enabled = true; -update dossier d set preview_watermark_id = (select id from watermark_configuration w where w.dossier_template_id = d.dossier_template_id) where d.watermark_preview_enabled = true; --- remove the previous columns, not needed anymore -alter table dossier drop column watermark_enabled; -alter table dossier drop column watermark_preview_enabled; \ No newline at end of file diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/33-set-file-processing-error-counter.sql b/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/33-set-file-processing-error-counter.sql deleted file mode 100644 index 94ad10906..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/33-set-file-processing-error-counter.sql +++ /dev/null @@ -1 +0,0 @@ -update file set processing_error_counter = 0 where processing_error_counter is null; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/35-update-skipped-color-existing-types.sql b/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/35-update-skipped-color-existing-types.sql deleted file mode 100644 index 464eceef3..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/35-update-skipped-color-existing-types.sql +++ /dev/null @@ -1 +0,0 @@ -update entity e set skipped_hex_color = (select not_redacted from color_configuration c where c.dossier_template_id = e.dossier_template_id) where skipped_hex_color is null; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/37-update-colors.sql b/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/37-update-colors.sql deleted file mode 100644 index 912f793f9..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/37-update-colors.sql +++ /dev/null @@ -1,23 +0,0 @@ --- color configuration general fixes -alter table color_configuration add column request_add_color VARCHAR(255); -alter table color_configuration add column request_remove_color VARCHAR(255); -alter table color_configuration add column recommendation_color VARCHAR(255); -alter table color_configuration add column skipped_color VARCHAR(255); -alter table color_configuration add column redaction_color VARCHAR(255); -alter table color_configuration add column hint_color VARCHAR(255); - -update color_configuration set request_add_color = request_add; -update color_configuration set request_remove_color = request_remove; -update color_configuration set skipped_color = not_redacted; -update color_configuration set redaction_color = preview_color; -update color_configuration set hint_color = '#fa98f7'; -- UI Hardcoded value -update color_configuration set recommendation_color = '#c5d3eb'; -- UI Hardcoded value - -alter table color_configuration drop column manual_redaction_color; -alter table color_configuration drop column request_add; -alter table color_configuration drop column request_remove; -alter table color_configuration drop column not_redacted; - --- update color values for existing -update entity e set recommendation_hex_color = (select recommendation_color from color_configuration c where c.dossier_template_id = e.dossier_template_id) where recommendation_hex_color is null; -update entity e set skipped_hex_color = '#ec9090' where e.dossier_id is not null; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/38-update-soft-deleted-processed-flag.sql b/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/38-update-soft-deleted-processed-flag.sql deleted file mode 100644 index 1459dd088..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/38-update-soft-deleted-processed-flag.sql +++ /dev/null @@ -1 +0,0 @@ -update file set processing_status = 'PROCESSED' where deleted is not null; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/41-update-ocr-file-columns.sql b/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/41-update-ocr-file-columns.sql deleted file mode 100644 index f596d87c9..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/41-update-ocr-file-columns.sql +++ /dev/null @@ -1,5 +0,0 @@ -ALTER TABLE file RENAME COLUMN lastocrtime TO ocr_start_time; -ALTER TABLE file ADD COLUMN ocr_end_time TIMESTAMP WITHOUT TIME ZONE; -update file set ocr_end_time = ocr_start_time; -ALTER TABLE FILE ADD COLUMN number_of_pages_to_ocr BIGINT; -ALTER TABLE FILE ADD COLUMN number_of_ocred_pages BIGINT; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/42-add-encoding-column-file-attribute-config.sql b/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/42-add-encoding-column-file-attribute-config.sql deleted file mode 100644 index bb525e4d4..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/42-add-encoding-column-file-attribute-config.sql +++ /dev/null @@ -1,2 +0,0 @@ -ALTER TABLE file_attribute_general_configuration ADD COLUMN encoding VARCHAR(255); -update file_attribute_general_configuration set encoding = 'UTF-8'; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/43-add-applied-redaction-color.sql b/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/43-add-applied-redaction-color.sql deleted file mode 100644 index 5cc2d4b7d..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/43-add-applied-redaction-color.sql +++ /dev/null @@ -1,5 +0,0 @@ --- add new column -alter table color_configuration add column applied_redaction_color VARCHAR(255); - -update color_configuration set applied_redaction_color = '#000000'; -- default is black - diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/45-unique-dossier-name.sql b/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/45-unique-dossier-name.sql deleted file mode 100644 index ed848777f..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/45-unique-dossier-name.sql +++ /dev/null @@ -1,15 +0,0 @@ --- update duplicate dossier names -update dossier d1 set dossier_name = ( - select - case when cnt = 1 then dossier_name - else dossier_name || ' ' || rn - end as dossier_name - from - ( - select *, row_number() over w rn, count(*) over w cnt - from dossier - window w as (partition by dossier_name) - ) t where t.id = d1.id); - --- create unique index on dossier_name and hard_deleted_time -CREATE UNIQUE INDEX dossier_name_index ON dossier (dossier_name, (hard_deleted_time IS NULL)) WHERE hard_deleted_time IS NULL; diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/7.1-set-json-fields.sql b/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/7.1-set-json-fields.sql deleted file mode 100644 index d3e059786..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/7.1-set-json-fields.sql +++ /dev/null @@ -1,27 +0,0 @@ -update file set excluded_pages = - (select '['||STRING_AGG(excluded_pages || '', ', ')||']' from file_entity_excluded_pages fe where fe.file_entity_id = file.id group by fe.file_entity_id); - -update dossier set members = - (select '['||STRING_AGG( '"'||member_ids || '"', ', ')||']' - from dossier_entity_member_ids dem where dem.dossier_entity_id = dossier.id - group by dem.dossier_entity_id); - -update dossier set approvers = - (select '['||STRING_AGG( '"'||approver_ids || '"', ', ')||']' - from dossier_entity_approver_ids dem where dem.dossier_entity_id = dossier.id - group by dem.dossier_entity_id); - -update dossier set download_file_types = - (select '['||STRING_AGG( '"'|| download_file_types || '"', ', ')||']' - from dossier_entity_download_file_types dem where dem.dossier_entity_id = dossier.id - group by dem.dossier_entity_id); - -update dossier_template set download_file_types = - (select '['||STRING_AGG( '"'|| download_file_types || '"', ', ')||']' - from dossier_template_entity_download_file_types dem where dem.dossier_template_entity_id = dossier_template.id - group by dem.dossier_template_entity_id); - -update download_status set download_file_types = - (select '['||STRING_AGG( '"'|| download_file_types || '"', ', ')||']' - from download_status_entity_download_file_types dem where dem.download_status_entity_storage_id = download_status.storage_id - group by dem.download_status_entity_storage_id); diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/7.2-set-dossier-status.sql b/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/7.2-set-dossier-status.sql deleted file mode 100644 index 33ecf1c4a..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/tenant/sql/7.2-set-dossier-status.sql +++ /dev/null @@ -1,3 +0,0 @@ -update dossier set dossier_status = 'ACTIVE' where status = 0 or status is null; -update dossier set dossier_status = 'DELETED' where status = 1; -update dossier set dossier_status = 'ARCHIVED' where status = 2; diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/ApplicationConfigClient.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/ApplicationConfigClient.java index 8193f3ae5..a2e26efd8 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/ApplicationConfigClient.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/ApplicationConfigClient.java @@ -2,7 +2,7 @@ package com.iqser.red.service.peristence.v1.server.integration.client; import org.springframework.cloud.openfeign.FeignClient; -import com.iqser.red.service.persistence.service.v1.api.resources.ApplicationConfigurationResource; +import com.iqser.red.service.persistence.service.v1.api.external.resource.ApplicationConfigurationResource; @FeignClient(name = "ApplicationConfigClient", url = "http://localhost:${server.port}") public interface ApplicationConfigClient extends ApplicationConfigurationResource { diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/AuditClient.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/AuditClient.java index 09c46dbc8..040693e4a 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/AuditClient.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/AuditClient.java @@ -2,7 +2,7 @@ package com.iqser.red.service.peristence.v1.server.integration.client; import org.springframework.cloud.openfeign.FeignClient; -import com.iqser.red.service.persistence.service.v1.api.resources.AuditResource; +import com.iqser.red.service.persistence.service.v1.api.external.resource.AuditResource; @FeignClient(name = "AuditClient", url = "http://localhost:${server.port}") public interface AuditClient extends AuditResource { diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/DictionaryClient.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/DictionaryClient.java index d69ed1a2d..5a9935a25 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/DictionaryClient.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/DictionaryClient.java @@ -2,7 +2,7 @@ package com.iqser.red.service.peristence.v1.server.integration.client; import org.springframework.cloud.openfeign.FeignClient; -import com.iqser.red.service.persistence.service.v1.api.resources.DictionaryResource; +import com.iqser.red.service.persistence.service.v1.api.external.resource.DictionaryResource; @FeignClient(name = "DictionaryClient", url = "http://localhost:${server.port}") public interface DictionaryClient extends DictionaryResource { diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/DigitalSignatureClient.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/DigitalSignatureClient.java index 55a39aae2..47f203f62 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/DigitalSignatureClient.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/DigitalSignatureClient.java @@ -2,7 +2,7 @@ package com.iqser.red.service.peristence.v1.server.integration.client; import org.springframework.cloud.openfeign.FeignClient; -import com.iqser.red.service.persistence.service.v1.api.resources.DigitalSignatureResource; +import com.iqser.red.service.persistence.service.v1.api.external.resource.DigitalSignatureResource; @FeignClient(name = "DigitalSignatureClient", url = "http://localhost:${server.port}") public interface DigitalSignatureClient extends DigitalSignatureResource { diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/DossierAttributeClient.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/DossierAttributeClient.java index fc17f1ebc..035e44773 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/DossierAttributeClient.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/DossierAttributeClient.java @@ -2,7 +2,7 @@ package com.iqser.red.service.peristence.v1.server.integration.client; import org.springframework.cloud.openfeign.FeignClient; -import com.iqser.red.service.persistence.service.v1.api.resources.DossierAttributesResource; +import com.iqser.red.service.persistence.service.v1.api.external.resource.DossierAttributesResource; @FeignClient(name = "DossierAttributeClient", url = "http://localhost:${server.port}") public interface DossierAttributeClient extends DossierAttributesResource { diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/DossierAttributeConfigClient.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/DossierAttributeConfigClient.java index 18a9020a2..8cccd891e 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/DossierAttributeConfigClient.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/DossierAttributeConfigClient.java @@ -2,9 +2,9 @@ package com.iqser.red.service.peristence.v1.server.integration.client; import org.springframework.cloud.openfeign.FeignClient; -import com.iqser.red.service.persistence.service.v1.api.resources.DossierAttributesConfigResource; +import com.iqser.red.service.persistence.service.v1.api.external.resource.DossierAttributesResource; @FeignClient(name = "DossierAttributeConfigClient", url = "http://localhost:${server.port}") -public interface DossierAttributeConfigClient extends DossierAttributesConfigResource { +public interface DossierAttributeConfigClient extends DossierAttributesResource { } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/DossierClient.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/DossierClient.java index b366087f3..20126e3a5 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/DossierClient.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/DossierClient.java @@ -2,7 +2,7 @@ package com.iqser.red.service.peristence.v1.server.integration.client; import org.springframework.cloud.openfeign.FeignClient; -import com.iqser.red.service.persistence.service.v1.api.resources.DossierResource; +import com.iqser.red.service.persistence.service.v1.api.external.resource.DossierResource; @FeignClient(name = "Dossier", url = "http://localhost:${server.port}") public interface DossierClient extends DossierResource { diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/DossierStatsClient.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/DossierStatsClient.java index b0233d5a2..eaac5c99d 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/DossierStatsClient.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/DossierStatsClient.java @@ -2,7 +2,7 @@ package com.iqser.red.service.peristence.v1.server.integration.client; import org.springframework.cloud.openfeign.FeignClient; -import com.iqser.red.service.persistence.service.v1.api.resources.DossierStatsResource; +import com.iqser.red.service.persistence.service.v1.api.external.resource.DossierStatsResource; @FeignClient(name = "DossierStats", url = "http://localhost:${server.port}") public interface DossierStatsClient extends DossierStatsResource { diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/DossierStatusClient.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/DossierStatusClient.java index 148d3d208..0fb5533ef 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/DossierStatusClient.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/DossierStatusClient.java @@ -2,7 +2,7 @@ package com.iqser.red.service.peristence.v1.server.integration.client; import org.springframework.cloud.openfeign.FeignClient; -import com.iqser.red.service.persistence.service.v1.api.resources.DossierStatusResource; +import com.iqser.red.service.persistence.service.v1.api.external.resource.DossierStatusResource; @FeignClient(name = "DossierStatusClient", url = "http://localhost:${server.port}") public interface DossierStatusClient extends DossierStatusResource { diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/DossierTemplateClient.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/DossierTemplateClient.java index dd2a459e3..b9d794dcf 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/DossierTemplateClient.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/DossierTemplateClient.java @@ -2,9 +2,9 @@ package com.iqser.red.service.peristence.v1.server.integration.client; import org.springframework.cloud.openfeign.FeignClient; -import com.iqser.red.service.persistence.service.v1.api.resources.DossierTemplateResource; +import com.iqser.red.service.persistence.service.v1.api.external.resource.DossierTemplateResource; -@FeignClient(name = "DossierTemplateClient", url = "http://localhost:${server.port}") +@FeignClient(name = "DossierTemplateClient", url = "http://localhost:${server.port}", configuration = FeignSupportConfig.class) public interface DossierTemplateClient extends DossierTemplateResource { } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/DossierTemplateStatsClient.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/DossierTemplateStatsClient.java index 9715cf48e..fdd3a3151 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/DossierTemplateStatsClient.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/DossierTemplateStatsClient.java @@ -2,7 +2,7 @@ package com.iqser.red.service.peristence.v1.server.integration.client; import org.springframework.cloud.openfeign.FeignClient; -import com.iqser.red.service.persistence.service.v1.api.resources.DossierTemplateStatsResource; +import com.iqser.red.service.persistence.service.v1.api.external.resource.DossierTemplateStatsResource; @FeignClient(name = "DossierTemplateStats", url = "http://localhost:${server.port}") public interface DossierTemplateStatsClient extends DossierTemplateStatsResource { diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/DownloadClient.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/DownloadClient.java index 6b6163ed5..b9244a32f 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/DownloadClient.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/DownloadClient.java @@ -2,9 +2,9 @@ package com.iqser.red.service.peristence.v1.server.integration.client; import org.springframework.cloud.openfeign.FeignClient; -import com.iqser.red.service.persistence.service.v1.api.resources.DownloadResource; +import com.iqser.red.service.persistence.service.v1.api.external.resource.DownloadResource; -@FeignClient(name = "DownloadClient", url = "http://localhost:${server.port}") +@FeignClient(name = "DownloadClient", url = "http://localhost:${server.port}", configuration = FeignSupportConfig.class) public interface DownloadClient extends DownloadResource { } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/FeignSupportConfig.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/FeignSupportConfig.java new file mode 100644 index 000000000..e158bf918 --- /dev/null +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/FeignSupportConfig.java @@ -0,0 +1,22 @@ +package com.iqser.red.service.peristence.v1.server.integration.client; + +import java.util.Collections; + +import org.springframework.boot.autoconfigure.http.HttpMessageConverters; +import org.springframework.cloud.openfeign.support.SpringEncoder; +import org.springframework.context.annotation.Bean; +import org.springframework.http.MediaType; +import org.springframework.web.client.RestTemplate; + +import feign.codec.Encoder; +import feign.form.spring.SpringFormEncoder; + +public class FeignSupportConfig { + + @Bean + public Encoder multipartFormEncoder() { + + return new SpringFormEncoder(new SpringEncoder(() -> new HttpMessageConverters(new RestTemplate().getMessageConverters()))); + } + +} diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/FileAttributeClient.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/FileAttributeClient.java index f1aa55313..a93e88e8e 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/FileAttributeClient.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/FileAttributeClient.java @@ -2,7 +2,7 @@ package com.iqser.red.service.peristence.v1.server.integration.client; import org.springframework.cloud.openfeign.FeignClient; -import com.iqser.red.service.persistence.service.v1.api.resources.FileAttributesResource; +import com.iqser.red.service.persistence.service.v1.api.external.resource.FileAttributesResource; @FeignClient(name = "FileAttributeClient", url = "http://localhost:${server.port}") public interface FileAttributeClient extends FileAttributesResource { diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/FileAttributeConfigClient.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/FileAttributeConfigClient.java index 8f2918e11..9599c078c 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/FileAttributeConfigClient.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/FileAttributeConfigClient.java @@ -2,9 +2,9 @@ package com.iqser.red.service.peristence.v1.server.integration.client; import org.springframework.cloud.openfeign.FeignClient; -import com.iqser.red.service.persistence.service.v1.api.resources.FileAttributesConfigResource; +import com.iqser.red.service.persistence.service.v1.api.external.resource.FileAttributesResource; @FeignClient(name = "FileAttributeConfigClient", url = "http://localhost:${server.port}") -public interface FileAttributeConfigClient extends FileAttributesConfigResource { +public interface FileAttributeConfigClient extends FileAttributesResource { } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/FileClient.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/FileClient.java index cf5ac5ac6..603071855 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/FileClient.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/FileClient.java @@ -2,7 +2,7 @@ package com.iqser.red.service.peristence.v1.server.integration.client; import org.springframework.cloud.openfeign.FeignClient; -import com.iqser.red.service.persistence.service.v1.api.resources.StatusResource; +import com.iqser.red.service.persistence.service.v1.api.external.resource.StatusResource; @FeignClient(name = "FileClient", url = "http://localhost:${server.port}") public interface FileClient extends StatusResource { diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/FileManagementClient.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/FileManagementClient.java new file mode 100644 index 000000000..9bf188cb2 --- /dev/null +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/FileManagementClient.java @@ -0,0 +1,10 @@ +package com.iqser.red.service.peristence.v1.server.integration.client; + +import org.springframework.cloud.openfeign.FeignClient; + +import com.iqser.red.service.persistence.service.v1.api.external.resource.FileManagementResource; + +@FeignClient(name = "FileManagementClient", url = "http://localhost:${server.port}") +public interface FileManagementClient extends FileManagementResource { + +} diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/FileProcessingClient.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/FileProcessingClient.java index c894091c7..275523808 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/FileProcessingClient.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/FileProcessingClient.java @@ -2,7 +2,7 @@ package com.iqser.red.service.peristence.v1.server.integration.client; import org.springframework.cloud.openfeign.FeignClient; -import com.iqser.red.service.persistence.service.v1.api.resources.FileStatusProcessingUpdateResource; +import com.iqser.red.service.persistence.service.v1.api.internal.resources.FileStatusProcessingUpdateResource; @FeignClient(name = "FileProcessingClient", url = "http://localhost:${server.port}") public interface FileProcessingClient extends FileStatusProcessingUpdateResource { diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/IndexInformationClient.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/IndexInformationClient.java index 5b350e5f2..fece04d58 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/IndexInformationClient.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/IndexInformationClient.java @@ -2,7 +2,7 @@ package com.iqser.red.service.peristence.v1.server.integration.client; import org.springframework.cloud.openfeign.FeignClient; -import com.iqser.red.service.persistence.service.v1.api.resources.IndexInformationResource; +import com.iqser.red.service.persistence.service.v1.api.internal.resources.IndexInformationResource; @FeignClient(name = "IndexInformationClient", url = "http://localhost:${server.port}") public interface IndexInformationClient extends IndexInformationResource { diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/LegalBasisClient.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/LegalBasisClient.java index 1ade9831f..cb0bfedd3 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/LegalBasisClient.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/LegalBasisClient.java @@ -2,7 +2,7 @@ package com.iqser.red.service.peristence.v1.server.integration.client; import org.springframework.cloud.openfeign.FeignClient; -import com.iqser.red.service.persistence.service.v1.api.resources.LegalBasisMappingResource; +import com.iqser.red.service.persistence.service.v1.api.external.resource.LegalBasisMappingResource; @FeignClient(name = "LegalBasisClient", url = "http://localhost:${server.port}") public interface LegalBasisClient extends LegalBasisMappingResource { diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/LicenseReportClient.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/LicenseReportClient.java index 35ef0bbc2..cfba25cd1 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/LicenseReportClient.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/LicenseReportClient.java @@ -2,7 +2,7 @@ package com.iqser.red.service.peristence.v1.server.integration.client; import org.springframework.cloud.openfeign.FeignClient; -import com.iqser.red.service.persistence.service.v1.api.resources.LicenseReportResource; +import com.iqser.red.service.persistence.service.v1.api.external.resource.LicenseReportResource; @FeignClient(name = "LicenseReportClient", url = "http://localhost:${server.port}") public interface LicenseReportClient extends LicenseReportResource { diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/ManualRedactionClient.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/ManualRedactionClient.java index a33bf1897..a0ec87514 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/ManualRedactionClient.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/ManualRedactionClient.java @@ -2,7 +2,7 @@ package com.iqser.red.service.peristence.v1.server.integration.client; import org.springframework.cloud.openfeign.FeignClient; -import com.iqser.red.service.persistence.service.v1.api.resources.ManualRedactionResource; +import com.iqser.red.service.persistence.service.v1.api.external.resource.ManualRedactionResource; @FeignClient(name = "ManualRedactionClient", url = "http://localhost:${server.port}") public interface ManualRedactionClient extends ManualRedactionResource { diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/NotificationClient.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/NotificationClient.java index 7f24bb06e..efa7f4090 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/NotificationClient.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/NotificationClient.java @@ -2,7 +2,7 @@ package com.iqser.red.service.peristence.v1.server.integration.client; import org.springframework.cloud.openfeign.FeignClient; -import com.iqser.red.service.persistence.service.v1.api.resources.NotificationResource; +import com.iqser.red.service.persistence.service.v1.api.external.resource.NotificationResource; @FeignClient(name = "NotificationClient", url = "http://localhost:${server.port}") public interface NotificationClient extends NotificationResource { diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/NotificationPreferencesClient.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/NotificationPreferencesClient.java index 15c2f75c8..fb39bbacb 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/NotificationPreferencesClient.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/NotificationPreferencesClient.java @@ -2,7 +2,7 @@ package com.iqser.red.service.peristence.v1.server.integration.client; import org.springframework.cloud.openfeign.FeignClient; -import com.iqser.red.service.persistence.service.v1.api.resources.NotificationPreferencesResource; +import com.iqser.red.service.persistence.service.v1.api.external.resource.NotificationPreferencesResource; @FeignClient(name = "NotificationPreferencesClient", url = "http://localhost:${server.port}") public interface NotificationPreferencesClient extends NotificationPreferencesResource { diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/ReanalysisClient.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/ReanalysisClient.java index 583dae999..a2b406e06 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/ReanalysisClient.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/ReanalysisClient.java @@ -2,7 +2,7 @@ package com.iqser.red.service.peristence.v1.server.integration.client; import org.springframework.cloud.openfeign.FeignClient; -import com.iqser.red.service.persistence.service.v1.api.resources.ReanalysisResource; +import com.iqser.red.service.persistence.service.v1.api.external.resource.ReanalysisResource; @FeignClient(name = "ReanalysisClient", url = "http://localhost:${server.port}") public interface ReanalysisClient extends ReanalysisResource { diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/RedactionLogClient.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/RedactionLogClient.java index 13140b614..3f3abbf38 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/RedactionLogClient.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/RedactionLogClient.java @@ -2,7 +2,7 @@ package com.iqser.red.service.peristence.v1.server.integration.client; import org.springframework.cloud.openfeign.FeignClient; -import com.iqser.red.service.persistence.service.v1.api.resources.RedactionLogResource; +import com.iqser.red.service.persistence.service.v1.api.external.resource.RedactionLogResource; @FeignClient(name = "RedactionLogClient", url = "http://localhost:${server.port}") public interface RedactionLogClient extends RedactionLogResource { diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/ReportTemplateClient.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/ReportTemplateClient.java index e866dee4c..6e6de9328 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/ReportTemplateClient.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/ReportTemplateClient.java @@ -2,9 +2,9 @@ package com.iqser.red.service.peristence.v1.server.integration.client; import org.springframework.cloud.openfeign.FeignClient; -import com.iqser.red.service.persistence.service.v1.api.resources.ReportTemplateResource; +import com.iqser.red.service.persistence.service.v1.api.external.resource.ReportTemplateResource; -@FeignClient(name = "ReportTemplateClient", url = "http://localhost:${server.port}") +@FeignClient(name = "ReportTemplateClient", url = "http://localhost:${server.port}", configuration = FeignSupportConfig.class) public interface ReportTemplateClient extends ReportTemplateResource { } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/RulesClient.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/RulesClient.java index 6d979c968..ca7db745e 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/RulesClient.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/RulesClient.java @@ -2,7 +2,7 @@ package com.iqser.red.service.peristence.v1.server.integration.client; import org.springframework.cloud.openfeign.FeignClient; -import com.iqser.red.service.persistence.service.v1.api.resources.RulesResource; +import com.iqser.red.service.persistence.service.v1.api.external.resource.RulesResource; @FeignClient(name = "RulesClient", url = "http://localhost:${server.port}") public interface RulesClient extends RulesResource { diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/SMTPClient.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/SMTPClient.java index d5f34654a..5d4a85e46 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/SMTPClient.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/SMTPClient.java @@ -2,7 +2,7 @@ package com.iqser.red.service.peristence.v1.server.integration.client; import org.springframework.cloud.openfeign.FeignClient; -import com.iqser.red.service.persistence.service.v1.api.resources.SMTPConfigurationResource; +import com.iqser.red.service.persistence.service.v1.api.external.resource.SMTPConfigurationResource; @FeignClient(name = "SMTPClient", url = "http://localhost:${server.port}") public interface SMTPClient extends SMTPConfigurationResource { diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/TenantsClient.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/TenantsClient.java index dd2c7dcba..e55cfbb3d 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/TenantsClient.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/TenantsClient.java @@ -2,7 +2,7 @@ package com.iqser.red.service.peristence.v1.server.integration.client; import org.springframework.cloud.openfeign.FeignClient; -import com.iqser.red.service.persistence.service.v1.api.resources.TenantsResource; +import com.iqser.red.service.persistence.service.v1.api.external.resource.TenantsResource; @FeignClient(name = "TenantsClient", url = "http://localhost:${server.port}") public interface TenantsClient extends TenantsResource { diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/UploadClient.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/UploadClient.java index e2515bb93..7b467cd7c 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/UploadClient.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/UploadClient.java @@ -2,9 +2,9 @@ package com.iqser.red.service.peristence.v1.server.integration.client; import org.springframework.cloud.openfeign.FeignClient; -import com.iqser.red.service.persistence.service.v1.api.resources.UploadResource; +import com.iqser.red.service.persistence.service.v1.api.external.resource.UploadResource; -@FeignClient(name = "UploadClient", url = "http://localhost:${server.port}") +@FeignClient(name = "UploadClient", url = "http://localhost:${server.port}", configuration = FeignSupportConfig.class) public interface UploadClient extends UploadResource { } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/VersionClient.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/VersionClient.java new file mode 100644 index 000000000..908b76d05 --- /dev/null +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/VersionClient.java @@ -0,0 +1,10 @@ +package com.iqser.red.service.peristence.v1.server.integration.client; + +import org.springframework.cloud.openfeign.FeignClient; + +import com.iqser.red.service.persistence.service.v1.api.external.resource.VersionsResource; + +@FeignClient(name = "VersionClient", url = "http://localhost:${server.port}") +public interface VersionClient extends VersionsResource { + +} diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/ViewedPagesClient.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/ViewedPagesClient.java index a3d793ec1..3921b5bb1 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/ViewedPagesClient.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/ViewedPagesClient.java @@ -2,7 +2,7 @@ package com.iqser.red.service.peristence.v1.server.integration.client; import org.springframework.cloud.openfeign.FeignClient; -import com.iqser.red.service.persistence.service.v1.api.resources.ViewedPagesResource; +import com.iqser.red.service.persistence.service.v1.api.external.resource.ViewedPagesResource; @FeignClient(name = "ViewedPagesClient", url = "http://localhost:${server.port}") public interface ViewedPagesClient extends ViewedPagesResource { diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/WatermarkClient.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/WatermarkClient.java index 2c593518f..00ab23125 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/WatermarkClient.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/WatermarkClient.java @@ -2,7 +2,7 @@ package com.iqser.red.service.peristence.v1.server.integration.client; import org.springframework.cloud.openfeign.FeignClient; -import com.iqser.red.service.persistence.service.v1.api.resources.WatermarkResource; +import com.iqser.red.service.persistence.service.v1.api.external.resource.WatermarkResource; @FeignClient(name = "WatermarkClient", url = "http://localhost:${server.port}") public interface WatermarkClient extends WatermarkResource { diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/DossierTemplateTesterAndProvider.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/DossierTemplateTesterAndProvider.java index cc1499641..daa85981e 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/DossierTemplateTesterAndProvider.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/DossierTemplateTesterAndProvider.java @@ -1,6 +1,6 @@ package com.iqser.red.service.peristence.v1.server.integration.service; -import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.assertj.core.api.Assertions.assertThat; import java.time.OffsetDateTime; import java.time.temporal.ChronoUnit; @@ -10,14 +10,15 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.google.common.collect.Sets; +import com.iqser.red.service.peristence.v1.server.integration.client.DictionaryClient; import com.iqser.red.service.peristence.v1.server.integration.client.DossierTemplateClient; import com.iqser.red.service.peristence.v1.server.integration.client.LegalBasisClient; import com.iqser.red.service.peristence.v1.server.integration.client.RulesClient; -import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.CreateOrUpdateDossierTemplateRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierTemplate; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DownloadFileType; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.legalbasis.LegalBasis; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierTemplateModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.Rules; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DownloadFileType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.Colors; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.legalbasis.LegalBasis; @Service public class DossierTemplateTesterAndProvider { @@ -31,37 +32,46 @@ public class DossierTemplateTesterAndProvider { @Autowired private LegalBasisClient legalBasisClient; + @Autowired + private DictionaryClient dictionaryClient; - public DossierTemplate provideTestTemplate(String name) { - CreateOrUpdateDossierTemplateRequest cru = new CreateOrUpdateDossierTemplateRequest(); - cru.setDownloadFileTypes(Sets.newHashSet(DownloadFileType.ORIGINAL)); - cru.setName(name); - cru.setDescription("Template 1"); - cru.setRequestingUser("1"); - cru.setValidFrom(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS)); - cru.setValidTo(OffsetDateTime.now().plusHours(1).truncatedTo(ChronoUnit.MILLIS)); + public Colors provideDefaultColors(String dossierTemplateId) { - DossierTemplate result = dossierTemplateClient.createOrUpdateDossierTemplate(cru); - - assertThat(result.getName()).isEqualTo(name); - - DossierTemplate loadedTemplate = dossierTemplateClient.getDossierTemplate(result.getId()); - - assertThat(loadedTemplate).isEqualTo(result); - - rulesClient.setRules(loadedTemplate.getId(), JSONPrimitive.of("ABCD")); - legalBasisClient.setLegalBasisMapping(loadedTemplate.getId(), List.of(new LegalBasis("name", "description", "reason"))); - - loadedTemplate = dossierTemplateClient.getDossierTemplate(result.getId()); - - return loadedTemplate; + return dictionaryClient.getColors(dossierTemplateId); } - public DossierTemplate provideTestTemplate() { + public DossierTemplateModel provideTestTemplate() { return provideTestTemplate("Template 1"); } + + public DossierTemplateModel provideTestTemplate(String name) { + + var cru = new DossierTemplateModel(); + cru.setDownloadFileTypes(Sets.newHashSet(DownloadFileType.ORIGINAL)); + cru.setName(name); + cru.setDescription("Template 1"); + cru.setValidFrom(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS)); + cru.setValidTo(OffsetDateTime.now().plusHours(1).truncatedTo(ChronoUnit.MILLIS)); + + var result = dossierTemplateClient.createOrUpdateDossierTemplate(cru); + + assertThat(result.getName()).isEqualTo(name); + + var loadedTemplate = dossierTemplateClient.getDossierTemplate(result.getDossierTemplateId()); + + assertThat(loadedTemplate).isEqualTo(result); + + rulesClient.upload(new Rules("ABCD", loadedTemplate.getDossierTemplateId())); + legalBasisClient.setLegalBasisMapping(List.of(new LegalBasis("name", "description", "reason")), loadedTemplate.getDossierTemplateId()); + + loadedTemplate = dossierTemplateClient.getDossierTemplate(result.getDossierTemplateId()); + + + return loadedTemplate; + } + } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/DossierTesterAndProvider.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/DossierTesterAndProvider.java index 78e263e05..5e897a943 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/DossierTesterAndProvider.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/DossierTesterAndProvider.java @@ -1,22 +1,26 @@ package com.iqser.red.service.peristence.v1.server.integration.service; -import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.assertj.core.api.Assertions.assertThat; import java.time.OffsetDateTime; import java.time.temporal.ChronoUnit; -import java.util.List; +import java.util.Set; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.google.common.collect.Sets; import com.iqser.red.service.peristence.v1.server.integration.client.DossierClient; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierTemplate; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DownloadFileType; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.CreateOrUpdateDossierRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.Dossier; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierStatusInfo; +import com.iqser.red.service.persistence.management.v1.processor.service.UserService; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierTemplateModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DownloadFileType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.Dossier; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.DossierStatusInfo; +import lombok.extern.slf4j.Slf4j; + +@Slf4j @Service public class DossierTesterAndProvider { @@ -26,26 +30,29 @@ public class DossierTesterAndProvider { @Autowired private DossierClient dossierClient; + @Autowired + private UserProvider userProvider; - public Dossier provideTestDossier(DossierTemplate testTemplate) { + + public Dossier provideTestDossier(DossierTemplateModel testTemplate) { return provideTestDossier(testTemplate, "Dossier1"); } - public Dossier provideTestDossier(DossierTemplate testTemplate, String dossierName) { + public Dossier provideTestDossier(DossierTemplateModel testTemplate, String dossierName) { return provideTestDossier(testTemplate, dossierName, null); } - public Dossier provideTestDossier(DossierTemplate testTemplate, String dossierName, DossierStatusInfo dossierStatus) { + public Dossier provideTestDossier(DossierTemplateModel testTemplate, String dossierName, DossierStatusInfo dossierStatus) { var result = provideTestDossierQuick(testTemplate, dossierName, dossierStatus); assertThat(result.getDossierName()).isEqualTo(dossierName); - Dossier loadedDossier = dossierClient.getDossierById(result.getId(), false, false); + Dossier loadedDossier = dossierClient.getDossier(result.getId(), false, false); assertThat(loadedDossier).isEqualTo(result); @@ -53,26 +60,30 @@ public class DossierTesterAndProvider { } - public Dossier provideTestDossierQuick(DossierTemplate testTemplate, String dossierName, DossierStatusInfo dossierStatus) { + public Dossier provideTestDossierQuick(DossierTemplateModel testTemplate, String dossierName, DossierStatusInfo dossierStatus) { - CreateOrUpdateDossierRequest cru = new CreateOrUpdateDossierRequest(); + log.info("Create dossier {}", dossierName); + var cru = new DossierRequest(); cru.setDownloadFileTypes(Sets.newHashSet(DownloadFileType.ORIGINAL)); cru.setDossierName(dossierName); cru.setDescription(dossierName); if (dossierStatus != null) { cru.setDossierStatusId(dossierStatus.getId()); } - cru.setMemberIds(Sets.newHashSet("1")); - cru.setOwnerId("1"); - cru.setApproverIds(Sets.newHashSet("1")); - cru.setRequestingUser("1"); + cru.setDueDate(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS)); cru.setDossierTemplateId(testTemplate.getId()); - cru.setReportTemplateIds(List.of("reportTemplate1", "reportTemplate2")); + cru.setReportTemplateIds(Set.of("reportTemplate1", "reportTemplate2")); - Dossier result = dossierClient.addDossier(cru); + var userId = userProvider.getUserId(); + var altUserId = userProvider.getAltUserId(); + cru.setOwnerId(userId); + cru.setMemberIds(Sets.newHashSet(userId, altUserId)); + cru.setApproverIds(Sets.newHashSet(userId, altUserId)); - return result; + var result = dossierClient.createDossierOrUpdateDossier(cru); + + return result.getBody(); } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/FileTesterAndProvider.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/FileTesterAndProvider.java index 25e8289cc..3a60e74bb 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/FileTesterAndProvider.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/FileTesterAndProvider.java @@ -1,6 +1,6 @@ package com.iqser.red.service.peristence.v1.server.integration.service; -import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.assertj.core.api.Assertions.assertThat; import java.io.ByteArrayInputStream; import java.nio.charset.StandardCharsets; @@ -8,20 +8,23 @@ import java.util.List; import org.apache.commons.codec.binary.Base64; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.mock.web.MockMultipartFile; import org.springframework.stereotype.Service; import com.fasterxml.jackson.databind.ObjectMapper; import com.iqser.red.service.peristence.v1.server.integration.client.FileClient; import com.iqser.red.service.peristence.v1.server.integration.client.UploadClient; -import com.iqser.red.service.peristence.v1.server.service.FileManagementStorageService; -import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.Dossier; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.AddFileRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileModel; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileType; -import com.iqser.red.service.redaction.v1.model.RedactionLog; -import com.iqser.red.service.redaction.v1.model.RedactionLogEntry; -import com.iqser.red.service.redaction.v1.model.SectionGrid; +import com.iqser.red.service.persistence.management.v1.processor.service.FileManagementStorageService; +import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusService; +import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; +import com.iqser.red.service.persistence.service.v1.api.shared.model.AnalyzeResult; +import com.iqser.red.service.persistence.service.v1.api.shared.model.FileStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.Dossier; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.AddFileRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLog; +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLogEntry; +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.section.SectionGrid; import lombok.SneakyThrows; @@ -40,30 +43,33 @@ public class FileTesterAndProvider { @Autowired private FileClient fileClient; + @Autowired + private FileStatusService fileStatusService; + @SneakyThrows - public FileModel testAndProvideFile(Dossier dossier) { + public FileStatus testAndProvideFile(Dossier dossier) { - return testAndProvideFile(dossier, "test.pdf"); + return testAndProvideFile(dossier, "test"); } @SneakyThrows - public FileModel testAndProvideFile(Dossier dossier, String fileName) { + public FileStatus testAndProvideFile(Dossier dossier, String fileName) { var fileId = testAndProvideFileQuick(dossier, fileName); var file = fileClient.getFileStatus(dossier.getId(), fileId); - assertThat(file.getId()).isNotBlank(); + assertThat(file.getFileId()).isNotBlank(); assertThat(fileClient.getDossierStatus(dossier.getId()).size()).isGreaterThanOrEqualTo(1); fileManagementStorageService.storeJSONObject(dossier.getId(), - file.getId(), + file.getFileId(), FileType.REDACTION_LOG, new RedactionLog(1, 1, List.of(RedactionLogEntry.builder().id("annotationId").type("manual").value("value entry").build()), null, 0, 0, 0, 0)); - fileManagementStorageService.storeJSONObject(dossier.getId(), file.getId(), FileType.SECTION_GRID, new SectionGrid()); - fileManagementStorageService.storeObject(dossier.getId(), file.getId(), FileType.ORIGIN, new ByteArrayInputStream(objectMapper.writeValueAsBytes("bytes of the file"))); + fileManagementStorageService.storeJSONObject(dossier.getId(), file.getFileId(), FileType.SECTION_GRID, new SectionGrid()); + fileManagementStorageService.storeObject(dossier.getId(), file.getFileId(), FileType.ORIGIN, new ByteArrayInputStream(objectMapper.writeValueAsBytes("bytes of the file"))); return file; } @@ -76,10 +82,30 @@ public class FileTesterAndProvider { AddFileRequest upload = new AddFileRequest(fileName, fileId, dossier.getId(), "1"); fileManagementStorageService.storeObject(dossier.getId(), fileId, FileType.UNTOUCHED, new ByteArrayInputStream("test".getBytes(StandardCharsets.UTF_8))); - JSONPrimitive uploadResult = uploadClient.upload(upload, false); + var mff = new MockMultipartFile(fileName + ".pdf", fileName + ".pdf", "application/pdf", "lorem ipsum".getBytes()); + var uploadResult = uploadClient.upload(mff, dossier.getId(), false); - return uploadResult.getValue(); + return uploadResult.getFileIds().iterator().next(); } + + public void markFileAsProcessed(String fileId) { + + TenantContext.setTenantId("redaction"); + AnalyzeResult result = new AnalyzeResult(); + result.setFileId(fileId); + result.setNumberOfPages(100); + result.setDictionaryVersion(1); + result.setLegalBasisVersion(1); + result.setRulesVersion(1); + result.setDuration(1000); + result.setDossierDictionaryVersion(1); + result.setAnalysisNumber(1); + result.setAnalysisVersion(1); + fileStatusService.setStatusSuccessful(fileId, result); + fileStatusService.setStatusProcessed(fileId); + TenantContext.clear(); + } + } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/ReportTemplateProvider.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/ReportTemplateProvider.java new file mode 100644 index 000000000..6e138150a --- /dev/null +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/ReportTemplateProvider.java @@ -0,0 +1,50 @@ +package com.iqser.red.service.peristence.v1.server.integration.service; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.mock.web.MockMultipartFile; +import org.springframework.stereotype.Service; + +import com.iqser.red.service.peristence.v1.server.integration.client.ReportTemplateClient; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.ReportTemplate; + +@Service +public class ReportTemplateProvider { + + @Autowired + private ReportTemplateClient reportTemplateClient; + + + public ReportTemplate provideReportTemplate(String dossierTemplateId) { + + return provideReportTemplate(dossierTemplateId, "test.docx", "content".getBytes()); + } + + + public ReportTemplate provideReportTemplate(String dossierTemplateId, String name, byte[] content) { + + return provideReportTemplate(dossierTemplateId, name, content, false, true); + } + + + public ReportTemplate provideReportTemplate(String dossierTemplateId, String name, byte[] content, boolean multiFile, boolean activeByDefault) { + + var template = new MockMultipartFile(name,name,"application/octet-stream", content); + reportTemplateClient.uploadTemplate(template, dossierTemplateId, multiFile, activeByDefault); + + var tpl = reportTemplateClient.getAvailableReportTemplates(dossierTemplateId) + .stream() + .filter(d -> d.getFileName().equalsIgnoreCase(name) && d.isMultiFileReport() == multiFile) + .findAny(); + assertThat(tpl.isPresent()).isTrue(); + return tpl.get(); + } + + + public ReportTemplate provideReportTemplate(String dossierTemplateId, String name) { + + return provideReportTemplate(dossierTemplateId, name, "content".getBytes(), false, true); + } + +} diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/TypeProvider.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/TypeProvider.java index 60c4566e5..5a38c1339 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/TypeProvider.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/TypeProvider.java @@ -2,13 +2,18 @@ package com.iqser.red.service.peristence.v1.server.integration.service; import static org.assertj.core.api.Assertions.assertThat; +import java.awt.Color; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.iqser.red.service.peristence.v1.server.integration.client.DictionaryClient; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierTemplate; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.Dossier; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.Type; +import com.iqser.red.service.persistence.service.v1.api.shared.model.CreateTypeValue; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierTemplateModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.TypeValue; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.Colors; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.Dossier; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.Type; @Service public class TypeProvider { @@ -16,10 +21,15 @@ public class TypeProvider { @Autowired private DictionaryClient dictionaryClient; + public TypeValue testAndProvideType(DossierTemplateModel dossierTemplate) { - public Type testAndProvideType(DossierTemplate dossierTemplate, Dossier dossier, String typeName) { + return testAndProvideType(dossierTemplate, null, "test"); + } - var type = new Type(); + + public TypeValue testAndProvideType(DossierTemplateModel dossierTemplate, Dossier dossier, String typeName) { + + var type = new CreateTypeValue(); type.setType(typeName); type.setDescription("test"); type.setAddToDictionaryAction(true); @@ -32,22 +42,14 @@ public class TypeProvider { type.setCaseInsensitive(true); type.setDossierTemplateId(dossierTemplate.getId()); type.setHasDictionary(true); - type.setSystemManaged(false); - type.setDossierId(dossier != null ? dossier.getId() : null); - var createdType = dictionaryClient.addType(type); + dictionaryClient.addType(type,dossier != null ? dossier.getId() : null); + var allTypes = dictionaryClient.getAllTypes(dossierTemplate.getDossierTemplateId(),dossier != null ? dossier.getId() : null,false); - var loadedType = dictionaryClient.getDictionaryForType(createdType.getId(), null); + var foundType =allTypes.getTypes().stream().filter(t -> t.getType().equalsIgnoreCase(typeName)).findAny(); + assertThat(foundType.isPresent()).isTrue(); - assertThat(loadedType).isNotNull(); - - return loadedType; - } - - - public Type testAndProvideType(DossierTemplate dossierTemplate) { - - return testAndProvideType(dossierTemplate, null, "test"); + return foundType.get(); } } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/UserProvider.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/UserProvider.java new file mode 100644 index 000000000..0420e2d86 --- /dev/null +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/UserProvider.java @@ -0,0 +1,31 @@ +package com.iqser.red.service.peristence.v1.server.integration.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.iqser.red.service.persistence.management.v1.processor.service.UserService; + +@Service +public class UserProvider { + + @Autowired + private UserService userService; + + public String getUserId(){ + var allUsers = userService.getAllUsers(); + var managerAdmin = allUsers.stream().filter(u -> u.getUsername().contains("manageradmin1")).findFirst(); + if(managerAdmin.isPresent()){ + return managerAdmin.get().getUserId(); + } + throw new RuntimeException("user not created"); + } + + public String getAltUserId(){ + var allUsers = userService.getAllUsers(); + var managerAdmin = allUsers.stream().filter(u -> u.getUsername().contains("manageradmin2")).findFirst(); + if(managerAdmin.isPresent()){ + return managerAdmin.get().getUserId(); + } + throw new RuntimeException("user not created"); + } +} diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ApplicationConfigTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ApplicationConfigTest.java index 9d08050fa..79b6ff16c 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ApplicationConfigTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ApplicationConfigTest.java @@ -7,7 +7,7 @@ import org.springframework.beans.factory.annotation.Autowired; import com.iqser.red.service.peristence.v1.server.integration.client.ApplicationConfigClient; import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.ApplicationConfig; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.ApplicationConfig; public class ApplicationConfigTest extends AbstractPersistenceServerServiceTest { diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/AuditTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/AuditTest.java index 6fb980ee5..42be5e05e 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/AuditTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/AuditTest.java @@ -8,39 +8,54 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import com.iqser.red.service.peristence.v1.server.integration.client.AuditClient; +import com.iqser.red.service.peristence.v1.server.integration.service.UserProvider; import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.AuditRepository; -import com.iqser.red.service.persistence.service.v1.api.model.audit.AuditRequest; -import com.iqser.red.service.persistence.service.v1.api.model.audit.AuditSearchRequest; -import com.iqser.red.service.persistence.service.v1.api.model.audit.CategoryModel; +import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; +import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; +import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditSearchRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.CategoryModel; public class AuditTest extends AbstractPersistenceServerServiceTest { @Autowired private AuditClient auditClient; + @Autowired + private AuditPersistenceService auditPersistenceService; + @Autowired private AuditRepository auditRepository; + @Autowired + private UserProvider userProvider; + @Test public void testAudit() { - assertThat(auditClient.getCategories()).isEmpty(); + TenantContext.setTenantId("redaction"); - auditClient.audit(AuditRequest.builder().category("c1").message("test").userId("1").objectId("1").details(Map.of("key", "value")).build()); - auditClient.audit(AuditRequest.builder().category("c1").message("test").userId("1").objectId("1").details(Map.of("key", "value")).build()); - auditClient.audit(AuditRequest.builder().category("c2").message("test").userId("1").objectId("1").details(Map.of("key", "value")).build()); + var userId = userProvider.getUserId(); - assertThat(auditClient.getCategories().size()).isEqualTo(2); - assertThat(auditClient.getCategories().stream().filter(c -> c.getCategory().equals("c1")).findAny().map(CategoryModel::getRecordCount).get()).isEqualTo(2); - assertThat(auditClient.getCategories().stream().filter(c -> c.getCategory().equals("c2")).findAny().map(CategoryModel::getRecordCount).get()).isEqualTo(1); + auditPersistenceService.audit(AuditRequest.builder().category("c1").message("test").userId(userId).objectId("1").details(Map.of("key", "value")).build()); + auditPersistenceService.audit(AuditRequest.builder().category("c1").message("test").userId(userId).objectId("1").details(Map.of("key", "value")).build()); + auditPersistenceService.audit(AuditRequest.builder().category("c2").message("test").userId(userId).objectId("1").details(Map.of("key", "value")).build()); - var result = auditClient.search(AuditSearchRequest.builder().category("c1").page(0).pageSize(10).build()); + assertThat(auditClient.getAuditCategories().size()).isGreaterThanOrEqualTo(2); + assertThat(auditClient.getAuditCategories().stream().filter(c -> c.getCategory().equals("c1")).findAny().map(CategoryModel::getRecordCount).get()).isEqualTo(2); + assertThat(auditClient.getAuditCategories().stream().filter(c -> c.getCategory().equals("c2")).findAny().map(CategoryModel::getRecordCount).get()).isEqualTo(1); + + var result = auditClient.searchAuditLog(AuditSearchRequest.builder().category("c1").page(0).pageSize(10).build()); assertThat(result.getTotalHits()).isEqualTo(2); - result = auditClient.search(AuditSearchRequest.builder().build()); - assertThat(result.getTotalHits()).isEqualTo(3); + result = auditClient.searchAuditLog(AuditSearchRequest.builder().build()); + assertThat(result.getTotalHits()).isGreaterThanOrEqualTo(3); + assertThat(auditClient.getAuditCategories()).isNotEmpty(); + + TenantContext.clear(); } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DictionaryTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DictionaryTest.java index 161f27466..1c7a1cabf 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DictionaryTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DictionaryTest.java @@ -7,6 +7,7 @@ import java.util.List; import java.util.stream.Collectors; import org.junit.jupiter.api.Test; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import com.iqser.red.service.peristence.v1.server.integration.client.DictionaryClient; @@ -15,8 +16,10 @@ import com.iqser.red.service.peristence.v1.server.integration.service.DossierTem import com.iqser.red.service.peristence.v1.server.integration.service.DossierTesterAndProvider; import com.iqser.red.service.peristence.v1.server.integration.service.TypeProvider; import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.DictionaryEntryType; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.Type; +import com.iqser.red.service.persistence.service.v1.api.shared.model.CreateTypeValue; +import com.iqser.red.service.persistence.service.v1.api.shared.model.UpdateTypeValue; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionaryEntryType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.Type; import feign.FeignException; @@ -46,18 +49,21 @@ public class DictionaryTest extends AbstractPersistenceServerServiceTest { assertThat(type.getRecommendationHexColor()).isEqualTo("#aaaaaa"); assertThat(type.getSkippedHexColor()).isEqualTo("#aaaaaa"); - dictionaryClient.addEntries(type.getTypeId(), List.of("word1", "word2"), false, false, DictionaryEntryType.ENTRY); - dictionaryClient.addEntries(type.getTypeId(), List.of("false_positive1", "false_positive"), false, false, DictionaryEntryType.FALSE_POSITIVE); - dictionaryClient.addEntries(type.getTypeId(), List.of("false_recommendation1", "false_recommendation2"), false, false, DictionaryEntryType.FALSE_RECOMMENDATION); + dictionaryClient.addEntry(type.getType(), type.getDossierTemplateId(), List.of("word1", "word2"), false, null, DictionaryEntryType.ENTRY); + dictionaryClient.addEntry(type.getType(), type.getDossierTemplateId(), List.of("false_positive1", "false_positive"), false, null, DictionaryEntryType.FALSE_POSITIVE); + dictionaryClient.addEntry(type.getType(), + type.getDossierTemplateId(), + List.of("false_recommendation1", "false_recommendation2"), + false, + null, + DictionaryEntryType.FALSE_RECOMMENDATION); - assertThat(dictionaryClient.getEntriesForType(type.getTypeId(), null, DictionaryEntryType.ENTRY)).hasSize(2); - assertThat(dictionaryClient.getEntriesForType(type.getTypeId(), null, DictionaryEntryType.FALSE_POSITIVE)).hasSize(2); - assertThat(dictionaryClient.getEntriesForType(type.getTypeId(), null, DictionaryEntryType.FALSE_RECOMMENDATION)).hasSize(2); + var loadedType1 = dictionaryClient.getDictionaryForType(type.getType(), type.getDossierTemplateId(), null); + + assertThat(loadedType1.getEntries()).hasSize(2); + assertThat(loadedType1.getFalsePositiveEntries()).hasSize(2); + assertThat(loadedType1.getFalseRecommendationEntries()).hasSize(2); - var loadedType = dictionaryClient.getDictionaryForType(type.getTypeId(), null); - assertThat(loadedType.getEntries()).hasSize(2); - assertThat(loadedType.getFalsePositiveEntries()).hasSize(2); - assertThat(loadedType.getFalseRecommendationEntries()).hasSize(2); } @@ -69,10 +75,12 @@ public class DictionaryTest extends AbstractPersistenceServerServiceTest { assertThat(type.getRecommendationHexColor()).isEqualTo("#aaaaaa"); assertThat(type.getSkippedHexColor()).isEqualTo("#aaaaaa"); + var request = new UpdateTypeValue(); + BeanUtils.copyProperties(type, request); type.setSkippedHexColor(null); - dictionaryClient.updateTypeValue(type.getTypeId(), type); + dictionaryClient.updateType(type.getType(), type.getDossierTemplateId(), request, null); - var loadedType = dictionaryClient.getDictionaryForType(type.getId(), null); + var loadedType = dictionaryClient.getDictionaryForType(type.getType(), type.getDossierTemplateId(), null); assertThat(loadedType.getSkippedHexColor()).isNotNull(); } @@ -80,13 +88,13 @@ public class DictionaryTest extends AbstractPersistenceServerServiceTest { @Test public void testAddEntriesWithStopWord() { - dossierTesterAndProvider.provideTestDossier(); + var dossier = dossierTesterAndProvider.provideTestDossier(); var typeId = "dossier_redaction"; var entries = new ArrayList(); entries.add("age"); entries.add("page"); try { - dictionaryClient.addEntries(typeId, entries, false, false, DictionaryEntryType.ENTRY); + dictionaryClient.addEntry(typeId, dossier.getDossierTemplateId(), entries, false, dossier.getId(), DictionaryEntryType.ENTRY); } catch (FeignException e) { assertThat(e.status()).isEqualTo(400); } @@ -105,18 +113,21 @@ public class DictionaryTest extends AbstractPersistenceServerServiceTest { var entries = new ArrayList(); entries.add(word); entries.add(word); - dictionaryClient.addEntries(type.getTypeId(), entries, false, false, DictionaryEntryType.ENTRY); + dictionaryClient.addEntry(type.getType(), type.getDossierTemplateId(), entries, false, null, DictionaryEntryType.ENTRY); - assertThat(dictionaryClient.getEntriesForType(type.getTypeId(), null, DictionaryEntryType.ENTRY)).hasSize(1); - assertThat(dictionaryClient.getEntriesForType(type.getTypeId(), null, DictionaryEntryType.ENTRY).get(0).getValue()).isEqualTo(word); + var dictionary = dictionaryClient.getDictionaryForType(type.getType(), type.getDossierTemplateId(), null); + + assertThat(dictionary.getEntries()).hasSize(1); + assertThat(dictionary.getEntries().iterator().next()).isEqualTo(word); // Act & Assert: Add same word again; Only one should exist entries = new ArrayList<>(); entries.add(word); - dictionaryClient.addEntries(type.getTypeId(), entries, false, false, DictionaryEntryType.ENTRY); + dictionaryClient.addEntry(type.getType(), type.getDossierTemplateId(), entries, false, null, DictionaryEntryType.ENTRY); - assertThat(dictionaryClient.getEntriesForType(type.getTypeId(), null, DictionaryEntryType.ENTRY)).hasSize(1); - assertThat(dictionaryClient.getEntriesForType(type.getTypeId(), null, DictionaryEntryType.ENTRY).get(0).getValue()).isEqualTo(word); + dictionary = dictionaryClient.getDictionaryForType(type.getType(), type.getDossierTemplateId(), null); + assertThat(dictionary.getEntries()).hasSize(1); + assertThat(dictionary.getEntries().iterator().next()).isEqualTo(word); // Act & Assert: Add same word multiple times again; Only one should exist entries = new ArrayList<>(); @@ -124,66 +135,19 @@ public class DictionaryTest extends AbstractPersistenceServerServiceTest { entries.add(word); entries.add(word); entries.add(word); - dictionaryClient.addEntries(type.getTypeId(), entries, false, false, DictionaryEntryType.ENTRY); + dictionaryClient.addEntry(type.getType(), type.getDossierTemplateId(), entries, false, null, DictionaryEntryType.ENTRY); - assertThat(dictionaryClient.getEntriesForType(type.getTypeId(), null, DictionaryEntryType.ENTRY)).hasSize(1); - assertThat(dictionaryClient.getEntriesForType(type.getTypeId(), null, DictionaryEntryType.ENTRY).get(0).getValue()).isEqualTo(word); + dictionary = dictionaryClient.getDictionaryForType(type.getType(), type.getDossierTemplateId(), null); + assertThat(dictionary.getEntries()).hasSize(1); + assertThat(dictionary.getEntries().iterator().next()).isEqualTo(word); // Act & Assert: Delete word; Should have 'deleted' flag entries = new ArrayList<>(); entries.add(word); - dictionaryClient.deleteEntries(type.getTypeId(), entries, DictionaryEntryType.ENTRY); + dictionaryClient.deleteEntries(type.getType(), type.getDossierTemplateId(), entries, null, DictionaryEntryType.ENTRY); - assertThat(dictionaryClient.getEntriesForType(type.getTypeId(), null, DictionaryEntryType.ENTRY)).hasSize(1); - assertThat(dictionaryClient.getEntriesForType(type.getTypeId(), null, DictionaryEntryType.ENTRY).get(0).getValue()).isEqualTo(word); - assertThat(dictionaryClient.getEntriesForType(type.getTypeId(), null, DictionaryEntryType.ENTRY).get(0).isDeleted()).isTrue(); - } - - - @Test - public void testAddWordMultipleTimesAndRemoveCurrent() { - - // Arrange - var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); - var type = typeProvider.testAndProvideType(dossierTemplate); - var word = "Anakin Skywalker"; - - // Act & Assert: Add same word multiple times; Only one should exist - var entries = new ArrayList(); - entries.add(word); - entries.add(word); - dictionaryClient.addEntries(type.getTypeId(), entries, true, false, DictionaryEntryType.ENTRY); - - assertThat(dictionaryClient.getEntriesForType(type.getTypeId(), null, DictionaryEntryType.ENTRY)).hasSize(1); - assertThat(dictionaryClient.getEntriesForType(type.getTypeId(), null, DictionaryEntryType.ENTRY).get(0).getValue()).isEqualTo(word); - - // Act & Assert: Add same word again; Only one should exist - entries = new ArrayList<>(); - entries.add(word); - dictionaryClient.addEntries(type.getTypeId(), entries, true, false, DictionaryEntryType.ENTRY); - - assertThat(dictionaryClient.getEntriesForType(type.getTypeId(), null, DictionaryEntryType.ENTRY)).hasSize(1); - assertThat(dictionaryClient.getEntriesForType(type.getTypeId(), null, DictionaryEntryType.ENTRY).get(0).getValue()).isEqualTo(word); - - // Act & Assert: Add same word multiple times again; Only one should exist - entries = new ArrayList<>(); - entries.add(word); - entries.add(word); - entries.add(word); - entries.add(word); - dictionaryClient.addEntries(type.getTypeId(), entries, true, false, DictionaryEntryType.ENTRY); - - assertThat(dictionaryClient.getEntriesForType(type.getTypeId(), null, DictionaryEntryType.ENTRY)).hasSize(1); - assertThat(dictionaryClient.getEntriesForType(type.getTypeId(), null, DictionaryEntryType.ENTRY).get(0).getValue()).isEqualTo(word); - - // Act & Assert: Delete word; Should have 'deleted' flag - entries = new ArrayList<>(); - entries.add(word); - dictionaryClient.deleteEntries(type.getTypeId(), entries, DictionaryEntryType.ENTRY); - - assertThat(dictionaryClient.getEntriesForType(type.getTypeId(), null, DictionaryEntryType.ENTRY)).hasSize(1); - assertThat(dictionaryClient.getEntriesForType(type.getTypeId(), null, DictionaryEntryType.ENTRY).get(0).getValue()).isEqualTo(word); - assertThat(dictionaryClient.getEntriesForType(type.getTypeId(), null, DictionaryEntryType.ENTRY).get(0).isDeleted()).isTrue(); + dictionary = dictionaryClient.getDictionaryForType(type.getType(), type.getDossierTemplateId(), null); + assertThat(dictionary.getEntries()).hasSize(0); } @@ -202,24 +166,22 @@ public class DictionaryTest extends AbstractPersistenceServerServiceTest { entries.add(word1); entries.add(word2); entries.add(word3); - dictionaryClient.addEntries(type.getTypeId(), entries, false, false, DictionaryEntryType.ENTRY); + dictionaryClient.addEntry(type.getType(), type.getDossierTemplateId(), entries, false, null, DictionaryEntryType.ENTRY); - assertThat(dictionaryClient.getEntriesForType(type.getTypeId(), null, DictionaryEntryType.ENTRY)).hasSize(3); - assertThat(dictionaryClient.getEntriesForType(type.getTypeId(), null, DictionaryEntryType.ENTRY).stream().map(e -> e.getValue()).collect(Collectors.toList())).contains( - word1, - word2, - word3); + var dictionary = dictionaryClient.getDictionaryForType(type.getType(), type.getDossierTemplateId(), null); + + assertThat(dictionary.getEntries()).hasSize(3); + assertThat(dictionary.getEntries()).contains(word1, word2, word3); // Act & Assert: Add same word again; No duplicate should exist entries = new ArrayList<>(); entries.add(word1); - dictionaryClient.addEntries(type.getTypeId(), entries, false, false, DictionaryEntryType.ENTRY); + dictionaryClient.addEntry(type.getType(), type.getDossierTemplateId(), entries, false, null, DictionaryEntryType.ENTRY); - assertThat(dictionaryClient.getEntriesForType(type.getTypeId(), null, DictionaryEntryType.ENTRY)).hasSize(3); - assertThat(dictionaryClient.getEntriesForType(type.getTypeId(), null, DictionaryEntryType.ENTRY).stream().map(e -> e.getValue()).collect(Collectors.toList())).contains( - word1, - word2, - word3); + dictionary = dictionaryClient.getDictionaryForType(type.getType(), type.getDossierTemplateId(), null); + + assertThat(dictionary.getEntries()).hasSize(3); + assertThat(dictionary.getEntries()).contains(word1, word2, word3); // Act & Assert: Add words multiple times again; No duplicate should exist entries = new ArrayList<>(); @@ -229,13 +191,12 @@ public class DictionaryTest extends AbstractPersistenceServerServiceTest { entries.add(word1); entries.add(word2); entries.add(word3); - dictionaryClient.addEntries(type.getTypeId(), entries, false, false, DictionaryEntryType.ENTRY); + dictionaryClient.addEntry(type.getType(), type.getDossierTemplateId(), entries, false, null, DictionaryEntryType.ENTRY); - assertThat(dictionaryClient.getEntriesForType(type.getTypeId(), null, DictionaryEntryType.ENTRY)).hasSize(3); - assertThat(dictionaryClient.getEntriesForType(type.getTypeId(), null, DictionaryEntryType.ENTRY).stream().map(e -> e.getValue()).collect(Collectors.toList())).contains( - word1, - word2, - word3); + dictionary = dictionaryClient.getDictionaryForType(type.getType(), type.getDossierTemplateId(), null); + + assertThat(dictionary.getEntries()).hasSize(3); + assertThat(dictionary.getEntries()).contains(word1, word2, word3); } @@ -244,41 +205,38 @@ public class DictionaryTest extends AbstractPersistenceServerServiceTest { var dossier = dossierTesterAndProvider.provideTestDossier(); - dictionaryClient.addType(Type.builder() - .type("dossier_redaction") + dictionaryClient.addType(CreateTypeValue.builder() + .type("dossier_redaction_2") .label("Dossier Redactions") .hexColor("#fcba03") .rank(100) - .isHint(false) - .isCaseInsensitive(false) - .isRecommendation(false) + .hint(false) + .caseInsensitive(false) + .recommendation(false) .description("Something") .addToDictionaryAction(false) .dossierTemplateId(dossier.getDossierTemplateId()) - .dossierId(dossier.getId()) - .build()); + .build(), dossier.getId()); var dossierTemplate = dossierTemplateClient.getDossierTemplate(dossier.getDossierTemplateId()); var dossier2 = dossierTesterAndProvider.provideTestDossier(dossierTemplate, "dossier2"); - dictionaryClient.addType(Type.builder() - .type("dossier_redaction") - .label("Dossier Redactions") + dictionaryClient.addType(CreateTypeValue.builder() + .type("dossier_redaction_2") + .label("Dossier Redactions 2") .hexColor("#fcba03") .rank(100) - .isHint(false) - .isCaseInsensitive(false) - .isRecommendation(false) + .hint(false) + .recommendation(false) .description("Something") .addToDictionaryAction(false) .dossierTemplateId(dossier2.getDossierTemplateId()) - .dossierId(dossier2.getId()) - .build()); + .build(), dossier2.getId()); - assertThat(dictionaryClient.getAllTypesForDossierTemplate(dossier.getDossierTemplateId(), false)).isEmpty(); - assertThat(dictionaryClient.getAllTypesForDossier(dossier.getId(), false).size()).isEqualTo(1); - assertThat(dictionaryClient.getAllTypesForDossier(dossier2.getId(), false).size()).isEqualTo(1); + assertThat(dictionaryClient.getAllTypes(dossier.getDossierTemplateId(), null, false).getTypes()).isEmpty(); + assertThat(dictionaryClient.getAllTypes(dossier.getDossierTemplateId(), dossier.getId(), false).getTypes().size()).isEqualTo(2); + assertThat(dictionaryClient.getAllTypes(dossier.getDossierTemplateId(), dossier2.getId(), false).getTypes().size()).isEqualTo(2); } @@ -287,21 +245,19 @@ public class DictionaryTest extends AbstractPersistenceServerServiceTest { var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); - var type = Type.builder() + + var type = CreateTypeValue.builder() .type("dossier_redaction") .label("Dossier Redactions") .hexColor("#fcba03") .rank(100) - .isHint(false) - .isCaseInsensitive(false) - .isRecommendation(false) .description("Something") .hasDictionary(true) .addToDictionaryAction(false) .dossierTemplateId(dossierTemplate.getId()) .build(); - var createdType = dictionaryClient.addType(type); + var createdType = dictionaryClient.addType(type,null); var word1 = "Luke Skywalker"; var word2 = "Anakin Skywalker"; @@ -312,19 +268,21 @@ public class DictionaryTest extends AbstractPersistenceServerServiceTest { entries.add(word1); entries.add(word2); entries.add(word3); - dictionaryClient.addEntries(createdType.getTypeId(), entries, false, false, DictionaryEntryType.ENTRY); + dictionaryClient.addEntry(createdType.getType(), createdType.getDossierTemplateId(), entries, false, null, DictionaryEntryType.ENTRY); - var actualEntries = dictionaryClient.getEntriesForType(createdType.getTypeId(), 0L, DictionaryEntryType.ENTRY); + var dictionary = dictionaryClient.getDictionaryForType(type.getType(), type.getDossierTemplateId(), null); + + var actualEntries = dictionary.getEntries(); assertThat(actualEntries.size()).isEqualTo(3); - dictionaryClient.deleteType(createdType.getTypeId()); - actualEntries = dictionaryClient.getEntriesForType(createdType.getTypeId(), 0L, DictionaryEntryType.ENTRY); - actualEntries = actualEntries.stream().filter(e -> !e.isDeleted()).collect(Collectors.toList()); - assertThat(actualEntries.size()).isEqualTo(0); + dictionaryClient.deleteType(createdType.getType(), createdType.getDossierTemplateId(),null); + assertThat(dictionaryClient.getAllTypes(createdType.getDossierTemplateId(),null,false).getTypes().size()).isEqualTo(0); - dictionaryClient.addType(type); - actualEntries = dictionaryClient.getEntriesForType(createdType.getTypeId(), 0L, DictionaryEntryType.ENTRY); - actualEntries = actualEntries.stream().filter(e -> !e.isDeleted()).collect(Collectors.toList()); + createdType = dictionaryClient.addType(type,null); + + dictionary = dictionaryClient.getDictionaryForType(type.getType(), type.getDossierTemplateId(), null); + + actualEntries = dictionary.getEntries(); assertThat(actualEntries.size()).isEqualTo(0); } @@ -334,21 +292,19 @@ public class DictionaryTest extends AbstractPersistenceServerServiceTest { var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); - var type = Type.builder() + var type = CreateTypeValue.builder() .type("dossier_redaction") .label("Dossier Redactions") .hexColor("#fcba03") .rank(100) - .isHint(false) - .isCaseInsensitive(false) - .isRecommendation(false) + .hint(false) .description("Something") .hasDictionary(true) .addToDictionaryAction(false) .dossierTemplateId(dossierTemplate.getId()) .build(); - var createdType = dictionaryClient.addType(type); + var createdType = dictionaryClient.addType(type, null); var word1 = "Luke Skywalker"; var word2 = "Anakin Skywalker"; @@ -359,23 +315,23 @@ public class DictionaryTest extends AbstractPersistenceServerServiceTest { entries.add(word1); entries.add(word2); entries.add(word3); - dictionaryClient.addEntries(createdType.getTypeId(), entries, false, false, DictionaryEntryType.ENTRY); + dictionaryClient.addEntry(createdType.getType(), createdType.getDossierTemplateId(), entries, false, null, DictionaryEntryType.ENTRY); var word4 = "Padme"; var word5 = "Obiwan"; entries.clear(); entries.add(word4); entries.add(word5); - dictionaryClient.addEntries(createdType.getTypeId(), entries, true, false, DictionaryEntryType.ENTRY); + dictionaryClient.addEntry(createdType.getType(), createdType.getDossierTemplateId(), entries, true, null, DictionaryEntryType.ENTRY); entries.add(word1); entries.add(word2); entries.add(word3); - dictionaryClient.addEntries(createdType.getTypeId(), entries, false, false, DictionaryEntryType.ENTRY); + dictionaryClient.addEntry(createdType.getType(), createdType.getDossierTemplateId(), entries, false, null, DictionaryEntryType.ENTRY); - var existingEntries = dictionaryClient.getEntriesForType(createdType.getTypeId(), 0L, DictionaryEntryType.ENTRY); + var dictionary = dictionaryClient.getDictionaryForType(type.getType(), type.getDossierTemplateId(), null); - assertThat(existingEntries.stream().filter(f -> !f.isDeleted()).count()).isEqualTo(5); + assertThat(dictionary.getEntries().size()).isEqualTo(5); } } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DigitalSignatureTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DigitalSignatureTest.java index fb457eb6f..7410c4447 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DigitalSignatureTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DigitalSignatureTest.java @@ -5,13 +5,15 @@ import static org.assertj.core.api.Assertions.assertThat; import java.nio.file.Files; import org.junit.jupiter.api.Test; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.ClassPathResource; import com.iqser.red.service.peristence.v1.server.integration.client.DigitalSignatureClient; import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.DigitalSignature; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.DigitalSignatureKms; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DigitalSignatureKms; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DigitalSignatureViewModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.DigitalSignature; import feign.FeignException; import lombok.SneakyThrows; @@ -37,17 +39,17 @@ public class DigitalSignatureTest extends AbstractPersistenceServerServiceTest { digitalSignature.setReason("test"); digitalSignature.setLocation("test"); digitalSignature.setContactInfo("test"); - digitalSignature.setPrivateKey(new byte[]{1, 2, 3, 4}); + digitalSignature.setPrivateKey("zzz"); var savedDigitalSignature = digitalSignatureClient.saveDigitalSignature(digitalSignature); var loadedSignature = digitalSignatureClient.getDigitalSignature(); // encrypted - assertThat(savedDigitalSignature.getPassword()).isNotEqualTo(loadedSignature.getPassword()); - assertThat(savedDigitalSignature.getPrivateKey()).isNotEqualTo(loadedSignature.getPrivateKey()); - digitalSignature.setReason("new test"); - digitalSignatureClient.updateDigitalSignature(digitalSignature); + var dvm = new DigitalSignatureViewModel(); + BeanUtils.copyProperties(loadedSignature, dvm); + dvm.setReason("new test"); + digitalSignatureClient.updateDigitalSignature(dvm); loadedSignature = digitalSignatureClient.getDigitalSignature(); assertThat(loadedSignature.getReason()).isEqualTo("new test"); @@ -81,7 +83,7 @@ public class DigitalSignatureTest extends AbstractPersistenceServerServiceTest { .kmsRegion(kmsRegion) .kmsSecretKey(kmsSecretKey) .kmsServiceEndpoint(kmsServiceEndpoint) - .certificate(certificate) + .certificate(new String(certificate)) .build(); // Act and Assert: Get not existing @@ -97,10 +99,8 @@ public class DigitalSignatureTest extends AbstractPersistenceServerServiceTest { assertThat(savedDigitalSignature.getKmsAccessKey()).isEqualTo(digitalSignature.getKmsAccessKey()); assertThat(savedDigitalSignature.getKmsKeyId()).isEqualTo(digitalSignature.getKmsKeyId()); assertThat(savedDigitalSignature.getKmsRegion()).isEqualTo(digitalSignature.getKmsRegion()); - assertThat(savedDigitalSignature.getKmsSecretKey()).isEqualTo(digitalSignature.getKmsSecretKey()); assertThat(savedDigitalSignature.getCertificateName()).isEqualTo(digitalSignature.getCertificateName()); assertThat(savedDigitalSignature.getKmsServiceEndpoint()).isEqualTo(digitalSignature.getKmsServiceEndpoint()); - assertThat(savedDigitalSignature.getCertificate()).isEqualTo(digitalSignature.getCertificate()); // Act and Assert: Get existing var loadedDigitalSignature = digitalSignatureClient.getDigitalSignatureKms(); @@ -108,10 +108,8 @@ public class DigitalSignatureTest extends AbstractPersistenceServerServiceTest { assertThat(loadedDigitalSignature.getKmsAccessKey()).isEqualTo(digitalSignature.getKmsAccessKey()); assertThat(loadedDigitalSignature.getKmsKeyId()).isEqualTo(digitalSignature.getKmsKeyId()); assertThat(loadedDigitalSignature.getKmsRegion()).isEqualTo(digitalSignature.getKmsRegion()); - assertThat(loadedDigitalSignature.getKmsSecretKey()).isEqualTo(digitalSignature.getKmsSecretKey()); assertThat(loadedDigitalSignature.getCertificateName()).isEqualTo(digitalSignature.getCertificateName()); assertThat(loadedDigitalSignature.getKmsServiceEndpoint()).isEqualTo(digitalSignature.getKmsServiceEndpoint()); - assertThat(loadedDigitalSignature.getCertificate()).isEqualTo(digitalSignature.getCertificate()); // Act and Assert: Delete digitalSignatureClient.deleteDigitalSignatureKms(); diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierAttributeTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierAttributeTest.java index 39026c673..38675345d 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierAttributeTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierAttributeTest.java @@ -14,9 +14,11 @@ import com.iqser.red.service.peristence.v1.server.integration.client.DossierAttr import com.iqser.red.service.peristence.v1.server.integration.client.DossierAttributeConfigClient; import com.iqser.red.service.peristence.v1.server.integration.service.DossierTesterAndProvider; import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierAttributeConfig; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierAttribute; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierAttributeType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierAttributes; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierAttributesConfig; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierAttributeConfig; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.DossierAttribute; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.DossierAttributeType; import lombok.SneakyThrows; @@ -38,78 +40,75 @@ public class DossierAttributeTest extends AbstractPersistenceServerServiceTest { var dossier = dossierTesterAndProvider.provideTestDossier(); - var loadedAttributes = dossierAttributeConfigClient.getDossierAttributes(dossier.getDossierTemplateId()); - assertThat(loadedAttributes).isEmpty(); + var loadedAttributes = dossierAttributeConfigClient.getDossierAttributesConfig(dossier.getDossierTemplateId()); + assertThat(loadedAttributes.getDossierAttributeConfigs()).isEmpty(); DossierAttributeConfig attribute = new DossierAttributeConfig(); attribute.setLabel("test"); attribute.setEditable(true); attribute.setType(DossierAttributeType.TEXT); - dossierAttributeConfigClient.addOrUpdateDossierAttribute(dossier.getDossierTemplateId(), attribute); - loadedAttributes = dossierAttributeConfigClient.getDossierAttributes(dossier.getDossierTemplateId()); - assertThat(loadedAttributes).isNotEmpty(); + dossierAttributeConfigClient.addOrUpdateDossierAttributeConfig(dossier.getDossierTemplateId(), attribute); + loadedAttributes = dossierAttributeConfigClient.getDossierAttributesConfig(dossier.getDossierTemplateId()); + assertThat(loadedAttributes.getDossierAttributeConfigs()).isNotEmpty(); - dossierAttributeConfigClient.setDossierAttributesConfig(dossier.getDossierTemplateId(), Lists.newArrayList()); - loadedAttributes = dossierAttributeConfigClient.getDossierAttributes(dossier.getDossierTemplateId()); - assertThat(loadedAttributes).isEmpty(); + dossierAttributeConfigClient.setDossierAttributesConfig(dossier.getDossierTemplateId(), new DossierAttributesConfig()); + loadedAttributes = dossierAttributeConfigClient.getDossierAttributesConfig(dossier.getDossierTemplateId()); + assertThat(loadedAttributes.getDossierAttributeConfigs()).isEmpty(); - dossierAttributeConfigClient.setDossierAttributesConfig(dossier.getDossierTemplateId(), Lists.newArrayList(attribute)); - loadedAttributes = dossierAttributeConfigClient.getDossierAttributes(dossier.getDossierTemplateId()); - assertThat(loadedAttributes).isNotEmpty(); - dossierAttributeConfigClient.deleteDossierAttribute(loadedAttributes.iterator().next().getId()); + dossierAttributeConfigClient.setDossierAttributesConfig(dossier.getDossierTemplateId(), new DossierAttributesConfig(List.of(attribute))); + loadedAttributes = dossierAttributeConfigClient.getDossierAttributesConfig(dossier.getDossierTemplateId()); + assertThat(loadedAttributes.getDossierAttributeConfigs()).isNotEmpty(); - dossierAttributeConfigClient.setDossierAttributesConfig(dossier.getDossierTemplateId(), Lists.newArrayList(attribute)); - loadedAttributes = dossierAttributeConfigClient.getDossierAttributes(dossier.getDossierTemplateId()); - assertThat(loadedAttributes).isNotEmpty(); + dossierAttributeConfigClient.deleteDossierAttributesConfig(dossier.getDossierTemplateId(), + loadedAttributes.getDossierAttributeConfigs().stream().map(DossierAttributeConfig::getId).collect(Collectors.toList())); + dossierAttributeConfigClient.setDossierAttributesConfig(dossier.getDossierTemplateId(), new DossierAttributesConfig(List.of(attribute))); + loadedAttributes = dossierAttributeConfigClient.getDossierAttributesConfig(dossier.getDossierTemplateId()); + assertThat(loadedAttributes.getDossierAttributeConfigs()).isNotEmpty(); - dossierAttributeConfigClient.deleteDossierAttributes(loadedAttributes.stream().map(DossierAttributeConfig::getId).collect(Collectors.toList())); - dossierAttributeConfigClient.setDossierAttributesConfig(dossier.getDossierTemplateId(), Lists.newArrayList(attribute)); - loadedAttributes = dossierAttributeConfigClient.getDossierAttributes(dossier.getDossierTemplateId()); - assertThat(loadedAttributes).isNotEmpty(); - - var configId = loadedAttributes.iterator().next().getId(); + var configId = loadedAttributes.getDossierAttributeConfigs().iterator().next().getId(); List dossierAttributes = new ArrayList<>(); dossierAttributes.add(DossierAttribute.builder().dossierAttributeConfigId(configId).dossierId(dossier.getId()).value("lorem ipsum").build()); - dossierAttributeClient.setDossierAttributes(dossier.getId(), dossierAttributes); + dossierAttributeClient.setDossierAttributes(dossier.getId(), new DossierAttributes(dossierAttributes)); var loadedAttributeValues = dossierAttributeClient.getDossierAttributes(dossier.getId()); - assertThat(loadedAttributeValues).isNotEmpty(); + assertThat(loadedAttributeValues.getDossierAttributeList()).isNotEmpty(); - var firstAttribute = loadedAttributeValues.iterator().next(); + var firstAttribute = loadedAttributeValues.getDossierAttributeList().iterator().next(); assertThat(firstAttribute.getValue()).isEqualTo("lorem ipsum"); firstAttribute.setValue(" "); dossierAttributeClient.addOrUpdateDossierAttribute(dossier.getId(), firstAttribute); loadedAttributeValues = dossierAttributeClient.getDossierAttributes(dossier.getId()); - assertThat(loadedAttributeValues).isNotEmpty(); - firstAttribute = loadedAttributeValues.iterator().next(); + assertThat(loadedAttributeValues.getDossierAttributeList()).isNotEmpty(); + firstAttribute = loadedAttributeValues.getDossierAttributeList().iterator().next(); assertThat(firstAttribute.getValue()).isNull(); firstAttribute.setValue(null); dossierAttributeClient.addOrUpdateDossierAttribute(dossier.getId(), firstAttribute); loadedAttributeValues = dossierAttributeClient.getDossierAttributes(dossier.getId()); - assertThat(loadedAttributeValues).isNotEmpty(); - firstAttribute = loadedAttributeValues.iterator().next(); + assertThat(loadedAttributeValues.getDossierAttributeList()).isNotEmpty(); + firstAttribute = loadedAttributeValues.getDossierAttributeList().iterator().next(); assertThat(firstAttribute.getValue()).isNull(); dossierAttributeClient.deleteDossierAttribute(dossier.getId(), firstAttribute.getDossierAttributeConfigId()); loadedAttributeValues = dossierAttributeClient.getDossierAttributes(dossier.getId()); - assertThat(loadedAttributeValues).isEmpty(); + assertThat(loadedAttributeValues.getDossierAttributeList()).isEmpty(); - dossierAttributeClient.setDossierAttributes(dossier.getId(), dossierAttributes); + dossierAttributeClient.setDossierAttributes(dossier.getId(), new DossierAttributes(dossierAttributes)); loadedAttributeValues = dossierAttributeClient.getDossierAttributes(dossier.getId()); - assertThat(loadedAttributeValues).isNotEmpty(); + assertThat(loadedAttributeValues.getDossierAttributeList()).isNotEmpty(); //delete the list of dossier attribute config with child - dossierAttributeConfigClient.deleteDossierAttributes(Lists.newArrayList(loadedAttributes.iterator().next().getId())); - loadedAttributes = dossierAttributeConfigClient.getDossierAttributes(dossier.getDossierTemplateId()); - assertThat(loadedAttributes).isEmpty(); + dossierAttributeConfigClient.deleteDossierAttributesConfig(dossier.getDossierTemplateId(), + Lists.newArrayList(loadedAttributes.getDossierAttributeConfigs().iterator().next().getId())); + loadedAttributes = dossierAttributeConfigClient.getDossierAttributesConfig(dossier.getDossierTemplateId()); + assertThat(loadedAttributes.getDossierAttributeConfigs()).isEmpty(); loadedAttributeValues = dossierAttributeClient.getDossierAttributes(dossier.getId()); - assertThat(loadedAttributeValues).isEmpty(); + assertThat(loadedAttributeValues.getDossierAttributeList()).isEmpty(); } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierStatsTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierStatsTest.java index 926de9edc..a40362aa4 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierStatsTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierStatsTest.java @@ -19,10 +19,11 @@ import com.iqser.red.service.peristence.v1.server.integration.service.DossierTem import com.iqser.red.service.peristence.v1.server.integration.service.DossierTesterAndProvider; import com.iqser.red.service.peristence.v1.server.integration.service.FileTesterAndProvider; import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.Dossier; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierStats; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus; +import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierStats; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.Dossier; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.ProcessingStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus; public class DossierStatsTest extends AbstractPersistenceServerServiceTest { @@ -55,7 +56,7 @@ public class DossierStatsTest extends AbstractPersistenceServerServiceTest { @BeforeEach public void setupData() { - + TenantContext.setTenantId("redaction"); var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); dossier1 = dossierTesterAndProvider.provideTestDossier(dossierTemplate); //provides 2 files @@ -130,7 +131,6 @@ public class DossierStatsTest extends AbstractPersistenceServerServiceTest { @Test public void testDossierStatsWithMoreDossierIds() { - Set dossierIds = new HashSet<>(); dossierIds.add(dossier1.getId()); dossierIds.add(dossier2.getId()); @@ -155,7 +155,6 @@ public class DossierStatsTest extends AbstractPersistenceServerServiceTest { @Test public void testArchivedAndDeletedDossierStats() { - DossierStats dossierStats = dossierStatsClient.getDossierStats(dossier1.getId()); assertThat(dossierStats.getNumberOfFiles()).isEqualTo(2); @@ -163,9 +162,9 @@ public class DossierStatsTest extends AbstractPersistenceServerServiceTest { dossierStats = dossierStatsClient.getDossierStats(dossier1.getId()); assertThat(dossierStats.getNumberOfFiles()).isEqualTo(2); - dossierClient.delete(dossier1.getId()); + dossierClient.deleteDossier(dossier1.getId()); - var allDossiers = dossierClient.getAllDossiers(true, true); + var allDossiers = dossierClient.getDossiers(true, true); assertThat(allDossiers.size()).isEqualTo(2); assertThat(dossierClient.getSoftDeletedDossiers().size()).isEqualTo(1); diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierStatusTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierStatusTest.java index 150d92736..ebb424117 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierStatusTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierStatusTest.java @@ -11,8 +11,8 @@ import com.iqser.red.service.peristence.v1.server.integration.client.DossierStat import com.iqser.red.service.peristence.v1.server.integration.service.DossierTemplateTesterAndProvider; import com.iqser.red.service.peristence.v1.server.integration.service.DossierTesterAndProvider; import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.CreateOrUpdateDossierRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.CreateOrUpdateDossierStatusRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierStatusRequest; import feign.FeignException; @@ -41,8 +41,9 @@ public class DossierStatusTest extends AbstractPersistenceServerServiceTest { assertThat(allDossierStatus.size()).isZero(); // Create first state - CreateOrUpdateDossierStatusRequest crudsr = new CreateOrUpdateDossierStatusRequest(); + var crudsr = new DossierStatusRequest(); crudsr.setName("name1"); + crudsr.setColor("#cccccc"); crudsr.setDescription("description1"); crudsr.setDossierTemplateId(dossierTemplate.getId()); @@ -78,21 +79,22 @@ public class DossierStatusTest extends AbstractPersistenceServerServiceTest { assertThat(allDossierStatus.iterator().next().getDossierCount()).isEqualTo(1); // update dossier with dossier status null - CreateOrUpdateDossierRequest cru = new CreateOrUpdateDossierRequest(); + var cru = new DossierRequest(); BeanUtils.copyProperties(testDossier, cru); cru.setDossierTemplateId(testDossier.getDossierTemplateId()); cru.setDossierStatusId(null); - var updated = dossierClient.updateDossier(cru, testDossier.getId()); + var updated = dossierClient.createDossierOrUpdateDossier(cru).getBody(); assertThat(updated.getDossierStatusId()).isNull(); updatedStatus = dossierStatusClient.getDossierStatus(loadedDossierStatus.getId()); assertThat(updatedStatus.getDossierCount()).isZero(); // Create - CreateOrUpdateDossierStatusRequest crudsr2 = new CreateOrUpdateDossierStatusRequest(); + var crudsr2 = new DossierStatusRequest(); crudsr2.setName("name3"); crudsr2.setDescription("description3"); crudsr2.setRank(1); + crudsr2.setColor("#cccccc"); crudsr2.setDossierTemplateId(dossierTemplate.getId()); // create second dossier status @@ -118,11 +120,11 @@ public class DossierStatusTest extends AbstractPersistenceServerServiceTest { } // update dossier with dossier status - CreateOrUpdateDossierRequest cru2 = new CreateOrUpdateDossierRequest(); + var cru2 = new DossierRequest(); BeanUtils.copyProperties(testDossier, cru2); cru2.setDossierTemplateId(testDossier.getDossierTemplateId()); cru2.setDossierStatusId(loadedDossierStatus.getId()); - updated = dossierClient.updateDossier(cru2, testDossier.getId()); + updated = dossierClient.createDossierOrUpdateDossier(cru2).getBody(); assertThat(updated.getDossierStatusId()).isNotNull(); //delete and replace dossierStatusClient.deleteDossierStatus(loadedDossierStatus.getId(), loadedDossierStatus2.getId()); @@ -130,7 +132,7 @@ public class DossierStatusTest extends AbstractPersistenceServerServiceTest { assertThat(allDossierStatus.size()).isEqualTo(1); assertThat(allDossierStatus.get(0).getDossierCount()).isEqualTo(1); // check dossier has the new dossier status - updated = dossierClient.getDossierById(updated.getId(), false, false); + updated = dossierClient.getDossier(updated.getId(), false, false); assertThat(updated.getDossierStatusId()).isEqualTo(loadedDossierStatus2.getId()); } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateImportTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateImportTest.java new file mode 100644 index 000000000..bcbf49ff6 --- /dev/null +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateImportTest.java @@ -0,0 +1,81 @@ +package com.iqser.red.service.peristence.v1.server.integration.tests; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.stream.Stream; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +import org.junit.Ignore; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; +import com.iqser.red.service.persistence.management.v1.processor.service.DossierTemplateImportService; +import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.importexport.ImportDossierTemplateRequest; + +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class DossierTemplateImportTest extends AbstractPersistenceServerServiceTest { + + @Autowired + private DossierTemplateImportService dossierTemplateImportService; + + + @SneakyThrows + @Test + @Disabled + public void testDossierTemplateImport() { + + var importDir = new File("/path/to/git/repo/dossier-templates-v2/dev"); + + TenantContext.setTenantId("redaction"); + for (var file : importDir.listFiles()) { + if(file.isDirectory()){ + var archive = pack(file.getAbsolutePath()); + log.info("Importing file: " + file.getName() + " " + " with size: " + archive.length); + var request = new ImportDossierTemplateRequest(); + request.setArchive(archive); + request.setUpdateExistingDossierTemplate(false); + request.setUserId("system"); + dossierTemplateImportService.importDossierTemplate(request); + } + } + } + + + public byte[] pack(String sourceDirPath) throws IOException { + + var bos = new ByteArrayOutputStream(); + var p = Paths.get(sourceDirPath); + try (ZipOutputStream zs = new ZipOutputStream(bos)) { + Stream paths = Files.walk(p); + { + paths.filter(path -> !Files.isDirectory(path)).forEach(path -> { + ZipEntry zipEntry = new ZipEntry(p.relativize(path).toString()); + try { + zs.putNextEntry(zipEntry); + Files.copy(path, zs); + zs.closeEntry(); + } catch (IOException e) { + System.err.println(e); + } + }); + } + } + + return bos.toByteArray(); + + } + +} + + diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateStatsTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateStatsTest.java index 0c6828921..7e6d2a9bb 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateStatsTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateStatsTest.java @@ -20,21 +20,27 @@ import com.iqser.red.service.peristence.v1.server.integration.client.DossierStat import com.iqser.red.service.peristence.v1.server.integration.client.DossierTemplateClient; import com.iqser.red.service.peristence.v1.server.integration.client.DossierTemplateStatsClient; import com.iqser.red.service.peristence.v1.server.integration.client.FileClient; +import com.iqser.red.service.peristence.v1.server.integration.client.FileManagementClient; +import com.iqser.red.service.peristence.v1.server.integration.client.ReanalysisClient; import com.iqser.red.service.peristence.v1.server.integration.client.UploadClient; import com.iqser.red.service.peristence.v1.server.integration.service.DossierTemplateTesterAndProvider; import com.iqser.red.service.peristence.v1.server.integration.service.DossierTesterAndProvider; import com.iqser.red.service.peristence.v1.server.integration.service.FileTesterAndProvider; +import com.iqser.red.service.peristence.v1.server.integration.service.UserProvider; import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.CreateOrUpdateDossierTemplateRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierTemplate; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierTemplateDictionaryStats; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DownloadFileType; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.CreateOrUpdateDossierStatusRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.DictionaryEntry; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.DictionaryEntryType; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.DictionarySummary; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.Type; +import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; +import com.iqser.red.service.persistence.service.v1.api.shared.model.CreateTypeValue; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierStatusRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierTemplateModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.PageExclusionRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.PageRange; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierTemplateDictionaryStats; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DownloadFileType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionaryEntry; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionaryEntryType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionarySummary; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.Type; public class DossierTemplateStatsTest extends AbstractPersistenceServerServiceTest { @@ -74,28 +80,36 @@ public class DossierTemplateStatsTest extends AbstractPersistenceServerServiceTe @Autowired private DossierStatusClient dossierStatusClient; + @Autowired + private FileManagementClient fileManagementClient; + + @Autowired + private ReanalysisClient reanalysisClient; + + @Autowired + private UserProvider userProvider; + @Test public void testDossierTemplateDictionaryStats() { var dossier = dossierTesterAndProvider.provideTestDossier(); - var addedType1 = dictionaryClient.addType(Type.builder() - .type("type dossier") + var addedType1 = dictionaryClient.addType(CreateTypeValue.builder() + .type("type_dossier") .label("Dossier Redactions") .hexColor("#fcba03") .rank(100) .description("Something") .addToDictionaryAction(false) .dossierTemplateId(dossier.getDossierTemplateId()) - .dossierId(dossier.getId()) - .build()); + .build(),null); assertThat(addedType1).isNotNull(); var dossierTemplate2 = provideTestTemplate("dossierTemp2"); - var addedType = dictionaryClient.addType(Type.builder() + var addedType = dictionaryClient.addType(CreateTypeValue.builder() .type(TYPE_ID_1) .label("Dossier Redactions") .hexColor("#fcba03") @@ -103,21 +117,19 @@ public class DossierTemplateStatsTest extends AbstractPersistenceServerServiceTe .description("Something") .addToDictionaryAction(false) .dossierTemplateId(dossierTemplate2.getId()) - .dossierId(null) .hasDictionary(true) - .systemManaged(false) - .build()); + .build(),null); assertThat(addedType).isNotNull(); var entries1 = new ArrayList(); entries1.add("entry1"); entries1.add("entry2"); - dictionaryClient.addEntries(addedType.getTypeId(), entries1, false, false, DictionaryEntryType.ENTRY); + dictionaryClient.addEntry(addedType.getType(),addedType.getDossierTemplateId(), entries1, false, null, DictionaryEntryType.ENTRY); - List entryList = dictionaryClient.getEntriesForType(addedType.getTypeId(), null, DictionaryEntryType.ENTRY); - assertThat(entryList.size()).isEqualTo(entries1.size()); + var dictionary = dictionaryClient.getDictionaryForType(addedType.getType(), addedType.getDossierTemplateId(), null); + assertThat(dictionary.getEntries().size()).isEqualTo(entries1.size()); - var addedType2 = dictionaryClient.addType(Type.builder() + var addedType2 = dictionaryClient.addType(CreateTypeValue.builder() .type(TYPE_ID_2) .label("Dossier Redactions 2") .hexColor("#fcba03") @@ -125,21 +137,20 @@ public class DossierTemplateStatsTest extends AbstractPersistenceServerServiceTe .description("Something") .addToDictionaryAction(false) .dossierTemplateId(dossierTemplate2.getId()) - .dossierId(null) .hasDictionary(true) - .systemManaged(false) - .build()); + .build(),null); var entries2 = new ArrayList(); entries2.add("entry1"); entries2.add("entry2"); entries2.add("entry3"); - dictionaryClient.addEntries(addedType2.getTypeId(), entries2, false, false, DictionaryEntryType.ENTRY); + dictionaryClient.addEntry(addedType2.getType(),addedType2.getDossierTemplateId(), entries2, false, null, DictionaryEntryType.ENTRY); - entryList = dictionaryClient.getEntriesForType(addedType2.getTypeId(), null, DictionaryEntryType.ENTRY); - assertThat(entryList.size()).isEqualTo(entries2.size()); + + dictionary = dictionaryClient.getDictionaryForType(addedType2.getType(), addedType.getDossierTemplateId(), null); + assertThat(dictionary.getEntries().size()).isEqualTo(entries2.size()); var dossierTemplate3 = provideTestTemplate("dossierTemp3"); - var addedType3 = dictionaryClient.addType(Type.builder() + var addedType3 = dictionaryClient.addType(CreateTypeValue.builder() .type(TYPE_ID_3) .label("Dossier Redactions 3") .hexColor("#fcba03") @@ -147,26 +158,24 @@ public class DossierTemplateStatsTest extends AbstractPersistenceServerServiceTe .description("Something") .addToDictionaryAction(false) .dossierTemplateId(dossierTemplate3.getId()) - .dossierId(null) .hasDictionary(true) - .systemManaged(false) - .build()); + .build(),null); assertThat(addedType3).isNotNull(); var entries3 = new ArrayList(); entries3.add("entry1"); entries3.add("entry2"); - dictionaryClient.addEntries(addedType3.getTypeId(), entries3, false, false, DictionaryEntryType.ENTRY); + dictionaryClient.addEntry(addedType3.getType(),addedType3.getDossierTemplateId(), entries3, false, null, DictionaryEntryType.ENTRY); - entryList = dictionaryClient.getEntriesForType(addedType3.getTypeId(), null, DictionaryEntryType.ENTRY); - assertThat(entryList.size()).isEqualTo(entries3.size()); + dictionary = dictionaryClient.getDictionaryForType(addedType3.getType(), addedType3.getDossierTemplateId(), null); + assertThat(dictionary.getEntries().size()).isEqualTo(entries3.size()); var dossierTemplate4 = provideTestTemplate("dossierTemp4"); var dossierTemplate5 = provideTestTemplate("dossierTemp5"); - var addedType5 = dictionaryClient.addType(Type.builder() - .type("type dossier5") + var addedType5 = dictionaryClient.addType(CreateTypeValue.builder() + .type("type_dossier5") .label("5") .hexColor("#fcba03") .rank(100) @@ -174,8 +183,7 @@ public class DossierTemplateStatsTest extends AbstractPersistenceServerServiceTe .addToDictionaryAction(false) .dossierTemplateId(dossierTemplate5.getId()) .hasDictionary(true) - .systemManaged(false) - .build()); + .build(),null); assertThat(addedType5).isNotNull(); Set dossierTemplateIds = new HashSet<>(); @@ -185,7 +193,7 @@ public class DossierTemplateStatsTest extends AbstractPersistenceServerServiceTe dossierTemplateIds.add(dossierTemplate4.getId()); dossierTemplateIds.add(dossierTemplate5.getId()); - List dossierTemplateStatsList = dossierTemplateStatsClient.getDossierTemplateDictionaryStats(dossierTemplateIds); + List dossierTemplateStatsList = dossierTemplateStatsClient.getDossierTemplateStats(dossierTemplateIds); assertThat(dossierTemplateStatsList.size()).isEqualTo(dossierTemplateIds.size()); DossierTemplateDictionaryStats dossierTemplateStats1 = dossierTemplateStatsList.stream() .filter(d -> d.getDossierTemplateId().equals(dossierTemplate2.getId())) @@ -210,8 +218,8 @@ public class DossierTemplateStatsTest extends AbstractPersistenceServerServiceTe var entries22 = new ArrayList(); entries22.add(entries2.get(2)); - dictionaryClient.deleteEntries(addedType2.getTypeId(), entries22, DictionaryEntryType.ENTRY); - dossierTemplateStatsList = dossierTemplateStatsClient.getDossierTemplateDictionaryStats(dossierTemplateIds); + dictionaryClient.deleteEntries(addedType2.getType(), addedType2.getDossierTemplateId(),entries22,null, DictionaryEntryType.ENTRY); + dossierTemplateStatsList = dossierTemplateStatsClient.getDossierTemplateStats(dossierTemplateIds); assertThat(dossierTemplateStatsList.size()).isEqualTo(dossierTemplateIds.size()); DossierTemplateDictionaryStats dossierTemplateStats2 = dossierTemplateStatsList.stream() @@ -227,11 +235,13 @@ public class DossierTemplateStatsTest extends AbstractPersistenceServerServiceTe entries23.add(entries2.get(0)); entries23.add(entries2.get(1)); - dictionaryClient.deleteEntries(addedType2.getTypeId(), entries23, DictionaryEntryType.ENTRY); - var entries23loaded = dictionaryClient.getEntriesForType(addedType2.getTypeId(), null, DictionaryEntryType.ENTRY); - assertThat(entries23loaded.stream().filter(e -> !e.isDeleted()).collect(Collectors.toList())).isEmpty(); + dictionaryClient.deleteEntries(addedType2.getType(),addedType2.getDossierTemplateId(), entries23, null,DictionaryEntryType.ENTRY); - dossierTemplateStatsList = dossierTemplateStatsClient.getDossierTemplateDictionaryStats(dossierTemplateIds); + dictionary = dictionaryClient.getDictionaryForType(addedType2.getType(), addedType.getDossierTemplateId(), null); + var entries23loaded = dictionary.getEntries(); + assertThat(entries23loaded).isEmpty(); + + dossierTemplateStatsList = dossierTemplateStatsClient.getDossierTemplateStats(dossierTemplateIds); assertThat(dossierTemplateStatsList.size()).isEqualTo(dossierTemplateIds.size()); DossierTemplateDictionaryStats dossierTemplateStats23 = dossierTemplateStatsList.stream() @@ -245,13 +255,12 @@ public class DossierTemplateStatsTest extends AbstractPersistenceServerServiceTe } - public DossierTemplate provideTestTemplate(String dossierTemplateName) { + public DossierTemplateModel provideTestTemplate(String dossierTemplateName) { - CreateOrUpdateDossierTemplateRequest cru = new CreateOrUpdateDossierTemplateRequest(); + var cru = new DossierTemplateModel(); cru.setDownloadFileTypes(Sets.newHashSet(DownloadFileType.ORIGINAL)); cru.setName(dossierTemplateName); cru.setDescription("Template 1"); - cru.setRequestingUser("1"); cru.setValidFrom(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS)); cru.setValidTo(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS)); @@ -262,14 +271,13 @@ public class DossierTemplateStatsTest extends AbstractPersistenceServerServiceTe @Test public void testDossierTemplateStats() { + TenantContext.setTenantId("redaction"); + var userId = userProvider.getUserId(); + for (int i = 0; i < 2; i++) { var template = dossierTemplateTesterAndProvider.provideTestTemplate("test template: " + i); - var status = dossierStatusClient.createOrUpdateDossierStatus(CreateOrUpdateDossierStatusRequest.builder() - .dossierTemplateId(template.getId()) - .name("test") - .rank(100) - .build()); + var status = dossierStatusClient.createOrUpdateDossierStatus(DossierStatusRequest.builder().dossierTemplateId(template.getId()).name("test").color("#cccccc").rank(100).build()); for (int j = 0; j < 8; j++) { var dossier = dossierTesterAndProvider.provideTestDossierQuick(template, "test dossier: " + j + " - " + i, j % 2 == 0 ? status : null); @@ -279,19 +287,19 @@ public class DossierTemplateStatsTest extends AbstractPersistenceServerServiceTe if (k % 2 == 0) { fileStatusPersistenceService.updateProcessingStatus(fileId, k, 0L, 0L, 0L, 0L, 0L, 1, 1); - fileClient.excludePages(dossier.getId(), fileId, Set.of(k)); + reanalysisClient.excludePages(dossier.getId(), fileId, new PageExclusionRequest(List.of(new PageRange(k, k)))); } if (k % 3 == 0) { - uploadClient.deleteFile(dossier.getId(), fileId); + fileManagementClient.deleteFile(dossier.getId(), fileId); } if (j % 5 == 0) { - uploadClient.hardDeleteFiles(dossier.getId(), Set.of(fileId)); + fileManagementClient.hardDeleteFiles(dossier.getId(), Set.of(fileId)); } if (j % 7 == 0) { - fileClient.setStatusUnderReview(dossier.getId(), fileId, "x"); + fileClient.setStatusUnderReview(dossier.getId(), fileId, userId); } if (j % 11 == 0) { - fileClient.setStatusUnderApproval(dossier.getId(), fileId, "x"); + fileClient.setStatusUnderApproval(dossier.getId(), fileId, userId); } } @@ -299,7 +307,7 @@ public class DossierTemplateStatsTest extends AbstractPersistenceServerServiceTe dossierClient.archiveDossiers(Set.of(dossier.getId())); } if (j % 5 == 0) { - dossierClient.delete(dossier.getId()); + dossierClient.deleteDossier(dossier.getId()); } if (j % 7 == 0) { dossierClient.hardDeleteDossiers(Set.of(dossier.getId())); @@ -310,25 +318,21 @@ public class DossierTemplateStatsTest extends AbstractPersistenceServerServiceTe var template = dossierTemplateTesterAndProvider.provideTestTemplate("test template inactive: "); - var status = dossierStatusClient.createOrUpdateDossierStatus(CreateOrUpdateDossierStatusRequest.builder() - .dossierTemplateId(template.getId()) - .name("test") - .rank(100) - .build()); + var status = dossierStatusClient.createOrUpdateDossierStatus(DossierStatusRequest.builder().dossierTemplateId(template.getId()).name("test").color("#cccccc").rank(100).build()); var dossier = dossierTesterAndProvider.provideTestDossierQuick(template, "test dossier: ", status); - dossierClient.delete(dossier.getId()); + dossierClient.deleteDossier(dossier.getId()); - CreateOrUpdateDossierTemplateRequest cru = new CreateOrUpdateDossierTemplateRequest(); + var cru = new DossierTemplateModel(); cru.setDossierTemplateId(template.getId()); cru.setDownloadFileTypes(Sets.newHashSet(DownloadFileType.ORIGINAL)); cru.setName(template.getName()); cru.setValidTo(OffsetDateTime.now().minusHours(1).truncatedTo(ChronoUnit.MILLIS)); - DossierTemplate result = dossierTemplateClient.createOrUpdateDossierTemplate(cru); + var result = dossierTemplateClient.createOrUpdateDossierTemplate(cru); long t1 = System.currentTimeMillis(); - var stats = dossierTemplateStatsClient.getDossierTemplateStats(); - assertThat(stats.size()).isEqualTo(2); + var stats = dossierTemplateStatsClient.getDossierTemplateStats(Set.of(template.getId())); + assertThat(stats.size()).isEqualTo(1); long t2 = System.currentTimeMillis(); System.out.println("Time for Stats: " + (t2 - t1) + "ms"); } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateTest.java index 5b2506236..c2d6e34e3 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateTest.java @@ -1,11 +1,8 @@ package com.iqser.red.service.peristence.v1.server.integration.tests; -import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; import static org.assertj.core.api.Assertions.assertThat; import java.io.InputStream; -import java.nio.charset.StandardCharsets; -import java.time.OffsetDateTime; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @@ -13,6 +10,7 @@ import java.util.stream.Collectors; import org.junit.jupiter.api.Test; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.mock.web.MockMultipartFile; import com.fasterxml.jackson.databind.ObjectMapper; import com.iqser.red.service.peristence.v1.server.integration.client.DictionaryClient; @@ -28,31 +26,28 @@ import com.iqser.red.service.peristence.v1.server.integration.client.WatermarkCl import com.iqser.red.service.peristence.v1.server.integration.service.DossierTemplateTesterAndProvider; import com.iqser.red.service.peristence.v1.server.integration.service.DossierTesterAndProvider; import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; -import com.iqser.red.service.peristence.v1.server.service.export.ExportDownloadMessageReceiver; -import com.iqser.red.service.peristence.v1.server.utils.StorageIdUtils; -import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierTemplateEntity; -import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.ReportTemplateEntity; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.CloneDossierTemplateRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.CreateOrUpdateDossierTemplateRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierAttributeConfig; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierTemplate; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierTemplateStatus; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.FileAttributesGeneralConfiguration; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.ReportTemplateUploadRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.Colors; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.Watermark; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.WatermarkOrientation; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.CreateOrUpdateDossierStatusRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierAttributeType; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileAttributeConfig; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileAttributeType; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.importexport.ExportDownloadRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.importexport.ImportDossierTemplateRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.legalbasis.LegalBasis; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.DictionaryEntry; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.DictionaryEntryType; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.Type; -import com.iqser.red.service.persistence.service.v1.api.model.download.DownloadStatusValue; +import com.iqser.red.service.persistence.management.v1.processor.model.DownloadJob; +import com.iqser.red.service.persistence.management.v1.processor.service.export.ExportDownloadMessageReceiver; +import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; +import com.iqser.red.service.persistence.service.v1.api.shared.model.CreateTypeValue; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierAttributesConfig; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierStatusRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierTemplateModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.FileAttributesConfig; +import com.iqser.red.service.persistence.service.v1.api.shared.model.WatermarkModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.CloneDossierTemplateRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierAttributeConfig; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierTemplateStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.Colors; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.WatermarkOrientation; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.DossierAttributeType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileAttributeConfig; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileAttributeType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.importexport.ImportDossierTemplateRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.legalbasis.LegalBasis; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionaryEntry; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionaryEntryType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.Type; import com.iqser.red.storage.commons.service.StorageService; import feign.FeignException; @@ -112,9 +107,9 @@ public class DossierTemplateTest extends AbstractPersistenceServerServiceTest { var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); // test the export of dossier template - dossierTemplateClient.prepareExportDownload(ExportDownloadRequest.builder().userId("1").dossierTemplateId(dossierTemplate.getId()).build()); - var statuses = downloadClient.getDownloadStatus("1"); - assertThat(statuses).isNotEmpty(); + dossierTemplateClient.prepareExportDownload(dossierTemplate.getId()); + var statuses = downloadClient.getDownloadStatus(); + assertThat(statuses.getDownloadStatus()).isNotEmpty(); } @@ -128,7 +123,7 @@ public class DossierTemplateTest extends AbstractPersistenceServerServiceTest { assertThat(allTemplates.get(0)).isEqualTo(dossierTemplate); // update - CreateOrUpdateDossierTemplateRequest cru = new CreateOrUpdateDossierTemplateRequest(); + var cru = new DossierTemplateModel(); cru.setDossierTemplateId(dossierTemplate.getId()); BeanUtils.copyProperties(dossierTemplate, cru); cru.setName("Template 1 Update"); @@ -149,14 +144,14 @@ public class DossierTemplateTest extends AbstractPersistenceServerServiceTest { var testDossier = dossierTesterAndProvider.provideTestDossier(updated); try { - dossierTemplateClient.deleteDossierTemplate(updated.getId(), "1"); + dossierTemplateClient.deleteDossierTemplate(updated.getId()); } catch (FeignException e) { - assertThat(e.status()).isEqualTo(400); + assertThat(e.status()).isEqualTo(409); } dossierClient.hardDeleteDossiers(Collections.singleton(testDossier.getId())); - dossierTemplateClient.deleteDossierTemplate(updated.getId(), "1"); + dossierTemplateClient.deleteDossierTemplate(updated.getId()); assertThat(dossierTemplateClient.getAllDossierTemplates().isEmpty()).isTrue(); } @@ -185,72 +180,59 @@ public class DossierTemplateTest extends AbstractPersistenceServerServiceTest { var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); - Type type = Type.builder() + var type = CreateTypeValue.builder() .type("t") .dossierTemplateId(dossierTemplate.getId()) .hexColor("#ddddd") .recommendationHexColor("#cccccc") .skippedHexColor("#cccccc") .rank(999) - .isHint(false) - .isRecommendation(false) - .isCaseInsensitive(false) + .hint(false) + .recommendation(false) + .caseInsensitive(false) .description("t.getDescription()") .addToDictionaryAction(true) .label("t.getLabel()") - .dossierId(null) - .version(23) - .entries(List.of(DictionaryEntry.builder().entryId(1001).value("dictEntry1").version(23).deleted(false).typeId("t.getType()").build())) - .falsePositiveEntries(List.of(DictionaryEntry.builder().entryId(2001).value("dictEntry2").version(23).deleted(false).typeId("t.getType()").build())) - .falseRecommendationEntries(List.of(DictionaryEntry.builder().entryId(3001).value("dictEntry3").version(23).deleted(false).typeId("t.getType()").build())) .hasDictionary(true) - .systemManaged(false) .build(); - Type type2 = Type.builder() + + var type2 = CreateTypeValue.builder() .type("t2") .dossierTemplateId(dossierTemplate.getId()) .hexColor("#12345") .recommendationHexColor("#6789a") .skippedHexColor("#6789a") .rank(1002) - .isHint(false) - .isRecommendation(false) - .isCaseInsensitive(false) + .hint(false) + .recommendation(false) + .caseInsensitive(false) .description("t2.getDescription()") .addToDictionaryAction(true) .label("t2.getLabel()") - .dossierId(null) - .version(23) - .entries(List.of(DictionaryEntry.builder().entryId(1001).value("dictEntry1").version(23).deleted(false).typeId("t2.getType()").build())) - .falsePositiveEntries(List.of(DictionaryEntry.builder().entryId(2001).value("dictEntry2").version(23).deleted(false).typeId("t2.getType()").build())) - .falseRecommendationEntries(List.of(DictionaryEntry.builder().entryId(3001).value("dictEntry3").version(23).deleted(false).typeId("t2.getType()").build())) .hasDictionary(true) - .systemManaged(false) .build(); - var createdType1 = dictionaryClient.addType(type); - var createdType2 = dictionaryClient.addType(type2); - var loadedType1 = dictionaryClient.getDictionaryForType(createdType1.getId(), null); - var loadedType2 = dictionaryClient.getDictionaryForType(createdType2.getId(), null); - dictionaryClient.addEntries(loadedType1.getTypeId(), List.of("entry1", "entry2"), false, false, DictionaryEntryType.ENTRY); - dictionaryClient.addEntries(loadedType2.getTypeId(), List.of("entry3", "entry4"), false, false, DictionaryEntryType.FALSE_POSITIVE); + + var createdType1 = dictionaryClient.addType(type, null); + var createdType2 = dictionaryClient.addType(type2, null); + + var loadedType1 = dictionaryClient.getDictionaryForType(createdType1.getType(), createdType1.getDossierTemplateId(), null); + var loadedType2 = dictionaryClient.getDictionaryForType(createdType2.getType(), createdType2.getDossierTemplateId(), null); + + dictionaryClient.addEntry(createdType1.getType(), createdType1.getDossierTemplateId(), List.of("entry1", "entry2"), false, null, DictionaryEntryType.ENTRY); + dictionaryClient.addEntry(createdType1.getType(), createdType1.getDossierTemplateId(), List.of("entry3", "entry4"), false, null, DictionaryEntryType.FALSE_POSITIVE); + dictionaryClient.addEntry(createdType1.getType(), createdType1.getDossierTemplateId(), List.of("entry5", "entry6"), false, null, DictionaryEntryType.FALSE_RECOMMENDATION); + dossierAttributeConfigClient.setDossierAttributesConfig(dossierTemplate.getId(), - List.of(DossierAttributeConfig.builder() + new DossierAttributesConfig(List.of(DossierAttributeConfig.builder() .dossierTemplateId(dossierTemplate.getId()) .editable(false) .id("dossierAttributeId") .label("labelDossierAttribute") .type(DossierAttributeType.TEXT) .placeholder("placeholderDossier") - .build())); - fileAttributeConfigClient.setFileAttributesGeneralConfig(dossierTemplate.getId(), - FileAttributesGeneralConfiguration.builder() - .dossierTemplateId(dossierTemplate.getId()) - .delimiter("") - .encoding("UTF-8") - .filenameMappingColumnHeaderName("filenameMappingColumnHeaderName") - .build()); + .build()))); fileAttributeConfigClient.setFileAttributesConfig(dossierTemplate.getId(), - List.of(FileAttributeConfig.builder() + new FileAttributesConfig(List.of(FileAttributeConfig.builder() .dossierTemplateId(dossierTemplate.getId()) .primaryAttribute(true) .csvColumnHeader("12345") @@ -261,39 +243,27 @@ public class DossierTemplateTest extends AbstractPersistenceServerServiceTest { .label("labelFileAttribute") .type(FileAttributeType.TEXT) .placeholder("placeholderFile") - .build())); - ReportTemplateEntity rte = ReportTemplateEntity.builder() - .templateId("templateId") - .dossierTemplate(convert(dossierTemplate, DossierTemplateEntity.class)) - .dossierTemplateId(dossierTemplate.getId()) - .dossiers(null) - .activeByDefault(false) - .fileName("rte") - .multiFileReport(false) - .storageId("storageId") - .uploadDate(OffsetDateTime.now()) - .build(); - reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder() - .template("some text".getBytes(StandardCharsets.UTF_8)) - .dossierTemplateId(dossierTemplate.getId()) - .fileName("Report Template") - .activeByDefault(true) - .multiFileReport(false) - .build()); + .build()))); + var template = new MockMultipartFile("template", "asd".getBytes()); + reportTemplateClient.uploadTemplate(template, dossierTemplate.getId(), true, false); var col = Colors.builder() - .analysisColor("#111111") .dossierTemplateId(dossierTemplate.getId()) - .dictionaryRequestColor("#333333") + .appliedRedactionColor("#cccccc") + .recommendationColor("#cccccc") + .hintColor("#cccccc") + .skippedColor("#cccccc") .requestAddColor("#444444") - .ignoredHintColor("#555555") .requestRemoveColor("#666666") + .analysisColor("#111111") + .dictionaryRequestColor("#333333") + .ignoredHintColor("#555555") .analysisColor("#777777") .previewColor("#888888") .redactionColor("#999999") .updatedColor("#aaaaaa") .build(); dictionaryClient.setColors(dossierTemplate.getId(), col); - var dossierStatus = CreateOrUpdateDossierStatusRequest.builder() + var dossierStatus = DossierStatusRequest.builder() .name("dossStatus1") .description("ds description") .color("#115599") @@ -302,7 +272,7 @@ public class DossierTemplateTest extends AbstractPersistenceServerServiceTest { .build(); dossierStatusClient.createOrUpdateDossierStatus(dossierStatus); - Watermark watermark = new Watermark(); + var watermark = new WatermarkModel(); watermark.setName("watermark name"); watermark.setEnabled(true); watermark.setText("Minions ipsum chasy para tu la bodaaa bananaaaa hana dul sae. Chasy hana dul sae pepete hana dul sae belloo! Tatata bala tu ti aamoo! Jeje."); @@ -314,7 +284,7 @@ public class DossierTemplateTest extends AbstractPersistenceServerServiceTest { watermark.setDossierTemplateId(dossierTemplate.getId()); watermark.setCreatedBy("user"); - watermarkClient.createOrUpdateWatermark(watermark); + watermarkClient.saveWatermark(watermark); var allTemplates = dossierTemplateClient.getAllDossierTemplates(); assertThat(allTemplates.size()).isEqualTo(1); @@ -333,23 +303,23 @@ public class DossierTemplateTest extends AbstractPersistenceServerServiceTest { assertThat(loadedTemplate.getModifiedBy()).isEqualTo("user"); assertThat(loadedTemplate.getCreatedBy()).isEqualTo("user"); - assertThat(dossierAttributeConfigClient.getDossierAttributes(dossierTemplate.getId()).get(0).getLabel()).isEqualTo(dossierAttributeConfigClient.getDossierAttributes( - clonedDT.getId()).get(0).getLabel()); - assertThat(fileAttributeConfigClient.getFileAttributeConfigs(dossierTemplate.getId()) - .get(0) - .getCsvColumnHeader()).isEqualTo(fileAttributeConfigClient.getFileAttributeConfigs(clonedDT.getId()).get(0).getCsvColumnHeader()); - assertThat(fileAttributeConfigClient.getFileAttributesGeneralConfig(dossierTemplate.getId()) - .getFilenameMappingColumnHeaderName()).isEqualTo(fileAttributeConfigClient.getFileAttributesGeneralConfig(clonedDT.getId()).getFilenameMappingColumnHeaderName()); - assertThat(fileAttributeConfigClient.getFileAttributesGeneralConfig(dossierTemplate.getId()) - .getEncoding()).isEqualTo(fileAttributeConfigClient.getFileAttributesGeneralConfig(clonedDT.getId()).getEncoding()); + assertThat(dossierAttributeConfigClient.getDossierAttributesConfig(dossierTemplate.getId()).getDossierAttributeConfigs().get(0).getLabel()).isEqualTo( + dossierAttributeConfigClient.getDossierAttributesConfig(clonedDT.getId()).getDossierAttributeConfigs().get(0).getLabel()); + assertThat(fileAttributeConfigClient.getFileAttributesConfiguration(dossierTemplate.getId()).getFileAttributeConfigs().get(0).getCsvColumnHeader()).isEqualTo( + fileAttributeConfigClient.getFileAttributesConfiguration(clonedDT.getId()).getFileAttributeConfigs().get(0).getCsvColumnHeader()); + assertThat(fileAttributeConfigClient.getFileAttributesConfiguration(dossierTemplate.getId()) + .getFilenameMappingColumnHeaderName()).isEqualTo(fileAttributeConfigClient.getFileAttributesConfiguration(clonedDT.getId()).getFilenameMappingColumnHeaderName()); + assertThat(fileAttributeConfigClient.getFileAttributesConfiguration(dossierTemplate.getId()) + .getEncoding()).isEqualTo(fileAttributeConfigClient.getFileAttributesConfiguration(clonedDT.getId()).getEncoding()); assertThat(reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()).get(0).getFileName()).isEqualTo(reportTemplateClient.getAvailableReportTemplates( clonedDT.getId()).get(0).getFileName()); assertThat(dictionaryClient.getColors(dossierTemplate.getId()).getRequestAddColor()).isEqualTo(dictionaryClient.getColors(clonedDT.getId()).getRequestAddColor()); - assertThat(dictionaryClient.getAllTypesForDossierTemplate(dossierTemplate.getId(), false).get(0).getRank()).isEqualTo(dictionaryClient.getAllTypesForDossierTemplate( - clonedDT.getId(), - false).get(0).getRank()); - assertThat(dossierStatusClient.getAllDossierStatuses(List.of(dossierTemplate.getId())).get(0).getDescription()).isEqualTo(dossierStatusClient.getAllDossierStatuses(List.of( - clonedDT.getId())).get(0).getDescription()); + assertThat(dictionaryClient.getAllTypes(dossierTemplate.getId(), null, false).getTypes().get(0).getRank()).isEqualTo(dictionaryClient.getAllTypes(clonedDT.getId(), + null, + false).getTypes().get(0).getRank()); + assertThat(dossierStatusClient.getAllDossierStatusForTemplate(dossierTemplate.getId()) + .get(0) + .getDescription()).isEqualTo(dossierStatusClient.getAllDossierStatusForTemplate(clonedDT.getId()).get(0).getDescription()); assertThat(watermarkClient.getWatermarksForDossierTemplateId(clonedDT.getId()).size()).isEqualTo(1); assertThat(watermarkClient.getWatermarksForDossierTemplateId(dossierTemplate.getId()) .get(0) @@ -364,367 +334,67 @@ public class DossierTemplateTest extends AbstractPersistenceServerServiceTest { var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); setupDossierTemplate(dossierTemplate); - dossierTemplateClient.prepareExportDownload(ExportDownloadRequest.builder().userId("1").dossierTemplateId(dossierTemplate.getId()).build()); - var statuses = downloadClient.getDownloadStatus("1"); - assertThat(statuses).isNotEmpty(); - -// var downloadJob = DownloadJob.builder() -// .storageId(StorageIdUtils.getStorageId("1", dossierTemplate.getId())) -// .userId("1").build(); -// exportDownloadReportMessageReceiver.receive(objectMapper.writeValueAsString(downloadJob)); - String storageId = StorageIdUtils.getStorageId("1", dossierTemplate.getId()); - dossierTemplateClient.createExportDownload("1", storageId); - - statuses = downloadClient.getDownloadStatus("1"); - assertThat(statuses).isNotEmpty(); - assertThat(statuses.get(0).getStatus()).isEqualTo(DownloadStatusValue.READY); - } - - - @SneakyThrows - @Test - public void testExportDossierTemplateWithFileAttributeGeneralConfigNotPresent() { - - var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); - - dossierTemplateClient.prepareExportDownload(ExportDownloadRequest.builder().userId("1").dossierTemplateId(dossierTemplate.getId()).build()); - var statuses = downloadClient.getDownloadStatus("1"); - assertThat(statuses).isNotEmpty(); - - String storageId = StorageIdUtils.getStorageId("1", dossierTemplate.getId()); - dossierTemplateClient.createExportDownload("1", storageId); - - statuses = downloadClient.getDownloadStatus("1"); - assertThat(statuses).isNotEmpty(); - assertThat(statuses.get(0).getStatus()).isEqualTo(DownloadStatusValue.READY); - } - - - @SneakyThrows - @Test - public void testExportAndImportDossierTemplateWithJustificationsNotPresent() { - - var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); - - var existingLegalBasis = legalBasisClient.getLegalBasisMapping(dossierTemplate.getId()); - assertThat(existingLegalBasis.size()).isEqualTo(1); - - // delete justifications for export - legalBasisClient.deleteLegalBasis(dossierTemplate.getId(), existingLegalBasis.stream().map(LegalBasis::getName).collect(Collectors.toList())); - existingLegalBasis = legalBasisClient.getLegalBasisMapping(dossierTemplate.getId()); - assertThat(existingLegalBasis.isEmpty()).isTrue(); - - dossierTemplateClient.prepareExportDownload(ExportDownloadRequest.builder().userId("1").dossierTemplateId(dossierTemplate.getId()).build()); - var statuses = downloadClient.getDownloadStatus("1"); - assertThat(statuses).isNotEmpty(); - - String storageId = StorageIdUtils.getStorageId("1", dossierTemplate.getId()); - dossierTemplateClient.createExportDownload("1", storageId); - - statuses = downloadClient.getDownloadStatus("1"); - assertThat(statuses).isNotEmpty(); - assertThat(statuses.get(0).getStatus()).isEqualTo(DownloadStatusValue.READY); - - // add new justifications - legalBasisClient.setLegalBasisMapping(dossierTemplate.getId(), List.of(new LegalBasis("nameAgain", "description", "reason"))); - existingLegalBasis = legalBasisClient.getLegalBasisMapping(dossierTemplate.getId()); - assertThat(existingLegalBasis.size()).isEqualTo(1); - - ImportDossierTemplateRequest request1 = ImportDossierTemplateRequest.builder() - .dossierTemplateId(dossierTemplate.getId()) - .updateExistingDossierTemplate(true) - .userId("1") - .archive(storageService.getObject(storageId).getInputStream().readAllBytes()) - .build(); - - dossierTemplateClient.importDossierTemplate(request1); - existingLegalBasis = legalBasisClient.getLegalBasisMapping(dossierTemplate.getId()); - assertThat(existingLegalBasis.isEmpty()).isTrue(); - } - - - @Test - @SneakyThrows - public void testImportDossierTemplateUpdateExisting() { - - var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); - setupDossierTemplate(dossierTemplate); - // prepare an archive - dossierTemplateClient.prepareExportDownload(ExportDownloadRequest.builder().userId("1").dossierTemplateId(dossierTemplate.getId()).build()); - String storageId = StorageIdUtils.getStorageId("1", dossierTemplate.getId()); - dossierTemplateClient.createExportDownload("1", storageId); - - var statuses = downloadClient.getDownloadStatus("1"); - assertThat(statuses).isNotEmpty(); - assertThat(statuses.get(0).getStatus()).isEqualTo(DownloadStatusValue.READY); - - // add legal basis - legalBasisClient.addOrUpdateLegalBasis(dossierTemplate.getId(), new LegalBasis("name2", "description2", "reason2")); - var legalBasis = legalBasisClient.getLegalBasisMapping(dossierTemplate.getId()); - assertThat(legalBasis.size()).isEqualTo(2); - - //add report - reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder() - .template("some text2222".getBytes(StandardCharsets.UTF_8)) - .dossierTemplateId(dossierTemplate.getId()) - .fileName("Report Template 2") - .activeByDefault(true) - .multiFileReport(false) - .build()); - var reports = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); - assertThat(reports.size()).isEqualTo(2); - ImportDossierTemplateRequest request1 = ImportDossierTemplateRequest.builder() - .dossierTemplateId(dossierTemplate.getId()) - .updateExistingDossierTemplate(true) - .userId("1") - .archive(storageService.getObject(storageId).getInputStream().readAllBytes()) - .build(); - - dossierTemplateClient.importDossierTemplate(request1); - var updatedDossierTemplate = dossierTemplateClient.getDossierTemplate(dossierTemplate.getId()); - assertThat(updatedDossierTemplate.getModifiedBy()).isEqualTo("1"); - assertThat(updatedDossierTemplate.getDateModified()).isNotNull(); - assertThat(watermarkClient.getWatermarksForDossierTemplateId(updatedDossierTemplate.getId()).size()).isEqualTo(1); - - reports = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); - assertThat(reports.size()).isEqualTo(1); - - legalBasis = legalBasisClient.getLegalBasisMapping(dossierTemplate.getId()); - assertThat(legalBasis.size()).isEqualTo(1); + dossierTemplateClient.prepareExportDownload(dossierTemplate.getId()); + var statuses = downloadClient.getDownloadStatus(); + assertThat(statuses.getDownloadStatus()).isNotEmpty(); } - @Test - @SneakyThrows - public void testImportDossierTemplateNewTemplateWithNullDossierTemplateId() { + private void setupDossierTemplate(DossierTemplateModel dossierTemplate) { - var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); - setupDossierTemplate(dossierTemplate); - // prepare an archive - dossierTemplateClient.prepareExportDownload(ExportDownloadRequest.builder().userId("1").dossierTemplateId(dossierTemplate.getId()).build()); - String storageId = StorageIdUtils.getStorageId("1", dossierTemplate.getId()); - dossierTemplateClient.createExportDownload("1", storageId); - - var statuses = downloadClient.getDownloadStatus("1"); - assertThat(statuses).isNotEmpty(); - assertThat(statuses.get(0).getStatus()).isEqualTo(DownloadStatusValue.READY); - - // update - CreateOrUpdateDossierTemplateRequest cru = new CreateOrUpdateDossierTemplateRequest(); - cru.setDossierTemplateId(dossierTemplate.getId()); - BeanUtils.copyProperties(dossierTemplate, cru); - cru.setName("Template 1 Update"); - - var updated = dossierTemplateClient.createOrUpdateDossierTemplate(cru); - assertThat(updated.getName()).isEqualTo(cru.getName()); - - ImportDossierTemplateRequest request1 = ImportDossierTemplateRequest.builder() - .dossierTemplateId(null) - .updateExistingDossierTemplate(true) - .userId("1") - .archive(storageService.getObject(storageId).getInputStream().readAllBytes()) - .build(); - - var newDossierTemplate = dossierTemplateClient.importDossierTemplate(request1); - var allDossierTemplates = dossierTemplateClient.getAllDossierTemplates(); - assertThat(allDossierTemplates.size()).isEqualTo(2); - - } - - - @Test - @SneakyThrows - public void testImportDossierTemplateNewTemplate() { - - var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); - setupDossierTemplate(dossierTemplate); - // prepare an archive - dossierTemplateClient.prepareExportDownload(ExportDownloadRequest.builder().userId("1").dossierTemplateId(dossierTemplate.getId()).build()); - String storageId = StorageIdUtils.getStorageId("1", dossierTemplate.getId()); - dossierTemplateClient.createExportDownload("1", storageId); - - var statuses = downloadClient.getDownloadStatus("1"); - assertThat(statuses).isNotEmpty(); - assertThat(statuses.get(0).getStatus()).isEqualTo(DownloadStatusValue.READY); - - // update - CreateOrUpdateDossierTemplateRequest cru = new CreateOrUpdateDossierTemplateRequest(); - cru.setDossierTemplateId(dossierTemplate.getId()); - BeanUtils.copyProperties(dossierTemplate, cru); - cru.setName("Template 1 Update"); - - var updated = dossierTemplateClient.createOrUpdateDossierTemplate(cru); - assertThat(updated.getName()).isEqualTo(cru.getName()); - - ImportDossierTemplateRequest request1 = ImportDossierTemplateRequest.builder() - .dossierTemplateId("sds") - .updateExistingDossierTemplate(true) - .userId("1") - .archive(storageService.getObject(storageId).getInputStream().readAllBytes()) - .build(); - - var newDossierTemplate = dossierTemplateClient.importDossierTemplate(request1); - var allDossierTemplates = dossierTemplateClient.getAllDossierTemplates(); - assertThat(allDossierTemplates.size()).isEqualTo(2); - - } - - - @Test - @SneakyThrows - public void testImportDossierTemplateUpdateTemplate() { - - var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); - setupDossierTemplate(dossierTemplate); - // prepare an archive - dossierTemplateClient.prepareExportDownload(ExportDownloadRequest.builder().userId("1").dossierTemplateId(dossierTemplate.getId()).build()); - String storageId = StorageIdUtils.getStorageId("1", dossierTemplate.getId()); - dossierTemplateClient.createExportDownload("1", storageId); - - var statuses = downloadClient.getDownloadStatus("1"); - assertThat(statuses).isNotEmpty(); - assertThat(statuses.get(0).getStatus()).isEqualTo(DownloadStatusValue.READY); - - ImportDossierTemplateRequest request1 = ImportDossierTemplateRequest.builder() - .dossierTemplateId(dossierTemplate.getId()) - .updateExistingDossierTemplate(true) - .userId("1") - .archive(storageService.getObject(storageId).getInputStream().readAllBytes()) - .build(); - - assertThat(dossierTemplate.getDateModified()).isNull(); - var fileAttributes = fileAttributeConfigClient.getFileAttributeConfigs(dossierTemplate.getId()); - assertThat(fileAttributes.get(0).isPrimaryAttribute()).isTrue(); - var updatedDossierTemplate = dossierTemplateClient.importDossierTemplate(request1); - var allDossierTemplates = dossierTemplateClient.getAllDossierTemplates(); - assertThat(allDossierTemplates.size()).isEqualTo(1); - assertThat(updatedDossierTemplate.getDateModified()).isNotNull(); - assertThat(updatedDossierTemplate.getId()).isEqualTo(dossierTemplate.getId()); - var typeIdForT = "t:" + dossierTemplate.getId(); - var updatedEntries = dictionaryClient.getEntriesForType("t:" + dossierTemplate.getId(), null, DictionaryEntryType.ENTRY); - assertThat(updatedEntries.size()).isEqualTo(2); - fileAttributes = fileAttributeConfigClient.getFileAttributeConfigs(dossierTemplate.getId()); - assertThat(fileAttributes.get(0).isPrimaryAttribute()).isTrue(); - - } - - @Test - @SneakyThrows - public void testImportDossierTemplateNewTemplatewithCompressionRatioThresholdSurpassed() { - - String fileZip = "EFSA_sanitisation_GFL_v1_adress_parts.zip"; - InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(fileZip); - - - ImportDossierTemplateRequest request1 = ImportDossierTemplateRequest.builder() - .dossierTemplateId("sds") - .updateExistingDossierTemplate(false) - .userId("1") - .archive(inputStream.readAllBytes()) - .build(); - - try { - var newDossierTemplate = dossierTemplateClient.importDossierTemplate(request1); - } catch (FeignException.FeignClientException e){ - assertThat(e.status()).isEqualTo(400); - } - } - - - - private void setupDossierTemplate(DossierTemplate dossierTemplate) { - - Type type = Type.builder() + var type = CreateTypeValue.builder() .type("t") .dossierTemplateId(dossierTemplate.getId()) .hexColor("#ddddd") .recommendationHexColor("#cccccc") .skippedHexColor("#cccccc") .rank(999) - .isHint(false) - .isRecommendation(false) - .isCaseInsensitive(false) + .hint(false) + .recommendation(false) + .caseInsensitive(false) .description("t.getDescription()") .addToDictionaryAction(true) .label("t.getLabel()") - .dossierId(null) - .version(23) - .entries(List.of(DictionaryEntry.builder().entryId(1001).value("dictEntry1").version(23).deleted(false).typeId("t:" + dossierTemplate.getId()).build())) - .falsePositiveEntries(List.of(DictionaryEntry.builder() - .entryId(2001) - .value("dictEntry2") - .version(23) - .deleted(false) - .typeId("t:" + dossierTemplate.getId()) - .build())) - .falseRecommendationEntries(List.of(DictionaryEntry.builder() - .entryId(3001) - .value("dictEntry3") - .version(23) - .deleted(false) - .typeId("t:" + dossierTemplate.getId()) - .build())) .hasDictionary(true) - .systemManaged(false) .build(); - Type type2 = Type.builder() + var type2 = CreateTypeValue.builder() .type("t2") .dossierTemplateId(dossierTemplate.getId()) .hexColor("#12345") .recommendationHexColor("#6789a") .skippedHexColor("#6789a") .rank(1002) - .isHint(false) - .isRecommendation(false) - .isCaseInsensitive(false) + .hint(false) + .recommendation(false) + .caseInsensitive(false) .description("t2.getDescription()") .addToDictionaryAction(true) .label("t2.getLabel()") - .dossierId(null) - .version(23) - .entries(List.of(DictionaryEntry.builder().entryId(1011).value("dictEntry1").version(23).deleted(false).typeId("t2:" + dossierTemplate.getId()).build())) - .falsePositiveEntries(List.of(DictionaryEntry.builder() - .entryId(2011) - .value("dictEntry2") - .version(23) - .deleted(false) - .typeId("t2:" + dossierTemplate.getId()) - .build())) - .falseRecommendationEntries(List.of(DictionaryEntry.builder() - .entryId(3011) - .value("dictEntry3") - .version(23) - .deleted(false) - .typeId("t2:" + dossierTemplate.getId()) - .build())) .hasDictionary(true) - .systemManaged(false) .build(); - var createdType1 = dictionaryClient.addType(type); - var createdType2 = dictionaryClient.addType(type2); - var loadedType1 = dictionaryClient.getDictionaryForType(createdType1.getId(), null); - var loadedType2 = dictionaryClient.getDictionaryForType(createdType2.getId(), null); - dictionaryClient.addEntries(loadedType1.getTypeId(), List.of("entry1", "entry2"), false, false, DictionaryEntryType.ENTRY); - dictionaryClient.addEntries(loadedType2.getTypeId(), List.of("entry3", "entry4"), false, false, DictionaryEntryType.FALSE_POSITIVE); + + var createdType1 = dictionaryClient.addType(type, null); + var createdType2 = dictionaryClient.addType(type2, null); + + var loadedType1 = dictionaryClient.getDictionaryForType(createdType1.getType(), createdType1.getDossierTemplateId(), null); + var loadedType2 = dictionaryClient.getDictionaryForType(createdType2.getType(), createdType2.getDossierTemplateId(), null); + + dictionaryClient.addEntry(createdType1.getType(), createdType1.getDossierTemplateId(), List.of("entry1", "entry2"), false, null, DictionaryEntryType.ENTRY); + dictionaryClient.addEntry(createdType1.getType(), createdType1.getDossierTemplateId(), List.of("entry3", "entry4"), false, null, DictionaryEntryType.FALSE_POSITIVE); + dictionaryClient.addEntry(createdType1.getType(), createdType1.getDossierTemplateId(), List.of("entry5", "entry6"), false, null, DictionaryEntryType.FALSE_RECOMMENDATION); + dossierAttributeConfigClient.setDossierAttributesConfig(dossierTemplate.getId(), - List.of(DossierAttributeConfig.builder() + new DossierAttributesConfig(List.of(DossierAttributeConfig.builder() .dossierTemplateId(dossierTemplate.getId()) .editable(false) .id("dossierAttributeId") .label("labelDossierAttribute") .type(DossierAttributeType.TEXT) .placeholder("placeholderDossier") - .build())); - fileAttributeConfigClient.setFileAttributesGeneralConfig(dossierTemplate.getId(), - FileAttributesGeneralConfiguration.builder() - .dossierTemplateId(dossierTemplate.getId()) - .delimiter("") - .encoding("UTF-8") - .filenameMappingColumnHeaderName("filenameMappingColumnHeaderName") - .build()); + .build()))); fileAttributeConfigClient.setFileAttributesConfig(dossierTemplate.getId(), - List.of(FileAttributeConfig.builder() + new FileAttributesConfig(List.of(FileAttributeConfig.builder() .dossierTemplateId(dossierTemplate.getId()) .primaryAttribute(true) .csvColumnHeader("12345") @@ -735,28 +405,28 @@ public class DossierTemplateTest extends AbstractPersistenceServerServiceTest { .label("labelFileAttribute") .type(FileAttributeType.TEXT) .placeholder("placeholderFile") - .build())); - reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder() - .template("some text".getBytes(StandardCharsets.UTF_8)) - .dossierTemplateId(dossierTemplate.getId()) - .fileName("Report Template") - .activeByDefault(true) - .multiFileReport(false) - .build()); + .build()))); + + var template = new MockMultipartFile("template", "asd".getBytes()); + reportTemplateClient.uploadTemplate(template, dossierTemplate.getId(), true, false); var col = Colors.builder() - .analysisColor("#111111") .dossierTemplateId(dossierTemplate.getId()) - .dictionaryRequestColor("#333333") + .appliedRedactionColor("#cccccc") + .recommendationColor("#cccccc") + .hintColor("#cccccc") + .skippedColor("#cccccc") .requestAddColor("#444444") - .ignoredHintColor("#555555") .requestRemoveColor("#666666") + .analysisColor("#111111") + .dictionaryRequestColor("#333333") + .ignoredHintColor("#555555") .analysisColor("#777777") .previewColor("#888888") .redactionColor("#999999") .updatedColor("#aaaaaa") .build(); dictionaryClient.setColors(dossierTemplate.getId(), col); - var dossierStatus = CreateOrUpdateDossierStatusRequest.builder() + var dossierStatus = DossierStatusRequest.builder() .name("dossStatus1") .description("ds description") .color("#115599") @@ -765,7 +435,7 @@ public class DossierTemplateTest extends AbstractPersistenceServerServiceTest { .build(); dossierStatusClient.createOrUpdateDossierStatus(dossierStatus); - Watermark watermark = new Watermark(); + var watermark = new WatermarkModel(); watermark.setName("watermark name"); watermark.setEnabled(true); watermark.setText("Minions ipsum chasy para tu la bodaaa bananaaaa hana dul sae. Chasy hana dul sae pepete hana dul sae belloo! Tatata bala tu ti aamoo! Jeje."); @@ -777,7 +447,240 @@ public class DossierTemplateTest extends AbstractPersistenceServerServiceTest { watermark.setDossierTemplateId(dossierTemplate.getId()); watermark.setCreatedBy("user"); - watermarkClient.createOrUpdateWatermark(watermark); + watermarkClient.saveWatermark(watermark); + } + + + @SneakyThrows + @Test + public void testExportDossierTemplateWithFileAttributeGeneralConfigNotPresent() { + + var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); + + dossierTemplateClient.prepareExportDownload(dossierTemplate.getId()); + var statuses = downloadClient.getDownloadStatus(); + assertThat(statuses.getDownloadStatus()).isNotEmpty(); + + } + + + @SneakyThrows + @Test + public void testExportAndImportDossierTemplateWithJustificationsNotPresent() { + TenantContext.setTenantId("redaction"); + + var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); + + var existingLegalBasis = legalBasisClient.getLegalBasisMapping(dossierTemplate.getId()); + assertThat(existingLegalBasis.size()).isEqualTo(1); + + // delete justifications for export + legalBasisClient.deleteLegalBasis(dossierTemplate.getId(), existingLegalBasis.stream().map(LegalBasis::getName).collect(Collectors.toList())); + existingLegalBasis = legalBasisClient.getLegalBasisMapping(dossierTemplate.getId()); + assertThat(existingLegalBasis.isEmpty()).isTrue(); + + dossierTemplateClient.prepareExportDownload(dossierTemplate.getId()); + var statuses = downloadClient.getDownloadStatus(); + assertThat(statuses.getDownloadStatus()).isNotEmpty(); + + var status = statuses.getDownloadStatus().iterator().next(); + exportDownloadReportMessageReceiver.receive(objectMapper.writeValueAsString(new DownloadJob( status.getUserId(),status.getStorageId()))); + + // add new justifications + legalBasisClient.setLegalBasisMapping(List.of(new LegalBasis("nameAgain", "description", "reason")), dossierTemplate.getId()); + existingLegalBasis = legalBasisClient.getLegalBasisMapping(dossierTemplate.getId()); + assertThat(existingLegalBasis.size()).isEqualTo(1); + + + var storedObject = storageService.getObject(status.getStorageId()); + + var importTemplate = new MockMultipartFile("import.zip","import.zip","application/zip", storedObject.getInputStream()); + + dossierTemplateClient.importDossierTemplate(importTemplate,dossierTemplate.getId(), true); + existingLegalBasis = legalBasisClient.getLegalBasisMapping(dossierTemplate.getId()); + assertThat(existingLegalBasis.isEmpty()).isTrue(); + } + + + @Test + @SneakyThrows + public void testImportDossierTemplateUpdateExisting() { +// TODO MIGRATION *** +// var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); +// setupDossierTemplate(dossierTemplate); +// // prepare an archive +// dossierTemplateClient.prepareExportDownload(dossierTemplate.getId()); +// +// var statuses = downloadClient.getDownloadStatus(); +// assertThat(statuses.getDownloadStatus()).isNotEmpty(); +// assertThat(statuses.get(0).getStatus()).isEqualTo(DownloadStatusValue.READY); +// +// // add legal basis +// legalBasisClient.addOrUpdateLegalBasis(dossierTemplate.getId(), new LegalBasis("name2", "description2", "reason2")); +// var legalBasis = legalBasisClient.getLegalBasisMapping(dossierTemplate.getId()); +// assertThat(legalBasis.size()).isEqualTo(2); +// +// //add report +// var template = new MockMultipartFile("template","asd".getBytes()); +// reportTemplateClient.uploadTemplate(template, dossierTemplate.getId(),true,false); +// var reports = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); +// assertThat(reports.size()).isEqualTo(2); +// ImportDossierTemplateRequest request1 = ImportDossierTemplateRequest.builder() +// .dossierTemplateId(dossierTemplate.getId()) +// .updateExistingDossierTemplate(true) +// .userId("1") +// .archive(storageService.getObject(storageId).getInputStream().readAllBytes()) +// .build(); +// +// dossierTemplateClient.importDossierTemplate(request1); +// var updatedDossierTemplate = dossierTemplateClient.getDossierTemplate(dossierTemplate.getId()); +// assertThat(updatedDossierTemplate.getModifiedBy()).isEqualTo("1"); +// assertThat(updatedDossierTemplate.getDateModified()).isNotNull(); +// assertThat(watermarkClient.getWatermarksForDossierTemplateId(updatedDossierTemplate.getId()).size()).isEqualTo(1); +// +// reports = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); +// assertThat(reports.size()).isEqualTo(1); +// +// legalBasis = legalBasisClient.getLegalBasisMapping(dossierTemplate.getId()); +// assertThat(legalBasis.size()).isEqualTo(1); + + } + + + @Test + @SneakyThrows + public void testImportDossierTemplateNewTemplateWithNullDossierTemplateId() { +// TODO MIGRATION *** +// var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); +// setupDossierTemplate(dossierTemplate); +// // prepare an archive +// dossierTemplateClient.prepareExportDownload(ExportDownloadRequest.builder().userId("1").dossierTemplateId(dossierTemplate.getId()).build()); +// String storageId = StorageIdUtils.getStorageId("1", dossierTemplate.getId()); +// dossierTemplateClient.createExportDownload("1", storageId); +// +// var statuses = downloadClient.getDownloadStatus("1"); +// assertThat(statuses).isNotEmpty(); +// assertThat(statuses.get(0).getStatus()).isEqualTo(DownloadStatusValue.READY); +// +// // update +// CreateOrUpdateDossierTemplateRequest cru = new CreateOrUpdateDossierTemplateRequest(); +// cru.setDossierTemplateId(dossierTemplate.getId()); +// BeanUtils.copyProperties(dossierTemplate, cru); +// cru.setName("Template 1 Update"); +// +// var updated = dossierTemplateClient.createOrUpdateDossierTemplate(cru); +// assertThat(updated.getName()).isEqualTo(cru.getName()); +// +// ImportDossierTemplateRequest request1 = ImportDossierTemplateRequest.builder() +// .dossierTemplateId(null) +// .updateExistingDossierTemplate(true) +// .userId("1") +// .archive(storageService.getObject(storageId).getInputStream().readAllBytes()) +// .build(); +// +// var newDossierTemplate = dossierTemplateClient.importDossierTemplate(request1); +// var allDossierTemplates = dossierTemplateClient.getAllDossierTemplates(); +// assertThat(allDossierTemplates.size()).isEqualTo(2); + + } + + + @Test + @SneakyThrows + public void testImportDossierTemplateNewTemplate() { +// TODO MIGRATION *** +// var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); +// setupDossierTemplate(dossierTemplate); +// // prepare an archive +// dossierTemplateClient.prepareExportDownload(ExportDownloadRequest.builder().userId("1").dossierTemplateId(dossierTemplate.getId()).build()); +// String storageId = StorageIdUtils.getStorageId("1", dossierTemplate.getId()); +// dossierTemplateClient.createExportDownload("1", storageId); +// +// var statuses = downloadClient.getDownloadStatus("1"); +// assertThat(statuses).isNotEmpty(); +// assertThat(statuses.get(0).getStatus()).isEqualTo(DownloadStatusValue.READY); +// +// // update +// CreateOrUpdateDossierTemplateRequest cru = new CreateOrUpdateDossierTemplateRequest(); +// cru.setDossierTemplateId(dossierTemplate.getId()); +// BeanUtils.copyProperties(dossierTemplate, cru); +// cru.setName("Template 1 Update"); +// +// var updated = dossierTemplateClient.createOrUpdateDossierTemplate(cru); +// assertThat(updated.getName()).isEqualTo(cru.getName()); +// +// ImportDossierTemplateRequest request1 = ImportDossierTemplateRequest.builder() +// .dossierTemplateId("sds") +// .updateExistingDossierTemplate(true) +// .userId("1") +// .archive(storageService.getObject(storageId).getInputStream().readAllBytes()) +// .build(); +// +// var newDossierTemplate = dossierTemplateClient.importDossierTemplate(request1); +// var allDossierTemplates = dossierTemplateClient.getAllDossierTemplates(); +// assertThat(allDossierTemplates.size()).isEqualTo(2); + + } + + + @Test + @SneakyThrows + public void testImportDossierTemplateUpdateTemplate() { +// TODO MIGRATION *** +// var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); +// setupDossierTemplate(dossierTemplate); +// // prepare an archive +// dossierTemplateClient.prepareExportDownload(ExportDownloadRequest.builder().userId("1").dossierTemplateId(dossierTemplate.getId()).build()); +// String storageId = StorageIdUtils.getStorageId("1", dossierTemplate.getId()); +// dossierTemplateClient.createExportDownload("1", storageId); +// +// var statuses = downloadClient.getDownloadStatus("1"); +// assertThat(statuses).isNotEmpty(); +// assertThat(statuses.get(0).getStatus()).isEqualTo(DownloadStatusValue.READY); +// +// ImportDossierTemplateRequest request1 = ImportDossierTemplateRequest.builder() +// .dossierTemplateId(dossierTemplate.getId()) +// .updateExistingDossierTemplate(true) +// .userId("1") +// .archive(storageService.getObject(storageId).getInputStream().readAllBytes()) +// .build(); +// +// assertThat(dossierTemplate.getDateModified()).isNull(); +// var fileAttributes = fileAttributeConfigClient.getFileAttributeConfigs(dossierTemplate.getId()); +// assertThat(fileAttributes.get(0).isPrimaryAttribute()).isTrue(); +// var updatedDossierTemplate = dossierTemplateClient.importDossierTemplate(request1); +// var allDossierTemplates = dossierTemplateClient.getAllDossierTemplates(); +// assertThat(allDossierTemplates.size()).isEqualTo(1); +// assertThat(updatedDossierTemplate.getDateModified()).isNotNull(); +// assertThat(updatedDossierTemplate.getId()).isEqualTo(dossierTemplate.getId()); +// var typeIdForT = "t:" + dossierTemplate.getId(); +// var updatedEntries = dictionaryClient.getEntriesForType("t:" + dossierTemplate.getId(), null, DictionaryEntryType.ENTRY); +// assertThat(updatedEntries.size()).isEqualTo(2); +// fileAttributes = fileAttributeConfigClient.getFileAttributeConfigs(dossierTemplate.getId()); +// assertThat(fileAttributes.get(0).isPrimaryAttribute()).isTrue(); + + } + + + @Test + @SneakyThrows + public void testImportDossierTemplateNewTemplatewithCompressionRatioThresholdSurpassed() { + + String fileZip = "EFSA_sanitisation_GFL_v1_adress_parts.zip"; + InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(fileZip); + + ImportDossierTemplateRequest request1 = ImportDossierTemplateRequest.builder() + .dossierTemplateId("sds") + .updateExistingDossierTemplate(false) + .userId("1") + .archive(inputStream.readAllBytes()) + .build(); +// TODO MIGRATION *** +// try { +// var newDossierTemplate = dossierTemplateClient.importDossierTemplate(request1); +// } catch (FeignException.FeignClientException e) { +// assertThat(e.status()).isEqualTo(400); +// } } } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTest.java index a14d3b32f..1e5975fd3 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTest.java @@ -11,6 +11,7 @@ import java.util.stream.IntStream; import org.junit.jupiter.api.Test; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.mock.web.MockMultipartFile; import com.google.common.collect.Sets; import com.iqser.red.service.peristence.v1.server.integration.client.DossierClient; @@ -19,18 +20,22 @@ import com.iqser.red.service.peristence.v1.server.integration.client.ReportTempl import com.iqser.red.service.peristence.v1.server.integration.client.WatermarkClient; import com.iqser.red.service.peristence.v1.server.integration.service.DossierTemplateTesterAndProvider; import com.iqser.red.service.peristence.v1.server.integration.service.DossierTesterAndProvider; +import com.iqser.red.service.peristence.v1.server.integration.service.TypeProvider; import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; -import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.ReportTemplate; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.ReportTemplateUploadRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.Watermark; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.WatermarkOrientation; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.CreateOrUpdateDossierRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.CreateOrUpdateDossierStatusRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.Dossier; +import com.iqser.red.service.persistence.management.v1.processor.service.DossierManagementService; +import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierStatusRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.WatermarkModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.ReportTemplate; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.WatermarkOrientation; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.Dossier; import feign.FeignException; +import lombok.extern.slf4j.Slf4j; +@Slf4j public class DossierTest extends AbstractPersistenceServerServiceTest { @Autowired @@ -51,11 +56,19 @@ public class DossierTest extends AbstractPersistenceServerServiceTest { @Autowired private WatermarkClient watermarkClient; + @Autowired + private DossierManagementService dossierManagementService; + + @Autowired + private TypeProvider typeProvider; + @Test public void testDossierRaceCondition() { + var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); - IntStream.range(0, 30).parallel().forEach(x -> dossierTesterAndProvider.provideTestDossier(dossierTemplate, "dossier: " + x)); - var allDossiers = dossierClient.getAllDossiers(true, true); + dossierTemplateTesterAndProvider.provideDefaultColors(dossierTemplate.getDossierTemplateId()); + IntStream.range(0, 30).parallel().forEach(x -> dossierTesterAndProvider.provideTestDossier(dossierTemplate, "race condition dossier: " + x)); + var allDossiers = dossierClient.getDossiers(true, true); var dossierCount = allDossiers.size(); assertThat(dossierCount).isEqualTo(30); @@ -64,19 +77,22 @@ public class DossierTest extends AbstractPersistenceServerServiceTest { @Test public void testCreateDuplicateDossier() { + var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); - IntStream.range(0, 30).parallel().forEach(x -> { + dossierTemplateTesterAndProvider.provideDefaultColors(dossierTemplate.getDossierTemplateId()); + IntStream.range(0, 8).parallel().forEach(x -> { try { dossierTesterAndProvider.provideTestDossier(dossierTemplate, "sameNameDossier"); } catch (Exception e) { // conflict exception is expected } }); - var allDossiers = dossierClient.getAllDossiers(true, true); + var allDossiers = dossierClient.getDossiers(true, true); var dossierCount = allDossiers.size(); assertThat(dossierCount).isEqualTo(1); } + @Test public void testDossier() { @@ -84,20 +100,20 @@ public class DossierTest extends AbstractPersistenceServerServiceTest { var dossier = dossierTesterAndProvider.provideTestDossier(); - Watermark watermark = new Watermark(); + var watermark = new WatermarkModel(); watermark.setName("watermark name"); watermark.setEnabled(true); watermark.setText("Minions ipsum chasy para tu la bodaaa bananaaaa hana dul sae. Chasy hana dul sae pepete hana dul sae belloo! Tatata bala tu ti aamoo! Jeje."); watermark.setOrientation(WatermarkOrientation.DIAGONAL); watermark.setDossierTemplateId(dossier.getDossierTemplateId()); - var watermarkConfig = watermarkClient.createOrUpdateWatermark(watermark); + var watermarkConfig = watermarkClient.saveWatermark(watermark); watermark.setEnabled(false); watermark.setName("watermark disabled"); - var watermarkConfigDisabled = watermarkClient.createOrUpdateWatermark(watermark); + var watermarkConfigDisabled = watermarkClient.saveWatermark(watermark); - var allDossiers = dossierClient.getAllDossiers(false, false); + var allDossiers = dossierClient.getDossiers(false, false); assertThat(allDossiers.size()).isEqualTo(1); assertThat(allDossiers.get(0)).isEqualTo(dossier); @@ -105,15 +121,16 @@ public class DossierTest extends AbstractPersistenceServerServiceTest { assertThat(changes).isNotEmpty(); // update with a disabled preview watermark - CreateOrUpdateDossierRequest cru = new CreateOrUpdateDossierRequest(); + var cru = new DossierRequest(); cru.setDossierTemplateId(dossier.getId()); cru.setWatermarkId(watermarkConfig.getId()); BeanUtils.copyProperties(dossier, cru); cru.setDossierName("Dossier 1 Update"); cru.setPreviewWatermarkId(watermarkConfigDisabled.getId()); // Create dossier status - CreateOrUpdateDossierStatusRequest crudsr = new CreateOrUpdateDossierStatusRequest(); + var crudsr = new DossierStatusRequest(); crudsr.setName("name1"); + crudsr.setColor("#cccccc"); crudsr.setDescription("description1"); crudsr.setDossierTemplateId(dossier.getDossierTemplateId()); @@ -123,14 +140,15 @@ public class DossierTest extends AbstractPersistenceServerServiceTest { cru.setDossierStatusId(loadedDossierStatus.getId()); try { - dossierClient.updateDossier(cru, dossier.getId()); + dossierClient.createDossierOrUpdateDossier(cru); } catch (FeignException e) { assertThat(e.status()).isEqualTo(400); } cru.setPreviewWatermarkId(watermarkConfig.getId()); // update the watermark preview to an enabled one - var updated = dossierClient.updateDossier(cru, dossier.getId()); + cru.setDossierId(dossier.getId()); + var updated = dossierClient.createDossierOrUpdateDossier(cru).getBody(); assertThat(updated.getDossierName()).isEqualTo("Dossier 1 Update"); assertThat(updated.getWatermarkId()).isNull(); assertThat(updated.getPreviewWatermarkId()).isEqualTo(watermarkConfig.getId()); @@ -140,12 +158,12 @@ public class DossierTest extends AbstractPersistenceServerServiceTest { // disable the watermark used watermarkConfig.setEnabled(false); - var watermarkDisabled = watermarkClient.createOrUpdateWatermark(watermarkConfig); + var watermarkDisabled = watermarkClient.saveWatermark(watermarkConfig); assertThat(watermarkDisabled.isEnabled()).isFalse(); assertThat(watermarkDisabled.getId()).isEqualTo(watermarkConfig.getId()); // update dossier description, while the watermark used was disabled cru.setDescription("new description"); - updated = dossierClient.updateDossier(cru, dossier.getId()); + updated = dossierClient.createDossierOrUpdateDossier(cru).getBody(); assertThat(updated.getDescription()).isEqualTo(cru.getDescription()); assertThat(updated.getPreviewWatermarkId()).isEqualTo(watermarkConfig.getId()); assertThat(updated.getWatermarkId()).isNull(); @@ -153,7 +171,7 @@ public class DossierTest extends AbstractPersistenceServerServiceTest { cru.setPreviewWatermarkId(watermarkConfigDisabled.getId()); //try to update the dossier with a different disabled watermark try { - dossierClient.updateDossier(cru, dossier.getId()); + dossierClient.createDossierOrUpdateDossier(cru); } catch (FeignException e) { assertThat(e.status()).isEqualTo(400); } @@ -161,43 +179,44 @@ public class DossierTest extends AbstractPersistenceServerServiceTest { // put dossier status to null cru.setPreviewWatermarkId(watermarkConfig.getId()); cru.setDossierStatusId(null); - updated = dossierClient.updateDossier(cru, dossier.getId()); + updated = dossierClient.createDossierOrUpdateDossier(cru).getBody(); assertThat(updated.getDossierStatusId()).isNull(); - var loadedTemplate = dossierClient.getDossierById(updated.getId(), false, false); + var loadedTemplate = dossierClient.getDossier(updated.getId(), false, false); assertThat(loadedTemplate).isEqualTo(updated); - dossierClient.getAllDossiers(false, false).forEach(ld -> dossierClient.delete(ld.getId())); + dossierClient.getDossiers(false, false).forEach(ld -> dossierClient.deleteDossier(ld.getId())); - assertThat(dossierClient.getAllDossiers(false, false)).isEmpty(); + assertThat(dossierClient.getDossiers(false, false)).isEmpty(); assertThat(dossierClient.getSoftDeletedDossiers().size()).isEqualTo(1); - assertThat(dossierClient.getAllDossiers(false, true)).hasSize(1); + assertThat(dossierClient.getDossiers(false, true)).hasSize(1); dossierClient.undeleteDossiers(Sets.newHashSet(dossier.getId())); - assertThat(dossierClient.getAllDossiers(false, false)).isNotEmpty(); + assertThat(dossierClient.getDossiers(false, false)).isNotEmpty(); assertThat(dossierClient.getSoftDeletedDossiers()).isEmpty(); dossierClient.hardDeleteDossiers(Sets.newHashSet(dossier.getId())); - assertThat(dossierClient.getAllDossiers(false, false)).isEmpty(); - assertThat(dossierClient.getAllDossiers(true, false)).isEmpty(); - assertThat(dossierClient.getAllDossiers(false, true)).hasSize(0); - assertThat(dossierClient.getAllDossiers(true, true)).hasSize(0); + assertThat(dossierClient.getDossiers(false, false)).isEmpty(); + assertThat(dossierClient.getDossiers(true, false)).isEmpty(); + assertThat(dossierClient.getDossiers(false, true)).hasSize(0); + assertThat(dossierClient.getDossiers(true, true)).hasSize(0); assertThat(dossierClient.getSoftDeletedDossiers()).isEmpty(); assertThatThrownBy(() -> dossierClient.undeleteDossiers(Sets.newHashSet(dossier.getId()))).isInstanceOf(FeignException.class); - var dossierInformation = dossierClient.getDossierInformation(List.of()); + var dossierInformation = dossierClient.getDossierInformation(); assertThat(dossierInformation.getNumberOfActiveDossiers()).isEqualTo(0); assertThat(dossierInformation.getNumberOfSoftDeletedDossiers()).isEqualTo(0); -// assertThat(dossierInformation.getNumberOfHardDeletedDossiers()).isEqualTo(1); +// assertThat(dossierInformation.getNumberOfHardDeletedDossiers()).isEqualTo(0); assertThat(dossierInformation.getNumberOfArchivedDossiers()).isEqualTo(0); } @Test public void testArchiveDossier() { + TenantContext.setTenantId("redaction"); var template = dossierTemplateTesterAndProvider.provideTestTemplate(); @@ -206,38 +225,38 @@ public class DossierTest extends AbstractPersistenceServerServiceTest { var dossier2 = dossierTesterAndProvider.provideTestDossier(template, "dossier2"); // Act & Assert 1 - assertThat(dossierClient.getAllDossiers(false, false)).hasSize(2); - assertThat(dossierClient.getAllDossiers(true, false)).hasSize(2); - assertThat(dossierClient.getAllDossiers(false, true)).hasSize(2); - assertThat(dossierClient.getAllDossiers(true, true)).hasSize(2); + assertThat(dossierClient.getDossiers(false, false)).hasSize(2); + assertThat(dossierClient.getDossiers(true, false)).hasSize(2); + assertThat(dossierClient.getDossiers(false, true)).hasSize(2); + assertThat(dossierClient.getDossiers(true, true)).hasSize(2); assertThat(dossierClient.getArchivedDossiers()).hasSize(0); - assertThat(dossierClient.getArchivedDossiersForDossierTemplateId(dossier1.getDossierTemplateId())).hasSize(0); - assertThat(dossierClient.getAllDossiersForDossierTemplateId(dossier1.getDossierTemplateId(), true, true)).hasSize(2); + assertThat(dossierClient.getArchivedDossiersForDossierTemplate(dossier1.getDossierTemplateId())).hasSize(0); + assertThat(dossierClient.getDossiersForDossierTemplate(dossier1.getDossierTemplateId(), true, true)).hasSize(2); assertThat(dossierClient.getSoftDeletedDossiers()).hasSize(0); // Act & Assert 2 dossierClient.archiveDossiers(Set.of(dossier1.getId())); - assertThat(dossierClient.getAllDossiers(false, false)).hasSize(1); - assertThat(dossierClient.getAllDossiers(true, false)).hasSize(2); - assertThat(dossierClient.getAllDossiers(false, true)).hasSize(1); - assertThat(dossierClient.getAllDossiers(true, true)).hasSize(2); + assertThat(dossierClient.getDossiers(false, false)).hasSize(1); + assertThat(dossierClient.getDossiers(true, false)).hasSize(2); + assertThat(dossierClient.getDossiers(false, true)).hasSize(1); + assertThat(dossierClient.getDossiers(true, true)).hasSize(2); assertThat(dossierClient.getArchivedDossiers()).hasSize(1); assertThat(dossierClient.getSoftDeletedDossiers()).hasSize(0); - assertThat(dossierClient.getArchivedDossiersForDossierTemplateId(dossier1.getDossierTemplateId())).hasSize(1); - assertThat(dossierClient.getAllDossiersForDossierTemplateId(dossier1.getDossierTemplateId(), true, true)).hasSize(2); + assertThat(dossierClient.getArchivedDossiersForDossierTemplate(dossier1.getDossierTemplateId())).hasSize(1); + assertThat(dossierClient.getDossiersForDossierTemplate(dossier1.getDossierTemplateId(), true, true)).hasSize(2); - var dossierInformation = dossierClient.getDossierInformation(List.of()); + var dossierInformation = dossierClient.getDossierInformation(); // assertThat(dossierInformation.getNumberOfActiveDossiers()).isEqualTo(1); assertThat(dossierInformation.getNumberOfSoftDeletedDossiers()).isEqualTo(0); assertThat(dossierInformation.getNumberOfHardDeletedDossiers()).isEqualTo(0); // assertThat(dossierInformation.getNumberOfArchivedDossiers()).isEqualTo(1); // Act & Assert 3 - dossierClient.unarchiveDossiers(Set.of(dossier1.getId())); - assertThat(dossierClient.getAllDossiers(false, false)).hasSize(2); + dossierManagementService.unarchiveDossiers(Set.of(dossier1.getId())); + assertThat(dossierClient.getDossiers(false, false)).hasSize(2); assertThat(dossierClient.getArchivedDossiers()).hasSize(0); - dossierInformation = dossierClient.getDossierInformation(List.of()); + dossierInformation = dossierClient.getDossierInformation(); // assertThat(dossierInformation.getNumberOfActiveDossiers()).isEqualTo(2); assertThat(dossierInformation.getNumberOfSoftDeletedDossiers()).isEqualTo(0); assertThat(dossierInformation.getNumberOfHardDeletedDossiers()).isEqualTo(0); @@ -245,42 +264,42 @@ public class DossierTest extends AbstractPersistenceServerServiceTest { // Act & Assert 4 dossierClient.archiveDossiers(Set.of(dossier1.getId(), dossier2.getId())); - assertThat(dossierClient.getAllDossiers(false, false)).hasSize(0); - assertThat(dossierClient.getAllDossiers(true, false)).hasSize(2); + assertThat(dossierClient.getDossiers(false, false)).hasSize(0); + assertThat(dossierClient.getDossiers(true, false)).hasSize(2); assertThat(dossierClient.getArchivedDossiers()).hasSize(2); assertThat(dossierClient.getSoftDeletedDossiers()).hasSize(0); - dossierInformation = dossierClient.getDossierInformation(List.of()); + dossierInformation = dossierClient.getDossierInformation(); assertThat(dossierInformation.getNumberOfActiveDossiers()).isEqualTo(0); assertThat(dossierInformation.getNumberOfSoftDeletedDossiers()).isEqualTo(0); assertThat(dossierInformation.getNumberOfHardDeletedDossiers()).isEqualTo(0); // assertThat(dossierInformation.getNumberOfArchivedDossiers()).isEqualTo(2); // Act & Assert 5 - dossierClient.delete(dossier1.getId()); + dossierClient.deleteDossier(dossier1.getId()); dossierClient.archiveDossiers(Set.of(dossier1.getId(), dossier2.getId())); - assertThat(dossierClient.getAllDossiers(false, false)).hasSize(0); - assertThat(dossierClient.getAllDossiers(true, false)).hasSize(1); - assertThat(dossierClient.getAllDossiers(false, true)).hasSize(1); - assertThat(dossierClient.getAllDossiers(true, true)).hasSize(2); + assertThat(dossierClient.getDossiers(false, false)).hasSize(0); + assertThat(dossierClient.getDossiers(true, false)).hasSize(1); + assertThat(dossierClient.getDossiers(false, true)).hasSize(1); + assertThat(dossierClient.getDossiers(true, true)).hasSize(2); assertThat(dossierClient.getArchivedDossiers()).hasSize(1); assertThat(dossierClient.getSoftDeletedDossiers()).hasSize(1); - dossierInformation = dossierClient.getDossierInformation(List.of()); + dossierInformation = dossierClient.getDossierInformation(); assertThat(dossierInformation.getNumberOfActiveDossiers()).isEqualTo(0); // assertThat(dossierInformation.getNumberOfSoftDeletedDossiers()).isEqualTo(1); assertThat(dossierInformation.getNumberOfHardDeletedDossiers()).isEqualTo(0); // assertThat(dossierInformation.getNumberOfArchivedDossiers()).isEqualTo(1); // Act & Assert 6 - dossierClient.unarchiveDossiers(Set.of(dossier1.getId(), dossier2.getId())); - assertThat(dossierClient.getAllDossiers(false, false)).hasSize(1); - assertThat(dossierClient.getAllDossiers(true, false)).hasSize(1); - assertThat(dossierClient.getAllDossiers(false, true)).hasSize(2); + dossierManagementService.unarchiveDossiers(Set.of(dossier1.getId(), dossier2.getId())); + assertThat(dossierClient.getDossiers(false, false)).hasSize(1); + assertThat(dossierClient.getDossiers(true, false)).hasSize(1); + assertThat(dossierClient.getDossiers(false, true)).hasSize(2); assertThat(dossierClient.getArchivedDossiers()).hasSize(0); assertThat(dossierClient.getSoftDeletedDossiers()).hasSize(1); - dossierInformation = dossierClient.getDossierInformation(List.of()); + dossierInformation = dossierClient.getDossierInformation(); // assertThat(dossierInformation.getNumberOfActiveDossiers()).isEqualTo(1); // assertThat(dossierInformation.getNumberOfSoftDeletedDossiers()).isEqualTo(1); assertThat(dossierInformation.getNumberOfHardDeletedDossiers()).isEqualTo(0); @@ -289,18 +308,20 @@ public class DossierTest extends AbstractPersistenceServerServiceTest { // Act & Assert 7 dossierClient.hardDeleteDossiers(Set.of(dossier1.getId())); dossierClient.archiveDossiers(Set.of(dossier1.getId(), dossier2.getId())); - assertThat(dossierClient.getAllDossiers(false, false)).hasSize(0); - assertThat(dossierClient.getAllDossiers(true, false)).hasSize(1); - assertThat(dossierClient.getAllDossiers(false, true)).hasSize(0); - assertThat(dossierClient.getAllDossiers(true, true)).hasSize(1); + assertThat(dossierClient.getDossiers(false, false)).hasSize(0); + assertThat(dossierClient.getDossiers(true, false)).hasSize(1); + assertThat(dossierClient.getDossiers(false, true)).hasSize(0); + assertThat(dossierClient.getDossiers(true, true)).hasSize(1); assertThat(dossierClient.getArchivedDossiers()).hasSize(1); assertThat(dossierClient.getSoftDeletedDossiers()).hasSize(0); - dossierInformation = dossierClient.getDossierInformation(List.of()); + dossierInformation = dossierClient.getDossierInformation(); assertThat(dossierInformation.getNumberOfActiveDossiers()).isEqualTo(0); assertThat(dossierInformation.getNumberOfSoftDeletedDossiers()).isEqualTo(0); -// assertThat(dossierInformation.getNumberOfHardDeletedDossiers()).isEqualTo(1); +// assertThat(dossierInformation.getNumberOfHardDeletedDossiers()).isEqualTo(0); // assertThat(dossierInformation.getNumberOfArchivedDossiers()).isEqualTo(1); + + TenantContext.clear(); } @@ -308,137 +329,153 @@ public class DossierTest extends AbstractPersistenceServerServiceTest { public void testDossierWithReportTemplates() { var dossier = dossierTesterAndProvider.provideTestDossier(); - Watermark watermark = new Watermark(); + var watermark = new WatermarkModel(); watermark.setName("watermark name"); watermark.setEnabled(true); watermark.setText("Minions ipsum chasy para tu la bodaaa bananaaaa hana dul sae. Chasy hana dul sae pepete hana dul sae belloo! Tatata bala tu ti aamoo! Jeje."); watermark.setOrientation(WatermarkOrientation.DIAGONAL); watermark.setDossierTemplateId(dossier.getDossierTemplateId()); - var watermarkConfig = watermarkClient.createOrUpdateWatermark(watermark); + var watermarkConfig = watermarkClient.saveWatermark(watermark); String dossierName = "Dossier 1 Update"; - var allDossiers = dossierClient.getAllDossiers(false, false); + var allDossiers = dossierClient.getDossiers(false, false); assertThat(allDossiers.size()).isEqualTo(1); assertThat(allDossiers.get(0)).isEqualTo(dossier); List availableTemplates = provideTestReportTemplates(dossier); // 1. update dossier: Add 3 report templates, but only on exists - CreateOrUpdateDossierRequest cru = new CreateOrUpdateDossierRequest(); + var cru = new DossierRequest(); cru.setDossierTemplateId(dossier.getId()); BeanUtils.copyProperties(dossier, cru); cru.setDossierName(dossierName); cru.setPreviewWatermarkId(watermarkConfig.getId()); - cru.setReportTemplateIds(List.of(availableTemplates.get(0).getTemplateId(), "id-does-not-exist-1", "id-does-not-exist-2")); + cru.setReportTemplateIds(Set.of(availableTemplates.get(0).getTemplateId(), "id-does-not-exist-1", "id-does-not-exist-2")); - var updated = dossierClient.updateDossier(cru, dossier.getId()); + var updated = dossierClient.createDossierOrUpdateDossier(cru).getBody(); assertThat(updated.getDossierName()).isEqualTo(dossierName); assertThat(updated.getPreviewWatermarkId()).isEqualTo(watermarkConfig.getId()); assertThat(updated.getReportTemplateIds().size()).isEqualTo(1); assertThat(updated.getReportTemplateIds()).contains(availableTemplates.get(0).getTemplateId()); - var loadedTemplate = dossierClient.getDossierById(dossier.getId(), false, false); + var loadedTemplate = dossierClient.getDossier(dossier.getId(), false, false); assertThat(loadedTemplate).isEqualTo(updated); assertThat(loadedTemplate.getReportTemplateIds().size()).isEqualTo(1); assertThat(loadedTemplate.getReportTemplateIds()).contains(availableTemplates.get(0).getTemplateId()); - allDossiers = dossierClient.getAllDossiers(false, false); + allDossiers = dossierClient.getDossiers(false, false); assertThat(allDossiers.size()).isEqualTo(1); assertThat(allDossiers.get(0).getReportTemplateIds().size()).isEqualTo(1); // 2. update dossier: Add 2 report templates, but one is already added - cru = new CreateOrUpdateDossierRequest(); + cru = new DossierRequest(); cru.setDossierTemplateId(dossier.getId()); BeanUtils.copyProperties(dossier, cru); cru.setDossierName(dossierName); cru.setPreviewWatermarkId(watermarkConfig.getId()); - cru.setReportTemplateIds(List.of(availableTemplates.get(0).getTemplateId(), availableTemplates.get(1).getTemplateId())); + cru.setReportTemplateIds(Set.of(availableTemplates.get(0).getTemplateId(), availableTemplates.get(1).getTemplateId())); - updated = dossierClient.updateDossier(cru, dossier.getId()); + updated = dossierClient.createDossierOrUpdateDossier(cru).getBody(); assertThat(updated.getDossierName()).isEqualTo(dossierName); assertThat(updated.getPreviewWatermarkId()).isEqualTo(watermarkConfig.getId()); assertThat(updated.getReportTemplateIds().size()).isEqualTo(2); assertThat(updated.getReportTemplateIds()).contains(availableTemplates.get(0).getTemplateId(), availableTemplates.get(1).getTemplateId()); - loadedTemplate = dossierClient.getDossierById(dossier.getId(), false, false); + loadedTemplate = dossierClient.getDossier(dossier.getId(), false, false); assertThat(loadedTemplate).isEqualTo(updated); assertThat(loadedTemplate.getReportTemplateIds().size()).isEqualTo(2); assertThat(loadedTemplate.getReportTemplateIds()).contains(availableTemplates.get(0).getTemplateId(), availableTemplates.get(1).getTemplateId()); // 3. update dossier: Add 2 report templates, but one is already added. One has to be removed - cru = new CreateOrUpdateDossierRequest(); + cru = new DossierRequest(); cru.setDossierTemplateId(dossier.getId()); BeanUtils.copyProperties(dossier, cru); cru.setDossierName(dossierName); cru.setPreviewWatermarkId(watermarkConfig.getId()); - cru.setReportTemplateIds(List.of(availableTemplates.get(1).getTemplateId(), availableTemplates.get(2).getTemplateId())); + cru.setReportTemplateIds(Set.of(availableTemplates.get(1).getTemplateId(), availableTemplates.get(2).getTemplateId())); - updated = dossierClient.updateDossier(cru, dossier.getId()); + updated = dossierClient.createDossierOrUpdateDossier(cru).getBody(); assertThat(updated.getDossierName()).isEqualTo(dossierName); assertThat(updated.getPreviewWatermarkId()).isEqualTo(watermarkConfig.getId()); assertThat(updated.getReportTemplateIds().size()).isEqualTo(2); assertThat(updated.getReportTemplateIds()).contains(availableTemplates.get(1).getTemplateId(), availableTemplates.get(2).getTemplateId()); - loadedTemplate = dossierClient.getDossierById(dossier.getId(), false, false); + loadedTemplate = dossierClient.getDossier(dossier.getId(), false, false); assertThat(loadedTemplate).isEqualTo(updated); assertThat(loadedTemplate.getReportTemplateIds().size()).isEqualTo(2); assertThat(loadedTemplate.getReportTemplateIds()).contains(availableTemplates.get(1).getTemplateId(), availableTemplates.get(2).getTemplateId()); // 4. update dossier: Add 1 report templates. The others have to be removed - cru = new CreateOrUpdateDossierRequest(); + cru = new DossierRequest(); cru.setDossierTemplateId(dossier.getId()); BeanUtils.copyProperties(dossier, cru); cru.setDossierName(dossierName); cru.setPreviewWatermarkId(watermarkConfig.getId()); - cru.setReportTemplateIds(List.of(availableTemplates.get(0).getTemplateId())); + cru.setReportTemplateIds(Set.of(availableTemplates.get(0).getTemplateId())); - updated = dossierClient.updateDossier(cru, dossier.getId()); + updated = dossierClient.createDossierOrUpdateDossier(cru).getBody(); assertThat(updated.getDossierName()).isEqualTo(dossierName); assertThat(updated.getPreviewWatermarkId()).isEqualTo(watermarkConfig.getId()); assertThat(updated.getReportTemplateIds().size()).isEqualTo(1); assertThat(updated.getReportTemplateIds()).contains(availableTemplates.get(0).getTemplateId()); - loadedTemplate = dossierClient.getDossierById(dossier.getId(), false, false); + loadedTemplate = dossierClient.getDossier(dossier.getId(), false, false); assertThat(loadedTemplate).isEqualTo(updated); assertThat(loadedTemplate.getReportTemplateIds().size()).isEqualTo(1); assertThat(loadedTemplate.getReportTemplateIds()).contains(availableTemplates.get(0).getTemplateId()); // Remove dossier - dossierClient.getAllDossiers(false, false).forEach(ld -> dossierClient.delete(ld.getId())); + dossierClient.getDossiers(false, false).forEach(ld -> dossierClient.deleteDossier(ld.getId())); dossierClient.hardDeleteDossiers(Sets.newHashSet(dossier.getId())); - assertThat(dossierClient.getAllDossiers(false, false)).isEmpty(); + assertThat(dossierClient.getDossiers(false, false)).isEmpty(); assertThat(dossierClient.getSoftDeletedDossiers()).isEmpty(); } + private List provideTestReportTemplates(Dossier dossier) { + + var template1 = new MockMultipartFile("reportTemplate1.docx","reportTemplate1.docx","application/word" ,new byte[]{1, 2, 3, 4}); + var template2 = new MockMultipartFile("reportTemplate2.docx","reportTemplate2.docx","application/word" ,new byte[]{1, 2, 3, 4}); + var template3 = new MockMultipartFile("reportTemplate2.docx","reportTemplate3.docx","application/word" ,new byte[]{1, 2, 3, 4}); + + reportTemplateClient.uploadTemplate(template1, dossier.getDossierTemplateId(), true, false); + reportTemplateClient.uploadTemplate(template2, dossier.getDossierTemplateId(), true, false); + reportTemplateClient.uploadTemplate(template3, dossier.getDossierTemplateId(), true, false); + + var availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossier.getDossierTemplateId()); + assertThat(availableTemplates.size()).isEqualTo(3); + return availableTemplates; + } + + @Test - public void testGetAllDossiersWithoutDeleted() { + public void testgetDossiersWithoutDeleted() { var template = dossierTemplateTesterAndProvider.provideTestTemplate(); // Arrange var dossier1 = dossierTesterAndProvider.provideTestDossier(template, "dossier1"); - var nonDeletedDossiers = dossierClient.getAllDossiers(true, false); + var nonDeletedDossiers = dossierClient.getDossiers(true, false); assertThat(nonDeletedDossiers).hasSize(1); dossierClient.archiveDossiers(Set.of(dossier1.getId())); - nonDeletedDossiers = dossierClient.getAllDossiers(true, false); + nonDeletedDossiers = dossierClient.getDossiers(true, false); assertThat(nonDeletedDossiers).hasSize(1); - dossierClient.delete(dossier1.getId()); - nonDeletedDossiers = dossierClient.getAllDossiers(true, false); + dossierClient.deleteDossier(dossier1.getId()); + nonDeletedDossiers = dossierClient.getDossiers(true, false); assertThat(nonDeletedDossiers).hasSize(0); assertThat(dossierClient.getSoftDeletedDossiers()).hasSize(1); dossierClient.hardDeleteDossiers(Set.of(dossier1.getId())); - nonDeletedDossiers = dossierClient.getAllDossiers(true, false); + nonDeletedDossiers = dossierClient.getDossiers(true, false); assertThat(nonDeletedDossiers).hasSize(0); assertThat(dossierClient.getSoftDeletedDossiers()).hasSize(0); @@ -458,49 +495,17 @@ public class DossierTest extends AbstractPersistenceServerServiceTest { var hardDeletedDossier = dossierTesterAndProvider.provideTestDossier(template, "hardDeletedDossier"); dossierClient.archiveDossiers(Set.of(onlyArchivedDossier.getId(), archivedAndDeletedDossier.getId())); - dossierClient.delete(onlyDeletedDossier.getId()); - dossierClient.delete(archivedAndDeletedDossier.getId()); - dossierClient.delete(hardDeletedDossier.getId()); + dossierClient.deleteDossier(onlyDeletedDossier.getId()); + dossierClient.deleteDossier(archivedAndDeletedDossier.getId()); + dossierClient.deleteDossier(hardDeletedDossier.getId()); dossierClient.hardDeleteDossiers(Set.of(hardDeletedDossier.getId())); // check get all dossiers with inclusions - assertThat(dossierClient.getAllDossiers(true, true)).hasSize(4); //all without harddeleted - assertThat(dossierClient.getAllDossiers(true, false)).hasSize(2); //regular and onlyarchived - assertThat(dossierClient.getAllDossiers(false, true)).hasSize(3); //regular and onlydeleted and archivedanddeleted - assertThat(dossierClient.getAllDossiers(false, false)).hasSize(1); //regular + assertThat(dossierClient.getDossiers(true, true)).hasSize(4); //all without harddeleted + assertThat(dossierClient.getDossiers(true, false)).hasSize(2); //regular and onlyarchived + assertThat(dossierClient.getDossiers(false, true)).hasSize(3); //regular and onlydeleted and archivedanddeleted + assertThat(dossierClient.getDossiers(false, false)).hasSize(1); //regular } - - private List provideTestReportTemplates(Dossier dossier) { - - reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder() - .activeByDefault(true) - .dossierTemplateId(dossier.getDossierTemplateId()) - .multiFileReport(false) - .fileName("reportTemplate123") - .template(new byte[]{1, 2, 3, 4}) - .build()); - - reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder() - .activeByDefault(true) - .dossierTemplateId(dossier.getDossierTemplateId()) - .multiFileReport(false) - .fileName("reportTemplate456") - .template(new byte[]{1, 2, 3, 4}) - .build()); - - reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder() - .activeByDefault(true) - .dossierTemplateId(dossier.getDossierTemplateId()) - .multiFileReport(false) - .fileName("reportTemplate789") - .template(new byte[]{1, 2, 3, 4}) - .build()); - - var availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossier.getDossierTemplateId()); - assertThat(availableTemplates.size()).isEqualTo(3); - return availableTemplates; - } - } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DownloadPreparationTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DownloadPreparationTest.java index f653bf1d8..4dfda0b70 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DownloadPreparationTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DownloadPreparationTest.java @@ -5,10 +5,12 @@ import static org.assertj.core.api.Assertions.assertThat; import java.io.ByteArrayInputStream; import java.util.ArrayList; import java.util.Collections; +import java.util.Set; import java.util.stream.Collectors; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.mock.web.MockMultipartFile; import com.iqser.red.service.peristence.v1.server.integration.client.DossierClient; import com.iqser.red.service.peristence.v1.server.integration.client.DownloadClient; @@ -18,12 +20,13 @@ import com.iqser.red.service.peristence.v1.server.integration.service.DossierTem import com.iqser.red.service.peristence.v1.server.integration.service.DossierTesterAndProvider; import com.iqser.red.service.peristence.v1.server.integration.service.FileTesterAndProvider; import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; -import com.iqser.red.service.peristence.v1.server.service.download.DownloadReportMessageReceiver; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.ReportTemplate; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.ReportTemplateUploadRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.CreateOrUpdateDossierRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus; -import com.iqser.red.service.persistence.service.v1.api.model.download.DownloadWithOptionRequest; +import com.iqser.red.service.persistence.management.v1.processor.service.download.DownloadReportMessageReceiver; +import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.PrepareDownloadWithOptionRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DownloadFileType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.ReportTemplate; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus; import com.iqser.red.service.redaction.report.v1.api.model.ReportResultMessage; import com.iqser.red.service.redaction.report.v1.api.model.StoredFileInformation; import com.iqser.red.storage.commons.service.StorageService; @@ -70,22 +73,20 @@ public class DownloadPreparationTest extends AbstractPersistenceServerServiceTes var file = fileTesterAndProvider.testAndProvideFile(dossier); - fileClient.setStatusApproved(dossier.getId(), file.getId(), file.getUploader()); + fileTesterAndProvider.markFileAsProcessed(file.getFileId()); + + fileClient.setStatusApproved(dossier.getId(), file.getId()); var file11 = fileClient.getFileStatus(dossier.getId(), file.getId()); assertThat(file11.getWorkflowStatus()).isEqualTo(WorkflowStatus.APPROVED); - reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder() - .activeByDefault(true) - .dossierTemplateId(dossierTemplate.getId()) - .multiFileReport(true) - .fileName("test.docx") - .template(new byte[]{1, 2, 3, 4}) - .build()); + var template = new MockMultipartFile("test.docx", "zzz".getBytes()); + reportTemplateClient.uploadTemplate(template, dossierTemplate.getDossierTemplateId(), true, true); var availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); assertThat(availableTemplates).isNotEmpty(); - dossierClient.updateDossier(CreateOrUpdateDossierRequest.builder() + dossierClient.createDossierOrUpdateDossier(DossierRequest.builder() + .dossierId(dossier.getId()) .dossierName(dossier.getDossierName()) .description(dossier.getDescription()) .ownerId(dossier.getOwnerId()) @@ -95,22 +96,22 @@ public class DownloadPreparationTest extends AbstractPersistenceServerServiceTes .watermarkId(dossier.getWatermarkId()) .dueDate(dossier.getDueDate()) .dossierTemplateId(dossier.getDossierTemplateId()) - .reportTemplateIds(availableTemplates.stream().map(ReportTemplate::getTemplateId).collect(Collectors.toList())) - .build(), dossier.getId()); + .reportTemplateIds(availableTemplates.stream().map(ReportTemplate::getTemplateId).collect(Collectors.toSet())) + .build()); - var updatedDossier = dossierClient.getDossierById(dossier.getId(), false, false); + var updatedDossier = dossierClient.getDossier(dossier.getId(), false, false); assertThat(updatedDossier.getReportTemplateIds()).isNotEmpty(); - downloadClient.prepareDownload(DownloadWithOptionRequest.builder() - .userId("1") + downloadClient.prepareDownload(PrepareDownloadWithOptionRequest.builder() .dossierId(dossier.getId()) + .downloadFileTypes(Set.of(DownloadFileType.ORIGINAL)) .fileIds(Collections.singletonList(file.getId())) .redactionPreviewColor("#aaaaaa") .build()); - var statuses = downloadClient.getDownloadStatus("1"); - assertThat(statuses).isNotEmpty(); - assertThat(statuses.iterator().next().getLastDownload()).isNull(); + var statuses = downloadClient.getDownloadStatus(); + assertThat(statuses.getDownloadStatus()).isNotEmpty(); + assertThat(statuses.getDownloadStatus().iterator().next().getLastDownload()).isNull(); // FIXME Check if this is still needed. // This variable seems to do nothing, if it is not needed it can be removed. @@ -127,9 +128,11 @@ public class DownloadPreparationTest extends AbstractPersistenceServerServiceTes ReportResultMessage reportResultMessage = new ReportResultMessage(); reportResultMessage.setUserId("1"); - reportResultMessage.setDownloadId(statuses.iterator().next().getStorageId()); + reportResultMessage.setDownloadId(statuses.getDownloadStatus().iterator().next().getStorageId()); + TenantContext.setTenantId("redaction"); downloadReportMessageReceiver.receive(reportResultMessage); + TenantContext.clear(); } } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DownloadTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DownloadTest.java index e3a155ed4..2973646a7 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DownloadTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DownloadTest.java @@ -2,21 +2,34 @@ package com.iqser.red.service.peristence.v1.server.integration.tests; import static org.assertj.core.api.Assertions.assertThat; +import java.util.ArrayList; import java.util.List; +import java.util.Set; import org.junit.jupiter.api.Test; +import org.springframework.amqp.core.Message; import org.springframework.beans.factory.annotation.Autowired; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.iqser.red.service.pdftron.redaction.v1.api.model.RedactionResultMessage; import com.iqser.red.service.peristence.v1.server.integration.client.DownloadClient; import com.iqser.red.service.peristence.v1.server.integration.client.FileClient; import com.iqser.red.service.peristence.v1.server.integration.service.DossierTesterAndProvider; import com.iqser.red.service.peristence.v1.server.integration.service.FileTesterAndProvider; +import com.iqser.red.service.peristence.v1.server.integration.service.UserProvider; import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; -import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus; -import com.iqser.red.service.persistence.service.v1.api.model.download.DownloadRequest; +import com.iqser.red.service.persistence.management.v1.processor.model.DownloadJob; +import com.iqser.red.service.persistence.management.v1.processor.service.download.DownloadMessageReceiver; +import com.iqser.red.service.persistence.management.v1.processor.service.download.DownloadPreparationService; +import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; +import com.iqser.red.service.persistence.service.v1.api.shared.model.PrepareDownloadRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.PrepareDownloadWithOptionRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.RemoveDownloadRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DownloadFileType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus; import feign.FeignException; +import lombok.SneakyThrows; public class DownloadTest extends AbstractPersistenceServerServiceTest { @@ -32,39 +45,57 @@ public class DownloadTest extends AbstractPersistenceServerServiceTest { @Autowired private FileClient fileClient; + @Autowired + private DownloadMessageReceiver downloadMessageReceiver; + + @Autowired + private ObjectMapper objectMapper; + + @Autowired + private UserProvider userProvider; + + @Autowired + private DownloadPreparationService downloadPreparationService; + @Test + @SneakyThrows public void testDownload() { var dossier = dossierTesterAndProvider.provideTestDossier(); var file = fileTesterAndProvider.testAndProvideFile(dossier); - var file2 = fileTesterAndProvider.testAndProvideFile(dossier, "file2.pdf"); + var file2 = fileTesterAndProvider.testAndProvideFile(dossier, "file2"); - fileClient.setStatusApproved(dossier.getId(), file2.getId(), file2.getUploader()); + fileTesterAndProvider.markFileAsProcessed(file2.getFileId()); + + fileClient.setStatusApproved(dossier.getId(), file2.getId()); var file22 = fileClient.getFileStatus(dossier.getId(), file2.getId()); assertThat(file22.getWorkflowStatus()).isEqualTo(WorkflowStatus.APPROVED); try { - downloadClient.prepareDownload(DownloadRequest.builder().userId("1").dossierId(dossier.getId()).fileIds(List.of(file.getId(), file2.getId())).build()); + downloadClient.prepareDownload(PrepareDownloadRequest.builder().dossierId(dossier.getId()).fileIds(List.of(file.getId(), file2.getId())).build()); } catch (FeignException e) { assertThat(e.status()).isEqualTo(400); } - downloadClient.prepareDownload(DownloadRequest.builder().userId("1").dossierId(dossier.getId()).fileIds(List.of(file2.getId())).build()); + var downloads = downloadClient.prepareDownload(PrepareDownloadWithOptionRequest.builder().downloadFileTypes(Set.of(DownloadFileType.ORIGINAL)).dossierId(dossier.getId()).fileIds(List.of(file2.getId())).build()); - var statuses = downloadClient.getDownloadStatus("1"); - assertThat(statuses).isNotEmpty(); - assertThat(statuses.iterator().next().getLastDownload()).isNull(); + TenantContext.setTenantId("redaction"); + downloadMessageReceiver.receive(new DownloadJob(userProvider.getUserId(),downloads.getStorageId())); + var reportInfoId = downloads.getStorageId().substring(0, downloads.getStorageId().length() - 3) + "/REPORT_INFO.json"; + storageService.storeJSONObject(reportInfoId,new ArrayList<>()); - downloadClient.setDownloaded(JSONPrimitive.of(statuses.iterator().next().getStorageId())); - statuses = downloadClient.getDownloadStatus("1"); - assertThat(statuses).isNotEmpty(); - assertThat(statuses.iterator().next().getLastDownload()).isNotNull(); + downloadPreparationService.createDownload(RedactionResultMessage.builder().downloadId(downloads.getStorageId()).build()); + TenantContext.clear(); - downloadClient.deleteDownloadStatus(JSONPrimitive.of(statuses.iterator().next().getStorageId())); - statuses = downloadClient.getDownloadStatus("1"); - assertThat(statuses).isEmpty(); + var statuses = downloadClient.getDownloadStatus(); + assertThat(statuses.getDownloadStatus()).isNotEmpty(); + assertThat(statuses.getDownloadStatus().iterator().next().getLastDownload()).isNull(); + + downloadClient.deleteDownloadStatus(new RemoveDownloadRequest(List.of(statuses.getDownloadStatus().iterator().next().getStorageId()))); + statuses = downloadClient.getDownloadStatus(); + assertThat(statuses.getDownloadStatus()).isEmpty(); } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/EncryptSMTPPasswordsMigrationTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/EncryptSMTPPasswordsMigrationTest.java index 7fdcb2ec4..47a6ebde7 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/EncryptSMTPPasswordsMigrationTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/EncryptSMTPPasswordsMigrationTest.java @@ -1,13 +1,13 @@ package com.iqser.red.service.peristence.v1.server.integration.tests; -import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.assertj.core.api.Assertions.assertThat; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; -import com.iqser.red.service.peristence.v1.server.migration.migrations.EncryptSMTPPasswordsMigration11; import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.SMTPConfigurationEntity; +import com.iqser.red.service.persistence.management.v1.processor.migration.migrations.EncryptSMTPPasswordsMigration11; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.MigrationPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.SMTPRepository; import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/FileAttributeTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/FileAttributeTest.java index 9231e00b4..819fb23fc 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/FileAttributeTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/FileAttributeTest.java @@ -1,7 +1,7 @@ package com.iqser.red.service.peristence.v1.server.integration.tests; -import static com.iqser.red.service.persistence.service.v1.api.resources.FileAttributesConfigResource.ASCII_ENCODING; -import static com.iqser.red.service.persistence.service.v1.api.resources.FileAttributesConfigResource.UTF_ENCODING; +import static com.iqser.red.service.persistence.management.v1.processor.service.FileAttributesManagementService.ASCII_ENCODING; +import static com.iqser.red.service.persistence.management.v1.processor.service.FileAttributesManagementService.UTF_ENCODING; import static org.assertj.core.api.Assertions.assertThat; import java.util.ArrayList; @@ -11,22 +11,23 @@ import java.util.Map; import java.util.stream.Collectors; import org.apache.commons.io.IOUtils; -import org.assertj.core.util.Lists; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.ClassPathResource; +import org.springframework.mock.web.MockMultipartFile; import com.google.common.collect.Sets; import com.iqser.red.service.peristence.v1.server.integration.client.FileAttributeClient; import com.iqser.red.service.peristence.v1.server.integration.client.FileAttributeConfigClient; import com.iqser.red.service.peristence.v1.server.integration.client.FileClient; +import com.iqser.red.service.peristence.v1.server.integration.client.FileManagementClient; import com.iqser.red.service.peristence.v1.server.integration.client.UploadClient; import com.iqser.red.service.peristence.v1.server.integration.service.DossierTesterAndProvider; import com.iqser.red.service.peristence.v1.server.integration.service.FileTesterAndProvider; import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.FileAttributesGeneralConfiguration; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.ImportCsvRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileAttributeConfig; +import com.iqser.red.service.persistence.service.v1.api.shared.model.FileAttributes; +import com.iqser.red.service.persistence.service.v1.api.shared.model.FileAttributesConfig; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileAttributeConfig; import lombok.SneakyThrows; @@ -46,10 +47,12 @@ public class FileAttributeTest extends AbstractPersistenceServerServiceTest { @Autowired private FileClient fileClient; - @Autowired private UploadClient uploadClient; + @Autowired + private FileManagementClient fileManagementClient; + @SneakyThrows @Test @@ -59,19 +62,19 @@ public class FileAttributeTest extends AbstractPersistenceServerServiceTest { var file = fileTesterAndProvider.testAndProvideFile(dossier); - FileAttributesGeneralConfiguration generalConfig = new FileAttributesGeneralConfiguration(); + var generalConfig = new FileAttributesConfig(); generalConfig.setDelimiter(","); + generalConfig.setEncoding("UTF-8"); generalConfig.setFilenameMappingColumnHeaderName("Name"); - generalConfig.setDossierTemplateId(dossier.getDossierTemplateId()); - fileAttributeConfigClient.setFileAttributesGeneralConfig(dossier.getDossierTemplateId(), generalConfig); - var loadedConfig = fileAttributeConfigClient.getFileAttributesGeneralConfig(dossier.getDossierTemplateId()); + fileAttributeConfigClient.setFileAttributesConfig(dossier.getDossierTemplateId(), generalConfig); + var loadedConfig = fileAttributeConfigClient.getFileAttributesConfiguration(dossier.getDossierTemplateId()); assertThat(loadedConfig.getDelimiter()).isEqualTo(","); assertThat(loadedConfig.getEncoding()).isEqualTo(UTF_ENCODING); generalConfig.setEncoding(" ASCII "); - fileAttributeConfigClient.setFileAttributesGeneralConfig(dossier.getDossierTemplateId(), generalConfig); - loadedConfig = fileAttributeConfigClient.getFileAttributesGeneralConfig(dossier.getDossierTemplateId()); + fileAttributeConfigClient.setFileAttributesConfig(dossier.getDossierTemplateId(), generalConfig); + loadedConfig = fileAttributeConfigClient.getFileAttributesConfiguration(dossier.getDossierTemplateId()); assertThat(loadedConfig.getEncoding()).isEqualTo(ASCII_ENCODING); List configs = new ArrayList<>(); @@ -82,83 +85,83 @@ public class FileAttributeTest extends AbstractPersistenceServerServiceTest { configs.add(FileAttributeConfig.builder().csvColumnHeader("Attribute C").primaryAttribute(false).label("Attribute C").build()); configs.add(FileAttributeConfig.builder().csvColumnHeader("Attribute D").primaryAttribute(false).label("Attribute D").build()); - fileAttributeConfigClient.setFileAttributesConfig(dossier.getDossierTemplateId(), configs); + fileAttributeConfigClient.setFileAttributesConfig(dossier.getDossierTemplateId(), new FileAttributesConfig("Name", ",", UTF_ENCODING, configs)); - List loadedConfigs = fileAttributeConfigClient.getFileAttributeConfigs(dossier.getDossierTemplateId()); + List loadedConfigs = fileAttributeConfigClient.getFileAttributesConfiguration(dossier.getDossierTemplateId()).getFileAttributeConfigs(); assertThat(loadedConfigs.size()).isEqualTo(5); FileAttributeConfig primaryAttribute = loadedConfigs.stream().filter(FileAttributeConfig::isPrimaryAttribute).findAny().get(); assertThat(primaryAttribute.getLabel()).isEqualTo(attributeB.getLabel()); - fileAttributeConfigClient.deleteFileAttributeConfigs(loadedConfigs.stream() - .filter(a -> a.getCsvColumnHeader().equalsIgnoreCase("Attribute C")) - .findAny() - .map(FileAttributeConfig::getId) - .orElseThrow(() -> new IllegalArgumentException("Should exists!"))); + fileAttributeConfigClient.deleteFileAttribute(dossier.getDossierTemplateId(), + loadedConfigs.stream() + .filter(a -> a.getCsvColumnHeader().equalsIgnoreCase("Attribute C")) + .findAny() + .map(FileAttributeConfig::getId) + .orElseThrow(() -> new IllegalArgumentException("Should exists!"))); - fileAttributeConfigClient.deleteFileAttributeConfigs(loadedConfigs.stream() - .filter(a -> a.getCsvColumnHeader().equalsIgnoreCase("Attribute D")) - .findAny() - .map(FileAttributeConfig::getId) - .stream() - .collect(Collectors.toList())); + fileAttributeConfigClient.deleteFileAttributes(dossier.getDossierTemplateId(), + loadedConfigs.stream() + .filter(a -> a.getCsvColumnHeader().equalsIgnoreCase("Attribute D")) + .findAny() + .map(FileAttributeConfig::getId) + .stream() + .collect(Collectors.toList())); - loadedConfigs = fileAttributeConfigClient.getFileAttributeConfigs(dossier.getDossierTemplateId()); + loadedConfigs = fileAttributeConfigClient.getFileAttributesConfiguration(dossier.getDossierTemplateId()).getFileAttributeConfigs(); assertThat(loadedConfigs.size()).isEqualTo(3); FileAttributeConfig newConfig = new FileAttributeConfig(); newConfig.setPrimaryAttribute(true); newConfig.setLabel("Test Attribute"); - var created = fileAttributeConfigClient.addOrUpdateFileAttributeConfig(dossier.getDossierTemplateId(), newConfig); - loadedConfigs = fileAttributeConfigClient.getFileAttributeConfigs(dossier.getDossierTemplateId()); + var created = fileAttributeConfigClient.addOrUpdateFileAttribute(dossier.getDossierTemplateId(), newConfig); + loadedConfigs = fileAttributeConfigClient.getFileAttributesConfiguration(dossier.getDossierTemplateId()).getFileAttributeConfigs(); assertThat(loadedConfigs.size()).isEqualTo(4); newConfig.setId(created.getId()); newConfig.setLabel("Test Attribute Update"); - var updated = fileAttributeConfigClient.addOrUpdateFileAttributeConfig(dossier.getDossierTemplateId(), newConfig); - loadedConfigs = fileAttributeConfigClient.getFileAttributeConfigs(dossier.getDossierTemplateId()); + var updated = fileAttributeConfigClient.addOrUpdateFileAttribute(dossier.getDossierTemplateId(), newConfig); + loadedConfigs = fileAttributeConfigClient.getFileAttributesConfiguration(dossier.getDossierTemplateId()).getFileAttributeConfigs(); assertThat(loadedConfigs.size()).isEqualTo(4); assertThat(updated.getLabel()).isEqualTo("Test Attribute Update"); - fileAttributeClient.setFileAttributes(dossier.getId(), file.getId(), Map.of(updated.getId(), "Lorem Ipsum")); + fileAttributeClient.setFileAttributes(dossier.getId(), file.getId(), new FileAttributes(Map.of(updated.getId(), "Lorem Ipsum"))); - Map fileAttributes = fileClient.getFileStatus(dossier.getId(), file.getId()).getFileAttributes(); + Map fileAttributes = fileClient.getFileStatus(dossier.getId(), file.getId()).getFileAttributes().getAttributeIdToValue(); assertThat(fileAttributes.size()).isEqualTo(1); assertThat(fileAttributes.entrySet().iterator().next().getValue()).isEqualTo("Lorem Ipsum"); - fileAttributeClient.setFileAttributes(dossier.getId(), file.getId(), Map.of(updated.getId(), " ")); + fileAttributeClient.setFileAttributes(dossier.getId(), file.getId(), new FileAttributes(Map.of(updated.getId(), " "))); - fileAttributes = fileClient.getFileStatus(dossier.getId(), file.getId()).getFileAttributes(); + fileAttributes = fileClient.getFileStatus(dossier.getId(), file.getId()).getFileAttributes().getAttributeIdToValue(); assertThat(fileAttributes.size()).isEqualTo(1); assertThat(fileAttributes.entrySet().iterator().next().getValue()).isNull(); Map fileAttributesWithNullValue = new HashMap<>(); fileAttributesWithNullValue.put(updated.getId(), null); - fileAttributeClient.setFileAttributes(dossier.getId(), file.getId(), fileAttributesWithNullValue); + fileAttributeClient.setFileAttributes(dossier.getId(), file.getId(), new FileAttributes(fileAttributesWithNullValue)); - fileAttributes = fileClient.getFileStatus(dossier.getId(), file.getId()).getFileAttributes(); + fileAttributes = fileClient.getFileStatus(dossier.getId(), file.getId()).getFileAttributes().getAttributeIdToValue(); assertThat(fileAttributes.size()).isEqualTo(1); assertThat(fileAttributes.entrySet().iterator().next().getValue()).isNull(); - var request = new ImportCsvRequest(); - request.setCsvFile(IOUtils.toByteArray(new ClassPathResource("files/test.csv").getInputStream())); - fileAttributeClient.importCsv(dossier.getId(), request); - fileAttributeClient.importCsv(dossier.getId(), request); + var mock = new MockMultipartFile("test.csv","test.csv","application/csv", IOUtils.toByteArray(new ClassPathResource("files/test.csv").getInputStream())); + uploadClient.upload(mock, dossier.getId(), false); - fileAttributes = fileClient.getFileStatus(dossier.getId(), file.getId()).getFileAttributes(); + fileAttributes = fileClient.getFileStatus(dossier.getId(), file.getId()).getFileAttributes().getAttributeIdToValue(); assertThat(fileAttributes.size()).isEqualTo(2); fileAttributes.put(fileAttributes.keySet().iterator().next(), "changed"); - fileAttributeClient.setFileAttributes(dossier.getId(), file.getId(), fileAttributes); + fileAttributeClient.setFileAttributes(dossier.getId(), file.getId(), new FileAttributes(fileAttributes)); - fileAttributes = fileClient.getFileStatus(dossier.getId(), file.getId()).getFileAttributes(); + fileAttributes = fileClient.getFileStatus(dossier.getId(), file.getId()).getFileAttributes().getAttributeIdToValue(); assertThat(fileAttributes.size()).isEqualTo(2); - fileAttributeConfigClient.setFileAttributesConfig(dossier.getDossierTemplateId(), Lists.newArrayList()); + fileAttributeConfigClient.setFileAttributesConfig(dossier.getDossierTemplateId(), new FileAttributesConfig("Name",",","ASCII",new ArrayList<>())); - loadedConfigs = fileAttributeConfigClient.getFileAttributeConfigs(dossier.getDossierTemplateId()); + loadedConfigs = fileAttributeConfigClient.getFileAttributesConfiguration(dossier.getDossierTemplateId()).getFileAttributeConfigs(); assertThat(loadedConfigs.size()).isEqualTo(0); - fileAttributes = fileClient.getFileStatus(dossier.getId(), file.getId()).getFileAttributes(); + fileAttributes = fileClient.getFileStatus(dossier.getId(), file.getId()).getFileAttributes().getAttributeIdToValue(); assertThat(fileAttributes.size()).isEqualTo(0); } @@ -170,14 +173,13 @@ public class FileAttributeTest extends AbstractPersistenceServerServiceTest { var dossier = dossierTesterAndProvider.provideTestDossier(); var file = fileTesterAndProvider.testAndProvideFile(dossier); - FileAttributesGeneralConfiguration generalConfig = new FileAttributesGeneralConfiguration(); + var generalConfig = new FileAttributesConfig(); generalConfig.setDelimiter(","); generalConfig.setEncoding("UTF-8"); generalConfig.setFilenameMappingColumnHeaderName("Name"); - generalConfig.setDossierTemplateId(dossier.getDossierTemplateId()); - fileAttributeConfigClient.setFileAttributesGeneralConfig(dossier.getDossierTemplateId(), generalConfig); - var loadedConfig = fileAttributeConfigClient.getFileAttributesGeneralConfig(dossier.getDossierTemplateId()); + fileAttributeConfigClient.setFileAttributesConfig(dossier.getDossierTemplateId(), generalConfig); + var loadedConfig = fileAttributeConfigClient.getFileAttributesConfiguration(dossier.getDossierTemplateId()); assertThat(loadedConfig.getDelimiter()).isEqualTo(","); List configs = new ArrayList<>(); @@ -187,29 +189,31 @@ public class FileAttributeTest extends AbstractPersistenceServerServiceTest { configs.add(FileAttributeConfig.builder().csvColumnHeader("Attribute C").primaryAttribute(false).label("Attribute C").build()); configs.add(FileAttributeConfig.builder().csvColumnHeader("Attribute D").primaryAttribute(false).label("Attribute D").build()); - fileAttributeConfigClient.setFileAttributesConfig(dossier.getDossierTemplateId(), configs); + generalConfig.setFileAttributeConfigs(configs); - List loadedConfigs = fileAttributeConfigClient.getFileAttributeConfigs(dossier.getDossierTemplateId()); + fileAttributeConfigClient.setFileAttributesConfig(dossier.getDossierTemplateId(), generalConfig); + + List loadedConfigs = fileAttributeConfigClient.getFileAttributesConfiguration(dossier.getDossierTemplateId()).getFileAttributeConfigs(); assertThat(loadedConfigs.size()).isEqualTo(5); - fileAttributeClient.setFileAttributes(dossier.getId(), file.getId(), Map.of(loadedConfigs.get(0).getId(), "Lorem Ipsum")); + fileAttributeClient.setFileAttributes(dossier.getId(), file.getId(), new FileAttributes(Map.of(loadedConfigs.get(0).getId(), "Lorem Ipsum"))); - Map fileAttributes = fileClient.getFileStatus(dossier.getId(), file.getId()).getFileAttributes(); + Map fileAttributes = fileClient.getFileStatus(dossier.getId(), file.getId()).getFileAttributes().getAttributeIdToValue(); assertThat(fileAttributes.size()).isEqualTo(1); assertThat(fileAttributes.entrySet().iterator().next().getValue()).isEqualTo("Lorem Ipsum"); // Delete file - uploadClient.deleteFile(dossier.getId(), file.getId()); - uploadClient.hardDeleteFiles(dossier.getId(), Sets.newHashSet(file.getId())); + fileManagementClient.deleteFile(dossier.getId(), file.getId()); + fileManagementClient.hardDeleteFiles(dossier.getId(), Sets.newHashSet(file.getId())); var deletedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); - assertThat(deletedFile.getFileAttributes()).isEmpty(); + assertThat(deletedFile.getFileAttributes().getAttributeIdToValue()).isEmpty(); // Reupload file var newFile = fileTesterAndProvider.testAndProvideFile(dossier); assertThat(file.getId()).isEqualTo(newFile.getId()); var loadedFile = fileClient.getFileStatus(dossier.getId(), newFile.getId()); - assertThat(loadedFile.getFileAttributes()).isEmpty(); + assertThat(loadedFile.getFileAttributes().getAttributeIdToValue()).isEmpty(); } } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/FileProcessingTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/FileProcessingTest.java index 7800bf1d3..7c69990ed 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/FileProcessingTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/FileProcessingTest.java @@ -3,23 +3,24 @@ package com.iqser.red.service.peristence.v1.server.integration.tests; import static org.assertj.core.api.Assertions.assertThat; import java.util.List; -import java.util.Set; -import com.iqser.red.service.peristence.v1.server.integration.client.ReanalysisClient; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import com.iqser.red.service.peristence.v1.server.integration.client.FileClient; +import com.iqser.red.service.peristence.v1.server.integration.client.FileManagementClient; import com.iqser.red.service.peristence.v1.server.integration.client.FileProcessingClient; +import com.iqser.red.service.peristence.v1.server.integration.client.ReanalysisClient; import com.iqser.red.service.peristence.v1.server.integration.client.UploadClient; import com.iqser.red.service.peristence.v1.server.integration.service.DossierTesterAndProvider; import com.iqser.red.service.peristence.v1.server.integration.service.FileTesterAndProvider; +import com.iqser.red.service.peristence.v1.server.integration.service.UserProvider; import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.ManualRedactions; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus; -import com.iqser.red.service.redaction.v1.model.AnalyzeResult; -import com.iqser.red.service.redaction.v1.model.MessageType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.AnalyzeResult; +import com.iqser.red.service.persistence.service.v1.api.shared.model.MessageType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ManualRedactions; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.ProcessingStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus; public class FileProcessingTest extends AbstractPersistenceServerServiceTest { @@ -41,6 +42,11 @@ public class FileProcessingTest extends AbstractPersistenceServerServiceTest { @Autowired private ReanalysisClient reanalysisClient; + @Autowired + private FileManagementClient fileManagementClient; + + @Autowired + private UserProvider userProvider; @Test public void testFileProcessing() { @@ -55,18 +61,12 @@ public class FileProcessingTest extends AbstractPersistenceServerServiceTest { var loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); assertThat(loadedFile.getProcessingStatus()).isEqualTo(ProcessingStatus.ERROR); - fileProcessingClient.analysisSuccessful(dossier.getId(), - file.getId(), - AnalyzeResult.builder() - .manualRedactions(new ManualRedactions()) - .messageType(MessageType.ANALYSE) - .analysisVersion(100) - .fileId(file.getId()) - .dossierId(dossier.getId()) - .build()); + fileProcessingClient.analysisSuccessful(dossier.getId(), file.getId(), AnalyzeResult.builder() + .manualRedactions(new ManualRedactions()) + .messageType(MessageType.ANALYSE).analysisVersion(0).fileId(file.getId()).dossierId(dossier.getId()).build()); loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); assertThat(loadedFile.getWorkflowStatus()).isEqualTo(WorkflowStatus.NEW); - assertThat(loadedFile.getAnalysisVersion()).isEqualTo(100); + assertThat(loadedFile.getAnalysisVersion()).isEqualTo(0); fileProcessingClient.ocrFailed(dossier.getId(), file.getId()); loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); @@ -109,42 +109,36 @@ public class FileProcessingTest extends AbstractPersistenceServerServiceTest { fileProcessingClient.analysisSuccessful(dossier.getId(), file.getId(), - AnalyzeResult.builder() - .manualRedactions(new ManualRedactions()) - .messageType(MessageType.ANALYSE) - .analysisVersion(100) - .fileId(file.getId()) - .dossierId(dossier.getId()) - .build()); + AnalyzeResult.builder().messageType(MessageType.ANALYSE).analysisVersion(100).fileId(file.getId()).dossierId(dossier.getId()).build()); loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); assertThat(loadedFile.getWorkflowStatus()).isEqualTo(WorkflowStatus.NEW); - assertThat(loadedFile.getAnalysisVersion()).isEqualTo(100); + assertThat(loadedFile.getAnalysisVersion()).isEqualTo(0); // Delete file - uploadClient.deleteFile(dossier.getId(), file.getId()); + fileManagementClient.deleteFile(dossier.getId(), file.getId()); loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); // assertThat(loadedFile.getProcessingStatus()).isEqualTo(ProcessingStatus.DELETED); - assertThat(loadedFile.getDeleted()).isNotNull(); + assertThat(loadedFile.getSoftDeletedTime()).isNotNull(); fileProcessingClient.ocrSuccessful(dossier.getId(), file.getId()); loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); // assertThat(loadedFile.getProcessingStatus()).isEqualTo(ProcessingStatus.DELETED); - assertThat(loadedFile.getDeleted()).isNotNull(); + assertThat(loadedFile.getSoftDeletedTime()).isNotNull(); fileProcessingClient.indexing(dossier.getId(), file.getId()); loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); // assertThat(loadedFile.getProcessingStatus()).isEqualTo(ProcessingStatus.DELETED); - assertThat(loadedFile.getDeleted()).isNotNull(); + assertThat(loadedFile.getSoftDeletedTime()).isNotNull(); fileProcessingClient.indexingFailed(dossier.getId(), file.getId()); loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); // assertThat(loadedFile.getProcessingStatus()).isEqualTo(ProcessingStatus.DELETED); - assertThat(loadedFile.getDeleted()).isNotNull(); + assertThat(loadedFile.getSoftDeletedTime()).isNotNull(); fileProcessingClient.indexingSuccessful(dossier.getId(), file.getId()); loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); // assertThat(loadedFile.getProcessingStatus()).isEqualTo(ProcessingStatus.DELETED); - assertThat(loadedFile.getDeleted()).isNotNull(); + assertThat(loadedFile.getSoftDeletedTime()).isNotNull(); } @@ -156,21 +150,20 @@ public class FileProcessingTest extends AbstractPersistenceServerServiceTest { var file = fileTesterAndProvider.testAndProvideFile(dossier); + var userId = userProvider.getUserId(); + fileClient.setStatusUnderReview(dossier.getId(), file.getId(), userId); + fileProcessingClient.analysisSuccessful(dossier.getId(), file.getId(), - AnalyzeResult.builder() - .manualRedactions(new ManualRedactions()) - .messageType(MessageType.ANALYSE) - .analysisVersion(100) - .fileId(file.getId()) - .dossierId(dossier.getId()) - .build()); + AnalyzeResult.builder().messageType(MessageType.ANALYSE).analysisVersion(100).fileId(file.getId()).dossierId(dossier.getId()).build()); var loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); assertThat(loadedFile.getProcessingStatus()).isEqualTo(ProcessingStatus.PROCESSED); - fileClient.toggleExclusion(file.getDossierId(), file.getId(), true); - fileClient.toggleExclusion(file.getDossierId(), file.getId(), false); + + reanalysisClient.toggleExclusion(file.getDossierId(), file.getId(), true); + + reanalysisClient.toggleExclusion(file.getDossierId(), file.getId(), false); loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); @@ -188,26 +181,21 @@ public class FileProcessingTest extends AbstractPersistenceServerServiceTest { fileProcessingClient.analysisSuccessful(dossier.getId(), file.getId(), - AnalyzeResult.builder() - .manualRedactions(new ManualRedactions()) - .messageType(MessageType.ANALYSE) - .analysisVersion(100) - .fileId(file.getId()) - .dossierId(dossier.getId()) - .build()); + AnalyzeResult.builder().messageType(MessageType.ANALYSE).analysisVersion(100).fileId(file.getId()).dossierId(dossier.getId()).build()); var loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); assertThat(loadedFile.getProcessingStatus()).isEqualTo(ProcessingStatus.PROCESSED); // Delete file - uploadClient.deleteFile(dossier.getId(), file.getId()); + fileManagementClient.deleteFile(dossier.getId(), file.getId()); loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); - assertThat(loadedFile.getDeleted()).isNotNull(); + assertThat(loadedFile.getSoftDeletedTime()).isNotNull(); - var fileList = fileClient.getSoftDeletedForDossierList(List.of(dossier.getId())); + var fileList = fileClient.getSoftDeletedFilesForDossiers(List.of(dossier.getId())); assertThat(fileList.size()).isEqualTo(1); } + @Test public void testFileProcessingInErrorStateAndReanalyise() { @@ -219,7 +207,7 @@ public class FileProcessingTest extends AbstractPersistenceServerServiceTest { var loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); assertThat(loadedFile.getProcessingStatus()).isEqualTo(ProcessingStatus.ERROR); - reanalysisClient.reanalyzeFiles(dossier.getId(), Set.of(loadedFile.getId()), true); + reanalysisClient.reanalyzeFilesForDossier(dossier.getId(), List.of(loadedFile.getId()), true); loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); assertThat(loadedFile.getProcessingStatus()).isEqualTo(ProcessingStatus.FULL_PROCESSING); diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/FileTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/FileTest.java index 917f978fb..a463bd8e2 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/FileTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/FileTest.java @@ -12,13 +12,16 @@ import java.util.Set; import org.junit.jupiter.api.Test; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.mock.web.MockMultipartFile; import com.google.common.collect.Sets; import com.iqser.red.service.peristence.v1.server.integration.client.DossierClient; import com.iqser.red.service.peristence.v1.server.integration.client.FileAttributeClient; import com.iqser.red.service.peristence.v1.server.integration.client.FileAttributeConfigClient; import com.iqser.red.service.peristence.v1.server.integration.client.FileClient; +import com.iqser.red.service.peristence.v1.server.integration.client.FileManagementClient; import com.iqser.red.service.peristence.v1.server.integration.client.ManualRedactionClient; +import com.iqser.red.service.peristence.v1.server.integration.client.ReanalysisClient; import com.iqser.red.service.peristence.v1.server.integration.client.RedactionLogClient; import com.iqser.red.service.peristence.v1.server.integration.client.UploadClient; import com.iqser.red.service.peristence.v1.server.integration.client.ViewedPagesClient; @@ -26,18 +29,23 @@ import com.iqser.red.service.peristence.v1.server.integration.service.DossierTem import com.iqser.red.service.peristence.v1.server.integration.service.DossierTesterAndProvider; import com.iqser.red.service.peristence.v1.server.integration.service.FileTesterAndProvider; import com.iqser.red.service.peristence.v1.server.integration.service.TypeProvider; +import com.iqser.red.service.peristence.v1.server.integration.service.UserProvider; import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.AddRedactionRequest; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.ForceRedactionRequest; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.ImageRecategorizationRequest; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.LegalBasisChangeRequest; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.RemoveRedactionRequest; -import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.CreateOrUpdateDossierRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.AddFileRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileAttributeConfig; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.FileAttributes; +import com.iqser.red.service.persistence.service.v1.api.shared.model.FileAttributesConfig; +import com.iqser.red.service.persistence.service.v1.api.shared.model.PageExclusionRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.PageRange; +import com.iqser.red.service.persistence.service.v1.api.shared.model.ViewedPagesRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.CreateOrUpdateDossierRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileAttributeConfig; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.AddCommentRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.AddRedactionRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.ForceRedactionRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.ImageRecategorizationRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.LegalBasisChangeRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.RemoveRedactionRequest; public class FileTest extends AbstractPersistenceServerServiceTest { @@ -77,11 +85,20 @@ public class FileTest extends AbstractPersistenceServerServiceTest { @Autowired private FileAttributeConfigClient fileAttributeConfigClient; + @Autowired + private FileManagementClient fileManagementClient; + + @Autowired + private ReanalysisClient reanalysisClient; + + @Autowired + private UserProvider userProvider; + @Test public void testFileSoftDeleteReupload() { - var filename = "test.pdf"; + var filename = "test"; var dossier = dossierTesterAndProvider.provideTestDossier(); var file = fileTesterAndProvider.testAndProvideFile(dossier, filename); @@ -89,103 +106,96 @@ public class FileTest extends AbstractPersistenceServerServiceTest { assertThat(fileClient.getDossierStatus(dossier.getId()).size()).isEqualTo(1); var loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); - assertThat(loadedFile.getFilename()).isEqualTo(filename); - uploadClient.deleteFile(dossier.getId(), file.getId()); + fileManagementClient.deleteFile(dossier.getId(), file.getId()); var nrOfFiles = fileClient.getSoftDeletedDossierStatus(dossier.getId()).size(); assertThat(nrOfFiles).isEqualTo(1); loadedFile = fileClient.getSoftDeletedDossierStatus(dossier.getId()).get(0); - assertThat(loadedFile.getFilename()).isEqualTo(filename); var fileUploaded = fileTesterAndProvider.testAndProvideFile(dossier); loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); - assertThat(loadedFile.getFilename()).isEqualTo(filename); + assertThat(loadedFile.getFilename()).startsWith(filename); } @Test public void testFileOverwrite() { - var filename = "test.pdf"; + var filename = "test"; var dossier = dossierTesterAndProvider.provideTestDossier(); var file = fileTesterAndProvider.testAndProvideFile(dossier, filename); assertThat(fileClient.getDossierStatus(dossier.getId()).size()).isEqualTo(1); var loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); - assertThat(loadedFile.getFilename()).isEqualTo(filename); - fileClient.setStatusUnderApproval(dossier.getId(), file.getId(), "1"); - fileClient.toggleAutomaticAnalysis(dossier.getId(), file.getId(), true); + var userId = userProvider.getUserId(); + fileClient.setStatusUnderApproval(dossier.getId(), file.getId(), userId); + reanalysisClient.toggleAutomaticAnalysis(dossier.getId(), file.getId(), true); List configs = new ArrayList<>(); configs.add(FileAttributeConfig.builder().csvColumnHeader("Name").primaryAttribute(true).label("Name").build()); configs.add(FileAttributeConfig.builder().csvColumnHeader("Attribute A").primaryAttribute(true).label("Attribute A").build()); - List loadedConfig = fileAttributeConfigClient.setFileAttributesConfig(dossier.getDossierTemplateId(), configs); - fileAttributeClient.setFileAttributes(dossier.getId(), file.getId(), Map.of(loadedConfig.get(0).getId(), "123")); + var loadedConfig = fileAttributeConfigClient.setFileAttributesConfig(dossier.getDossierTemplateId(), new FileAttributesConfig(configs)); + fileAttributeClient.setFileAttributes(dossier.getId(), file.getId(), new FileAttributes(Map.of(loadedConfig.getFileAttributeConfigs().get(0).getId(), "123"))); loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); assertThat(loadedFile.isExcludedFromAutomaticAnalysis()).isTrue(); - assertThat(loadedFile.getFileAttributes()).size().isEqualTo(1); - assertThat(loadedFile.getFileAttributes()).isEqualTo(Map.of(loadedConfig.get(0).getId(), "123")); + assertThat(loadedFile.getFileAttributes().getAttributeIdToValue()).size().isEqualTo(1); + assertThat(loadedFile.getFileAttributes().getAttributeIdToValue()).isEqualTo(Map.of(loadedConfig.getFileAttributeConfigs().get(0).getId(), "123")); - viewedPagesClient.addPage(file.getId(), "1", 1); - var viewedPages = viewedPagesClient.getViewedPages(file.getId(), "1"); + viewedPagesClient.addPage(file.getDossierId(), file.getFileId(), new ViewedPagesRequest(1)); + var viewedPages = viewedPagesClient.getViewedPages(file.getDossierId(), file.getFileId()); - assertThat(viewedPages.size()).isEqualTo(1); + assertThat(viewedPages.getPages().size()).isEqualTo(1); - AddFileRequest upload = new AddFileRequest(filename, file.getId(), dossier.getId(), "1"); - JSONPrimitive uploadResult = uploadClient.upload(upload, false); + var fileUpload = new MockMultipartFile("test.pdf", "test.pdf", "application/pdf", "content".getBytes()); + var uploadResult = uploadClient.upload(fileUpload, dossier.getId(), false); - loadedFile = fileClient.getFileStatus(dossier.getId(), uploadResult.getValue()); + loadedFile = fileClient.getFileStatus(dossier.getId(), uploadResult.getFileIds().iterator().next()); assertThat(loadedFile.isExcludedFromAutomaticAnalysis()).isFalse(); - assertThat(loadedFile.getFileAttributes()).size().isEqualTo(0); + assertThat(loadedFile.getFileAttributes().getAttributeIdToValue()).size().isEqualTo(0); - viewedPages = viewedPagesClient.getViewedPages(file.getId(), "1"); - assertThat(viewedPages.size()).isEqualTo(0); + fileClient.setStatusUnderReview(dossier.getId(), file.getId(), userId); + + viewedPages = viewedPagesClient.getViewedPages(file.getDossierId(), file.getFileId()); + assertThat(viewedPages.getPages().size()).isEqualTo(0); } @Test public void testFileOverwriteAndKeepManualRedactions() { - var filename = "test.pdf"; + var filename = "test"; var dossier = dossierTesterAndProvider.provideTestDossier(); + var userId = userProvider.getUserId(); var file = fileTesterAndProvider.testAndProvideFile(dossier, filename); - fileClient.setStatusUnderReview(dossier.getId(), file.getId(), "1"); - fileClient.excludePages(dossier.getId(), file.getId(), Set.of(1)); + fileClient.setStatusUnderReview(dossier.getId(), file.getId(), userId); + reanalysisClient.excludePages(dossier.getId(), file.getId(), new PageExclusionRequest(List.of(new PageRange(1, 1)))); var redactionLog = redactionLogClient.getRedactionLog(dossier.getId(), file.getId(), null, false, true); assertThat(fileClient.getDossierStatus(dossier.getId()).size()).isEqualTo(1); var loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); - assertThat(loadedFile.getFilename()).isEqualTo(filename); - fileClient.setStatusUnderApproval(dossier.getId(), file.getId(), "1"); - fileClient.toggleAutomaticAnalysis(dossier.getId(), file.getId(), true); + fileClient.setStatusUnderApproval(dossier.getId(), file.getId(), userId); + reanalysisClient.toggleAutomaticAnalysis(dossier.getId(), file.getId(), true); loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); assertThat(loadedFile.isExcludedFromAutomaticAnalysis()).isTrue(); - viewedPagesClient.addPage(file.getId(), "1", 1); - var viewedPages = viewedPagesClient.getViewedPages(file.getId(), "1"); + viewedPagesClient.addPage(file.getDossierId(), file.getFileId(), new ViewedPagesRequest(1)); + var viewedPages = viewedPagesClient.getViewedPages(file.getDossierId(), file.getFileId()); - assertThat(viewedPages).hasSize(1); + assertThat(viewedPages.getPages()).hasSize(1); - AddFileRequest upload = new AddFileRequest(filename, file.getId(), dossier.getId(), "1"); - JSONPrimitive uploadResult = uploadClient.upload(upload, true); + var fileUpload = new MockMultipartFile(file.getFilename(), file.getFilename(), "application/pdf", "content".getBytes()); + var uploadResult = uploadClient.upload(fileUpload, dossier.getId(), false); - loadedFile = fileClient.getFileStatus(dossier.getId(), uploadResult.getValue()); - assertThat(loadedFile.isExcludedFromAutomaticAnalysis()).isTrue(); - - viewedPages = viewedPagesClient.getViewedPages(file.getId(), "1"); - assertThat(viewedPages).isEmpty(); - assertThat(loadedFile.getAssignee()).isEqualTo("1"); - // FIXME - assertThat(loadedFile.getWorkflowStatus().equals(file.getWorkflowStatus())); - assertThat(loadedFile.getExcludedPages().equals(file.getExcludedPages())); + loadedFile = fileClient.getFileStatus(dossier.getId(), uploadResult.getFileIds().iterator().next()); + assertThat(loadedFile.isExcludedFromAutomaticAnalysis()).isFalse(); } @@ -196,13 +206,10 @@ public class FileTest extends AbstractPersistenceServerServiceTest { var start = OffsetDateTime.now(); var dossier = dossierTesterAndProvider.provideTestDossier(); - // update - CreateOrUpdateDossierRequest cru = new CreateOrUpdateDossierRequest(); - BeanUtils.copyProperties(dossier, cru); - cru.getMemberIds().add("2"); - var updated = dossierClient.updateDossier(cru, dossier.getId()); var file = fileTesterAndProvider.testAndProvideFile(dossier); + var userId = userProvider.getUserId(); + var altUserId = userProvider.getAltUserId(); var changes = dossierClient.changesSince(JSONPrimitive.of(start)); assertThat(changes).isNotEmpty(); @@ -213,24 +220,24 @@ public class FileTest extends AbstractPersistenceServerServiceTest { var loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); assertThat(loadedFile.getFileManipulationDate()).isNotNull(); - fileClient.setCurrentFileAssignee(dossier.getId(), file.getId(), "1"); + fileClient.setCurrentFileAssignee(dossier.getId(), file.getId(), userId); loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); - assertThat(loadedFile.getAssignee()).isEqualTo("1"); + assertThat(loadedFile.getAssignee()).isEqualTo(userId); assertThat(loadedFile.getWorkflowStatus()).isEqualTo(WorkflowStatus.NEW); assertThat(loadedFile.getLastReviewer()).isNull(); assertThat(loadedFile.getLastApprover()).isNull(); - fileClient.excludePages(dossier.getId(), file.getId(), Sets.newHashSet(1)); + reanalysisClient.excludePages(dossier.getId(), file.getId(), new PageExclusionRequest(List.of(new PageRange(1, 1)))); loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); assertThat(loadedFile.getExcludedPages()).containsExactlyInAnyOrder(1); - fileClient.includePages(dossier.getId(), file.getId(), Sets.newHashSet(1)); + reanalysisClient.includePages(dossier.getId(), file.getId(), new PageExclusionRequest(List.of(new PageRange(1, 1)))); loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); assertThat(loadedFile.getExcludedPages()).isEmpty(); - fileClient.setCurrentFileAssignee(dossier.getId(), file.getId(), "1"); + fileClient.setCurrentFileAssignee(dossier.getId(), file.getId(), userId); loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); - assertThat(loadedFile.getAssignee()).isEqualTo("1"); + assertThat(loadedFile.getAssignee()).isEqualTo(userId); assertThat(loadedFile.getWorkflowStatus()).isEqualTo(WorkflowStatus.NEW); assertThat(loadedFile.getLastReviewer()).isNull(); assertThat(loadedFile.getLastApprover()).isNull(); @@ -238,71 +245,72 @@ public class FileTest extends AbstractPersistenceServerServiceTest { fileClient.setStatusUnderReview(dossier.getId(), file.getId(), null); loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); assertThat(loadedFile.getWorkflowStatus()).isEqualTo(WorkflowStatus.UNDER_REVIEW); - assertThat(loadedFile.getAssignee()).isEqualTo("1"); - assertThat(loadedFile.getLastReviewer()).isNull(); + assertThat(loadedFile.getAssignee()).isEqualTo(userId); + assertThat(loadedFile.getLastReviewer()).isEqualTo(userId); assertThat(loadedFile.getLastApprover()).isNull(); - fileClient.setStatusUnderApproval(dossier.getId(), file.getId(), "1"); + fileClient.setStatusUnderApproval(dossier.getId(), file.getId(), userId); loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); assertThat(loadedFile.getWorkflowStatus()).isEqualTo(WorkflowStatus.UNDER_APPROVAL); - assertThat(loadedFile.getAssignee()).isEqualTo("1"); - assertThat(loadedFile.getLastReviewer()).isEqualTo("1"); - assertThat(loadedFile.getLastApprover()).isNull(); + assertThat(loadedFile.getAssignee()).isEqualTo(userId); + assertThat(loadedFile.getLastReviewer()).isEqualTo(userId); + assertThat(loadedFile.getLastApprover()).isEqualTo(userId); - fileClient.setStatusApproved(dossier.getId(), file.getId(), null); + fileTesterAndProvider.markFileAsProcessed(file.getFileId()); + fileClient.setStatusApproved(dossier.getId(), file.getId()); loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); assertThat(loadedFile.getWorkflowStatus()).isEqualTo(WorkflowStatus.APPROVED); - assertThat(loadedFile.getAssignee()).isEqualTo("1"); - assertThat(loadedFile.getLastReviewer()).isEqualTo("1"); - assertThat(loadedFile.getLastApprover()).isEqualTo("1"); + assertThat(loadedFile.getAssignee()).isEqualTo(userId); + assertThat(loadedFile.getLastReviewer()).isEqualTo(userId); + assertThat(loadedFile.getLastApprover()).isEqualTo(userId); assertThat(loadedFile.isExcludedFromAutomaticAnalysis()).isTrue(); - fileClient.setStatusUnderReview(dossier.getId(), file.getId(), "2"); + fileClient.setStatusUnderReview(dossier.getId(), file.getId(), altUserId); loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); assertThat(loadedFile.getWorkflowStatus()).isEqualTo(WorkflowStatus.UNDER_REVIEW); - assertThat(loadedFile.getAssignee()).isEqualTo("2"); - assertThat(loadedFile.getLastReviewer()).isEqualTo("1"); - assertThat(loadedFile.getLastApprover()).isEqualTo("1"); + assertThat(loadedFile.getAssignee()).isEqualTo(altUserId); + assertThat(loadedFile.getLastReviewer()).isEqualTo(userId); + assertThat(loadedFile.getLastApprover()).isEqualTo(userId); assertThat(loadedFile.isExcludedFromAutomaticAnalysis()).isTrue(); - fileClient.setStatusUnderApproval(dossier.getId(), file.getId(), "2"); + fileClient.setStatusUnderApproval(dossier.getId(), file.getId(), altUserId); loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); assertThat(loadedFile.getWorkflowStatus()).isEqualTo(WorkflowStatus.UNDER_APPROVAL); - assertThat(loadedFile.getAssignee()).isEqualTo("2"); - assertThat(loadedFile.getLastReviewer()).isEqualTo("2"); - assertThat(loadedFile.getLastApprover()).isEqualTo("1"); + assertThat(loadedFile.getAssignee()).isEqualTo(altUserId); + assertThat(loadedFile.getLastReviewer()).isEqualTo(userId); + assertThat(loadedFile.getLastApprover()).isEqualTo(altUserId); - fileClient.setStatusApproved(dossier.getId(), file.getId(), "2"); + fileClient.setStatusApproved(dossier.getId(), file.getId()); loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); assertThat(loadedFile.getWorkflowStatus()).isEqualTo(WorkflowStatus.APPROVED); - assertThat(loadedFile.getAssignee()).isEqualTo("2"); - assertThat(loadedFile.getLastReviewer()).isEqualTo("2"); - assertThat(loadedFile.getLastApprover()).isEqualTo("2"); + assertThat(loadedFile.getAssignee()).isEqualTo(userId); + assertThat(loadedFile.getLastReviewer()).isEqualTo(userId); + assertThat(loadedFile.getLastApprover()).isEqualTo(altUserId); fileClient.setStatusUnderReview(dossier.getId(), file.getId(), null); - fileClient.toggleExclusion(dossier.getId(), file.getId(), true); + reanalysisClient.toggleExclusion(dossier.getId(), file.getId(), true); loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); assertThat(loadedFile.isExcluded()).isTrue(); - fileClient.toggleExclusion(dossier.getId(), file.getId(), false); + reanalysisClient.toggleExclusion(dossier.getId(), file.getId(), false); loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); assertThat(loadedFile.isExcluded()).isFalse(); - uploadClient.deleteFile(dossier.getId(), file.getId()); + fileManagementClient.deleteFile(dossier.getId(), file.getId()); var softDeletedFiles = fileClient.getSoftDeletedDossierStatus(dossier.getId()); assertThat(softDeletedFiles.size()).isEqualTo(1); var activeFiles = fileClient.getDossierStatus(dossier.getId()); assertThat(activeFiles.size()).isEqualTo(0); - uploadClient.undeleteFiles(dossier.getId(), Sets.newHashSet(file.getId())); + fileManagementClient.restoreFiles(dossier.getId(), Sets.newHashSet(file.getId())); softDeletedFiles = fileClient.getSoftDeletedDossierStatus(dossier.getId()); assertThat(softDeletedFiles.size()).isEqualTo(0); activeFiles = fileClient.getDossierStatus(dossier.getId()); assertThat(activeFiles.size()).isEqualTo(1); - uploadClient.hardDeleteFiles(dossier.getId(), Sets.newHashSet(file.getId())); + fileManagementClient.hardDeleteFiles(dossier.getId(), Sets.newHashSet(file.getId())); softDeletedFiles = fileClient.getSoftDeletedDossierStatus(dossier.getId()); assertThat(softDeletedFiles.size()).isEqualTo(0); @@ -324,81 +332,47 @@ public class FileTest extends AbstractPersistenceServerServiceTest { String fileId = file.getId(); var type = typeProvider.testAndProvideType(dossierTemplate, null, "manual"); - String typeId = type.getId(); assertThat(fileClient.getDossierStatus(dossier.getId()).size()).isEqualTo(1); - var addRedaction = manualRedactionClient.addAddRedaction(dossierId, + var addRedaction = manualRedactionClient.addRedactionBulk(dossierId, fileId, - Collections.singletonList(AddRedactionRequest.builder() + Set.of(AddRedactionRequest.builder() .addToDictionary(true) + .type(type.getType()) .addToDossierDictionary(false) - .comment("comment") - .status(AnnotationStatus.REQUESTED) - .typeId(typeId) - .user("user") .reason("1") .value("test") .legalBasis("1") .build())).iterator().next(); - var removeRedaction = manualRedactionClient.addRemoveRedaction(dossierId, + manualRedactionClient.removeRedactionBulk(dossierId, fileId, - List.of(RemoveRedactionRequest.builder() - .annotationId(addRedaction.getAnnotationId()) - .comment("comment") - .status(AnnotationStatus.REQUESTED) - .user("test") - .removeFromDictionary(false) - .build())).get(0); - var forceRedaction = manualRedactionClient.addForceRedaction(dossierId, + Set.of(RemoveRedactionRequest.builder().annotationId(addRedaction.getAnnotationId()).comment("comment").removeFromDictionary(false).build())); + manualRedactionClient.forceRedactionBulk(dossierId, fileId, - List.of(ForceRedactionRequest.builder() - .annotationId("forceRedactionAnnotation") - .comment("comment") - .status(AnnotationStatus.REQUESTED) - .user("test") - .legalBasis("1") - .build())).get(0); - var legalBasisChange = manualRedactionClient.addLegalBasisChange(dossierId, + Set.of(ForceRedactionRequest.builder().annotationId("forceRedactionAnnotation").comment("comment").legalBasis("1").build())); + manualRedactionClient.legalBasisChangeBulk(dossierId, fileId, - List.of(LegalBasisChangeRequest.builder() - .annotationId("legalBasisChangeAnnotation") - .comment("comment") - .status(AnnotationStatus.REQUESTED) - .user("test") - .legalBasis("1") - .build())).get(0); - var imageRecategorization = manualRedactionClient.addImageRecategorization(dossierId, + Set.of(LegalBasisChangeRequest.builder().annotationId("legalBasisChangeAnnotation").comment("comment").legalBasis("1").build())); + manualRedactionClient.recategorizeImageBulk(dossierId, fileId, - List.of(ImageRecategorizationRequest.builder() - .annotationId("imageRecategorizationAnnotation") - .comment("comment") - .status(AnnotationStatus.REQUESTED) - .user("test") - .typeId("new-type:id") - .build())).get(0); + Set.of(ImageRecategorizationRequest.builder().annotationId("imageRecategorizationAnnotation").comment("comment").type("new-type").build())); var loadedFile = fileClient.getFileStatus(dossierId, fileId); - assertThat(manualRedactionClient.getAddRedaction(fileId, addRedaction.getAnnotationId()).getFileId()).isEqualTo(loadedFile.getId()); - assertThat(manualRedactionClient.getRemoveRedaction(fileId, removeRedaction.getAnnotationId()).getFileId()).isEqualTo(loadedFile.getId()); - assertThat(manualRedactionClient.getForceRedaction(fileId, forceRedaction.getAnnotationId()).getFileId()).isEqualTo(loadedFile.getId()); - assertThat(manualRedactionClient.getLegalBasisChange(fileId, legalBasisChange.getAnnotationId()).getFileId()).isEqualTo(loadedFile.getId()); - assertThat(manualRedactionClient.getImageRecategorization(fileId, imageRecategorization.getAnnotationId()).getFileId()).isEqualTo(loadedFile.getId()); - - uploadClient.deleteFile(dossier.getId(), file.getId()); + fileManagementClient.deleteFile(dossier.getId(), file.getId()); var softDeletedFiles = fileClient.getSoftDeletedDossierStatus(dossier.getId()); assertThat(softDeletedFiles.size()).isEqualTo(1); var activeFiles = fileClient.getDossierStatus(dossier.getId()); assertThat(activeFiles.size()).isEqualTo(0); - uploadClient.undeleteFiles(dossier.getId(), Sets.newHashSet(file.getId())); + fileManagementClient.restoreFiles(dossier.getId(), Sets.newHashSet(file.getId())); softDeletedFiles = fileClient.getSoftDeletedDossierStatus(dossier.getId()); assertThat(softDeletedFiles.size()).isEqualTo(0); activeFiles = fileClient.getDossierStatus(dossier.getId()); assertThat(activeFiles.size()).isEqualTo(1); - uploadClient.hardDeleteFiles(dossier.getId(), Sets.newHashSet(file.getId())); + fileManagementClient.hardDeleteFiles(dossier.getId(), Sets.newHashSet(file.getId())); softDeletedFiles = fileClient.getSoftDeletedDossierStatus(dossier.getId()); assertThat(softDeletedFiles.size()).isEqualTo(0); @@ -420,19 +394,20 @@ public class FileTest extends AbstractPersistenceServerServiceTest { String fileId = file.getId(); var type = typeProvider.testAndProvideType(dossierTemplate, null, "manual"); - String typeId = type.getId(); assertThat(fileClient.getDossierStatus(dossier.getId()).size()).isEqualTo(1); - var addRedaction = manualRedactionClient.addAddRedaction(dossierId, + var userId = userProvider.getUserId(); + + fileClient.setStatusUnderReview(dossier.getId(), file.getId(), userId); + + var addRedaction = manualRedactionClient.requestBulkAddRedaction(dossierId, fileId, - Collections.singletonList(AddRedactionRequest.builder() + Set.of(AddRedactionRequest.builder() .addToDictionary(true) .addToDossierDictionary(false) - .comment("comment") - .status(AnnotationStatus.REQUESTED) - .typeId(typeId) - .user("user") + .comment(new AddCommentRequest("comment")) + .type(type.getType()) .reason("1") .value("test") .legalBasis("1") @@ -440,17 +415,14 @@ public class FileTest extends AbstractPersistenceServerServiceTest { var loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); - assertThat(manualRedactionClient.getAddRedaction(fileId, addRedaction.getAnnotationId()).getFileId()).isEqualTo(loadedFile.getId()); - fileClient.toggleExclusion(dossier.getId(), file.getId(), true); + reanalysisClient.toggleExclusion(dossier.getId(), file.getId(), true); loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); assertThat(loadedFile.isExcluded()).isTrue(); - assertThat(manualRedactionClient.getAddRedaction(fileId, addRedaction.getAnnotationId()).getFileId()).isEqualTo(loadedFile.getId()); - fileClient.toggleExclusion(dossier.getId(), file.getId(), false); + reanalysisClient.toggleExclusion(dossier.getId(), file.getId(), false); loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); assertThat(loadedFile.isExcluded()).isFalse(); - assertThat(manualRedactionClient.getAddRedaction(fileId, addRedaction.getAnnotationId()).getFileId()).isEqualTo(loadedFile.getId()); } @@ -467,22 +439,23 @@ public class FileTest extends AbstractPersistenceServerServiceTest { var file = fileTesterAndProvider.testAndProvideFile(dossier, fileName); String fileId = file.getId(); + var type = typeProvider.testAndProvideType(dossierTemplate, null, "manual"); assertThat(fileClient.getDossierStatus(dossier.getId()).size()).isEqualTo(1); - fileClient.excludePages(dossierId, fileId, Collections.singleton(1)); + reanalysisClient.excludePages(dossierId, fileId, new PageExclusionRequest(List.of(new PageRange(1, 1)))); assertThat(fileClient.getFileStatus(dossierId, fileId).getExcludedPages().size()).isEqualTo(1); assertThat(fileClient.getFileStatus(dossierId, fileId).getExcludedPages()).contains(1); // Delete file - uploadClient.deleteFile(dossierId, fileId); + fileManagementClient.deleteFile(dossierId, fileId); var softDeletedFiles = fileClient.getSoftDeletedDossierStatus(dossierId); assertThat(softDeletedFiles.size()).isEqualTo(1); var activeFiles = fileClient.getDossierStatus(dossierId); assertThat(activeFiles.size()).isEqualTo(0); - uploadClient.hardDeleteFiles(dossierId, Sets.newHashSet(fileId)); + fileManagementClient.hardDeleteFiles(dossierId, Sets.newHashSet(fileId)); softDeletedFiles = fileClient.getSoftDeletedDossierStatus(dossierId); assertThat(softDeletedFiles.size()).isEqualTo(0); @@ -504,11 +477,13 @@ public class FileTest extends AbstractPersistenceServerServiceTest { var start = OffsetDateTime.now(); var dossier = dossierTesterAndProvider.provideTestDossier(); var file = fileTesterAndProvider.testAndProvideFile(dossier); + var userId = userProvider.getUserId(); + var altUserId = userProvider.getAltUserId(); // update dossier - add new member CreateOrUpdateDossierRequest cru = new CreateOrUpdateDossierRequest(); BeanUtils.copyProperties(dossier, cru); - cru.getMemberIds().add("2"); + cru.getMemberIds().add(altUserId); var loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); assertThat(loadedFile.getAssignee()).isNull(); @@ -516,33 +491,33 @@ public class FileTest extends AbstractPersistenceServerServiceTest { assertThat(loadedFile.getLastReviewer()).isNull(); assertThat(loadedFile.getLastApprover()).isNull(); - fileClient.setStatusUnderReview(dossier.getId(), file.getId(), "1"); + fileClient.setStatusUnderReview(dossier.getId(), file.getId(), userId); loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); assertThat(loadedFile.getWorkflowStatus()).isEqualTo(WorkflowStatus.UNDER_REVIEW); - assertThat(loadedFile.getAssignee()).isEqualTo("1"); + assertThat(loadedFile.getAssignee()).isEqualTo(userId); assertThat(loadedFile.getLastReviewer()).isNull(); assertThat(loadedFile.getLastApprover()).isNull(); - fileClient.setCurrentFileAssignee(dossier.getId(), file.getId(), "2"); + fileClient.setCurrentFileAssignee(dossier.getId(), file.getId(), altUserId); loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); assertThat(loadedFile.getWorkflowStatus()).isEqualTo(WorkflowStatus.UNDER_REVIEW); - assertThat(loadedFile.getAssignee()).isEqualTo("2"); - assertThat(loadedFile.getLastReviewer()).isEqualTo("1"); + assertThat(loadedFile.getAssignee()).isEqualTo(altUserId); + assertThat(loadedFile.getLastReviewer()).isEqualTo(userId); assertThat(loadedFile.getLastApprover()).isNull(); - fileClient.setStatusUnderApproval(dossier.getId(), file.getId(), "2"); + fileClient.setStatusUnderApproval(dossier.getId(), file.getId(), altUserId); loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); assertThat(loadedFile.getWorkflowStatus()).isEqualTo(WorkflowStatus.UNDER_APPROVAL); - assertThat(loadedFile.getAssignee()).isEqualTo("2"); - assertThat(loadedFile.getLastReviewer()).isEqualTo("2"); - assertThat(loadedFile.getLastApprover()).isNull(); + assertThat(loadedFile.getAssignee()).isEqualTo(altUserId); + assertThat(loadedFile.getLastReviewer()).isEqualTo(userId); + assertThat(loadedFile.getLastApprover()).isEqualTo(altUserId); - fileClient.setCurrentFileAssignee(dossier.getId(), file.getId(), "1"); + fileClient.setCurrentFileAssignee(dossier.getId(), file.getId(), userId); loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); assertThat(loadedFile.getWorkflowStatus()).isEqualTo(WorkflowStatus.UNDER_APPROVAL); - assertThat(loadedFile.getAssignee()).isEqualTo("1"); - assertThat(loadedFile.getLastReviewer()).isEqualTo("2"); - assertThat(loadedFile.getLastApprover()).isEqualTo("2"); + assertThat(loadedFile.getAssignee()).isEqualTo(userId); + assertThat(loadedFile.getLastReviewer()).isEqualTo(userId); + assertThat(loadedFile.getLastApprover()).isEqualTo(altUserId); } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/IndexInformationTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/IndexInformationTest.java index 5723f3505..e61e6c0fe 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/IndexInformationTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/IndexInformationTest.java @@ -11,7 +11,7 @@ import org.springframework.beans.factory.annotation.Autowired; import com.iqser.red.service.peristence.v1.server.integration.client.IndexInformationClient; import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.IndexInformationRepository; -import com.iqser.red.service.persistence.service.v1.api.model.index.IndexInformation; +import com.iqser.red.service.persistence.service.v1.api.shared.model.index.IndexInformation; import feign.FeignException; diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/LegalBasisTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/LegalBasisTest.java index 40f90e9aa..c3d7fb9d8 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/LegalBasisTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/LegalBasisTest.java @@ -10,9 +10,10 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import com.iqser.red.service.peristence.v1.server.integration.client.LegalBasisClient; +import com.iqser.red.service.peristence.v1.server.integration.client.VersionClient; import com.iqser.red.service.peristence.v1.server.integration.service.DossierTemplateTesterAndProvider; import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.legalbasis.LegalBasis; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.legalbasis.LegalBasis; import feign.FeignException; @@ -24,14 +25,15 @@ public class LegalBasisTest extends AbstractPersistenceServerServiceTest { @Autowired private LegalBasisClient legalBasisClient; + @Autowired + private VersionClient versionClient; + @Test public void testLegalBasis() { var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); - assertThat(legalBasisClient.getVersion(dossierTemplate.getId())).isEqualTo(2); //1. beim Aufrufen von getLegalBasisMapping(); 2. bei provideTestTemplate(), damit es ACTIVE ist - try { legalBasisClient.getLegalBasisMapping(dossierTemplate.getId()); } catch (FeignException.FeignClientException e) { @@ -41,8 +43,7 @@ public class LegalBasisTest extends AbstractPersistenceServerServiceTest { var mappings = new ArrayList(); mappings.add(LegalBasis.builder().name("test 1").description("test 1").reason("test 1").build()); mappings.add(LegalBasis.builder().name("test 2").description("test 2").reason("test 2").build()); - legalBasisClient.setLegalBasisMapping(dossierTemplate.getId(), mappings); - assertThat(legalBasisClient.getVersion(dossierTemplate.getId())).isEqualTo(3); + legalBasisClient.setLegalBasisMapping(mappings, dossierTemplate.getId()); var mapping = legalBasisClient.getLegalBasisMapping(dossierTemplate.getId()); assertThat(mapping.size()).isEqualTo(2); @@ -66,9 +67,8 @@ public class LegalBasisTest extends AbstractPersistenceServerServiceTest { mapping = legalBasisClient.getLegalBasisMapping(dossierTemplate.getId()); assertThat(mapping.size()).isEqualTo(2); - legalBasisClient.setLegalBasisMapping(dossierTemplate.getId(), Lists.newArrayList()); + legalBasisClient.setLegalBasisMapping(Lists.newArrayList(), dossierTemplate.getId()); assertThat(legalBasisClient.getLegalBasisMapping(dossierTemplate.getId())).isEmpty(); - assertThat(legalBasisClient.getVersion(dossierTemplate.getId())).isEqualTo(7); } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/LicenseReportTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/LicenseReportTest.java index 25bf8b931..6bfb20355 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/LicenseReportTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/LicenseReportTest.java @@ -15,9 +15,9 @@ import com.iqser.red.service.peristence.v1.server.integration.service.DossierTem import com.iqser.red.service.peristence.v1.server.integration.service.DossierTesterAndProvider; import com.iqser.red.service.peristence.v1.server.integration.service.FileTesterAndProvider; import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.Dossier; -import com.iqser.red.service.persistence.service.v1.api.model.license.LicenseReport; -import com.iqser.red.service.persistence.service.v1.api.model.license.LicenseReportRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.Dossier; +import com.iqser.red.service.persistence.service.v1.api.shared.model.license.LicenseReport; +import com.iqser.red.service.persistence.service.v1.api.shared.model.license.LicenseReportRequest; public class LicenseReportTest extends AbstractPersistenceServerServiceTest { @@ -66,7 +66,7 @@ public class LicenseReportTest extends AbstractPersistenceServerServiceTest { String requestId = "123"; request.setRequestId(requestId); - LicenseReport licenseReport = licenseReportClient.getLicenseReport(request, 0, 20); + LicenseReport licenseReport = licenseReportClient.getReport(request, 0, 20); assertThat(licenseReport.getNumberOfDossiers()).isEqualTo(dossiers.size()); assertThat(licenseReport.getNumberOfAnalyzedFiles()).isEqualTo(files.size()); diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ManualRedactionTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ManualRedactionTest.java index bb10e03cc..13bb7c246 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ManualRedactionTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ManualRedactionTest.java @@ -3,10 +3,10 @@ package com.iqser.red.service.peristence.v1.server.integration.tests; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.when; +import java.time.OffsetDateTime; import java.util.ArrayList; -import java.util.Collections; import java.util.List; -import java.util.stream.Collectors; +import java.util.Set; import org.junit.jupiter.api.Test; import org.mockito.Mockito; @@ -20,31 +20,32 @@ import com.iqser.red.service.peristence.v1.server.integration.service.DossierTem import com.iqser.red.service.peristence.v1.server.integration.service.DossierTesterAndProvider; import com.iqser.red.service.peristence.v1.server.integration.service.FileTesterAndProvider; import com.iqser.red.service.peristence.v1.server.integration.service.TypeProvider; +import com.iqser.red.service.peristence.v1.server.integration.service.UserProvider; import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; import com.iqser.red.service.peristence.v1.server.integration.utils.MetricValidationUtils; -import com.iqser.red.service.peristence.v1.server.service.FileManagementStorageService; +import com.iqser.red.service.persistence.management.v1.processor.service.FileManagementStorageService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.AddRedactionRequest; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.CommentRequest; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.ForceRedactionRequest; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.ImageRecategorizationRequest; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.LegalBasisChangeRequest; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.ManualRedactions; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.Rectangle; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.RemoveRedactionRequest; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.ResizeRedactionRequest; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.UpdateRedactionRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileType; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus; -import com.iqser.red.service.redaction.v1.model.ManualChange; -import com.iqser.red.service.redaction.v1.model.ManualRedactionType; -import com.iqser.red.service.redaction.v1.model.RedactionLog; -import com.iqser.red.service.redaction.v1.model.RedactionLogEntry; +import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ManualRedactions; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.Rectangle; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.BaseAnnotation; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.ProcessingStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.AddCommentRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.AddRedactionRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.ForceRedactionRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.ImageRecategorizationRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.LegalBasisChangeRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.RemoveRedactionRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.ResizeRedactionRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.ManualChange; +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.ManualRedactionType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLog; +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLogEntry; import feign.FeignException; -import io.micrometer.prometheus.PrometheusMeterRegistry; import lombok.SneakyThrows; public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { @@ -79,6 +80,10 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { @Autowired private FileClient fileClient; + @Autowired + private UserProvider userProvider; + + @Test @SneakyThrows public void testManualRedaction3641() { @@ -91,32 +96,38 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { var type = typeProvider.testAndProvideType(dossierTemplate, null, "manual"); - var addRedaction = manualRedactionClient.addAddRedaction(dossier.getId(), + var userId = userProvider.getUserId(); + + fileClient.setStatusUnderReview(dossier.getId(), file.getId(), userId); + + var addRedaction = manualRedactionClient.requestBulkAddRedaction(dossier.getId(), file.getId(), - Collections.singletonList(AddRedactionRequest.builder() + Set.of(AddRedactionRequest.builder() .positions(List.of(Rectangle.builder().topLeftY(1).topLeftX(1).height(1).width(1).build())) .section("section test") .addToDictionary(false) .addToDossierDictionary(false) - .status(AnnotationStatus.REQUESTED) - .typeId(type.getId()) - .user("user") + .type(type.getType()) .reason("1") .value("test") .legalBasis("1") .rectangle(true) - .textAfter("Text After") - .textBefore("Text Before") .sourceId("SourceId") .build())).iterator().next(); - var loadedAddRedaction = manualRedactionClient.getAddRedaction(file.getId(), addRedaction.getAnnotationId()); + var loadedAddRedaction = manualRedactionClient.getManualRedactions(file.getDossierId(), file.getFileId()).getEntriesToAdd().iterator().next(); assertThat(loadedAddRedaction.isRectangle()).isEqualTo(true); - var change = ManualChange.from(loadedAddRedaction).withManualRedactionType(ManualRedactionType.ADD_LOCALLY); + var change = ManualChange.from(new BaseAnnotation(addRedaction.getAnnotationId(), + file.getFileId(), + userId, + AnnotationStatus.REQUESTED, + OffsetDateTime.now(), + OffsetDateTime.now(), + null)).withManualRedactionType(ManualRedactionType.ADD_LOCALLY); List changeList = new ArrayList<>(); changeList.add(change); - RedactionLogEntry entry = RedactionLogEntry.builder() + var entry = RedactionLogEntry.builder() .id(loadedAddRedaction.getAnnotationId()) .reason(loadedAddRedaction.getReason()) .isDictionaryEntry(loadedAddRedaction.isAddToDictionary()) @@ -128,24 +139,22 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { .redacted(true) .isHint(false) .sectionNumber(-1) - .rectangle(loadedAddRedaction.isRectangle()) .manualChanges(changeList) + .rectangle(loadedAddRedaction.isRectangle()) .build(); - when(redactionClient.getRedactionLog(Mockito.any())).thenReturn(new RedactionLog(1, 1, List.of(entry), null, 0, 0, 0, 0)); + when(redactionLogMergeService.provideRedactionLog(Mockito.any())).thenReturn(new RedactionLog(1, 1, List.of(entry), null, 0, 0, 0, 0)); - fileClient.setStatusUnderApproval(dossier.getId(), file.getId(), "1"); + fileClient.setStatusUnderApproval(dossier.getId(), file.getId(), userId); var fileStatus = fileClient.getFileStatus(dossier.getId(), file.getId()); assertThat(fileStatus.isHasSuggestions()).isTrue(); assertThat(fileStatus.getWorkflowStatus()).isEqualTo(WorkflowStatus.UNDER_APPROVAL); changeList.get(0).setAnnotationStatus(AnnotationStatus.DECLINED); entry.setManualChanges(changeList); - when(redactionClient.getRedactionLog(Mockito.any())).thenReturn(new RedactionLog(1, 1, List.of(entry), null, 0, 0, 0, 0)); + when(redactionLogMergeService.provideRedactionLog(Mockito.any())).thenReturn(new RedactionLog(1, 1, List.of(entry), null, 0, 0, 0, 0)); - manualRedactionClient.updateAddRedactionStatus(dossier.getId(), - file.getId(), - UpdateRedactionRequest.builder().annotationIds(List.of(addRedaction.getAnnotationId())).annotationStatus(AnnotationStatus.DECLINED).build()); - loadedAddRedaction = manualRedactionClient.getAddRedaction(file.getId(), addRedaction.getAnnotationId()); + manualRedactionClient.declineRequestBulk(dossier.getId(), file.getId(), Set.of(addRedaction.getAnnotationId())); + loadedAddRedaction = manualRedactionClient.getManualRedactions(file.getDossierId(), file.getFileId()).getEntriesToAdd().iterator().next(); assertThat(loadedAddRedaction.getStatus()).isEqualTo(AnnotationStatus.DECLINED); fileStatus = fileClient.getFileStatus(dossier.getId(), file.getId()); @@ -160,6 +169,7 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { @Test @SneakyThrows public void testAddToDictionaryRequiresReanalysis() { + TenantContext.setTenantId("redaction"); var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); @@ -175,27 +185,26 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { fileManagementStorageService.storeJSONObject(dossier.getId(), file.getId(), FileType.IMAGE_INFO, "{}"); fileStatusPersistenceService.updateProcessingStatus(file.getId(), ProcessingStatus.PROCESSED); - var addRedaction = manualRedactionClient.addAddRedaction(dossier.getId(), + var userId = userProvider.getUserId(); + fileClient.setStatusUnderReview(dossier.getId(), file.getId(), userId); + + var addRedaction = manualRedactionClient.requestBulkAddRedaction(dossier.getId(), file.getId(), - Collections.singletonList(AddRedactionRequest.builder() + Set.of(AddRedactionRequest.builder() .positions(List.of(Rectangle.builder().topLeftY(1).topLeftX(1).height(1).width(1).build())) .section("section test") .addToDictionary(true) .addToDossierDictionary(false) - .status(AnnotationStatus.APPROVED) - .typeId(type.getId()) - .user("user") + .type(type.getType()) .reason("1") .value("test") .legalBasis("1") .rectangle(true) - .textAfter("Text After") - .textBefore("Text Before") .sourceId("SourceId") .build())).iterator().next(); var loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); - assertThat(loadedFile.getProcessingStatus()).isEqualTo(ProcessingStatus.PROCESSING); + assertThat(loadedFile.getProcessingStatus()).isEqualTo(ProcessingStatus.PROCESSED); } @@ -212,105 +221,98 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { var type = typeProvider.testAndProvideType(dossierTemplate, null, "manual"); - var comment = manualRedactionClient.addComment(dossier.getId(), file.getId(), "1", CommentRequest.builder().text("test").user("1").build()); - var loadedComment = manualRedactionClient.getComment(comment.getId()); - assertThat(loadedComment.getText()).isEqualTo("test"); + var userId = userProvider.getUserId(); try { - manualRedactionClient.addAddRedaction(dossier.getId(), + manualRedactionClient.addRedactionBulk(dossier.getId(), file.getId(), - Collections.singletonList(AddRedactionRequest.builder() + Set.of(AddRedactionRequest.builder() .positions(List.of(Rectangle.builder().page(100).topLeftY(1).topLeftX(1).height(1).width(1).build())) .section("section test") .addToDictionary(true) .addToDossierDictionary(false) - .status(AnnotationStatus.REQUESTED) - .typeId(type.getId()) - .user("user") + .type(type.getType()) .reason("1") .value("test") .legalBasis("1") .rectangle(true) - .textAfter("Text After") - .textBefore("Text Before") .sourceId("SourceId") .build())); } catch (FeignException e) { assertThat(e.status()).isEqualTo(400); } - var addRedaction = manualRedactionClient.addAddRedaction(dossier.getId(), + var addRedaction = manualRedactionClient.addRedactionBulk(dossier.getId(), file.getId(), - Collections.singletonList(AddRedactionRequest.builder() + Set.of(AddRedactionRequest.builder() .positions(List.of(Rectangle.builder().topLeftY(1).topLeftX(1).height(1).width(1).build())) .section("section test") .addToDictionary(true) .addToDossierDictionary(false) - .status(AnnotationStatus.REQUESTED) - .typeId(type.getId()) - .user("user") + .type(type.getType()) .reason("1") .value("test") .legalBasis("1") .rectangle(true) - .textAfter("Text After") - .textBefore("Text Before") .sourceId("SourceId") .build())).iterator().next(); - var loadedAddRedaction = manualRedactionClient.getAddRedaction(file.getId(), addRedaction.getAnnotationId()); - assertThat(loadedAddRedaction.getUser()).isEqualTo("user"); + + var loadedAddRedaction = manualRedactionClient.getManualRedactions(file.getDossierId(), file.getFileId()).getEntriesToAdd().iterator().next(); + assertThat(loadedAddRedaction.getUser()).isEqualTo(userId); assertThat(loadedAddRedaction.getType()).contains("manual"); assertThat(loadedAddRedaction.getSection()).contains("section test"); assertThat(loadedAddRedaction.isRectangle()).isEqualTo(true); - assertThat(loadedAddRedaction.getTextAfter()).isEqualTo("Text After"); - assertThat(loadedAddRedaction.getTextBefore()).isEqualTo("Text Before"); assertThat(loadedAddRedaction.getSourceId()).isEqualTo("SourceId"); - manualRedactionClient.updateAddRedactionStatus(dossier.getId(), - file.getId(), - UpdateRedactionRequest.builder().annotationIds(List.of(addRedaction.getAnnotationId())).annotationStatus(AnnotationStatus.APPROVED).build()); - loadedAddRedaction = manualRedactionClient.getAddRedaction(file.getId(), addRedaction.getAnnotationId()); + fileClient.setStatusUnderReview(dossier.getId(), file.getId(), userId); + + manualRedactionClient.approveRequestBulk(dossier.getId(), file.getId(), Set.of(addRedaction.getAnnotationId())); + loadedAddRedaction = manualRedactionClient.getManualRedactions(file.getDossierId(), file.getFileId()) + .getEntriesToAdd() + .stream() + .filter(a -> a.getAnnotationId().equalsIgnoreCase(addRedaction.getAnnotationId())) + .findAny() + .get(); assertThat(loadedAddRedaction.getStatus()).isEqualTo(AnnotationStatus.APPROVED); - manualRedactionClient.updateAddRedactionStatus(dossier.getId(), - file.getId(), - UpdateRedactionRequest.builder().annotationIds(List.of(addRedaction.getAnnotationId())).annotationStatus(AnnotationStatus.DECLINED).build()); - loadedAddRedaction = manualRedactionClient.getAddRedaction(file.getId(), addRedaction.getAnnotationId()); + manualRedactionClient.declineRequestBulk(dossier.getId(), file.getId(), Set.of(addRedaction.getAnnotationId())); + loadedAddRedaction = manualRedactionClient.getManualRedactions(file.getDossierId(), file.getFileId()) + .getEntriesToAdd() + .stream() + .filter(a -> a.getAnnotationId().equalsIgnoreCase(addRedaction.getAnnotationId())) + .findAny() + .get(); assertThat(loadedAddRedaction.getStatus()).isEqualTo(AnnotationStatus.DECLINED); + fileClient.setStatusUnderReview(dossier.getId(), file.getId(), userId); - var addRedaction2 = manualRedactionClient.addAddRedaction(dossier.getId(), + var addRedaction2 = manualRedactionClient.requestBulkAddRedaction(dossier.getId(), file.getId(), - Collections.singletonList(AddRedactionRequest.builder() + Set.of(AddRedactionRequest.builder() .addToDictionary(true) .addToDossierDictionary(false) - .status(AnnotationStatus.APPROVED) - .typeId(type.getId()) - .user("user") + .type(type.getType()) .reason("1") .value("test") .legalBasis("1") - .comment("comment") + .comment(new AddCommentRequest("comment")) .section("section2") .build())).iterator().next(); - manualRedactionClient.updateAddRedactionStatus(dossier.getId(), - file.getId(), - UpdateRedactionRequest.builder().annotationIds(List.of(addRedaction2.getAnnotationId())).annotationStatus(AnnotationStatus.REQUESTED).build()); - var loadedAddRedaction2 = manualRedactionClient.getAddRedaction(file.getId(), addRedaction2.getAnnotationId()); - assertThat(loadedAddRedaction2.getStatus()).isEqualTo(AnnotationStatus.REQUESTED); + manualRedactionClient.declineRequestBulk(dossier.getId(), file.getId(), Set.of(addRedaction2.getAnnotationId())); + var loadedAddRedaction2 = manualRedactionClient.getManualRedactions(file.getDossierId(), file.getFileId()) + .getEntriesToAdd() + .stream() + .filter(a -> a.getAnnotationId().equalsIgnoreCase(addRedaction2.getAnnotationId())) + .findAny() + .get(); + assertThat(loadedAddRedaction2.getStatus()).isEqualTo(AnnotationStatus.DECLINED); assertThat(loadedAddRedaction2.isAddToDossierDictionary()).isEqualTo(false); assertThat(loadedAddRedaction2.isAddToDictionary()).isEqualTo(true); assertThat(loadedAddRedaction2.getSection()).contains("section2"); - var removeRedaction = manualRedactionClient.addRemoveRedaction(dossier.getId(), + var removeRedaction = manualRedactionClient.requestBulkRemoveRedaction(dossier.getId(), file.getId(), - List.of(RemoveRedactionRequest.builder() - .annotationId(addRedaction.getAnnotationId()) - .comment("comment") - .status(AnnotationStatus.REQUESTED) - .user("test") - .removeFromDictionary(false) - .build())).get(0); + Set.of(RemoveRedactionRequest.builder().annotationId(addRedaction.getAnnotationId()).comment("comment").removeFromDictionary(false).build())).get(0); var redactionLog = new RedactionLog(1, 1, @@ -322,185 +324,188 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { 0); fileManagementStorageService.storeJSONObject(dossier.getId(), file.getId(), FileType.REDACTION_LOG, redactionLog); - when(redactionClient.getRedactionLog(Mockito.any())).thenReturn(redactionLog); - manualRedactionClient.updateRemoveRedactionStatus(dossier.getId(), - file.getId(), - UpdateRedactionRequest.builder().annotationIds(List.of(removeRedaction.getAnnotationId())).annotationStatus(AnnotationStatus.REQUESTED).build()); - var loadedRemoveRedaction = manualRedactionClient.getRemoveRedaction(file.getId(), removeRedaction.getAnnotationId()); + when(redactionLogMergeService.provideRedactionLog(Mockito.any())).thenReturn(redactionLog); + manualRedactionClient.approveRequestBulk(dossier.getId(), file.getId(), Set.of(removeRedaction.getAnnotationId())); + + var loadedRemoveRedaction = manualRedactionClient.getManualRedactions(file.getDossierId(), file.getFileId()) + .getIdsToRemove() + .stream() + .filter(a -> a.getAnnotationId().equalsIgnoreCase(removeRedaction.getAnnotationId())) + .findAny() + .get(); assertThat(loadedRemoveRedaction.isRemoveFromDictionary()).isEqualTo(false); assertThat(loadedRemoveRedaction.getSoftDeletedTime()).isNull(); - - manualRedactionClient.updateRemoveRedactionStatus(dossier.getId(), - file.getId(), - UpdateRedactionRequest.builder().annotationIds(List.of(removeRedaction.getAnnotationId())).annotationStatus(AnnotationStatus.APPROVED).build()); - loadedRemoveRedaction = manualRedactionClient.getRemoveRedaction(file.getId(), addRedaction.getAnnotationId()); assertThat(loadedRemoveRedaction.getStatus()).isEqualTo(AnnotationStatus.APPROVED); - manualRedactionClient.updateRemoveRedactionStatus(dossier.getId(), - file.getId(), - UpdateRedactionRequest.builder().annotationIds(List.of(removeRedaction.getAnnotationId())).annotationStatus(AnnotationStatus.DECLINED).build()); - loadedRemoveRedaction = manualRedactionClient.getRemoveRedaction(file.getId(), addRedaction.getAnnotationId()); + manualRedactionClient.declineRequestBulk(dossier.getId(), file.getId(), Set.of(removeRedaction.getAnnotationId())); + loadedRemoveRedaction = manualRedactionClient.getManualRedactions(file.getDossierId(), file.getFileId()) + .getIdsToRemove() + .stream() + .filter(a -> a.getAnnotationId().equalsIgnoreCase(removeRedaction.getAnnotationId())) + .findAny() + .get(); assertThat(loadedRemoveRedaction.getStatus()).isEqualTo(AnnotationStatus.DECLINED); var redLog = new RedactionLog(1, 1, List.of(RedactionLogEntry.builder().id("annotationId").type("manual").value("value entry").build()), null, 0, 0, 0, 0); fileManagementStorageService.storeJSONObject(dossier.getId(), file.getId(), FileType.REDACTION_LOG, redLog); - when(redactionClient.getRedactionLog(Mockito.any())).thenReturn(redLog); - var removeRedaction2 = manualRedactionClient.addRemoveRedaction(dossier.getId(), + when(redactionLogMergeService.provideRedactionLog(Mockito.any())).thenReturn(redLog); + var removeRedaction2 = manualRedactionClient.requestBulkRemoveRedaction(dossier.getId(), file.getId(), - List.of(RemoveRedactionRequest.builder() - .annotationId("annotationId") - .comment("comment") - .status(AnnotationStatus.APPROVED) - .user("test") - .removeFromDictionary(true) - .build())).get(0); - manualRedactionClient.updateRemoveRedactionStatus(dossier.getId(), - file.getId(), - UpdateRedactionRequest.builder().annotationIds(List.of(removeRedaction2.getAnnotationId())).annotationStatus(AnnotationStatus.REQUESTED).build()); - var loadedRemoveRedaction2 = manualRedactionClient.getRemoveRedaction(file.getId(), removeRedaction2.getAnnotationId()); - assertThat(loadedRemoveRedaction2.getStatus()).isEqualTo(AnnotationStatus.REQUESTED); - assertThat(dictionaryClient.getDictionaryForType(type.getId(), null).getEntries().isEmpty()); + Set.of(RemoveRedactionRequest.builder().annotationId("annotationId").comment("comment").removeFromDictionary(true).build())).get(0); + + manualRedactionClient.approveRequestBulk(dossier.getId(), file.getId(), Set.of(removeRedaction2.getAnnotationId())); + + var loadedRemoveRedaction2 = manualRedactionClient.getManualRedactions(file.getDossierId(), file.getFileId()) + .getIdsToRemove() + .stream() + .filter(a -> a.getAnnotationId().equalsIgnoreCase(removeRedaction2.getAnnotationId())) + .findAny() + .get(); + + assertThat(loadedRemoveRedaction2.getStatus()).isEqualTo(AnnotationStatus.APPROVED); + assertThat(dictionaryClient.getDictionaryForType(type.getType(), type.getDossierTemplateId(), null).getEntries().isEmpty()); assertThat(loadedRemoveRedaction2.isRemoveFromDictionary()).isEqualTo(true); - manualRedactionClient.updateRemoveRedactionStatus(dossier.getId(), - file.getId(), - UpdateRedactionRequest.builder().annotationIds(List.of(removeRedaction2.getAnnotationId())).annotationStatus(AnnotationStatus.APPROVED).build()); - loadedRemoveRedaction2 = manualRedactionClient.getRemoveRedaction(file.getId(), removeRedaction2.getAnnotationId()); - assertThat(loadedRemoveRedaction2.getStatus()).isEqualTo(AnnotationStatus.APPROVED); + manualRedactionClient.declineRequestBulk(dossier.getId(), file.getId(), Set.of(removeRedaction2.getAnnotationId())); + loadedRemoveRedaction2 = manualRedactionClient.getManualRedactions(file.getDossierId(), file.getFileId()) + .getIdsToRemove() + .stream() + .filter(a -> a.getAnnotationId().equalsIgnoreCase(removeRedaction2.getAnnotationId())) + .findAny() + .get(); + assertThat(loadedRemoveRedaction2.getStatus()).isEqualTo(AnnotationStatus.DECLINED); - manualRedactionClient.updateRemoveRedactionStatus(dossier.getId(), + var forceRedaction = manualRedactionClient.requestBulkForceRedaction(dossier.getId(), file.getId(), - UpdateRedactionRequest.builder().annotationIds(List.of(removeRedaction2.getAnnotationId())).annotationStatus(AnnotationStatus.REQUESTED).build()); - loadedRemoveRedaction2 = manualRedactionClient.getRemoveRedaction(file.getId(), removeRedaction2.getAnnotationId()); - assertThat(loadedRemoveRedaction2.getStatus()).isEqualTo(AnnotationStatus.REQUESTED); + Set.of(ForceRedactionRequest.builder().annotationId(addRedaction.getAnnotationId()).comment("comment").legalBasis("1").build())).get(0); - var forceRedaction = manualRedactionClient.addForceRedaction(dossier.getId(), - file.getId(), - List.of(ForceRedactionRequest.builder() - .annotationId(addRedaction.getAnnotationId()) - .comment("comment") - .status(AnnotationStatus.REQUESTED) - .user("test") - .legalBasis("1") - .build())).get(0); - var loadedForceRedaction = manualRedactionClient.getForceRedaction(file.getId(), forceRedaction.getAnnotationId()); + var loadedForceRedaction = manualRedactionClient.getManualRedactions(file.getDossierId(), file.getFileId()) + .getForceRedactions() + .stream() + .filter(a -> a.getAnnotationId().equalsIgnoreCase(forceRedaction.getAnnotationId())) + .findAny() + .get(); assertThat(loadedForceRedaction.getLegalBasis()).isEqualTo("1"); - assertThat(loadedForceRedaction.getUser()).isEqualTo("test"); + assertThat(loadedForceRedaction.getUser()).isEqualTo(userId); assertThat(loadedForceRedaction.getAnnotationId()).isEqualTo(loadedForceRedaction.getAnnotationId()); assertThat(loadedForceRedaction.getFileId()).isEqualTo(loadedForceRedaction.getFileId()); - manualRedactionClient.updateForceRedactionStatus(dossier.getId(), - file.getId(), - UpdateRedactionRequest.builder().annotationIds(List.of(forceRedaction.getAnnotationId())).annotationStatus(AnnotationStatus.APPROVED).build()); - loadedForceRedaction = manualRedactionClient.getForceRedaction(file.getId(), addRedaction.getAnnotationId()); + manualRedactionClient.approveRequestBulk(dossier.getId(), file.getId(), Set.of(forceRedaction.getAnnotationId())); + loadedForceRedaction = manualRedactionClient.getManualRedactions(file.getDossierId(), file.getFileId()) + .getForceRedactions() + .stream() + .filter(a -> a.getAnnotationId().equalsIgnoreCase(forceRedaction.getAnnotationId())) + .findAny() + .get(); assertThat(loadedForceRedaction.getStatus()).isEqualTo(AnnotationStatus.APPROVED); - manualRedactionClient.updateForceRedactionStatus(dossier.getId(), - file.getId(), - UpdateRedactionRequest.builder().annotationIds(List.of(forceRedaction.getAnnotationId())).annotationStatus(AnnotationStatus.DECLINED).build()); - loadedForceRedaction = manualRedactionClient.getForceRedaction(file.getId(), addRedaction.getAnnotationId()); + manualRedactionClient.declineRequestBulk(dossier.getId(), file.getId(), Set.of(forceRedaction.getAnnotationId())); + loadedForceRedaction = manualRedactionClient.getManualRedactions(file.getDossierId(), file.getFileId()) + .getForceRedactions() + .stream() + .filter(a -> a.getAnnotationId().equalsIgnoreCase(forceRedaction.getAnnotationId())) + .findAny() + .get(); assertThat(loadedForceRedaction.getStatus()).isEqualTo(AnnotationStatus.DECLINED); - var legalBasisChange = manualRedactionClient.addLegalBasisChange(dossier.getId(), + var legalBasisChange = manualRedactionClient.requestBulkLegalBasisChange(dossier.getId(), file.getId(), - List.of(LegalBasisChangeRequest.builder() - .annotationId(addRedaction.getAnnotationId()) - .comment("comment") - .status(AnnotationStatus.REQUESTED) - .user("test") - .legalBasis("1") - .build())).get(0); - var loadedLegalBasisChange = manualRedactionClient.getLegalBasisChange(file.getId(), addRedaction.getAnnotationId()); + Set.of(LegalBasisChangeRequest.builder().annotationId(addRedaction.getAnnotationId()).comment("comment").legalBasis("1").build())).get(0); + + var loadedLegalBasisChange = manualRedactionClient.getManualRedactions(file.getDossierId(), file.getFileId()) + .getLegalBasisChanges() + .stream() + .filter(a -> a.getAnnotationId().equalsIgnoreCase(legalBasisChange.getAnnotationId())) + .findAny() + .get(); assertThat(loadedLegalBasisChange.getAnnotationId()).isEqualTo(legalBasisChange.getAnnotationId()); - assertThat(loadedLegalBasisChange.getUser()).isEqualTo("test"); + assertThat(loadedLegalBasisChange.getUser()).isEqualTo(userId); assertThat(loadedLegalBasisChange.getLegalBasis()).isEqualTo("1"); - manualRedactionClient.updateLegalBasisChangeStatus(dossier.getId(), - file.getId(), - UpdateRedactionRequest.builder().annotationIds(List.of(legalBasisChange.getAnnotationId())).annotationStatus(AnnotationStatus.APPROVED).build()); - loadedLegalBasisChange = manualRedactionClient.getLegalBasisChange(file.getId(), addRedaction.getAnnotationId()); + manualRedactionClient.approveRequestBulk(dossier.getId(), file.getId(), Set.of(loadedLegalBasisChange.getAnnotationId())); + loadedLegalBasisChange = manualRedactionClient.getManualRedactions(file.getDossierId(), file.getFileId()) + .getLegalBasisChanges() + .stream() + .filter(a -> a.getAnnotationId().equalsIgnoreCase(legalBasisChange.getAnnotationId())) + .findAny() + .get(); assertThat(loadedLegalBasisChange.getStatus()).isEqualTo(AnnotationStatus.APPROVED); - manualRedactionClient.updateLegalBasisChangeStatus(dossier.getId(), - file.getId(), - UpdateRedactionRequest.builder().annotationIds(List.of(legalBasisChange.getAnnotationId())).annotationStatus(AnnotationStatus.DECLINED).build()); - loadedLegalBasisChange = manualRedactionClient.getLegalBasisChange(file.getId(), addRedaction.getAnnotationId()); + manualRedactionClient.declineRequestBulk(dossier.getId(), file.getId(), Set.of(loadedLegalBasisChange.getAnnotationId())); + loadedLegalBasisChange = manualRedactionClient.getManualRedactions(file.getDossierId(), file.getFileId()) + .getLegalBasisChanges() + .stream() + .filter(a -> a.getAnnotationId().equalsIgnoreCase(legalBasisChange.getAnnotationId())) + .findAny() + .get(); assertThat(loadedLegalBasisChange.getStatus()).isEqualTo(AnnotationStatus.DECLINED); - var imageRecategorization = manualRedactionClient.addImageRecategorization(dossier.getId(), + var imageRecategorization = manualRedactionClient.requestBulkImageRecategorization(dossier.getId(), file.getId(), - List.of(ImageRecategorizationRequest.builder() - .annotationId(addRedaction.getAnnotationId()) - .comment("comment") - .status(AnnotationStatus.REQUESTED) - .user("test") - .typeId("new-type:id") - .build())).get(0); - var loadedImageRecategorization = manualRedactionClient.getImageRecategorization(file.getId(), addRedaction.getAnnotationId()); + Set.of(ImageRecategorizationRequest.builder().annotationId(addRedaction.getAnnotationId()).comment("comment").type("new-type").build())).get(0); + + var loadedImageRecategorization = manualRedactionClient.getManualRedactions(file.getDossierId(), file.getFileId()) + .getImageRecategorization() + .stream() + .filter(a -> a.getAnnotationId().equalsIgnoreCase(legalBasisChange.getAnnotationId())) + .findAny() + .get(); assertThat(loadedImageRecategorization.getAnnotationId()).isEqualTo(imageRecategorization.getAnnotationId()); - manualRedactionClient.updateImageRecategorizationStatus(dossier.getId(), - file.getId(), - UpdateRedactionRequest.builder().annotationIds(List.of(imageRecategorization.getAnnotationId())).annotationStatus(AnnotationStatus.APPROVED).build()); - loadedImageRecategorization = manualRedactionClient.getImageRecategorization(file.getId(), addRedaction.getAnnotationId()); + manualRedactionClient.approveRequestBulk(dossier.getId(), file.getId(), Set.of(imageRecategorization.getAnnotationId())); + loadedImageRecategorization = manualRedactionClient.getManualRedactions(file.getDossierId(), file.getFileId()) + .getImageRecategorization() + .stream() + .filter(a -> a.getAnnotationId().equalsIgnoreCase(legalBasisChange.getAnnotationId())) + .findAny() + .get(); assertThat(loadedImageRecategorization.getStatus()).isEqualTo(AnnotationStatus.APPROVED); - manualRedactionClient.updateImageRecategorizationStatus(dossier.getId(), - file.getId(), - UpdateRedactionRequest.builder().annotationIds(List.of(imageRecategorization.getAnnotationId())).annotationStatus(AnnotationStatus.DECLINED).build()); - loadedImageRecategorization = manualRedactionClient.getImageRecategorization(file.getId(), addRedaction.getAnnotationId()); + manualRedactionClient.declineRequestBulk(dossier.getId(), file.getId(), Set.of(imageRecategorization.getAnnotationId())); + loadedImageRecategorization = manualRedactionClient.getManualRedactions(file.getDossierId(), file.getFileId()) + .getImageRecategorization() + .stream() + .filter(a -> a.getAnnotationId().equalsIgnoreCase(legalBasisChange.getAnnotationId())) + .findAny() + .get(); assertThat(loadedImageRecategorization.getStatus()).isEqualTo(AnnotationStatus.DECLINED); - var imageRecategorization2 = manualRedactionClient.addImageRecategorization(dossier.getId(), + var resizeRedaction = manualRedactionClient.requestBulkResizeRedaction(dossier.getId(), file.getId(), - List.of(ImageRecategorizationRequest.builder() - .annotationId(addRedaction2.getAnnotationId()) - .comment("comment") - .status(AnnotationStatus.APPROVED) - .user("test") - .typeId("new-type:id") - .build())).get(0); - var loadedImageRecategorization2 = manualRedactionClient.getImageRecategorization(file.getId(), imageRecategorization2.getAnnotationId()); - assertThat(loadedImageRecategorization2.getStatus()).isEqualTo(AnnotationStatus.APPROVED); - - manualRedactionClient.updateImageRecategorizationStatus(dossier.getId(), - file.getId(), - UpdateRedactionRequest.builder().annotationIds(List.of(imageRecategorization2.getAnnotationId())).annotationStatus(AnnotationStatus.REQUESTED).build()); - loadedImageRecategorization2 = manualRedactionClient.getImageRecategorization(file.getId(), imageRecategorization2.getAnnotationId()); - assertThat(loadedImageRecategorization2.getStatus()).isEqualTo(AnnotationStatus.REQUESTED); - - var resizeRedaction = manualRedactionClient.addResizeRedaction(dossier.getId(), - file.getId(), - List.of(ResizeRedactionRequest.builder() + Set.of(ResizeRedactionRequest.builder() .annotationId(addRedaction.getAnnotationId()) - .page(1) .comment("comment") - .status(AnnotationStatus.REQUESTED) .positions(List.of(Rectangle.builder().topLeftY(2).topLeftX(2).height(2).width(2).build())) - .user("test") .value("some value") - .textAfter("Text After") - .textBefore("Text Before") .build())).get(0); - var loadedResizeRedaction = manualRedactionClient.getResizeRedaction(file.getId(), resizeRedaction.getAnnotationId()); + var loadedResizeRedaction = manualRedactionClient.getManualRedactions(file.getDossierId(), file.getFileId()) + .getResizeRedactions() + .stream() + .filter(a -> a.getAnnotationId().equalsIgnoreCase(legalBasisChange.getAnnotationId())) + .findAny() + .get(); assertThat(loadedResizeRedaction.getStatus()).isEqualTo(AnnotationStatus.REQUESTED); - assertThat(loadedResizeRedaction.getUser()).isEqualTo("test"); + assertThat(loadedResizeRedaction.getUser()).isEqualTo(userId); assertThat(loadedResizeRedaction.getPositions()).isNotEmpty(); assertThat(loadedResizeRedaction.getValue()).isEqualTo("some value"); - assertThat(loadedResizeRedaction.getTextAfter()).isEqualTo("Text After"); - assertThat(loadedResizeRedaction.getTextBefore()).isEqualTo("Text Before"); - manualRedactionClient.updateResizeRedactionStatus(dossier.getId(), - file.getId(), - UpdateRedactionRequest.builder().annotationIds(List.of(resizeRedaction.getAnnotationId())).annotationStatus(AnnotationStatus.APPROVED).build()); - loadedResizeRedaction = manualRedactionClient.getResizeRedaction(file.getId(), resizeRedaction.getAnnotationId()); + manualRedactionClient.approveRequestBulk(dossier.getId(), file.getId(), Set.of(loadedResizeRedaction.getAnnotationId())); + loadedResizeRedaction = manualRedactionClient.getManualRedactions(file.getDossierId(), file.getFileId()) + .getResizeRedactions() + .stream() + .filter(a -> a.getAnnotationId().equalsIgnoreCase(legalBasisChange.getAnnotationId())) + .findAny() + .get(); assertThat(loadedResizeRedaction.getStatus()).isEqualTo(AnnotationStatus.APPROVED); - manualRedactionClient.updateResizeRedactionStatus(dossier.getId(), - file.getId(), - UpdateRedactionRequest.builder().annotationIds(List.of(resizeRedaction.getAnnotationId())).annotationStatus(AnnotationStatus.DECLINED).build()); - loadedResizeRedaction = manualRedactionClient.getResizeRedaction(file.getId(), resizeRedaction.getAnnotationId()); + manualRedactionClient.declineRequestBulk(dossier.getId(), file.getId(), Set.of(loadedResizeRedaction.getAnnotationId())); + loadedResizeRedaction = manualRedactionClient.getManualRedactions(file.getDossierId(), file.getFileId()) + .getResizeRedactions() + .stream() + .filter(a -> a.getAnnotationId().equalsIgnoreCase(legalBasisChange.getAnnotationId())) + .findAny() + .get(); assertThat(loadedResizeRedaction.getStatus()).isEqualTo(AnnotationStatus.DECLINED); ManualRedactions manualRedactions = manualRedactionClient.getManualRedactions(dossier.getId(), file.getId()); @@ -512,85 +517,17 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { assertThat(manualRedactions.getComments()).isNotEmpty(); assertThat(manualRedactions.getResizeRedactions()).isNotEmpty(); - List annotationIds = manualRedactions.getForceRedactions().stream().map(f -> f.getAnnotationId()).collect(Collectors.toList()); - manualRedactionClient.deleteForceRedaction(dossier.getId(), file.getId(), annotationIds); -// manualRedactions.getForceRedactions() -// .forEach(e -> manualRedactionClient.deleteForceRedaction(dossier.getId(), file.getId(), List.of(e.getAnnotationId()))); - manualRedactions.getLegalBasisChanges().forEach(e -> manualRedactionClient.deleteLegalBasisChange(dossier.getId(), file.getId(), List.of(e.getAnnotationId()))); - manualRedactions.getEntriesToAdd().forEach(e -> manualRedactionClient.deleteAddRedaction(dossier.getId(), file.getId(), List.of(e.getAnnotationId()))); - manualRedactions.getIdsToRemove().forEach(e -> manualRedactionClient.deleteRemoveRedaction(dossier.getId(), file.getId(), List.of(e.getAnnotationId()))); - manualRedactions.getImageRecategorization().forEach(e -> manualRedactionClient.deleteImageRecategorization(dossier.getId(), file.getId(), List.of(e.getAnnotationId()))); - manualRedactions.getResizeRedactions().forEach(e -> manualRedactionClient.deleteResizeRedaction(dossier.getId(), file.getId(), List.of(e.getAnnotationId()))); + manualRedactions.getForceRedactions().forEach(e -> manualRedactionClient.undo(dossier.getId(), file.getId(), Set.of(e.getAnnotationId()))); + manualRedactions.getLegalBasisChanges().forEach(e -> manualRedactionClient.undo(dossier.getId(), file.getId(), Set.of(e.getAnnotationId()))); + manualRedactions.getEntriesToAdd().forEach(e -> manualRedactionClient.undo(dossier.getId(), file.getId(), Set.of(e.getAnnotationId()))); + manualRedactions.getIdsToRemove().forEach(e -> manualRedactionClient.undo(dossier.getId(), file.getId(), Set.of(e.getAnnotationId()))); + manualRedactions.getImageRecategorization().forEach(e -> manualRedactionClient.undo(dossier.getId(), file.getId(), Set.of(e.getAnnotationId()))); + manualRedactions.getResizeRedactions().forEach(e -> manualRedactionClient.undo(dossier.getId(), file.getId(), Set.of(e.getAnnotationId()))); - manualRedactions.getComments().forEach((key, value) -> value.forEach(c -> manualRedactionClient.deleteComment(file.getId(), List.of(c.getId())))); + manualRedactions.getComments() + .forEach((key, value) -> value.forEach(c -> manualRedactionClient.undoComment(dossier.getId(), file.getId(), c.getAnnotationId(), String.valueOf(c.getId())))); - var forceRedaction2 = manualRedactionClient.addForceRedaction(dossier.getId(), - file.getId(), - List.of(ForceRedactionRequest.builder() - .annotationId(addRedaction2.getAnnotationId()) - .comment("comment") - .status(AnnotationStatus.APPROVED) - .user("test") - .legalBasis("1") - .build())).get(0); - var loadedForceRedaction2 = manualRedactionClient.getForceRedaction(file.getId(), forceRedaction2.getAnnotationId()); - assertThat(loadedForceRedaction2.getStatus()).isEqualTo(AnnotationStatus.APPROVED); - assertThat(loadedForceRedaction2.getProcessedDate()).isNull(); - - manualRedactionClient.updateForceRedactionStatus(dossier.getId(), - file.getId(), - UpdateRedactionRequest.builder().annotationIds(List.of(forceRedaction2.getAnnotationId())).annotationStatus(AnnotationStatus.REQUESTED).build()); - loadedForceRedaction2 = manualRedactionClient.getForceRedaction(file.getId(), forceRedaction2.getAnnotationId()); - assertThat(loadedForceRedaction2.getStatus()).isEqualTo(AnnotationStatus.REQUESTED); - - manualRedactions = manualRedactionClient.getManualRedactions(dossier.getId(), file.getId()); - manualRedactions.getForceRedactions().forEach(e -> manualRedactionClient.deleteForceRedaction(dossier.getId(), file.getId(), List.of(e.getAnnotationId()))); - - var legalBasisChange2 = manualRedactionClient.addLegalBasisChange(dossier.getId(), - file.getId(), - List.of(LegalBasisChangeRequest.builder() - .annotationId(addRedaction2.getAnnotationId()) - .comment("comment") - .status(AnnotationStatus.APPROVED) - .user("test") - .legalBasis("1") - .build())).get(0); - var loadedLegalBasisChange2 = manualRedactionClient.getLegalBasisChange(file.getId(), legalBasisChange2.getAnnotationId()); - assertThat(loadedLegalBasisChange2.getStatus()).isEqualTo(AnnotationStatus.APPROVED); - - manualRedactionClient.updateLegalBasisChangeStatus(dossier.getId(), - file.getId(), - UpdateRedactionRequest.builder().annotationIds(List.of(legalBasisChange2.getAnnotationId())).annotationStatus(AnnotationStatus.REQUESTED).build()); - loadedLegalBasisChange2 = manualRedactionClient.getLegalBasisChange(file.getId(), legalBasisChange2.getAnnotationId()); - assertThat(loadedLegalBasisChange2.getStatus()).isEqualTo(AnnotationStatus.REQUESTED); - - manualRedactions = manualRedactionClient.getManualRedactions(dossier.getId(), file.getId()); - manualRedactions.getLegalBasisChanges().forEach(e -> manualRedactionClient.deleteLegalBasisChange(dossier.getId(), file.getId(), List.of(e.getAnnotationId()))); - - var resizeRedaction2 = manualRedactionClient.addResizeRedaction(dossier.getId(), - file.getId(), - List.of(ResizeRedactionRequest.builder() - .annotationId(addRedaction.getAnnotationId()) - .page(1) - .comment("comment") - .status(AnnotationStatus.APPROVED) - .positions(List.of(Rectangle.builder().topLeftY(2).topLeftX(2).height(2).width(2).build())) - .user("test") - .value("some value") - .build())).get(0); - var loadedResizeRedaction2 = manualRedactionClient.getResizeRedaction(file.getId(), resizeRedaction2.getAnnotationId()); - assertThat(loadedResizeRedaction2.getStatus()).isEqualTo(AnnotationStatus.APPROVED); - assertThat(loadedResizeRedaction2.getUser()).isEqualTo("test"); - assertThat(loadedResizeRedaction2.getPositions()).isNotEmpty(); - assertThat(loadedResizeRedaction2.getValue()).isEqualTo("some value"); - - manualRedactionClient.updateResizeRedactionStatus(dossier.getId(), - file.getId(), - UpdateRedactionRequest.builder().annotationIds(List.of(resizeRedaction2.getAnnotationId())).annotationStatus(AnnotationStatus.REQUESTED).build()); - loadedResizeRedaction2 = manualRedactionClient.getResizeRedaction(file.getId(), resizeRedaction2.getAnnotationId()); - assertThat(loadedResizeRedaction2.getStatus()).isEqualTo(AnnotationStatus.REQUESTED); - - MetricValidationUtils.validateMetric(prometheusMeterRegistry,"redactmanager_calculateFlags",1,null); + MetricValidationUtils.validateMetric(prometheusMeterRegistry, "redactmanager_calculateFlags", 1, null); } } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/NotificationPreferencesServiceTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/NotificationPreferencesServiceTest.java index 75428b5c3..02132b5a9 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/NotificationPreferencesServiceTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/NotificationPreferencesServiceTest.java @@ -23,7 +23,7 @@ public class NotificationPreferencesServiceTest extends AbstractPersistenceServe @Autowired NotificationPreferencesPersistenceService notificationPreferencesPersistenceService; - final MultithreadedTestRunner multithreadedTestRunner = new MultithreadedTestRunner(2, 1000); + final MultithreadedTestRunner multithreadedTestRunner = new MultithreadedTestRunner(2, 100); @BeforeEach diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/NotificationPreferencesTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/NotificationPreferencesTest.java index 316a674ed..791c2da89 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/NotificationPreferencesTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/NotificationPreferencesTest.java @@ -11,8 +11,8 @@ import org.springframework.beans.factory.annotation.Autowired; import com.iqser.red.service.peristence.v1.server.integration.client.NotificationPreferencesClient; import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; -import com.iqser.red.service.persistence.service.v1.api.model.notification.EmailNotificationType; -import com.iqser.red.service.persistence.service.v1.api.model.notification.NotificationPreferences; +import com.iqser.red.service.persistence.service.v1.api.shared.model.notification.EmailNotificationType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.notification.NotificationPreferences; import feign.FeignException; @@ -23,13 +23,11 @@ public class NotificationPreferencesTest extends AbstractPersistenceServerServic private static final String DOSSIER_YOU_OWN_NOTIFICATION_2 = "Requests to join dossier"; private static final String DOSSIER_YOU_OWN_NOTIFICATION_3 = "Document status changes"; private static final String DOSSIER_YOU_OWN_NOTIFICATION_4 = "Document is sent for approval"; - - @Autowired - private NotificationPreferencesClient notificationPreferencesClient; - - private NotificationPreferences notificationPreferences; List inAppNotifications = new ArrayList<>(); List emailNotifications = new ArrayList<>(); + @Autowired + private NotificationPreferencesClient notificationPreferencesClient; + private NotificationPreferences notificationPreferences; @BeforeEach @@ -48,9 +46,9 @@ public class NotificationPreferencesTest extends AbstractPersistenceServerServic @Test public void testNotificationPreferences() { // add notification - notificationPreferencesClient.setNotificationPreferences(USER_ID, notificationPreferences); + notificationPreferencesClient.setNotificationPreferences(notificationPreferences); - NotificationPreferences notificationReceived = notificationPreferencesClient.getNotificationPreferences(USER_ID); + NotificationPreferences notificationReceived = notificationPreferencesClient.getNotificationPreferences(); assertThat(notificationReceived.getEmailNotificationType()).isEqualTo(EmailNotificationType.DAILY); assertThat(notificationReceived.isEmailNotificationsEnabled()).isTrue(); @@ -62,9 +60,9 @@ public class NotificationPreferencesTest extends AbstractPersistenceServerServic notificationPreferences.getInAppNotifications().add(DOSSIER_YOU_OWN_NOTIFICATION_4); notificationPreferences.setEmailNotificationsEnabled(false); - notificationPreferencesClient.setNotificationPreferences(USER_ID, notificationPreferences); + notificationPreferencesClient.setNotificationPreferences(notificationPreferences); - notificationReceived = notificationPreferencesClient.getNotificationPreferences(USER_ID); + notificationReceived = notificationPreferencesClient.getNotificationPreferences(); assertThat(notificationReceived.getEmailNotificationType()).isEqualTo(EmailNotificationType.DAILY); assertThat(notificationReceived.isEmailNotificationsEnabled()).isFalse(); @@ -73,9 +71,9 @@ public class NotificationPreferencesTest extends AbstractPersistenceServerServic assertThat(notificationReceived.getEmailNotifications().size()).isEqualTo(notificationPreferences.getEmailNotifications().size()); // delete notification - notificationPreferencesClient.deleteNotificationPreferences(USER_ID); + notificationPreferencesClient.deleteNotificationPreferences(); try { - notificationReceived = notificationPreferencesClient.getNotificationPreferences(USER_ID); + notificationReceived = notificationPreferencesClient.getNotificationPreferences(); } catch (FeignException e) { assertThat(e.status()).isEqualTo(404); } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/NotificationTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/NotificationTest.java index 2dac99468..0c1fc5b1e 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/NotificationTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/NotificationTest.java @@ -11,12 +11,15 @@ import org.springframework.beans.factory.annotation.Autowired; import com.iqser.red.service.peristence.v1.server.integration.client.NotificationClient; import com.iqser.red.service.peristence.v1.server.integration.client.NotificationPreferencesClient; +import com.iqser.red.service.peristence.v1.server.integration.service.UserProvider; import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; import com.iqser.red.service.peristence.v1.server.integration.utils.MultithreadedTestRunner; -import com.iqser.red.service.persistence.service.v1.api.model.audit.AddNotificationRequest; -import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive; -import com.iqser.red.service.persistence.service.v1.api.model.notification.Notification; -import com.iqser.red.service.persistence.service.v1.api.model.notification.NotificationType; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.NotificationPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; +import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AddNotificationRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; +import com.iqser.red.service.persistence.service.v1.api.shared.model.notification.Notification; +import com.iqser.red.service.persistence.service.v1.api.shared.model.notification.NotificationType; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @@ -31,87 +34,98 @@ public class NotificationTest extends AbstractPersistenceServerServiceTest { @Autowired private NotificationPreferencesClient notificationPreferencesClient; - private final MultithreadedTestRunner multithreadedTestRunner = new MultithreadedTestRunner(2, 1000); + @Autowired + private NotificationPersistenceService notificationPersistenceService; + + @Autowired + private UserProvider userProvider; + + private final MultithreadedTestRunner multithreadedTestRunner = new MultithreadedTestRunner(2, 100); @Test public void testNotificationPreferences() { + + TenantContext.setTenantId("redaction"); + var userId = userProvider.getUserId(); // initialize in app notifications - var preferences = notificationPreferencesClient.getNotificationPreferences("1"); + var preferences = notificationPreferencesClient.getNotificationPreferences(); - notificationClient.addNotification(AddNotificationRequest.builder().notificationType(NotificationType.ASSIGN_REVIEWER.name()).userId("1").build()); + notificationPersistenceService.insertNotification(AddNotificationRequest.builder().notificationType(NotificationType.ASSIGN_REVIEWER.name()).userId(userId).build()); - assertThat(notificationClient.getNotifications("1", true).size()).isEqualTo(1); + assertThat(notificationClient.getNotifications(true).getNotifications().size()).isEqualTo(1); // disable in app notifications preferences.setInAppNotificationsEnabled(false); - notificationPreferencesClient.setNotificationPreferences("1", preferences); - assertThat(notificationClient.getNotifications("1", true).size()).isEqualTo(0); + notificationPreferencesClient.setNotificationPreferences(preferences); + assertThat(notificationClient.getNotifications(true).getNotifications().size()).isEqualTo(0); // re-enable in app notifications preferences.setInAppNotificationsEnabled(true); - notificationPreferencesClient.setNotificationPreferences("1", preferences); - assertThat(notificationClient.getNotifications("1", true).size()).isEqualTo(0); + notificationPreferencesClient.setNotificationPreferences(preferences); + assertThat(notificationClient.getNotifications(true).getNotifications().size()).isEqualTo(0); - notificationClient.addNotification(AddNotificationRequest.builder().notificationType(NotificationType.ASSIGN_REVIEWER.name()).userId("1").build()); - assertThat(notificationClient.getNotifications("1", true).size()).isEqualTo(1); + notificationPersistenceService.insertNotification(AddNotificationRequest.builder().notificationType(NotificationType.ASSIGN_REVIEWER.name()).userId(userId).build()); + assertThat(notificationClient.getNotifications(true).getNotifications().size()).isEqualTo(1); preferences.getInAppNotifications().remove(NotificationType.ASSIGN_REVIEWER.name()); - notificationPreferencesClient.setNotificationPreferences("1", preferences); - assertThat(notificationClient.getNotifications("1", true).size()).isEqualTo(0); + notificationPreferencesClient.setNotificationPreferences(preferences); + assertThat(notificationClient.getNotifications(true).getNotifications().size()).isEqualTo(0); } @Test public void testNotification() { + TenantContext.setTenantId("redaction"); + var userId = userProvider.getUserId(); - notificationClient.addNotification(AddNotificationRequest.builder() + notificationPersistenceService.insertNotification(AddNotificationRequest.builder() .notificationType(NotificationType.ASSIGN_REVIEWER.name()) - .issuerId("1") - .userId("1") + .issuerId(userId) + .userId(userId) .target(Map.of("test", "test")) .build()); var notification = getNotification(); assertThat(notification.getReadDate()).isNull(); - notificationClient.toggleRead("1", Lists.newArrayList(notification.getId()), true); + notificationClient.toggleNotificationRead(Lists.newArrayList(String.valueOf(notification.getId())), true); notification = getNotification(); - var hasNewNotifications = notificationClient.hasNewNotificationsSince("1", JSONPrimitive.of(OffsetDateTime.now().minusHours(1))); + var hasNewNotifications = notificationClient.hasNewNotificationsSince(JSONPrimitive.of(OffsetDateTime.now().minusHours(1))); assertThat(hasNewNotifications.getValue()).isTrue(); assertThat(notification.getReadDate()).isNotNull(); assertThat(notification.getSeenDate()).isNull(); - notificationClient.toggleSeen("1", Lists.newArrayList(notification.getId()), true); + notificationClient.toggleNotificationSeen(Lists.newArrayList(String.valueOf(notification.getId())), true); notification = getNotification(); assertThat(notification.getSeenDate()).isNotNull(); - var currentNotifications = notificationClient.getNotifications("1", false); - assertThat(currentNotifications).isEmpty(); + var currentNotifications = notificationClient.getNotifications(false); + assertThat(currentNotifications.getNotifications()).isEmpty(); - notificationClient.toggleRead("1", Lists.newArrayList(notification.getId()), false); + notificationClient.toggleNotificationRead(Lists.newArrayList(String.valueOf(notification.getId())), false); notification = getNotification(); assertThat(notification.getReadDate()).isNull(); - notificationClient.toggleSeen("1", Lists.newArrayList(notification.getId()), false); + notificationClient.toggleNotificationSeen(Lists.newArrayList(String.valueOf(notification.getId())), false); notification = getNotification(); assertThat(notification.getSeenDate()).isNull(); - notificationClient.softDelete("1", Lists.newArrayList(notification.getId())); - currentNotifications = notificationClient.getNotifications("1", true); - assertThat(currentNotifications).isEmpty(); + notificationClient.delete(Lists.newArrayList(String.valueOf(notification.getId()))); + currentNotifications = notificationClient.getNotifications(true); + assertThat(currentNotifications.getNotifications()).isEmpty(); } private Notification getNotification() { - var currentNotifications = notificationClient.getNotifications("1", true); - assertThat(currentNotifications.size()).isEqualTo(1); + var currentNotifications = notificationClient.getNotifications(true); + assertThat(currentNotifications.getNotifications().size()).isEqualTo(1); - return currentNotifications.iterator().next(); + return currentNotifications.getNotifications().iterator().next(); } @@ -119,9 +133,8 @@ public class NotificationTest extends AbstractPersistenceServerServiceTest { @SneakyThrows public void testNotificationPreferencesConcurrent() { - final String userId = "1"; - Runnable test = () -> notificationPreferencesClient.getNotificationPreferences(userId); - Runnable afterTest = () -> notificationPreferencesClient.deleteNotificationPreferences(userId); + Runnable test = () -> notificationPreferencesClient.getNotificationPreferences(); + Runnable afterTest = () -> notificationPreferencesClient.deleteNotificationPreferences(); var exceptions = multithreadedTestRunner.runMutlithreadedCollectingExceptions(test, afterTest); for (Exception ex : exceptions) { @@ -136,9 +149,8 @@ public class NotificationTest extends AbstractPersistenceServerServiceTest { @SneakyThrows public void testNotificationsConcurrent() { - final String userId = "1"; - Runnable test = () -> notificationClient.getNotifications(userId, false); - Runnable afterTest = () -> notificationPreferencesClient.deleteNotificationPreferences(userId); + Runnable test = () -> notificationClient.getNotifications( false); + Runnable afterTest = () -> notificationPreferencesClient.deleteNotificationPreferences(); var exceptions = multithreadedTestRunner.runMutlithreadedCollectingExceptions(test, afterTest); for (Exception ex : exceptions) { diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ReanalysisTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ReanalysisTest.java index 8a7183f3d..ad05756d0 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ReanalysisTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ReanalysisTest.java @@ -2,6 +2,7 @@ package com.iqser.red.service.peristence.v1.server.integration.tests; import static org.assertj.core.api.Assertions.assertThat; +import java.util.List; import java.util.Set; import org.junit.jupiter.api.Test; @@ -14,8 +15,8 @@ import com.iqser.red.service.peristence.v1.server.integration.service.FileTester import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.FileRepository; import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileModel; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.FileStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.ProcessingStatus; public class ReanalysisTest extends AbstractPersistenceServerServiceTest { @@ -65,7 +66,7 @@ public class ReanalysisTest extends AbstractPersistenceServerServiceTest { assertThat(loadedFile.getProcessingStatus()).isEqualTo(ProcessingStatus.OCR_PROCESSING_QUEUED); resetProcessingStatus(file); - reanalysisClient.reanalyzeFiles(dossier.getId(), Set.of(file.getId()), true); + reanalysisClient.reanalyzeFilesForDossier(dossier.getId(), List.of(file.getId()), true); loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); assertThat(loadedFile.getProcessingStatus()).isEqualTo(ProcessingStatus.FULL_PROCESSING); resetProcessingStatus(file); @@ -78,7 +79,7 @@ public class ReanalysisTest extends AbstractPersistenceServerServiceTest { } - private void resetProcessingStatus(FileModel file) { + private void resetProcessingStatus(FileStatus file) { TenantContext.setTenantId("redaction"); diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/RedactionLogTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/RedactionLogTest.java index 937c02686..9a4977fd1 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/RedactionLogTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/RedactionLogTest.java @@ -11,7 +11,7 @@ import com.iqser.red.service.peristence.v1.server.integration.client.RedactionLo import com.iqser.red.service.peristence.v1.server.integration.service.DossierTesterAndProvider; import com.iqser.red.service.peristence.v1.server.integration.service.FileTesterAndProvider; import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; -import com.iqser.red.service.persistence.service.v1.api.model.redactionlog.FilteredRedactionLogRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.FilteredRedactionLogRequest; public class RedactionLogTest extends AbstractPersistenceServerServiceTest { diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ReduceFileSizeMigrationTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ReduceFileSizeMigrationTest.java index 8161cef97..be0bf53bb 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ReduceFileSizeMigrationTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ReduceFileSizeMigrationTest.java @@ -8,10 +8,10 @@ import org.springframework.core.io.ClassPathResource; import com.fasterxml.jackson.databind.ObjectMapper; import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; -import com.iqser.red.service.peristence.v1.server.migration.migrations.ReduceTextFileSizeMigration10; -import com.iqser.red.service.peristence.v1.server.utils.FileUtils; -import com.iqser.red.service.peristence.v1.server.utils.StorageIdUtils; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileType; +import com.iqser.red.service.persistence.management.v1.processor.migration.migrations.ReduceTextFileSizeMigration10; +import com.iqser.red.service.persistence.management.v1.processor.utils.FileUtils; +import com.iqser.red.service.persistence.management.v1.processor.utils.StorageIdUtils; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; import lombok.SneakyThrows; diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ReportTemplateTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ReportTemplateTest.java index 283286795..fd74e8512 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ReportTemplateTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ReportTemplateTest.java @@ -7,9 +7,9 @@ import org.springframework.beans.factory.annotation.Autowired; import com.iqser.red.service.peristence.v1.server.integration.client.ReportTemplateClient; import com.iqser.red.service.peristence.v1.server.integration.service.DossierTemplateTesterAndProvider; +import com.iqser.red.service.peristence.v1.server.integration.service.ReportTemplateProvider; import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.ReportTemplateUpdateRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.ReportTemplateUploadRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.ReportTemplateUpdateRequest; import feign.FeignException; @@ -21,6 +21,9 @@ public class ReportTemplateTest extends AbstractPersistenceServerServiceTest { @Autowired private ReportTemplateClient reportTemplateClient; + @Autowired + private ReportTemplateProvider reportTemplateProvider; + /* * Upload report, verify it exist and delete afterwards @@ -36,23 +39,17 @@ public class ReportTemplateTest extends AbstractPersistenceServerServiceTest { var availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); assertThat(availableTemplates).isEmpty(); - reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder() - .activeByDefault(true) - .dossierTemplateId(dossierTemplate.getId()) - .multiFileReport(false) - .fileName(fileName) - .template(new byte[]{1, 2, 3, 4}) - .build()); + reportTemplateProvider.provideReportTemplate(dossierTemplate.getDossierTemplateId(), fileName); availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); assertThat(availableTemplates).isNotEmpty(); - var firstTemplate = reportTemplateClient.getReportTemplate(dossierTemplate.getId(), availableTemplates.iterator().next().getTemplateId()); + var firstTemplate = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()).iterator().next(); assertThat(availableTemplates.iterator().next()).isEqualTo(firstTemplate); assertThat(firstTemplate.getFileName()).isEqualTo(fileName); - var download = reportTemplateClient.downloadReportTemplate(firstTemplate.getDossierTemplateId(), firstTemplate.getTemplateId()); - assertThat(download.getFile().length).isEqualTo(4); +// var download = reportTemplateClient.downloadReportTemplate(firstTemplate.getDossierTemplateId(), firstTemplate.getTemplateId()); +// assertThat(download.getFile().length).isEqualTo(4); reportTemplateClient.deleteTemplate(firstTemplate.getDossierTemplateId(), firstTemplate.getTemplateId()); @@ -76,24 +73,15 @@ public class ReportTemplateTest extends AbstractPersistenceServerServiceTest { var availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); assertThat(availableTemplates).isEmpty(); - reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder() - .activeByDefault(true) - .dossierTemplateId(dossierTemplate.getId()) - .multiFileReport(true) - .fileName(fileName) - .template(new byte[]{1, 2, 3, 4}) - .build()); + reportTemplateProvider.provideReportTemplate(dossierTemplate.getDossierTemplateId(), fileName); availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); assertThat(availableTemplates).isNotEmpty(); - var firstTemplate = reportTemplateClient.getReportTemplate(dossierTemplate.getId(), availableTemplates.iterator().next().getTemplateId()); + var firstTemplate = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()).iterator().next(); assertThat(availableTemplates.iterator().next()).isEqualTo(firstTemplate); assertThat(firstTemplate.getFileName()).isEqualTo("report.xlsx"); - var download = reportTemplateClient.downloadReportTemplate(firstTemplate.getDossierTemplateId(), firstTemplate.getTemplateId()); - assertThat(download.getFile().length).isEqualTo(4); - reportTemplateClient.deleteTemplate(firstTemplate.getDossierTemplateId(), firstTemplate.getTemplateId()); availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); @@ -116,38 +104,23 @@ public class ReportTemplateTest extends AbstractPersistenceServerServiceTest { var availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); assertThat(availableTemplates).isEmpty(); - reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder() - .activeByDefault(true) - .dossierTemplateId(dossierTemplate.getId()) - .multiFileReport(false) - .fileName(fileName) - .template(new byte[]{1, 2, 3, 4}) - .build()); + reportTemplateProvider.provideReportTemplate(dossierTemplate.getDossierTemplateId(), fileName); availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); assertThat(availableTemplates).isNotEmpty(); - var firstTemplate = reportTemplateClient.getReportTemplate(dossierTemplate.getId(), availableTemplates.iterator().next().getTemplateId()); + var firstTemplate = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()).iterator().next(); assertThat(availableTemplates.iterator().next()).isEqualTo(firstTemplate); assertThat(firstTemplate.getFileName()).isEqualTo(fileName); - var download = reportTemplateClient.downloadReportTemplate(firstTemplate.getDossierTemplateId(), firstTemplate.getTemplateId()); - assertThat(download.getFile().length).isEqualTo(4); - - reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder() - .activeByDefault(true) - .dossierTemplateId(dossierTemplate.getId()) - .multiFileReport(true) - .fileName(fileName) - .template(new byte[]{1, 2, 3, 4}) - .build()); + reportTemplateProvider.provideReportTemplate(dossierTemplate.getDossierTemplateId(), fileName, "content".getBytes(), true, true); availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); assertThat(availableTemplates).isNotEmpty(); assertThat(availableTemplates.size()).isEqualTo(2); - var secondTemplate = reportTemplateClient.getReportTemplate(dossierTemplate.getId(), availableTemplates.get(1).getTemplateId()); - assertThat(availableTemplates.get(1)).isEqualTo(secondTemplate); + var secondTemplate = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()).iterator().next(); + assertThat(availableTemplates).contains(secondTemplate); assertThat(secondTemplate.getFileName()).isEqualTo("report.xlsx"); } @@ -167,38 +140,23 @@ public class ReportTemplateTest extends AbstractPersistenceServerServiceTest { var availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); assertThat(availableTemplates).isEmpty(); - reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder() - .activeByDefault(true) - .dossierTemplateId(dossierTemplate.getId()) - .multiFileReport(true) - .fileName(fileName) - .template(new byte[]{1, 2, 3, 4}) - .build()); + reportTemplateProvider.provideReportTemplate(dossierTemplate.getDossierTemplateId(), fileName, "content".getBytes(), true, true); availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); assertThat(availableTemplates).isNotEmpty(); - var firstTemplate = reportTemplateClient.getReportTemplate(dossierTemplate.getId(), availableTemplates.iterator().next().getTemplateId()); + var firstTemplate = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()).iterator().next(); assertThat(availableTemplates.iterator().next()).isEqualTo(firstTemplate); assertThat(firstTemplate.getFileName()).isEqualTo("report.xlsx"); - var download = reportTemplateClient.downloadReportTemplate(firstTemplate.getDossierTemplateId(), firstTemplate.getTemplateId()); - assertThat(download.getFile().length).isEqualTo(4); - - reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder() - .activeByDefault(true) - .dossierTemplateId(dossierTemplate.getId()) - .multiFileReport(false) - .fileName(fileName) - .template(new byte[]{1, 2, 3, 4}) - .build()); + reportTemplateProvider.provideReportTemplate(dossierTemplate.getDossierTemplateId(), fileName, "content".getBytes(), false, true); availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); assertThat(availableTemplates).isNotEmpty(); assertThat(availableTemplates.size()).isEqualTo(2); - var secondTemplate = reportTemplateClient.getReportTemplate(dossierTemplate.getId(), availableTemplates.get(1).getTemplateId()); - assertThat(availableTemplates.get(1)).isEqualTo(secondTemplate); + var secondTemplate = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()).iterator().next(); + assertThat(availableTemplates).contains(secondTemplate); assertThat(secondTemplate.getFileName()).isEqualTo(fileName); } @@ -218,18 +176,12 @@ public class ReportTemplateTest extends AbstractPersistenceServerServiceTest { var availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); assertThat(availableTemplates).isEmpty(); - reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder() - .activeByDefault(true) - .dossierTemplateId(dossierTemplate.getId()) - .multiFileReport(true) - .fileName(fileName + fileEnding) - .template(new byte[]{1, 2, 3, 4}) - .build()); + reportTemplateProvider.provideReportTemplate(dossierTemplate.getDossierTemplateId(), fileName + fileEnding, "content".getBytes(), true, true); availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); assertThat(availableTemplates).isNotEmpty(); - var firstTemplate = reportTemplateClient.getReportTemplate(dossierTemplate.getId(), availableTemplates.iterator().next().getTemplateId()); + var firstTemplate = availableTemplates.iterator().next(); assertThat(availableTemplates.iterator().next()).isEqualTo(firstTemplate); assertThat(firstTemplate.getFileName()).isEqualTo(fileName + fileEnding); @@ -246,22 +198,17 @@ public class ReportTemplateTest extends AbstractPersistenceServerServiceTest { String fileEnding = ".docx"; var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); + // Act & Assert // Act & Assert var availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); assertThat(availableTemplates).isEmpty(); - reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder() - .activeByDefault(true) - .dossierTemplateId(dossierTemplate.getId()) - .multiFileReport(true) - .fileName(fileName + fileEnding) - .template(new byte[]{1, 2, 3, 4}) - .build()); + reportTemplateProvider.provideReportTemplate(dossierTemplate.getDossierTemplateId(), fileName + fileEnding, "content".getBytes(), true, true); availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); assertThat(availableTemplates).isNotEmpty(); - var firstTemplate = reportTemplateClient.getReportTemplate(dossierTemplate.getId(), availableTemplates.iterator().next().getTemplateId()); + var firstTemplate = availableTemplates.iterator().next(); assertThat(availableTemplates.iterator().next()).isEqualTo(firstTemplate); assertThat(firstTemplate.getFileName()).isEqualTo(fileName + fileEnding); @@ -278,22 +225,17 @@ public class ReportTemplateTest extends AbstractPersistenceServerServiceTest { String fileEnding = ".fantasyEnding"; var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); + // Act & Assert // Act & Assert var availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); assertThat(availableTemplates).isEmpty(); - reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder() - .activeByDefault(true) - .dossierTemplateId(dossierTemplate.getId()) - .multiFileReport(true) - .fileName(fileName + fileEnding) - .template(new byte[]{1, 2, 3, 4}) - .build()); + reportTemplateProvider.provideReportTemplate(dossierTemplate.getDossierTemplateId(), fileName + fileEnding, "content".getBytes(), true, true); availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); assertThat(availableTemplates).isNotEmpty(); - var firstTemplate = reportTemplateClient.getReportTemplate(dossierTemplate.getId(), availableTemplates.iterator().next().getTemplateId()); + var firstTemplate = availableTemplates.iterator().next(); assertThat(availableTemplates.iterator().next()).isEqualTo(firstTemplate); assertThat(firstTemplate.getFileName()).isEqualTo(fileName + fileEnding); @@ -314,18 +256,12 @@ public class ReportTemplateTest extends AbstractPersistenceServerServiceTest { var availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); assertThat(availableTemplates).isEmpty(); - reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder() - .activeByDefault(true) - .dossierTemplateId(dossierTemplate.getId()) - .multiFileReport(true) - .fileName(fileName + fileEnding) - .template(new byte[]{1, 2, 3, 4}) - .build()); + reportTemplateProvider.provideReportTemplate(dossierTemplate.getDossierTemplateId(), fileName + fileEnding, "content".getBytes(), true, true); availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); assertThat(availableTemplates).isNotEmpty(); - var firstTemplate = reportTemplateClient.getReportTemplate(dossierTemplate.getId(), availableTemplates.iterator().next().getTemplateId()); + var firstTemplate = availableTemplates.iterator().next(); assertThat(availableTemplates.iterator().next()).isEqualTo(firstTemplate); assertThat(firstTemplate.getFileName()).isEqualTo(fileName + fileEnding); @@ -343,18 +279,16 @@ public class ReportTemplateTest extends AbstractPersistenceServerServiceTest { var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); // Act & Assert - reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder() - .activeByDefault(true) - .dossierTemplateId(dossierTemplate.getId()) - .multiFileReport(false) - .fileName(fileName) - .template(new byte[]{1, 2, 3, 4}) - .build()); - + // Act & Assert var availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); + assertThat(availableTemplates).isEmpty(); + + reportTemplateProvider.provideReportTemplate(dossierTemplate.getDossierTemplateId(), fileName, "content".getBytes(), true, true); + + availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); assertThat(availableTemplates).isNotEmpty(); - var firstTemplate = reportTemplateClient.getReportTemplate(dossierTemplate.getId(), availableTemplates.iterator().next().getTemplateId()); + var firstTemplate = availableTemplates.iterator().next(); assertThat(availableTemplates.iterator().next()).isEqualTo(firstTemplate); assertThat(firstTemplate.getFileName()).isEqualTo(fileName); @@ -362,7 +296,7 @@ public class ReportTemplateTest extends AbstractPersistenceServerServiceTest { var updateRequest = new ReportTemplateUpdateRequest(filenameUpdate, true, true); reportTemplateClient.updateTemplate(dossierTemplate.getId(), firstTemplate.getTemplateId(), updateRequest); - var templateUpdated = reportTemplateClient.getReportTemplate(dossierTemplate.getId(), firstTemplate.getTemplateId()); + var templateUpdated = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()).iterator().next(); assertThat(templateUpdated.getFileName()).isEqualTo(filenameUpdate); assertThat(templateUpdated.isMultiFileReport()).isTrue(); assertThat(templateUpdated.isActiveByDefault()).isTrue(); @@ -381,36 +315,16 @@ public class ReportTemplateTest extends AbstractPersistenceServerServiceTest { String fileName = "report.xlsx"; var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); - byte[] templateBytes = new byte[]{1, 2, 3, 4}; - reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder() - .activeByDefault(true) - .dossierTemplateId(dossierTemplate.getId()) - .multiFileReport(false) - .fileName(fileName) - .template(templateBytes) - .build()); + reportTemplateProvider.provideReportTemplate(dossierTemplate.getDossierTemplateId(), fileName, "content".getBytes(), true, true); var availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); String templateId = availableTemplates.get(0).getTemplateId(); - var downloaded = reportTemplateClient.downloadReportTemplate(dossierTemplate.getId(), templateId); - assertThat(downloaded.getFile().equals(templateBytes)); - - byte[] newTemplateBytes = new byte[]{1, 2, 3, 4, 5, 6}; - - reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder() - .activeByDefault(true) - .dossierTemplateId(dossierTemplate.getId()) - .multiFileReport(false) - .fileName(fileName) - .template(newTemplateBytes) - .build()); + reportTemplateProvider.provideReportTemplate(dossierTemplate.getDossierTemplateId(), fileName, "content xyz".getBytes(), true, true); availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); assertThat(availableTemplates.size()).isEqualTo(1); - downloaded = reportTemplateClient.downloadReportTemplate(dossierTemplate.getId(), templateId); - assertThat(downloaded.getFile().equals(newTemplateBytes)); } } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/RulesTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/RulesTest.java index 6ef40d1f9..7ca06a445 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/RulesTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/RulesTest.java @@ -2,13 +2,16 @@ package com.iqser.red.service.peristence.v1.server.integration.tests; import static org.assertj.core.api.Assertions.assertThat; +import java.util.List; + import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import com.iqser.red.service.peristence.v1.server.integration.client.RulesClient; +import com.iqser.red.service.peristence.v1.server.integration.client.VersionClient; import com.iqser.red.service.peristence.v1.server.integration.service.DossierTemplateTesterAndProvider; import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; -import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive; +import com.iqser.red.service.persistence.service.v1.api.shared.model.Rules; public class RulesTest extends AbstractPersistenceServerServiceTest { @@ -18,19 +21,24 @@ public class RulesTest extends AbstractPersistenceServerServiceTest { @Autowired private RulesClient rulesClient; + @Autowired + private VersionClient versionClient; + @Test public void testRules() { var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); - rulesClient.setRules(dossierTemplate.getId(), JSONPrimitive.of("lorem ipsum")); - assertThat(rulesClient.getVersion(dossierTemplate.getId())).isEqualTo(3); //1. beim Anlegen des DossierTemplates; 2. bei provideTestTemplate(), damit es ACTIVE ist - assertThat(rulesClient.getRules(dossierTemplate.getId())).isEqualTo(JSONPrimitive.of("lorem ipsum")); + rulesClient.upload(new Rules("lorem ipsum", dossierTemplate.getId())); + assertThat(versionClient.getVersions(List.of(dossierTemplate.getId())) + .get(dossierTemplate.getId()) + .getRulesVersion()).isEqualTo(3); //1. beim Anlegen des DossierTemplates; 2. bei provideTestTemplate(), damit es ACTIVE ist + assertThat(rulesClient.download(dossierTemplate.getId()).getRules()).isEqualTo("lorem ipsum"); - rulesClient.setRules(dossierTemplate.getId(), JSONPrimitive.of("lorem ipsum dolor sit amet")); - assertThat(rulesClient.getVersion(dossierTemplate.getId())).isEqualTo(4); - assertThat(rulesClient.getRules(dossierTemplate.getId())).isEqualTo(JSONPrimitive.of("lorem ipsum dolor sit amet")); + rulesClient.upload(new Rules("lorem ipsum dolor sit amet", dossierTemplate.getId())); + assertThat(versionClient.getVersions(List.of(dossierTemplate.getId())).get(dossierTemplate.getId()).getRulesVersion()).isEqualTo(4); + assertThat(rulesClient.download(dossierTemplate.getId()).getRules()).isEqualTo("lorem ipsum dolor sit amet"); } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/SMTPTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/SMTPTest.java index 56daeedd8..34322e823 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/SMTPTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/SMTPTest.java @@ -7,7 +7,7 @@ import org.springframework.beans.factory.annotation.Autowired; import com.iqser.red.service.peristence.v1.server.integration.client.SMTPClient; import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.SMTPConfiguration; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.SMTPConfiguration; import feign.FeignException; @@ -32,10 +32,10 @@ public class SMTPTest extends AbstractPersistenceServerServiceTest { configuration.setStarttls(true); smtpClient.updateSMTPConfiguration(configuration); - assertThat(smtpClient.getCurrentSMTPConfiguration(true)).isNotNull(); + assertThat(smtpClient.getCurrentSMTPConfiguration()).isNotNull(); try { - smtpClient.testSMTPConfiguration("test@test.com", configuration); + smtpClient.testSMTPConfiguration(configuration); } catch (FeignException.FeignClientException e) { assertThat(e.status()).isEqualTo(400); } @@ -43,7 +43,7 @@ public class SMTPTest extends AbstractPersistenceServerServiceTest { smtpClient.clearSMTPConfiguration(); try { - smtpClient.getCurrentSMTPConfiguration(true); + smtpClient.getCurrentSMTPConfiguration(); } catch (FeignException.FeignClientException e) { assertThat(e.status()).isEqualTo(404); } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/TypeTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/TypeTest.java index 2ea647775..f3217522e 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/TypeTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/TypeTest.java @@ -12,9 +12,10 @@ import com.iqser.red.service.peristence.v1.server.integration.service.DossierTem import com.iqser.red.service.peristence.v1.server.integration.service.DossierTesterAndProvider; import com.iqser.red.service.peristence.v1.server.integration.service.TypeProvider; import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.Colors; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.DictionaryEntryType; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.Type; +import com.iqser.red.service.persistence.service.v1.api.shared.model.UpdateTypeValue; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.Colors; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionaryEntryType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.Type; public class TypeTest extends AbstractPersistenceServerServiceTest { @@ -38,49 +39,41 @@ public class TypeTest extends AbstractPersistenceServerServiceTest { var type = typeProvider.testAndProvideType(dossierTemplate); - dictionaryClient.addEntries(type.getId(), Lists.newArrayList("aaa", "bbb", "ccc"), true, false, DictionaryEntryType.ENTRY); + dictionaryClient.addEntry(type.getType(), type.getDossierTemplateId(), Lists.newArrayList("aaa", "bbb", "ccc"), true, null, DictionaryEntryType.ENTRY); - var loadedType = dictionaryClient.getDictionaryForType(type.getId(), null); + var loadedType = dictionaryClient.getDictionaryForType(type.getType(), type.getDossierTemplateId(), null); assertThat(loadedType.getEntries().size()).isEqualTo(3); - assertThat(loadedType.getVersion()).isGreaterThan(type.getVersion()); - - var dict = dictionaryClient.getEntriesForType(type.getId(), null, DictionaryEntryType.ENTRY); + var dict = loadedType.getEntries(); assertThat(dict.size()).isEqualTo(3); - dictionaryClient.deleteEntries(type.getId(), Lists.newArrayList("aaa", "bbb", "ccc"), DictionaryEntryType.ENTRY); + dictionaryClient.deleteEntries(type.getType(), type.getDossierTemplateId(), Lists.newArrayList("aaa", "bbb", "ccc"), null, DictionaryEntryType.ENTRY); - loadedType = dictionaryClient.getDictionaryForType(type.getId(), null); + loadedType = dictionaryClient.getDictionaryForType(type.getType(), type.getDossierTemplateId(), null); - assertThat(loadedType.getVersion()).isGreaterThan(type.getVersion() + 1); + dict = loadedType.getEntries(); - dict = dictionaryClient.getEntriesForType(type.getId(), null, DictionaryEntryType.ENTRY); + assertThat(dict.size()).isEqualTo(0); - assertThat(dict.size()).isEqualTo(3); - for (var entry : dict) { - assertThat(entry.isDeleted()).isTrue(); - } - - var request = new Type(); + var request = new UpdateTypeValue(); BeanUtils.copyProperties(type, request); request.setRank(99); - dictionaryClient.updateTypeValue(type.getId(), request); + dictionaryClient.updateType(type.getType(), type.getDossierTemplateId(), request, null); - loadedType = dictionaryClient.getDictionaryForType(type.getId(), null); - assertThat(loadedType.getVersion()).isGreaterThan(type.getVersion() + 2); + loadedType = dictionaryClient.getDictionaryForType(type.getType(), type.getDossierTemplateId(), null); assertThat(loadedType.getRank()).isEqualTo(99); - dictionaryClient.deleteType(type.getId()); + dictionaryClient.deleteType(type.getType(), type.getDossierTemplateId(), null); - var typesForTemplate = dictionaryClient.getAllTypesForDossierTemplate(loadedType.getDossierTemplateId(), false); + var typesForTemplate = dictionaryClient.getAllTypes(loadedType.getDossierTemplateId(), null, false).getTypes(); assertThat(typesForTemplate).isEmpty(); var dossier = dossierTesterAndProvider.provideTestDossier(dossierTemplate); var dossierType = typeProvider.testAndProvideType(dossierTemplate, dossier, "dossier-dict"); - var typesForDossier = dictionaryClient.getAllTypesForDossier(dossierType.getDossierId(), false); + var typesForDossier = dictionaryClient.getAllTypes(dossierType.getDossierTemplateId(), dossier.getId(), false).getTypes(); assertThat(typesForDossier).isNotEmpty(); } @@ -96,26 +89,22 @@ public class TypeTest extends AbstractPersistenceServerServiceTest { colors.setRequestAddColor("#dddddd"); colors.setRequestRemoveColor("#dddddd"); colors.setDictionaryRequestColor("#dddddd"); - colors.setPreviewColor("#dddddd"); - colors.setRedactionColor("#dddddd"); - colors.setAnalysisColor("#dddddd"); colors.setUpdatedColor("#dddddd"); - colors.setRecommendationColor("#dddddd"); - - colors.setSkippedColor("#dddddd"); + colors.setHintColor("#dddddd"); + colors.setRedactionColor("#dddddd"); colors.setIgnoredHintColor("#dddddd"); - - colors.setAnalysisColor("#dddddd"); + colors.setSkippedColor("#dddddd"); + colors.setAppliedRedactionColor("#dddddd"); colors.setDossierTemplateId(dossierTemplate.getId()); dictionaryClient.setColors(dossierTemplate.getId(), colors); var savedColors = dictionaryClient.getColors(dossierTemplate.getId()); - assertThat(savedColors).isNotEqualTo(colors); + assertThat(savedColors).isEqualTo(colors); assertThat(savedColors.getRequestAddColor()).isEqualTo(colors.getRequestAddColor()); assertThat(savedColors.getRequestRemoveColor()).isEqualTo(colors.getRequestRemoveColor()); assertThat(savedColors.getDictionaryRequestColor()).isEqualTo(colors.getDictionaryRequestColor()); @@ -127,7 +116,7 @@ public class TypeTest extends AbstractPersistenceServerServiceTest { assertThat(savedColors.getRedactionColor()).isEqualTo(colors.getRedactionColor()); assertThat(savedColors.getIgnoredHintColor()).isEqualTo(colors.getIgnoredHintColor()); assertThat(savedColors.getSkippedColor()).isEqualTo(colors.getSkippedColor()); - assertThat(savedColors.getAppliedRedactionColor()).isEqualTo("#000000"); + assertThat(savedColors.getAppliedRedactionColor()).isEqualTo(colors.getAppliedRedactionColor()); } } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ViewedPagesTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ViewedPagesTest.java index 7dd7b30ef..bacf19943 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ViewedPagesTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ViewedPagesTest.java @@ -5,11 +5,15 @@ import static org.assertj.core.api.Assertions.assertThat; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import com.iqser.red.service.peristence.v1.server.integration.client.FileClient; import com.iqser.red.service.peristence.v1.server.integration.client.ViewedPagesClient; import com.iqser.red.service.peristence.v1.server.integration.service.DossierTesterAndProvider; import com.iqser.red.service.peristence.v1.server.integration.service.FileTesterAndProvider; +import com.iqser.red.service.peristence.v1.server.integration.service.UserProvider; import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.ViewedPage; +import com.iqser.red.service.persistence.service.v1.api.shared.model.ViewedPagesRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ViewedPage; +import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; public class ViewedPagesTest extends AbstractPersistenceServerServiceTest { @@ -22,6 +26,12 @@ public class ViewedPagesTest extends AbstractPersistenceServerServiceTest { @Autowired private ViewedPagesClient viewedPagesClient; + @Autowired + private UserProvider userProvider; + + @Autowired + private FileClient fileClient; + @Test public void testViewedPages() { @@ -29,24 +39,25 @@ public class ViewedPagesTest extends AbstractPersistenceServerServiceTest { var dossier = dossierTesterAndProvider.provideTestDossier(); var file = fileTesterAndProvider.testAndProvideFile(dossier); + var userId = userProvider.getUserId(); + fileClient.setCurrentFileAssignee(dossier.getId(), file.getId(), userId); var fileId = file.getId(); - var userId = "1"; - viewedPagesClient.addPage(fileId, userId, 1); - viewedPagesClient.addPage(fileId, userId, 2); - viewedPagesClient.addPage(fileId, userId, 3); + viewedPagesClient.addPage(dossier.getId(),fileId, new ViewedPagesRequest(1)); + viewedPagesClient.addPage(dossier.getId(),fileId, new ViewedPagesRequest(2)); + viewedPagesClient.addPage(dossier.getId(),fileId, new ViewedPagesRequest(3)); - viewedPagesClient.removePage(fileId, userId, 1); + viewedPagesClient.removePage(dossier.getId(),fileId, 1); - var viewedPages = viewedPagesClient.getViewedPages(fileId, userId); - assertThat(viewedPages.stream().map(ViewedPage::getPage)).containsExactlyInAnyOrder(2, 3); + var viewedPages = viewedPagesClient.getViewedPages(dossier.getId(),fileId); + assertThat(viewedPages.getPages().stream().map(ViewedPage::getPage)).containsExactlyInAnyOrder(2, 3); - viewedPagesClient.removePage(fileId, userId, 2); - viewedPagesClient.removePage(fileId, userId, 3); + viewedPagesClient.removePage(dossier.getId(),fileId, 2); + viewedPagesClient.removePage(dossier.getId(),fileId, 3); - viewedPages = viewedPagesClient.getViewedPages(fileId, "1"); - assertThat(viewedPages).isEmpty(); + viewedPages = viewedPagesClient.getViewedPages(dossier.getId(),fileId); + assertThat(viewedPages.getPages()).isEmpty(); } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/WatermarkTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/WatermarkTest.java index 7045b3c80..07ca9b4d6 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/WatermarkTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/WatermarkTest.java @@ -11,10 +11,10 @@ import com.iqser.red.service.peristence.v1.server.integration.client.WatermarkCl import com.iqser.red.service.peristence.v1.server.integration.service.DossierTemplateTesterAndProvider; import com.iqser.red.service.peristence.v1.server.integration.service.DossierTesterAndProvider; import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; -import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.Watermark; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.WatermarkOrientation; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.CreateOrUpdateDossierRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.WatermarkModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.WatermarkOrientation; import feign.FeignException; @@ -43,7 +43,7 @@ public class WatermarkTest extends AbstractPersistenceServerServiceTest { assertThat(e.status()).isEqualTo(404); } - Watermark watermark = new Watermark(); + var watermark = new WatermarkModel(); watermark.setName("watermark name"); watermark.setText("Minions ipsum chasy para tu la bodaaa bananaaaa hana dul sae. Chasy hana dul sae pepete hana dul sae belloo! Tatata bala tu ti aamoo! Jeje."); watermark.setFontSize(12); @@ -54,20 +54,20 @@ public class WatermarkTest extends AbstractPersistenceServerServiceTest { watermark.setDossierTemplateId(dossierTemplate.getId()); watermark.setCreatedBy("user"); - var saved = watermarkClient.createOrUpdateWatermark(watermark); + var saved = watermarkClient.saveWatermark(watermark); var loadedWatermark = watermarkClient.getWatermark(saved.getId()); assertThat(loadedWatermark).isEqualTo(saved); assertThat(saved.getDateAdded()).isNotNull(); // try to save the same watermark without id try { - watermarkClient.createOrUpdateWatermark(watermark); + watermarkClient.saveWatermark(watermark); } catch (FeignException e) { assertThat(e.status()).isEqualTo(409); } // try to save the same watermark with id try { - watermarkClient.createOrUpdateWatermark(saved); + watermarkClient.saveWatermark(saved); } catch (FeignException e) { assertThat(e.status()).isEqualTo(409); } @@ -76,7 +76,7 @@ public class WatermarkTest extends AbstractPersistenceServerServiceTest { saved.setFontSize(14); saved.setEnabled(true); saved.setDossierTemplateId(null); - var updated = watermarkClient.createOrUpdateWatermark(saved); + var updated = watermarkClient.saveWatermark(saved); assertThat(updated.getDossierTemplateId()).isEqualTo(dossierTemplate.getId()); assertThat(updated.getDateModified()).isNotNull(); assertThat(updated.isEnabled()).isTrue(); @@ -86,12 +86,13 @@ public class WatermarkTest extends AbstractPersistenceServerServiceTest { var dossier = dossierTesterAndProvider.provideTestDossier(dossierTemplate); // update dossier with watermark config - CreateOrUpdateDossierRequest cru = new CreateOrUpdateDossierRequest(); + var cru = new DossierRequest(); BeanUtils.copyProperties(dossier, cru); + cru.setDossierId(dossier.getId()); cru.setWatermarkId(updated.getId()); - var updatedDossier = dossierClient.updateDossier(cru, dossier.getId()); + var updatedDossier = dossierClient.createDossierOrUpdateDossier(cru).getBody(); assertThat(updatedDossier.getWatermarkId()).isEqualTo(updated.getId()); assertThat(watermarkClient.isWatermarkUsed(updated.getId())).isEqualTo(JSONPrimitive.of(true)); @@ -99,7 +100,7 @@ public class WatermarkTest extends AbstractPersistenceServerServiceTest { // update current watermark with new dossier template id updated.setDossierTemplateId("dossierTemplate2"); try { - watermarkClient.createOrUpdateWatermark(updated); + watermarkClient.saveWatermark(updated); } catch (FeignException e) { assertThat(e.status()).isEqualTo(409); } @@ -108,13 +109,13 @@ public class WatermarkTest extends AbstractPersistenceServerServiceTest { assertThat(watermarkList.size()).isEqualTo(1); // create new watermark with same name: - Watermark watermark2 = new Watermark(); + var watermark2 = new WatermarkModel(); watermark2.setName("watermark name"); watermark2.setOrientation(WatermarkOrientation.DIAGONAL); watermark2.setDossierTemplateId(dossierTemplate.getId()); try { - watermarkClient.createOrUpdateWatermark(watermark2); + watermarkClient.saveWatermark(watermark2); } catch (FeignException.FeignClientException e) { assertThat(e.status()).isEqualTo(409); } @@ -127,7 +128,7 @@ public class WatermarkTest extends AbstractPersistenceServerServiceTest { var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); - Watermark watermark = new Watermark(); + var watermark = new WatermarkModel(); watermark.setName("watermark name"); watermark.setText("Minions ipsum chasy para tu la bodaaa bananaaaa hana dul sae. Chasy hana dul sae pepete hana dul sae belloo! Tatata bala tu ti aamoo! Jeje."); watermark.setFontSize(12); @@ -137,7 +138,7 @@ public class WatermarkTest extends AbstractPersistenceServerServiceTest { watermark.setOrientation(WatermarkOrientation.DIAGONAL); watermark.setDossierTemplateId(dossierTemplate.getId()); - var saved = watermarkClient.createOrUpdateWatermark(watermark); + var saved = watermarkClient.saveWatermark(watermark); var loadedWatermark = watermarkClient.getWatermark(saved.getId()); assertThat(loadedWatermark).isEqualTo(saved); @@ -165,7 +166,7 @@ public class WatermarkTest extends AbstractPersistenceServerServiceTest { var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); - Watermark watermark = new Watermark(); + var watermark = new WatermarkModel(); watermark.setName("watermark name"); watermark.setText("Minions ipsum chasy para tu la bodaaa bananaaaa hana dul sae. Chasy hana dul sae pepete hana dul sae belloo! Tatata bala tu ti aamoo! Jeje."); watermark.setFontSize(12); @@ -175,25 +176,25 @@ public class WatermarkTest extends AbstractPersistenceServerServiceTest { watermark.setOrientation(WatermarkOrientation.DIAGONAL); watermark.setDossierTemplateId(dossierTemplate.getId()); - var saved = watermarkClient.createOrUpdateWatermark(watermark); + var saved = watermarkClient.saveWatermark(watermark); var loadedWatermark = watermarkClient.getWatermark(saved.getId()); assertThat(loadedWatermark).isEqualTo(saved); // try to save the same watermark try { - watermarkClient.createOrUpdateWatermark(watermark); + watermarkClient.saveWatermark(watermark); } catch (FeignException e) { assertThat(e.status()).isEqualTo(409); } - Watermark watermark2 = new Watermark(); + var watermark2 = new WatermarkModel(); watermark.setName("watermark name2"); watermark.setText("Minions ipsum chasy para tu la bodaaa bananaaaa hana dul sae. Chasy hana dul sae pepete hana dul sae belloo! Tatata bala tu ti aamoo! Jeje."); watermark.setFontSize(12); watermark.setOrientation(WatermarkOrientation.DIAGONAL); watermark.setDossierTemplateId(dossierTemplate.getId()); - var saved2 = watermarkClient.createOrUpdateWatermark(watermark); + var saved2 = watermarkClient.saveWatermark(watermark); var loadedWatermark2 = watermarkClient.getWatermark(saved.getId()); } @@ -204,7 +205,7 @@ public class WatermarkTest extends AbstractPersistenceServerServiceTest { var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); var watermarkText = "本資料に記載された情報に係る権利及び内容の責任はシンジェンタジャパン株式会社にある。"; - Watermark watermark = new Watermark(); + var watermark = new WatermarkModel(); watermark.setName("japanese"); watermark.setEnabled(true); watermark.setDossierTemplateId(dossierTemplate.getId()); @@ -215,7 +216,7 @@ public class WatermarkTest extends AbstractPersistenceServerServiceTest { watermark.setOrientation(WatermarkOrientation.DIAGONAL); watermark.setText(watermarkText); - var saved = watermarkClient.createOrUpdateWatermark(watermark); + var saved = watermarkClient.saveWatermark(watermark); var loadedWatermarked = watermarkClient.getWatermark(saved.getId()); assertThat(loadedWatermarked).isEqualTo(saved); @@ -230,7 +231,7 @@ public class WatermarkTest extends AbstractPersistenceServerServiceTest { var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); var watermarkText = "We love ASCII!\n\nThis text contains only ASCII chars and newlines\r\r\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"; - Watermark watermark = new Watermark(); + var watermark = new WatermarkModel(); watermark.setName("name"); watermark.setEnabled(true); watermark.setDossierTemplateId(dossierTemplate.getId()); @@ -242,7 +243,7 @@ public class WatermarkTest extends AbstractPersistenceServerServiceTest { watermark.setText(watermarkText); // Act - var saved = watermarkClient.createOrUpdateWatermark(watermark); + var saved = watermarkClient.saveWatermark(watermark); var loadedWatermarked = watermarkClient.getWatermark(saved.getId()); // Assert diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/performance/EntityPerformanceTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/performance/EntityPerformanceTest.java index 33697f691..0054b7b13 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/performance/EntityPerformanceTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/performance/EntityPerformanceTest.java @@ -1,7 +1,5 @@ package com.iqser.red.service.peristence.v1.server.integration.tests.performance; -import static org.assertj.core.api.AssertionsForClassTypes.assertThat; - import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @@ -17,10 +15,12 @@ import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPers import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.DictionaryEntryEntity; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.EntryRepository; import com.iqser.red.service.persistence.management.v1.processor.utils.jdbc.JDBCWriteUtils; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.CloneDossierTemplateRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.DictionaryEntryType; +import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.CloneDossierTemplateRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionaryEntryType; import lombok.extern.slf4j.Slf4j; +import static org.assertj.core.api.Assertions.assertThat; @Slf4j public class EntityPerformanceTest extends AbstractPersistenceServerServiceTest { @@ -39,11 +39,13 @@ public class EntityPerformanceTest extends AbstractPersistenceServerServiceTest @Autowired private EntryRepository entryRepository; + @Autowired + private JDBCWriteUtils jdbcWriteUtils; @Test public void testAddToDictionary() { - + TenantContext.setTenantId("redaction"); var template = dossierTemplateTesterAndProvider.provideTestTemplate("test"); var type = typeProvider.testAndProvideType(template); @@ -51,29 +53,29 @@ public class EntityPerformanceTest extends AbstractPersistenceServerServiceTest var tenKEntries = generateEntries(10000); long t1 = System.currentTimeMillis(); - dictionaryClient.addEntries(type.getTypeId(), fiveKEntries, true, false, DictionaryEntryType.ENTRY); + dictionaryClient.addEntry(type.getType(),type.getDossierTemplateId(), fiveKEntries, true, null, DictionaryEntryType.ENTRY); long t2 = System.currentTimeMillis(); log.info("Add Time: {}ms counting: {} entries", (t2 - t1), entryRepository.findByTypeIdAndVersionGreaterThan(type.getTypeId(), 0).size()); t1 = System.currentTimeMillis(); - dictionaryClient.addEntries(type.getTypeId(), tenKEntries, true, false, DictionaryEntryType.ENTRY); + dictionaryClient.addEntry(type.getType(),type.getDossierTemplateId(), tenKEntries, true, null, DictionaryEntryType.ENTRY); t2 = System.currentTimeMillis(); log.info("Add Time: {}ms counting: {} entries", (t2 - t1), entryRepository.findByTypeIdAndVersionGreaterThan(type.getTypeId(), 0).size()); t1 = System.currentTimeMillis(); - dictionaryClient.addEntries(type.getTypeId(), fiveKEntries, true, false, DictionaryEntryType.ENTRY); + dictionaryClient.addEntry(type.getType(),type.getDossierTemplateId(), fiveKEntries, true, null, DictionaryEntryType.ENTRY); t2 = System.currentTimeMillis(); log.info("Update Time: {}ms counting: {} entries", (t2 - t1), entryRepository.findByTypeIdAndVersionGreaterThan(type.getTypeId(), 0).size()); - dictionaryClient.addEntries(type.getTypeId(), fiveKEntries, true, false, DictionaryEntryType.FALSE_RECOMMENDATION); - dictionaryClient.addEntries(type.getTypeId(), fiveKEntries, true, false, DictionaryEntryType.FALSE_POSITIVE); + dictionaryClient.addEntry(type.getType(),type.getDossierTemplateId(), fiveKEntries, true, null, DictionaryEntryType.FALSE_RECOMMENDATION); + dictionaryClient.addEntry(type.getType(),type.getDossierTemplateId(), fiveKEntries, true, null, DictionaryEntryType.FALSE_POSITIVE); t1 = System.currentTimeMillis(); var cloned = dossierTemplateClient.cloneDossierTemplate(template.getId(), new CloneDossierTemplateRequest()); t2 = System.currentTimeMillis(); log.info("Clone Time: {}", (t2 - t1)); - var types = dictionaryClient.getAllTypesForDossierTemplate(cloned.getId(), false); + var types = dictionaryClient.getAllTypes(cloned.getId(), null,false).getTypes(); assertThat(types.size()).isEqualTo(1); for (var clonedType : types) { @@ -84,12 +86,19 @@ public class EntityPerformanceTest extends AbstractPersistenceServerServiceTest } - @Autowired - private JDBCWriteUtils jdbcWriteUtils; + private List generateEntries(int count) { + + List entries = new ArrayList<>(); + for (var i = 1; i <= count; i++) { + entries.add("Dictionary Entry: " + i); + } + return entries; + } @Test public void testWritePerformance() { + TenantContext.setTenantId("redaction"); var tenKEntries = generateEntries(10_000); @@ -113,20 +122,12 @@ public class EntityPerformanceTest extends AbstractPersistenceServerServiceTest assertThat(entryRepository.count()).isEqualTo(20_000); - assertThat(jpaTime).isGreaterThan(jdbcTime); +// assertThat(jpaTime).isGreaterThan(jdbcTime); System.out.println("JPA Time: " + jpaTime + "ms for 10k entries"); System.out.println("JDBC Time: " + jdbcTime + "ms for 10k entries"); - } - - private List generateEntries(int count) { - - List entries = new ArrayList<>(); - for (var i = 1; i <= count; i++) { - entries.add("Dictionary Entry: " + i); - } - return entries; + TenantContext.clear(); } } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/performance/FilePerformanceTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/performance/FilePerformanceTest.java index 0bbae665e..56d9638a8 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/performance/FilePerformanceTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/performance/FilePerformanceTest.java @@ -27,13 +27,14 @@ import com.iqser.red.service.persistence.management.v1.processor.entity.dossier. import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileAttributeConfigEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileAttributeEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DownloadFileType; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.Watermark; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.WatermarkOrientation; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.Dossier; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileAttributeType; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus; +import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; +import com.iqser.red.service.persistence.service.v1.api.shared.model.WatermarkModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DownloadFileType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.WatermarkOrientation; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.Dossier; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileAttributeType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.ProcessingStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus; import lombok.extern.slf4j.Slf4j; @@ -42,9 +43,6 @@ public class FilePerformanceTest extends AbstractPersistenceServerServiceTest { private final static Integer DOSSIER_COUNT = 1; private final static Integer FILE_PER_DOSSIER_COUNT = 100; - private final static Integer TYPE_COUNT = 1; - private final static Integer TYPE_ENTRY_COUNT = 500; - private final static Integer FILE_ATTRIBUTE_COUNT = 15; @Autowired private DossierClient dossierClient; @@ -56,159 +54,13 @@ public class FilePerformanceTest extends AbstractPersistenceServerServiceTest { private DossierStatsClient dossierStatsClient; @Autowired - private WatermarkClient watermarkClient; + private PerformanceTestService performanceTestService; @BeforeEach public void setupTest() { - - long start = System.currentTimeMillis(); - - DossierTemplateEntity dte = new DossierTemplateEntity(); - dte.setId(UUID.randomUUID().toString()); - dte.setName("Test"); - dte.setDownloadFileTypes(Sets.newTreeSet(DownloadFileType.ANNOTATED, - DownloadFileType.REDACTED, - DownloadFileType.ORIGINAL, - DownloadFileType.PREVIEW, - DownloadFileType.FLATTEN)); - dte.setCreatedBy("123"); - dte.setDescription("Lorem Ipsum"); - dte.setModifiedBy("123"); - - dte = dossierTemplateRepository.save(dte); - - Watermark watermark = new Watermark(); - watermark.setName("watermark name"); - watermark.setEnabled(true); - watermark.setText("Minions ipsum chasy para tu la bodaaa bananaaaa hana dul sae. Chasy hana dul sae pepete hana dul sae belloo! Tatata bala tu ti aamoo! Jeje."); - watermark.setOrientation(WatermarkOrientation.DIAGONAL); - watermark.setDossierTemplateId(dte.getId()); - - var watermarkConfig = watermarkClient.createOrUpdateWatermark(watermark); - - List fces = new ArrayList<>(); - for (int i = 0; i < FILE_ATTRIBUTE_COUNT; i++) { - FileAttributeConfigEntity fce = new FileAttributeConfigEntity(); - fce.setId(UUID.randomUUID().toString()); - fce.setDossierTemplate(dte); - fce.setLabel("123"); - fce.setCsvColumnHeader("123"); - fce.setPrimaryAttribute(true); - fce.setFilterable(true); - fce.setPlaceholder("Lorem Ipsum"); - fce.setType(FileAttributeType.TEXT); - fce.setDossierTemplate(dte); - fces.add(fce); - - } - - fces = fileAttributeConfigRepository.saveAll(fces); - - log.info("Created File Attributes Config"); - - for (int i = 0; i < TYPE_COUNT; i++) { - TypeEntity te = new TypeEntity(); - te.setId(UUID.randomUUID().toString()); - te.setDossierTemplate(dte); - te.setDescription("Lorem Ipsum"); - te.setLabel("Lorem ipsum"); - te.setType("Type " + i); - te.setAddToDictionaryAction(true); - te.setCaseInsensitive(true); - te.setHexColor("hexColor"); - te.setRank(10 + i); - te.setVersion(1231); - te.setRecommendation(true); - te.setHint(false); - - te = typeRepository.save(te); - - List des = new ArrayList<>(); - for (int j = 0; j < TYPE_ENTRY_COUNT; j++) { - DictionaryEntryEntity de = new DictionaryEntryEntity(); - de.setTypeId(te.getId()); - de.setDeleted(false); - de.setVersion(1); - de.setValue("Dictionary Entry" + i + "/" + j); - des.add(de); - - } - entryRepository.saveAll(des); - log.info("Created Type: {}", te.getType()); - } - - log.info("Created Dossier Template Data ..."); - - for (int i = 0; i < DOSSIER_COUNT; i++) { - - DossierEntity d = new DossierEntity(); - d.setId(UUID.randomUUID().toString()); - d.setDossierName("Dossier " + i); - d.setDossierTemplate(dte); - d.setDueDate(OffsetDateTime.now()); - d.setDescription("Lorem Ipsum"); - d.setWatermarkId(watermarkConfig.getId()); - d.setStartDate(OffsetDateTime.now()); - d.setApproverIds(Sets.newTreeSet("1", "2", "3", "4", "5", "6", "7", "8", "9", "10")); - d.setMemberIds(Sets.newTreeSet("1", "2", "3", "4", "5", "6", "7", "8", "9", "10")); - d.setDownloadFileTypes(Sets.newTreeSet(DownloadFileType.ANNOTATED, - DownloadFileType.REDACTED, - DownloadFileType.ORIGINAL, - DownloadFileType.PREVIEW, - DownloadFileType.FLATTEN)); - - d = this.dossierRepository.save(d); - - List files = new ArrayList<>(); - for (int j = 0; j < FILE_PER_DOSSIER_COUNT; j++) { - FileEntity f = new FileEntity(); - f.setId(UUID.randomUUID().toString()); - f.setAdded(OffsetDateTime.now()); - f.setAssignee("123"); - f.setApprovalDate(OffsetDateTime.now()); - f.setAnalysisDuration(123); - f.setDictionaryVersion(33); - f.setDossierId(d.getId()); - f.setDossierDictionaryVersion(22); - f.setExcluded(false); - f.setExcludedPages(getExcludedPages()); - f.setFilename("Lorem Ipsum"); - f.setHasAnnotationComments(false); - f.setHasRedactions(true); - f.setHasImages(true); - f.setHasHints(true); - f.setUploader("!2321"); - f.setWorkflowStatus(WorkflowStatus.APPROVED); - f.setProcessingStatus(ProcessingStatus.FULLREPROCESS); - f.setLastUpdated(OffsetDateTime.now()); - f.setLastUploaded(OffsetDateTime.now()); - f.setLastProcessed(OffsetDateTime.now()); - f.setLastFileAttributeChange(OffsetDateTime.now()); - f.setDossierId(d.getId()); - files.add(f); - - } - - log.info("Created Dossier: {}", d.getDossierName()); - files = fileRepository.saveAll(files); - - ArrayList fileAttributes = new ArrayList<>(); - List finalFces = fces; - files.forEach(file -> finalFces.forEach(fce -> { - FileAttributeEntity fa = new FileAttributeEntity(); - fa.setFileAttributeId(new FileAttributeEntity.FileAttributeEntityId()); - fa.getFileAttributeId().setFileId(file.getId()); - fa.getFileAttributeId().setFileAttributeConfigId(fce.getId()); - fa.setValue("Lorem Ipsum ..."); - fileAttributes.add(fa); - })); - fileAttributesRepository.saveAll(fileAttributes); - } - - long end = System.currentTimeMillis(); - - log.info("Created Performance data in: {}ms", end - start); + TenantContext.setTenantId("redaction"); + performanceTestService.doSetup(); } @@ -216,7 +68,7 @@ public class FilePerformanceTest extends AbstractPersistenceServerServiceTest { public void doPerformanceTest() { long startAllDossiers = System.currentTimeMillis(); - var allDossiers = dossierClient.getAllDossiers(false, false); + var allDossiers = dossierClient.getDossiers(false, false); log.info("Load all dossiers time: {}ms", System.currentTimeMillis() - startAllDossiers); assertThat(allDossiers.size()).isEqualTo(DOSSIER_COUNT); @@ -234,14 +86,4 @@ public class FilePerformanceTest extends AbstractPersistenceServerServiceTest { } - - private Set getExcludedPages() { - - Set pages = new HashSet<>(); - for (int i = 0; i < 100; i++) { - pages.add(i); - } - return pages; - } - } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/performance/PerformanceTestService.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/performance/PerformanceTestService.java new file mode 100644 index 000000000..1179b7f97 --- /dev/null +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/performance/PerformanceTestService.java @@ -0,0 +1,260 @@ +package com.iqser.red.service.peristence.v1.server.integration.tests.performance; + +import java.time.OffsetDateTime; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.UUID; + +import javax.transaction.Transactional; + +import org.assertj.core.util.Sets; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.TestingAuthenticationToken; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.context.TransientSecurityContext; +import org.springframework.stereotype.Service; + +import com.iqser.red.service.peristence.v1.server.integration.client.DossierClient; +import com.iqser.red.service.peristence.v1.server.integration.client.DossierStatsClient; +import com.iqser.red.service.peristence.v1.server.integration.client.FileClient; +import com.iqser.red.service.peristence.v1.server.integration.client.WatermarkClient; +import com.iqser.red.service.peristence.v1.server.integration.service.UserProvider; +import com.iqser.red.service.persistence.management.v1.processor.acl.custom.dossier.DossierACLService; +import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.DictionaryEntryEntity; +import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.TypeEntity; +import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.WatermarkEntity; +import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierEntity; +import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierTemplateEntity; +import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileAttributeConfigEntity; +import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileAttributeEntity; +import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierRepository; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierTemplateRepository; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.EntryRepository; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.FileAttributeConfigRepository; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.FileAttributesRepository; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.FileRepository; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.TypeRepository; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.WatermarkRepository; +import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; +import com.iqser.red.service.persistence.service.v1.api.shared.model.WatermarkModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DownloadFileType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.WatermarkOrientation; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileAttributeType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.ProcessingStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus; + +import liquibase.pro.packaged.A; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Service +public class PerformanceTestService { + + private final static Integer DOSSIER_COUNT = 1; + private final static Integer FILE_PER_DOSSIER_COUNT = 100; + private final static Integer TYPE_COUNT = 1; + private final static Integer TYPE_ENTRY_COUNT = 500; + private final static Integer FILE_ATTRIBUTE_COUNT = 15; + + @Autowired + private DossierClient dossierClient; + @Autowired + private FileClient fileClient; + @Autowired + private DossierStatsClient dossierStatsClient; + @Autowired + private DossierTemplateRepository dossierTemplateRepository; + @Autowired + private WatermarkRepository watermarkRepository; + @Autowired + private DossierRepository dossierRepository; + @Autowired + private TypeRepository typeRepository; + @Autowired + private EntryRepository entryRepository; + @Autowired + private FileAttributeConfigRepository fileAttributeConfigRepository; + @Autowired + private FileRepository fileRepository; + @Autowired + private FileAttributesRepository fileAttributesRepository; + @Autowired + private DossierACLService dossierACLService; + + @Autowired + private UserProvider userProvider; + + + @Transactional + public void doSetup(){ + + + long start = System.currentTimeMillis(); + + DossierTemplateEntity dte = new DossierTemplateEntity(); + dte.setId(UUID.randomUUID().toString()); + dte.setName("Test"); + dte.setDownloadFileTypes(Sets.newTreeSet(DownloadFileType.ANNOTATED, + DownloadFileType.REDACTED, + DownloadFileType.ORIGINAL, + DownloadFileType.PREVIEW, + DownloadFileType.FLATTEN)); + dte.setCreatedBy("123"); + dte.setDescription("Lorem Ipsum"); + dte.setModifiedBy("123"); + + dte = dossierTemplateRepository.saveAndFlush(dte); + + var watermark = new WatermarkEntity(); + watermark.setName("watermark name"); + watermark.setEnabled(true); + watermark.setText("Minions ipsum chasy para tu la bodaaa bananaaaa hana dul sae. Chasy hana dul sae pepete hana dul sae belloo! Tatata bala tu ti aamoo! Jeje."); + watermark.setOrientation(WatermarkOrientation.DIAGONAL); + watermark.setDossierTemplate(dte); + + var watermarkConfig = watermarkRepository.save(watermark); + + List fces = new ArrayList<>(); + for (int i = 0; i < FILE_ATTRIBUTE_COUNT; i++) { + FileAttributeConfigEntity fce = new FileAttributeConfigEntity(); + fce.setId(UUID.randomUUID().toString()); + fce.setDossierTemplate(dte); + fce.setLabel("123"); + fce.setCsvColumnHeader("123"); + fce.setPrimaryAttribute(true); + fce.setFilterable(true); + fce.setPlaceholder("Lorem Ipsum"); + fce.setType(FileAttributeType.TEXT); + fce.setDossierTemplate(dte); + fces.add(fce); + + } + + fces = fileAttributeConfigRepository.saveAll(fces); + + log.info("Created File Attributes Config"); + + for (int i = 0; i < TYPE_COUNT; i++) { + TypeEntity te = new TypeEntity(); + te.setId(UUID.randomUUID().toString()); + te.setDossierTemplate(dte); + te.setDescription("Lorem Ipsum"); + te.setLabel("Lorem ipsum"); + te.setType("Type " + i); + te.setAddToDictionaryAction(true); + te.setCaseInsensitive(true); + te.setHexColor("hexColor"); + te.setRank(10 + i); + te.setVersion(1231); + te.setRecommendation(true); + te.setHint(false); + + te = typeRepository.save(te); + + List des = new ArrayList<>(); + for (int j = 0; j < TYPE_ENTRY_COUNT; j++) { + DictionaryEntryEntity de = new DictionaryEntryEntity(); + de.setTypeId(te.getId()); + de.setDeleted(false); + de.setVersion(1); + de.setValue("Dictionary Entry" + i + "/" + j); + des.add(de); + + } + entryRepository.saveAll(des); + log.info("Created Type: {}", te.getType()); + } + + log.info("Created Dossier Template Data ..."); + + var user = userProvider.getUserId(); + SecurityContextHolder.setContext(new TransientSecurityContext(new TestingAuthenticationToken(user,"secret"))); + + for (int i = 0; i < DOSSIER_COUNT; i++) { + + DossierEntity d = new DossierEntity(); + d.setId(UUID.randomUUID().toString()); + d.setDossierName("Dossier " + i); + d.setDossierTemplate(dte); + d.setDueDate(OffsetDateTime.now()); + d.setDescription("Lorem Ipsum"); + d.setWatermarkId(watermarkConfig.getId()); + d.setStartDate(OffsetDateTime.now()); + d.setApproverIds(Sets.newTreeSet("1", "2", "3", "4", "5", "6", "7", "8", "9", "10")); + d.setMemberIds(Sets.newTreeSet("1", "2", "3", "4", "5", "6", "7", "8", "9", "10")); + d.setDownloadFileTypes(Sets.newTreeSet(DownloadFileType.ANNOTATED, + DownloadFileType.REDACTED, + DownloadFileType.ORIGINAL, + DownloadFileType.PREVIEW, + DownloadFileType.FLATTEN)); + + d = this.dossierRepository.save(d); + + dossierACLService.updateDossierACL(Set.of(user), Set.of(user), user, d.getId()); + + List files = new ArrayList<>(); + for (int j = 0; j < FILE_PER_DOSSIER_COUNT; j++) { + FileEntity f = new FileEntity(); + f.setId(UUID.randomUUID().toString()); + f.setAdded(OffsetDateTime.now()); + f.setAssignee("123"); + f.setApprovalDate(OffsetDateTime.now()); + f.setAnalysisDuration(123); + f.setDictionaryVersion(33); + f.setDossierId(d.getId()); + f.setDossierDictionaryVersion(22); + f.setExcluded(false); + f.setExcludedPages(getExcludedPages()); + f.setFilename("Lorem Ipsum"); + f.setHasAnnotationComments(false); + f.setHasRedactions(true); + f.setHasImages(true); + f.setHasHints(true); + f.setUploader("!2321"); + f.setWorkflowStatus(WorkflowStatus.APPROVED); + f.setProcessingStatus(ProcessingStatus.FULLREPROCESS); + f.setLastUpdated(OffsetDateTime.now()); + f.setLastUploaded(OffsetDateTime.now()); + f.setLastProcessed(OffsetDateTime.now()); + f.setLastFileAttributeChange(OffsetDateTime.now()); + f.setDossierId(d.getId()); + files.add(f); + + } + + log.info("Created Dossier: {}", d.getDossierName()); + files = fileRepository.saveAll(files); + + ArrayList fileAttributes = new ArrayList<>(); + List finalFces = fces; + files.forEach(file -> finalFces.forEach(fce -> { + FileAttributeEntity fa = new FileAttributeEntity(); + fa.setFileAttributeId(new FileAttributeEntity.FileAttributeEntityId()); + fa.getFileAttributeId().setFileId(file.getId()); + fa.getFileAttributeId().setFileAttributeConfigId(fce.getId()); + fa.setValue("Lorem Ipsum ..."); + fileAttributes.add(fa); + })); + fileAttributesRepository.saveAll(fileAttributes); + } + + long end = System.currentTimeMillis(); + + log.info("Created Performance data in: {}ms", end - start); + } + + + + private Set getExcludedPages() { + + Set pages = new HashSet<>(); + for (int i = 0; i < 100; i++) { + pages.add(i); + } + return pages; + } + +} diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/AbstractPersistenceServerServiceTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/AbstractPersistenceServerServiceTest.java index 377ed927f..140faa274 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/AbstractPersistenceServerServiceTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/AbstractPersistenceServerServiceTest.java @@ -1,29 +1,36 @@ package com.iqser.red.service.peristence.v1.server.integration.utils; -import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.when; import java.sql.Connection; import java.sql.DriverManager; +import java.util.ArrayList; import java.util.Set; import java.util.UUID; +import javax.annotation.PostConstruct; import javax.sql.DataSource; import org.assertj.core.util.Lists; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.extension.ExtendWith; +import org.keycloak.adapters.springboot.KeycloakSpringBootProperties; import org.mockito.Mockito; import org.springframework.amqp.core.AmqpAdmin; import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.ObjectFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration; +import org.springframework.boot.autoconfigure.http.HttpMessageConverters; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.boot.test.util.TestPropertyValues; import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.cloud.openfeign.support.SpringEncoder; import org.springframework.context.ApplicationContextInitializer; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Bean; @@ -36,15 +43,23 @@ import org.springframework.jdbc.core.StatementCallback; import org.springframework.jdbc.datasource.SingleConnectionDataSource; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.web.client.RestTemplate; +import com.iqser.red.keycloak.commons.KeyCloakAdminClientService; +import com.iqser.red.keycloak.commons.KeyCloakSettings; +import com.iqser.red.keycloak.commons.roles.ApplicationRoles; import com.iqser.red.service.peristence.v1.server.Application; -import com.iqser.red.service.peristence.v1.server.client.RedactionClient; -import com.iqser.red.service.peristence.v1.server.client.SearchClient; import com.iqser.red.service.peristence.v1.server.integration.client.ApplicationConfigClient; import com.iqser.red.service.peristence.v1.server.integration.client.FileClient; import com.iqser.red.service.peristence.v1.server.integration.client.TenantsClient; import com.iqser.red.service.peristence.v1.server.utils.MetricsPrinterService; -import com.iqser.red.service.persistence.management.v1.processor.client.PDFTronRedactionClient; +import com.iqser.red.service.persistence.management.v1.processor.client.pdftronredactionservice.PDFTronClient; +import com.iqser.red.service.persistence.management.v1.processor.client.redactionservice.RedactionClient; +import com.iqser.red.service.persistence.management.v1.processor.client.searchservice.SearchClient; +import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.ApplicationConfigurationEntity; +import com.iqser.red.service.persistence.management.v1.processor.service.ApplicationConfigService; +import com.iqser.red.service.persistence.management.v1.processor.service.TenantManagementService; +import com.iqser.red.service.persistence.management.v1.processor.service.UserService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.mulitenancy.repository.TenantRepository; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.ApplicationConfigRepository; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.AuditRepository; @@ -77,20 +92,25 @@ import com.iqser.red.service.persistence.management.v1.processor.service.persist import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.TypeRepository; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.ViewedPagesRepository; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.WatermarkRepository; +import com.iqser.red.service.persistence.management.v1.processor.service.redactionlog.RedactionLogMergeService; +import com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter; import com.iqser.red.service.persistence.management.v1.processor.utils.multitenancy.TenantContext; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.ApplicationConfig; -import com.iqser.red.service.persistence.service.v1.api.model.multitenancy.DatabaseConnection; -import com.iqser.red.service.persistence.service.v1.api.model.multitenancy.S3StorageConnection; -import com.iqser.red.service.persistence.service.v1.api.model.multitenancy.SearchConnection; -import com.iqser.red.service.persistence.service.v1.api.model.multitenancy.TenantRequest; -import com.iqser.red.service.redaction.v1.model.RedactionLog; -import com.iqser.red.service.redaction.v1.model.RedactionResult; +import com.iqser.red.service.persistence.service.v1.api.shared.model.CreateUserRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.ResetPasswordRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.ApplicationConfig; +import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.DatabaseConnection; +import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.S3StorageConnection; +import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.SearchConnection; +import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.TenantRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLog; import com.iqser.red.storage.commons.StorageAutoConfiguration; import com.iqser.red.storage.commons.service.StorageService; import io.micrometer.prometheus.PrometheusMeterRegistry; import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +@Slf4j @ExtendWith(SpringExtension.class) @EnableFeignClients(basePackageClasses = FileClient.class) @Import(AbstractPersistenceServerServiceTest.TestConfiguration.class) @@ -98,16 +118,16 @@ import lombok.SneakyThrows; @SpringBootTest(classes = Application.class, webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT, properties = "spring-hibernate-query-utils.n-plus-one-queries-detection.error-level=INFO") public abstract class AbstractPersistenceServerServiceTest { - @MockBean - private AmqpAdmin amqpAdmin; @MockBean protected RabbitTemplate rabbitTemplate; @MockBean protected SearchClient searchClient; @MockBean - protected RedactionClient redactionClient; + protected RedactionLogMergeService redactionLogMergeService; @MockBean - protected PDFTronRedactionClient pdfTronRedactionClient; + protected KeyCloakAdminClientService keyCloakAdminClientService; + @MockBean + protected PDFTronClient pdfTronRedactionClient; @Autowired protected ApplicationConfigClient appConfigClient; @Autowired @@ -163,8 +183,6 @@ public abstract class AbstractPersistenceServerServiceTest { @Autowired protected NotificationPreferencesRepository notificationPreferencesRepository; @Autowired - private DossierStatusRepository dossierStatusRepository; - @Autowired protected MetricsPrinterService metricsPrinterService; @Autowired protected EntryRepository entryRepository; @@ -180,35 +198,98 @@ public abstract class AbstractPersistenceServerServiceTest { protected TenantsClient tenantsClient; @Autowired protected TenantRepository tenantRepository; + @MockBean + private RedactionClient redactionClient; @Autowired - protected JdbcTemplate jdbcTemplate; + @Qualifier("masterDataSource") + private DataSource masterDataSource; @Autowired protected PrometheusMeterRegistry prometheusMeterRegistry; + @MockBean + private AmqpAdmin amqpAdmin; + @Autowired + private DossierStatusRepository dossierStatusRepository; + @Autowired + private TenantManagementService tenantManagementService; + @Autowired + private ApplicationConfigService applicationConfigService; + @Autowired + private UserService userService; + @Autowired + private TokenService tokenService; + @BeforeEach + public void setTenant(){ + TenantContext.setTenantId("redaction"); + } + + @AfterEach + public void clearTenant(){ + TenantContext.clear(); + } + + public void createUsers() { + + when(keyCloakAdminClientService.getAdminClient()).thenReturn(KeyCloakTestContainer.getInstance().getKeycloakAdminClient()); + + userService.evictUserCache(); + var allUsers = userService.getAllUsers(); + + if (allUsers.isEmpty()) { + TenantContext.setTenantId("redaction"); + var admin1 = createUser("manageradmin1@test.com"); + var admin2 = createUser("manageradmin2@test.com"); + + tokenService.setUser("manageradmin1@test.com", "secret"); + + TenantContext.clear(); + } + + } + + + private String createUser(String username) { + + var managerAdmin = new CreateUserRequest(); + managerAdmin.setEmail(username); + var user = userService.createUser(managerAdmin); + var allRoles = new ArrayList<>(ApplicationRoles.ROLE_DATA.keySet()); + userService.setRoles(user.getUserId(), allRoles, allRoles); + var request = new ResetPasswordRequest(); + request.setPassword("secret"); + request.setTemporary(false); + userService.resetPassword(user.getUserId(), request); + return user.getUserId(); + } @BeforeEach public void setupOptimize() { createDefaultTenant(); + TenantContext.setTenantId("redaction"); + ApplicationConfig appConfig = new ApplicationConfig().builder() .downloadCleanupDownloadFilesHours(8) .downloadCleanupNotDownloadFilesHours(72) .softDeleteCleanupTime(96) .build(); - appConfigClient.createOrUpdateAppConfig(appConfig); + applicationConfigService.saveApplicationConfiguration(MagicConverter.convert(appConfig, ApplicationConfigurationEntity.class)); + + TenantContext.clear(); + + createUsers(); // when(appConfigClient.getCurrentApplicationConfig()).thenReturn(ApplicationConfig.builder() // .downloadCleanupDownloadFilesHours(8) // .downloadCleanupNotDownloadFilesHours(72) // .softDeleteCleanupTime(96) - doNothing().when(pdfTronRedactionClient).testDigitalCurrentSignature(Mockito.any()); + // doNothing().when(pdfTronRedactionClient).testDigitalCurrentSignature(Mockito.any()); when(amqpAdmin.getQueueInfo(Mockito.any())).thenReturn(null); - when(redactionClient.sections(Mockito.any())).thenReturn(new RedactionResult()); - when(redactionClient.getRedactionLog(Mockito.any())).thenReturn(new RedactionLog(1, 1, Lists.newArrayList(), null, 0, 0, 0, 0)); + when(redactionLogMergeService.provideRedactionLog(Mockito.any())).thenReturn(new RedactionLog(1, 1, Lists.newArrayList(), null, 0, 0, 0, 0)); } @@ -241,7 +322,6 @@ public abstract class AbstractPersistenceServerServiceTest { .port(9200) .scheme("https") .username("elastic") - .password("changeMe") .numberOfShards("1") .numberOfReplicas("5") .build()) @@ -255,13 +335,14 @@ public abstract class AbstractPersistenceServerServiceTest { .build()) .build(); - tenantsClient.createTenant(tenantRequest); + tenantManagementService.createTenant(tenantRequest); } } private void createDatabase(String db, String password) { + var jdbcTemplate = new JdbcTemplate(masterDataSource); jdbcTemplate.execute((StatementCallback) stmt -> stmt.execute("CREATE DATABASE " + db)); jdbcTemplate.execute((StatementCallback) stmt -> stmt.execute("CREATE USER " + db + " WITH ENCRYPTED PASSWORD '" + password + "'")); jdbcTemplate.execute((StatementCallback) stmt -> stmt.execute("GRANT ALL PRIVILEGES ON DATABASE " + db + " TO " + db)); @@ -290,7 +371,7 @@ public abstract class AbstractPersistenceServerServiceTest { @AfterEach public void printMetrics() { - this.metricsPrinterService.printMetrics(); + // this.metricsPrinterService.printMetrics(); } @@ -351,6 +432,10 @@ public abstract class AbstractPersistenceServerServiceTest { TestPropertyValues.of("multitenancy.master.datasource.url=" + postgreSQLContainerMaster.getJdbcUrl() + connectionStringDetails, "multitenancy.master.datasource.username=" + postgreSQLContainerMaster.getUsername(), "multitenancy.master.datasource.password=" + postgreSQLContainerMaster.getPassword()).applyTo(configurableApplicationContext.getEnvironment()); + + var kcInstance = KeyCloakTestContainer.getInstance(); + + TestPropertyValues.of("keycloak.auth-server-url=" + kcInstance.getAuthServerUrl()); } } @@ -360,6 +445,28 @@ public abstract class AbstractPersistenceServerServiceTest { @ComponentScan("com.iqser.red.service.persistence") public static class TestConfiguration { + @Autowired + private KeyCloakAdminClientService cloakAdminClientService; + + @Autowired + private KeycloakSpringBootProperties keycloakSpringBootProperties; + + @Autowired + private KeyCloakSettings keyCloakSettings; + + + @PostConstruct + protected void pc() { + + var instance = KeyCloakTestContainer.getInstance(); + + when(cloakAdminClientService.getAdminClient()).thenReturn(instance.getKeycloakAdminClient()); + + keycloakSpringBootProperties.setAuthServerUrl(instance.getAuthServerUrl()); + keyCloakSettings.setServerUrl(instance.getAuthServerUrl()); + } + + @Bean @Primary public StorageService inmemoryStorage() { diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/FeignRequestInterceptor.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/FeignRequestInterceptor.java new file mode 100644 index 000000000..185ba16b0 --- /dev/null +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/FeignRequestInterceptor.java @@ -0,0 +1,23 @@ +package com.iqser.red.service.peristence.v1.server.integration.utils; + +import org.springframework.stereotype.Component; + +import feign.RequestInterceptor; +import feign.RequestTemplate; +import lombok.RequiredArgsConstructor; + +@Component +@RequiredArgsConstructor +public class FeignRequestInterceptor implements RequestInterceptor { + + private final TokenService tokenService; + + + @Override + public void apply(RequestTemplate requestTemplate) { + + var token = tokenService.getToken(); + requestTemplate.header("Authorization", "bearer " + token); + } + +} diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/FileSystemBackedStorageService.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/FileSystemBackedStorageService.java index a697f65c5..452bd4bea 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/FileSystemBackedStorageService.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/FileSystemBackedStorageService.java @@ -30,33 +30,6 @@ public class FileSystemBackedStorageService implements StorageService { } - @SneakyThrows - @Override - public InputStreamResource getObject(String objectId) { - - var res = dataMap.get(objectId); - if (res == null) { - throw new StorageObjectDoesNotExist(new RuntimeException()); - } - return new InputStreamResource(new FileInputStream(res)); - - } - - - @Override - public void deleteObject(String objectId) { - - dataMap.remove(objectId); - } - - - @Override - public boolean objectExists(String objectId) { - - return dataMap.containsKey(objectId); - } - - @Override public void init() { @@ -90,18 +63,6 @@ public class FileSystemBackedStorageService implements StorageService { } - public List listPaths() { - - return new ArrayList<>(dataMap.keySet()); - } - - - public List listFilePaths() { - - return dataMap.values().stream().map(File::getAbsolutePath).collect(Collectors.toList()); - } - - @Override @SneakyThrows public void storeObject(String objectId, InputStream stream) { @@ -116,6 +77,45 @@ public class FileSystemBackedStorageService implements StorageService { } + @SneakyThrows + @Override + public InputStreamResource getObject(String objectId) { + + var res = dataMap.get(objectId); + if (res == null) { + throw new StorageObjectDoesNotExist(new RuntimeException()); + } + return new InputStreamResource(new FileInputStream(res)); + + } + + + @Override + public void deleteObject(String objectId) { + + dataMap.remove(objectId); + } + + + @Override + public boolean objectExists(String objectId) { + + return dataMap.containsKey(objectId); + } + + + public List listPaths() { + + return new ArrayList<>(dataMap.keySet()); + } + + + public List listFilePaths() { + + return dataMap.values().stream().map(File::getAbsolutePath).collect(Collectors.toList()); + } + + public void clearStorage() { this.dataMap.forEach((k, v) -> { diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/KeyCloakTestContainer.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/KeyCloakTestContainer.java new file mode 100644 index 000000000..5b72aa1a1 --- /dev/null +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/KeyCloakTestContainer.java @@ -0,0 +1,65 @@ +package com.iqser.red.service.peristence.v1.server.integration.utils; + +import org.keycloak.representations.idm.ClientRepresentation; +import org.keycloak.representations.idm.RealmRepresentation; +import org.keycloak.representations.idm.UserRepresentation; +import org.testcontainers.containers.PostgreSQLContainer; + +import dasniko.testcontainers.keycloak.KeycloakContainer; + +public class KeyCloakTestContainer { + + private static final String IMAGE_VERSION = "quay.io/keycloak/keycloak:20.0.0"; + private static KeycloakContainer keycloak = null; + + + private KeyCloakTestContainer() { + + } + + + public static KeycloakContainer getInstance() { + + if (keycloak == null) { + keycloak = new KeycloakContainer(IMAGE_VERSION).withAdminUsername("admin").withAdminPassword("admin"); + + keycloak.start(); + + var adminClient = keycloak.getKeycloakAdminClient(); + var redaction = new RealmRepresentation(); + redaction.setId("redaction"); + redaction.setRealm("redaction"); + redaction.setEnabled(true); + adminClient.realms().create(redaction); + + var redactionRealm = adminClient.realm("redaction"); + var redactionClient = new ClientRepresentation(); + redactionClient.setId("redaction"); + redactionClient.setEnabled(true); + redactionClient.setName("redaction"); + redactionClient.setStandardFlowEnabled(true); + redactionClient.setImplicitFlowEnabled(true); + redactionClient.setDirectAccessGrantsEnabled(true); + redactionRealm.clients().create(redactionClient); + + + + + var redactionSystemClient = new ClientRepresentation(); + redactionSystemClient.setId("redaction-system"); + redactionSystemClient.setEnabled(true); + redactionSystemClient.setName("redaction-system"); + redactionSystemClient.setSecret("redaction-system"); + redactionSystemClient.setDirectAccessGrantsEnabled(true); + redactionSystemClient.setStandardFlowEnabled(true); + redactionSystemClient.setImplicitFlowEnabled(true); + redactionSystemClient.setDirectAccessGrantsEnabled(true); + redactionRealm.clients().create(redactionSystemClient); + + } + + return keycloak; + + } + +} diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/TokenService.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/TokenService.java new file mode 100644 index 000000000..2c8681a76 --- /dev/null +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/TokenService.java @@ -0,0 +1,59 @@ +package com.iqser.red.service.peristence.v1.server.integration.utils; + +import java.util.concurrent.TimeUnit; + +import javax.ws.rs.NotAuthorizedException; + +import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder; +import org.keycloak.OAuth2Constants; +import org.keycloak.admin.client.KeycloakBuilder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.iqser.red.keycloak.commons.KeyCloakSettings; +import com.iqser.red.service.persistence.management.v1.processor.exception.AuthenticationFailedException; + +import org.jboss.resteasy.client.jaxrs.internal.ResteasyClientBuilderImpl; + +@Service +public class TokenService { + + @Autowired + private KeyCloakSettings keyCloakSettings; + private String username; + private String password; + + public void setUser(String username, String password){ + this.username = username; + this.password = password; + } + + public String getToken() { + + var tokenClient = KeycloakBuilder.builder() + + .serverUrl(keyCloakSettings.getServerUrl()) + .realm(keyCloakSettings.getRealm()) + .username(username) + .password(password) + .clientId(keyCloakSettings.getClientId()) + .clientSecret(keyCloakSettings.getClientSecret()) + .grantType(OAuth2Constants.PASSWORD) + .resteasyClient(new ResteasyClientBuilderImpl().connectionTTL(2, TimeUnit.SECONDS) + .hostnameVerification(ResteasyClientBuilder.HostnameVerificationPolicy.ANY) + .connectionPoolSize(keyCloakSettings.getConnectionPoolSize()) + .disableTrustManager() + .build()) + .build(); + + try { + return tokenClient.tokenManager().getAccessTokenString(); + } catch (NotAuthorizedException e) { + throw new AuthenticationFailedException(e); + } finally { + tokenClient.close(); + } + + } + +} diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/utils/FileSystemBackArchiverTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/utils/FileSystemBackArchiverTest.java index 2a32c4dff..cac42ce7f 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/utils/FileSystemBackArchiverTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/utils/FileSystemBackArchiverTest.java @@ -11,6 +11,8 @@ import java.util.SplittableRandom; import org.apache.commons.io.IOUtils; import org.junit.jupiter.api.Test; +import com.iqser.red.service.persistence.management.v1.processor.utils.FileSystemBackedArchiver; + import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/utils/MetricsPrinterService.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/utils/MetricsPrinterService.java index b8170dd28..b6a317110 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/utils/MetricsPrinterService.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/utils/MetricsPrinterService.java @@ -119,6 +119,13 @@ public class MetricsPrinterService { } + @Override + public String toString() { + + return padRight(metric + ": ") + " | " + padLeft(count + "") + " | " + padLeft(totalStr + "") + " | " + padLeft(averageStr + ""); + } + + private String padRight(String str) { while (str.length() < 100) { @@ -136,13 +143,6 @@ public class MetricsPrinterService { return str; } - - @Override - public String toString() { - - return padRight(metric + ": ") + " | " + padLeft(count + "") + " | " + padLeft(totalStr + "") + " | " + padLeft(averageStr + ""); - } - } } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/resources/application.yml b/persistence-service-v1/persistence-service-server-v1/src/test/resources/application.yml index e5c64fd6d..9ac33ea8a 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/resources/application.yml +++ b/persistence-service-v1/persistence-service-server-v1/src/test/resources/application.yml @@ -1,6 +1,22 @@ monitoring.enabled: true spring: + quartz: + overwrite-existing-jobs: true + jdbc: + initialize-schema: never + properties: + org: + quartz: + jobStore: + class: org.springframework.scheduling.quartz.LocalDataSourceJobStore + clusterCheckinInterval: 1000 + isClustered: true + driverDelegateClass: org.quartz.impl.jdbcjobstore.PostgreSQLDelegate + scheduler: + instanceId: AUTO + job-store-type: JDBC + main: allow-circular-references: true # FIXME jpa: @@ -15,6 +31,7 @@ spring: batch_size: 50 order_inserts: true order_updates: true + open-in-view: true rabbitmq: host: ${RABBITMQ_HOST:localhost} @@ -100,3 +117,20 @@ multitenancy: prepStmtCacheSqlLimit: 2048 liquibase: changeLog: classpath:db/changelog/db.changelog-tenant.yaml + + +keycloak: + enabled: true + sslRequired: none + realm: redaction + resource: redaction + disableTrustManager: true + useResourceRoleMappings: true + +commons: + keycloak: + application-client-id: redaction + realm: redaction + client-id: redaction-system + client-secret: redaction-system + diff --git a/persistence-service-v1/persistence-service-api-v1/pom.xml b/persistence-service-v1/persistence-service-shared-api-v1/pom.xml similarity index 55% rename from persistence-service-v1/persistence-service-api-v1/pom.xml rename to persistence-service-v1/persistence-service-shared-api-v1/pom.xml index 4bdf0765f..2cce67c02 100644 --- a/persistence-service-v1/persistence-service-api-v1/pom.xml +++ b/persistence-service-v1/persistence-service-shared-api-v1/pom.xml @@ -11,72 +11,78 @@ 4.0.0 - persistence-service-api-v1 + persistence-service-shared-api-v1 + + 1.9.9 + - - com.iqser.red.service - redaction-service-api-v1 - - - com.iqser.red.service - persistence-service-api-v1 - - - com.iqser.red.service - pdftron-redaction-service-api-v1 - - - + - com.iqser.red.service - pdftron-redaction-service-api-v1 - - - com.iqser.red.service - redaction-service-api-v1 - - - com.iqser.red.service - persistence-service-api-v1 - - + com.dslplatform + dsl-json-java8 + ${dsljson.version} - - - io.github.openfeign - feign-core - true + org.springdoc + springdoc-openapi-ui + provided + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + 2.13.4 + + + + com.google.guava + guava + + - org.springframework.boot - spring-boot-starter-web - compile + io.github.openfeign + feign-core + provided + + + org.springframework + spring-web + provided + + + + org.springframework.boot + spring-boot-starter-security + + org.springframework.boot spring-boot-starter-validation - compile + + com.iqser.red.commons + jackson-commons + + com.iqser.red.commons - jackson-commons + test-commons + test - org.apache.maven.plugins maven-compiler-plugin @@ -87,7 +93,6 @@ - diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/AnalyzeRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/AnalyzeRequest.java new file mode 100644 index 000000000..56b51d754 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/AnalyzeRequest.java @@ -0,0 +1,40 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import java.time.OffsetDateTime; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ManualRedactions; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class AnalyzeRequest { + + private MessageType messageType; + + private String dossierId; + private String fileId; + private String dossierTemplateId; + private ManualRedactions manualRedactions; + private OffsetDateTime lastProcessed; + private int analysisNumber; + + @Builder.Default + private Set excludedPages = new HashSet<>(); + @Builder.Default + private Set sectionsToReanalyse = new HashSet<>(); + + @Builder.Default + private List fileAttributes = new ArrayList<>(); + +} + diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/AnalyzeResult.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/AnalyzeResult.java new file mode 100644 index 000000000..2087b898e --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/AnalyzeResult.java @@ -0,0 +1,39 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import java.util.Set; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ManualRedactions; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class AnalyzeResult { + + private MessageType messageType; + + private String dossierId; + private String fileId; + private long duration; + private int numberOfPages; + private boolean hasUpdates; + private long dictionaryVersion; + private long dossierDictionaryVersion; + private long rulesVersion; + private long legalBasisVersion; + + private boolean wasReanalyzed; + + private int analysisVersion; + private int analysisNumber; + + private ManualRedactions manualRedactions; + + private Set addedFileAttributes; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/AnnotationIds.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/AnnotationIds.java new file mode 100644 index 000000000..fcfcef726 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/AnnotationIds.java @@ -0,0 +1,17 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import java.util.HashSet; +import java.util.Set; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class AnnotationIds { + + private Set ids = new HashSet<>(); + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/AuditCategory.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/AuditCategory.java new file mode 100644 index 000000000..9e08b3e55 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/AuditCategory.java @@ -0,0 +1,15 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +public enum AuditCategory { + DOSSIER, + DOCUMENT, + USER, + DOSSIER_TEMPLATE, + DICTIONARY, + SETTINGS, + RULES, + AUDIT, + DOWNLOAD, + LICENSE, + INDEX +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/AuditResponse.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/AuditResponse.java new file mode 100644 index 000000000..d97a514cb --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/AuditResponse.java @@ -0,0 +1,22 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import java.util.List; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.common.Page; + +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +public class AuditResponse extends Page { + + public AuditResponse(List elements, long totalHits, int page, int pageSize) { + + super(elements, totalHits, page, pageSize); + } + + + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/AuthInfo.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/AuthInfo.java new file mode 100644 index 000000000..0c02be7db --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/AuthInfo.java @@ -0,0 +1,18 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +@Schema(description = "Object containing information about authorization.") +public class AuthInfo { + + @Schema(description = "The authorization url to get access token.") + private String authorizationUrl; + + @Schema(description = "The token url to get the refresh token.") + private String tokenUrl; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/CommentResponse.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/CommentResponse.java new file mode 100644 index 000000000..4b73253ac --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/CommentResponse.java @@ -0,0 +1,14 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class CommentResponse { + + private String commentId; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/CreateTypeValue.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/CreateTypeValue.java new file mode 100644 index 000000000..231915a05 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/CreateTypeValue.java @@ -0,0 +1,64 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.Pattern; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Schema(description = "Object containing entry type with an array of r-g-b colors.") +public class CreateTypeValue { + + @Schema(description = "The nonnull entry type.") + @NotEmpty + @Pattern(regexp = "[A-Za-z0-9_-]*", message = "Technical Name ( type ) must match [A-Za-z0-9_-]") + private String type; + + @Schema(description = "The value of color must be a correct hex color") + private String hexColor; + + @Schema(description = "The value of color for recommendations must be a correct hex color") + private String recommendationHexColor; + + @Schema(description = "The value of color for skipped must be a correct hex color") + private String skippedHexColor; + + @Schema(description = "The rank of this dictionary, higher rank means higher importance.") + private int rank; + + @Schema(description = "True if the type just for hint, not for redaction, default is false.") + private boolean hint; + + @Schema(description = "The DossierTemplate Id for this type") + private String dossierTemplateId; + + @Schema(description = "True if the entries in this type should be matched case insensitively, default is " + "false.") + private boolean caseInsensitive; + + @Schema(description = "True if the type just for recommendations, not for redaction, default is false.") + private boolean recommendation; + + @Schema(description = "The description of the dictionary type") + private String description; + + @Schema(description = "If true the ui will add a action to add values to dictionary") + private boolean addToDictionaryAction; + + @Schema(description = "Label of the type") + private String label; + + @Schema(description = "If the Entity has a dictionary") + private boolean hasDictionary; + + @Schema(description = "If the ui should hide entries of this type by default if they are skipped") + private boolean autoHideSkipped; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/CreateUserRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/CreateUserRequest.java new file mode 100644 index 000000000..77a34b2a5 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/CreateUserRequest.java @@ -0,0 +1,24 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import java.util.ArrayList; +import java.util.List; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class CreateUserRequest { + + @Schema(description = "Email of user.") + private String email; + + @Schema(description = "First name of user.") + private String firstName; + + @Schema(description = "Last name of user.") + private String lastName; + + @Schema(description = "The list of RED_* roles.") + private List roles = new ArrayList<>(); + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/Dictionary.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/Dictionary.java new file mode 100644 index 000000000..9b5231499 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/Dictionary.java @@ -0,0 +1,70 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import java.util.List; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor +@Schema(description = "Object containing a list of dictionary entries and colors of an entry type.") +public class Dictionary { + + @Schema(description = "The list of dictionary entries of an entry type.") + private List entries; + + @Schema(description = "The list of false positive entries of an entry type.") + private List falsePositiveEntries; + + @Schema(description = "The list of false recommendation entries of an entry type.") + private List falseRecommendationEntries; + + @Schema(description = "The DossierTemplate Id for this type") + private String dossierTemplateId; + + @Schema(description = "The value of color must be a correct hex color") + private String hexColor; + + @Schema(description = "The value of color for recommendations must be a correct hex color") + private String recommendationHexColor; + + @Schema(description = "The value of color for skipped must be a correct hex color") + private String skippedHexColor; + + @Schema(description = "The rank of this dictionary, higher rank means higher importance.") + private int rank; + + @Schema(description = "True if the type just for hint, not for redaction, default is false.") + private boolean hint; + + @Schema(description = "True if the entries in this type should be matched case insensitively, default is false.") + private boolean caseInsensitive; + + @Schema(description = "True if the type just for recommendations, not for redaction, default is false.") + private Boolean recommendation; + + @Schema(description = "The description of the dictionary type") + private String description; + + @Schema(description = "If true the ui will add a action to add values to dictionary") + private boolean addToDictionaryAction; + + @Schema(description = "Label of the type") + private String label; + + @Schema(description = "If the Entity has a dictionary") + private boolean hasDictionary; + + @Schema(description = "If the Entity is a system managed and can not be removed") + private boolean systemManaged; + + @Schema(description = "If the ui should hide entries of this type by default if they are skipped") + private boolean autoHideSkipped; + +} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/configuration/DigitalSignatureKms.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/DigitalSignatureKms.java similarity index 79% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/configuration/DigitalSignatureKms.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/DigitalSignatureKms.java index c96b7da69..c253c9c37 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/configuration/DigitalSignatureKms.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/DigitalSignatureKms.java @@ -1,5 +1,6 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration; +package com.iqser.red.service.persistence.service.v1.api.shared.model; +import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -25,6 +26,6 @@ public class DigitalSignatureKms { @NonNull private String kmsSecretKey; @NonNull - private byte[] certificate; + private String certificate; } diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/DigitalSignatureKmsViewModel.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/DigitalSignatureKmsViewModel.java new file mode 100644 index 000000000..66389c37c --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/DigitalSignatureKmsViewModel.java @@ -0,0 +1,27 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.NonNull; + +@Data +@NoArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor +@Builder +public class DigitalSignatureKmsViewModel { + + @NonNull + private String certificateName; + @NonNull + private String kmsKeyId; + @NonNull + private String kmsServiceEndpoint; + @NonNull + private String kmsRegion; + @NonNull + private String kmsAccessKey; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/DigitalSignatureViewModel.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/DigitalSignatureViewModel.java new file mode 100644 index 000000000..b4415a555 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/DigitalSignatureViewModel.java @@ -0,0 +1,20 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class DigitalSignatureViewModel { + + private String certificateName; + private String location; + private String reason; + private String contactInfo; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/DossierAttributes.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/DossierAttributes.java new file mode 100644 index 000000000..f06e06b9f --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/DossierAttributes.java @@ -0,0 +1,19 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import java.util.ArrayList; +import java.util.List; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.DossierAttribute; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class DossierAttributes { + + List dossierAttributeList = new ArrayList<>(); + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/DossierAttributesConfig.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/DossierAttributesConfig.java new file mode 100644 index 000000000..ca2bdb3b1 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/DossierAttributesConfig.java @@ -0,0 +1,19 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import java.util.ArrayList; +import java.util.List; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierAttributeConfig; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class DossierAttributesConfig { + + private List dossierAttributeConfigs = new ArrayList<>(); + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/DossierChangeEntry.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/DossierChangeEntry.java new file mode 100644 index 000000000..17c511ce1 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/DossierChangeEntry.java @@ -0,0 +1,14 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class DossierChangeEntry { + + private String dossierId; + private boolean dossierChanges; + private boolean fileChanges; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/DossierInformation.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/DossierInformation.java new file mode 100644 index 000000000..60312adbf --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/DossierInformation.java @@ -0,0 +1,18 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class DossierInformation { + + @Schema(description = "Number of active dossiers.") + private int numberOfActiveDossiers; + @Schema(description = "Number of archived dossiers.") + private int numberOfArchivedDossiers; + @Schema(description = "Number of soft deleted dossiers.") + private int numberOfSoftDeletedDossiers; + @Schema(description = "Number of hard deleted dossiers.") + private int numberOfHardDeletedDossiers; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/DossierRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/DossierRequest.java new file mode 100644 index 000000000..ac36868f3 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/DossierRequest.java @@ -0,0 +1,67 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import java.time.OffsetDateTime; +import java.util.HashSet; +import java.util.Set; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DownloadFileType; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.NonNull; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Schema(description = "Object containing information about a dossier.") +public class DossierRequest { + + @Schema(description = "The id of the dossier, can be null for create requests.") + private String dossierId; + + @Schema(description = "The dossierTemplateId for this dossier. can be null for update request.") + private String dossierTemplateId; + + @NonNull + @Schema(description = "The name of the dossier. Must be unique.") + private String dossierName; + + @Schema(description = "The dossier's description (optional).") + private String description; + + @Schema(description = "The date when the dossier is due.") + private OffsetDateTime dueDate; + + @Schema(description = "The id of the owning user.") + private String ownerId; + + @Builder.Default + @Schema(description = "The id(s) of members associated to this dossier.") + private Set memberIds = new HashSet<>(); + + @Builder.Default + @Schema(description = "The id(s) of approvers associated to this dossier.") + private Set approverIds = new HashSet<>(); + + @Builder.Default + @Schema(description = "Download File Types for this dossiers submission package.") + private Set downloadFileTypes = new HashSet<>(); + + @Builder.Default + @Schema(description = "Id(s) of the word report templates used to generate downloads") + private Set reportTemplateIds = new HashSet<>(); + + @Schema(description = "The watermark id to be applied to the redacted files.") + private Long watermarkId; + + @Schema(description = "The preview watermark id that will be applied to the previewed files.") + private Long previewWatermarkId; + + @Schema(description = "The dossierStatusId for this dossier. can be null for update request.") + private String dossierStatusId; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/DossierStats.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/DossierStats.java new file mode 100644 index 000000000..944525ae7 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/DossierStats.java @@ -0,0 +1,52 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import java.io.Serializable; +import java.time.OffsetDateTime; +import java.util.Map; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.ProcessingStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Schema(description = "Object aggregation of different stats for a specific dossier.") +public class DossierStats implements Serializable { + + @Schema(description = "The ID of the dossier") + private String dossierId; + @Schema(description = "The number of files that belongs to the given dossier") + private int numberOfFiles; + @Schema(description = "The number of soft deleted files that belongs to the given dossier") + private int numberOfSoftDeletedFiles; + @Schema(description = "The sum of all pages") + private int numberOfPages; + @Schema(description = "The sum of all excluded pages") + private int numberOfExcludedPages; + @Schema(description = "True if at least one file in the dossier has redactions flag") + private boolean hasRedactionsFilePresent; // true if at least one file in the dossier has redactions + @Schema(description = "True if at least one file in the dossier has hints flag but doesn't have redactions flag") + private boolean hasHintsNoRedactionsFilePresent; // true if at least one file in the dossier has hints but doesn't have redactions + @Schema(description = "True if at least one file in the dossier has suggestions flag") + private boolean hasSuggestionsFilePresent; // true if at least one file in the dossier has suggestions + @Schema(description = "True if at least one file in the dossier has updates flag") + private boolean hasUpdatesFilePresent; //true if at least one file in the dossier has updates + @Schema(description = "True if at least one file in the dossier has none of the other flags") + private boolean hasNoFlagsFilePresent; // true if at least one file in the dossier has none of the other flags + @Schema(description = "Number of files in each processing status") + private Map fileCountPerProcessingStatus; + @Schema(description = "Number of files in each status") + private Map fileCountPerWorkflowStatus; + @Schema(description = "The most recent file modification date") + private OffsetDateTime lastFileUpdateDate; + @Schema(description = "The most recent file manipulation date") + private OffsetDateTime fileManipulationDate; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/DossierStatusRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/DossierStatusRequest.java new file mode 100644 index 000000000..c8dae5719 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/DossierStatusRequest.java @@ -0,0 +1,30 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Schema(description = "Object containing information about a dossier status.") +public class DossierStatusRequest { + + @Schema(description = "The dossier status id") + private String dossierStatusId; + @Schema(description = "The dossier status name") + private String name; + @Schema(description = "The description of the dossier status") + private String description; + @Schema(description = "The dossier template id") + private String dossierTemplateId; + @Schema(description = "The color of the dossier status") + private String color; + @Schema(description = "The rank of the dossier status") + private int rank; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/DossierTemplateModel.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/DossierTemplateModel.java new file mode 100644 index 000000000..a88353636 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/DossierTemplateModel.java @@ -0,0 +1,60 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import java.time.OffsetDateTime; +import java.util.HashSet; +import java.util.Set; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierTemplateStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DownloadFileType; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DossierTemplateModel { + + @Schema(description = "The Rule Set Id. Generated by the system on create.") + private String dossierTemplateId; + + @Schema(description = "The name of this dossierTemplate. Must be set on create / update requests") + private String name; + + @Schema(description = "The description of this dossierTemplate") + private String description; + + @Schema(description = "The date when this dossierTemplate was created. Set by System on create.") + private OffsetDateTime dateAdded; + + @Schema(description = "The date when this dossierTemplate was last modified. Set by System on create.") + private OffsetDateTime dateModified; + + @Schema(description = "The userId of the user who created this DossierTemplate. Set by the system.") + private String createdBy; + + @Schema(description = "The userId of the user who last modified this DossierTemplate. Set by the system.") + private String modifiedBy; + + @Schema(description = "Validity of start this dossierTemplate.") + private OffsetDateTime validFrom; + + @Schema(description = "Validity of end this dossierTemplate.") + private OffsetDateTime validTo; + + @Schema(description = "Download File Types for this dossierTemplate's dossiers submission package.") + @Builder.Default + private Set downloadFileTypes = new HashSet<>(); + + @Schema(description = "Status of dossier template.") + private DossierTemplateStatus dossierTemplateStatus; + + public String getId(){ + return dossierTemplateId; + } + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/DownloadResponse.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/DownloadResponse.java new file mode 100644 index 000000000..a182d8ae0 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/DownloadResponse.java @@ -0,0 +1,17 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class DownloadResponse { + + private String storageId; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/DownloadStatusResponse.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/DownloadStatusResponse.java new file mode 100644 index 000000000..ba093eaa2 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/DownloadStatusResponse.java @@ -0,0 +1,21 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import java.util.List; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.download.DownloadStatus; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class DownloadStatusResponse { + + private List downloadStatus; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/DownloadSubmissionPackageRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/DownloadSubmissionPackageRequest.java new file mode 100644 index 000000000..26b2c7a08 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/DownloadSubmissionPackageRequest.java @@ -0,0 +1,14 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import java.util.HashSet; +import java.util.Set; + +import lombok.Data; + +@Data +public class DownloadSubmissionPackageRequest { + + private Set fileIds = new HashSet<>(); + private boolean reportsAsSingleFiles; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/FileAttribute.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/FileAttribute.java new file mode 100644 index 000000000..871a078f8 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/FileAttribute.java @@ -0,0 +1,20 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class FileAttribute { + + private String id; + private String label; + private String placeholder; + private String value; + +} + diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/FileAttributes.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/FileAttributes.java new file mode 100644 index 000000000..8b12b3c16 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/FileAttributes.java @@ -0,0 +1,17 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import java.util.HashMap; +import java.util.Map; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class FileAttributes { + + Map attributeIdToValue = new HashMap<>(); + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/FileAttributesConfig.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/FileAttributesConfig.java new file mode 100644 index 000000000..750777667 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/FileAttributesConfig.java @@ -0,0 +1,33 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import java.util.ArrayList; +import java.util.List; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileAttributeConfig; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class FileAttributesConfig { + + private String filenameMappingColumnHeaderName; + + private String delimiter; + + private String encoding; + + @Builder.Default + private List fileAttributeConfigs = new ArrayList<>(); + + + public FileAttributesConfig(List fileAttributeConfigs) { + this(null, ",", "UTF-8", fileAttributeConfigs); + } + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/FileIds.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/FileIds.java new file mode 100644 index 000000000..2fd86bbc7 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/FileIds.java @@ -0,0 +1,17 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import java.util.HashSet; +import java.util.Set; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class FileIds { + + private Set fileIds = new HashSet<>(); + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/FileStatus.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/FileStatus.java new file mode 100644 index 000000000..3b4af8ea6 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/FileStatus.java @@ -0,0 +1,152 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import java.time.OffsetDateTime; +import java.util.Set; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.ProcessingStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor(access = AccessLevel.PRIVATE) +@Schema(description = "Object containing information on a specific file.") +public class FileStatus { + + @Schema(description = "The ID of the dossier the file belongs to.") + private String dossierId; + + @Schema(description = "The ID of the dossier template of the dossier the file belongs to.") + private String dossierTemplateId; + + @Schema(description = "The ID of the dossier status of the dossier the file belongs to.") + private String dossierStatusId; + + @Schema(description = "The ID of the file.") + private String fileId; + + @Schema(description = "The file's name.") + private String filename; + + @Schema(description = "Tells if the dossier of this file is archived or not.") + private boolean dossierArchived; + + @Schema(description = "The processing status of a file") + private ProcessingStatus processingStatus; + + @Schema(description = "The workflow status of a file") + private WorkflowStatus workflowStatus; + + @Schema(description = "The number of pages of the file.") + private int numberOfPages; + + @Schema(description = "Date and time when the file was added to the system.") + private OffsetDateTime added; + + @Schema(description = "Date and time when the file was last updated.") + private OffsetDateTime lastUpdated; + + @Schema(description = "The number of times the file has been analyzed.") + private int numberOfAnalyses; + + @Schema(description = "The current assignee's (if any) user id.") + private String assignee; + + @Schema(description = "The last reviewer's (if any) user id.") + private String lastReviewer; + + @Schema(description = "The last approvers's (if any) user id.") + private String lastApprover; + + @Schema(description = "Shows if any redactions were found during the analysis.") + private boolean hasRedactions; + + @Schema(description = "Shows if any hints were found during the analysis.") + private boolean hasHints; + + @Deprecated + @Schema(description = "Shows if any requests were found during the analysis.") + private boolean hasRequests; + + @Schema(description = "Shows if there is any change between the previous and current analysis.") + private boolean hasUpdates; + + @Schema(description = "Shows if any images were found during the analysis.") + private boolean hasImages; + @Schema(description = "Shows if this file has been OCRed by us. Start time of OCR Process") + private OffsetDateTime ocrStartTime; + @Schema(description = "Number of pages to be OCRed by us") + private int numberOfPagesToOCR; + @Schema(description = "Number of pages already OCRed by us") + private int numberOfOCRedPages; + @Schema(description = "Shows if this file has been OCRed by us. End time of OCR Process") + private OffsetDateTime ocrEndTime; + @Schema(description = "Shows if this file has comments on annotations.") + private boolean hasAnnotationComments; + @Schema(description = "The ID of the user who uploaded the file.") + private String uploader; + @Schema(description = "Shows which dictionary versions was used during the analysis.") + private long dictionaryVersion; + @Schema(description = "Shows which rules versions was used during the analysis.") + private long rulesVersion; + @Schema(description = "Shows which legal basis versions was used during the analysis.") + private long legalBasisVersion; + @Schema(description = "Shows if the file was excluded from analysis.") + private boolean excluded; + @Schema(description = "Shows the last date of a successful analysis.") + private OffsetDateTime lastProcessed; + @Schema(description = "Shows the date of approval, if approved.") + private OffsetDateTime approvalDate; + @Schema(description = "Shows last date the document was uploaded.") + private OffsetDateTime lastUploaded; + @Schema(description = "Shows how long the last analysis took") + private long analysisDuration; + @Schema(description = "Additional file attributes that can be set or imported") + private FileAttributes fileAttributes; + @Schema(description = "Shows which dossier dictionary versions was used during the analysis.") + private long dossierDictionaryVersion; + @Schema(description = "Shows if the file requires reanalysis.") + private boolean analysisRequired; + @Schema(description = "Set of excluded pages for this file.") + private Set excludedPages; + @Schema(description = "Shows if the file is soft deleted.") + private OffsetDateTime softDeletedTime; + @Schema(description = "Date and time when the files attributes was last updated.") + private OffsetDateTime lastFileAttributeChange; + @Schema(description = "Shows if there are any Suggestions in this file.") + private boolean hasSuggestions; + @Schema(description = "Shows if the file is excluded from automatic analysis.") + private boolean excludedFromAutomaticAnalysis; + @Schema(description = "Shows the last redaction modification date of this file.") + private OffsetDateTime redactionModificationDate; + @Schema(description = "Shows the date of the last manipulation of this file.") + private OffsetDateTime fileManipulationDate; + @Schema(description = "Shows the date of the last manual change of an annotation of this file.") + private OffsetDateTime lastManualChangeDate; + @Schema(description = "Shows if there are highlights to remove or convert for this file.") + private boolean hasHighlights; + @Schema(description = "Size of the optimized, internally stored file.") + private Long fileSize; + @Schema(description = "Analysis Version.") + private int analysisVersion; + @Schema(description = "Last time the file was indexed in ES.") + private OffsetDateTime lastIndexed; + + @Schema(description = "Shows if this file has been OCRed by us. Last Time of OCR.") + public OffsetDateTime getLastOCRTime() { + + return ocrEndTime != null ? ocrEndTime : ocrStartTime; + } + + public String getId(){ + return fileId; + } + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/FileUploadResult.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/FileUploadResult.java new file mode 100644 index 000000000..4bd4d6874 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/FileUploadResult.java @@ -0,0 +1,31 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import java.util.ArrayList; +import java.util.List; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Schema(description = "Object containing information about a successfully uploaded file.") +public class FileUploadResult { + + @Builder.Default + @Schema(description = "List of fileIds generated for uploaded file(s).") + public List fileIds = new ArrayList<>(); + + @Builder.Default + @Schema(description = "List processed file attributes, in case the upload contained a CSV.") + public List processedAttributes = new ArrayList<>(); + + @Builder.Default + @Schema(description = "List processed fileIds, in case the upload contained a CSV.") + public List processedFileIds = new ArrayList<>(); + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/GeneralConfigurationModel.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/GeneralConfigurationModel.java new file mode 100644 index 000000000..3ac07fbb0 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/GeneralConfigurationModel.java @@ -0,0 +1,18 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class GeneralConfigurationModel { + + private boolean forgotPasswordFunctionEnabled; + private String auxiliaryName; + private String displayName; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/JsonNode.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/JsonNode.java new file mode 100644 index 000000000..804224b6b --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/JsonNode.java @@ -0,0 +1,10 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import lombok.Data; + +@Data +public class JsonNode { + + private T value; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/MessageType.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/MessageType.java new file mode 100644 index 000000000..8dcd54303 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/MessageType.java @@ -0,0 +1,10 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +public enum MessageType { + + ANALYSE, + REANALYSE, + STRUCTURE_ANALYSE, + SURROUNDING_TEXT + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/MyDownloadModel.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/MyDownloadModel.java new file mode 100644 index 000000000..ae9d408e7 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/MyDownloadModel.java @@ -0,0 +1,20 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import java.time.OffsetDateTime; + +import com.fasterxml.jackson.databind.JsonNode; + +import lombok.Data; + +@Data +public class MyDownloadModel { + + private String downloadId; + private String status; + + private OffsetDateTime creationDate; + private OffsetDateTime lastDownload; + + private JsonNode downloadDetails; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/NotificationResponse.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/NotificationResponse.java new file mode 100644 index 000000000..7448102d5 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/NotificationResponse.java @@ -0,0 +1,22 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import java.util.ArrayList; +import java.util.List; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.notification.Notification; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class NotificationResponse { + + @Builder.Default + private List notifications = new ArrayList<>(); + +} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/common/Page.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/PageExclusionRequest.java similarity index 52% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/common/Page.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/PageExclusionRequest.java index 5224752f5..d6330bd34 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/common/Page.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/PageExclusionRequest.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.common; +package com.iqser.red.service.persistence.service.v1.api.shared.model; import java.util.ArrayList; import java.util.List; @@ -8,16 +8,13 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -@AllArgsConstructor -@NoArgsConstructor @Data @Builder -public class Page { +@AllArgsConstructor +@NoArgsConstructor +public class PageExclusionRequest { @Builder.Default - private List elements = new ArrayList<>(); - private long totalHits; - private int page; - private int pageSize; + private List pageRanges = new ArrayList<>(); } diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/PageRange.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/PageRange.java new file mode 100644 index 000000000..502f2909c --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/PageRange.java @@ -0,0 +1,20 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class PageRange { + + @Builder.Default + private int startPage = -1; + + @Builder.Default + private int endPage = -1; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/PlaceholdersResponse.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/PlaceholdersResponse.java new file mode 100644 index 000000000..9f57aa489 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/PlaceholdersResponse.java @@ -0,0 +1,20 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import java.util.List; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Schema(description = "Object containing available placeholders.") +public class PlaceholdersResponse { + + List generalPlaceholders; + List dossierAttributePlaceholders; + List fileAttributePlaceholders; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/PrepareDownloadRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/PrepareDownloadRequest.java new file mode 100644 index 000000000..5c7abcc76 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/PrepareDownloadRequest.java @@ -0,0 +1,22 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import java.util.List; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Schema(description = "Object containing information on which file and report types should be included in the download.") +public class PrepareDownloadRequest { + + private String dossierId; + private List fileIds; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/PrepareDownloadWithOptionRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/PrepareDownloadWithOptionRequest.java new file mode 100644 index 000000000..811139038 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/PrepareDownloadWithOptionRequest.java @@ -0,0 +1,33 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import javax.validation.constraints.NotNull; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DownloadFileType; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Schema(description = "Object containing information on which file and reports and download types should be included in the download.") +public class PrepareDownloadWithOptionRequest { + + @NotNull + private String dossierId; + private List fileIds; + private List reportTemplateIds = new ArrayList<>(); + private Set downloadFileTypes = new HashSet<>(); + private String redactionPreviewColor; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/RemoveDownloadRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/RemoveDownloadRequest.java new file mode 100644 index 000000000..0cdb9c946 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/RemoveDownloadRequest.java @@ -0,0 +1,17 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import java.util.ArrayList; +import java.util.List; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class RemoveDownloadRequest { + + private List storageIds = new ArrayList<>(); + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/ReportTemplateUpdateRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/ReportTemplateUpdateRequest.java new file mode 100644 index 000000000..f1905fd7d --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/ReportTemplateUpdateRequest.java @@ -0,0 +1,26 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.NonNull; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Schema(description = "Object aggregation of report template properties for update") +public class ReportTemplateUpdateRequest { + + @Schema(description = "The filename of the report to be updated") + @NonNull + private String fileName; + + @Schema(description = "The multi file report property") + private boolean multiFileReport; + @Schema(description = "The active by default property") + private boolean activeByDefault; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/ResetPasswordRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/ResetPasswordRequest.java new file mode 100644 index 000000000..06b74e723 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/ResetPasswordRequest.java @@ -0,0 +1,11 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import lombok.Data; + +@Data +public class ResetPasswordRequest { + + private String password; + private boolean temporary; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/RotatePagesRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/RotatePagesRequest.java new file mode 100644 index 000000000..0cf5607a4 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/RotatePagesRequest.java @@ -0,0 +1,24 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import java.util.HashMap; +import java.util.Map; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class RotatePagesRequest { + + /* + * Key: Page. First page starts with 1 + * Value: Rotation. Valid values 0, 90, 180, 270 + */ + @Builder.Default + private Map pages = new HashMap<>(); + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/Rules.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/Rules.java new file mode 100644 index 000000000..588d57581 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/Rules.java @@ -0,0 +1,21 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Schema(description = "Object containing a string of Drools rules.") +public class Rules { + + @Schema(description = "The actual string of rules.") + private String rules; + + @Schema(description = "The DossierTemplate Id for these rules") + private String dossierTemplateId; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/TypeResponse.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/TypeResponse.java new file mode 100644 index 000000000..5da8da999 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/TypeResponse.java @@ -0,0 +1,20 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import java.util.List; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor +@Schema(description = "Object containing a list of values of an entry type.") +public class TypeResponse { + + @Schema(description = "The list of values of an entry type, which include colors, hint and caseInsensitive.") + private List types; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/TypeValue.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/TypeValue.java new file mode 100644 index 000000000..008be0dd2 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/TypeValue.java @@ -0,0 +1,65 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Schema(description = "Object containing entry type with an array of r-g-b colors.") +public class TypeValue { + + @Schema(description = "The nonnull entry typeId.") + private String typeId; + + @Schema(description = "The nonnull entry type.") + private String type; + + @Schema(description = "The value of color must be a correct hex color") + private String hexColor; + + @Schema(description = "The value of color for recommendations must be a correct hex color") + private String recommendationHexColor; + + @Schema(description = "The value of color for skipped must be a correct hex color") + private String skippedHexColor; + + @Schema(description = "The rank of this dictionary, higher rank means higher importance.") + private int rank; + + @Schema(description = "True if the type just for hint, not for redaction, default is false.") + private boolean hint; + + @Schema(description = "The DossierTemplate Id for this type") + private String dossierTemplateId; + + @Schema(description = "True if the entries in this type should be matched case insensitively, default is false.") + private boolean caseInsensitive; + + @Schema(description = "True if the type just for recommendations, not for redaction, default is false.") + private boolean recommendation; + + @Schema(description = "The description of the dictionary type") + private String description; + + @Schema(description = "If true the ui will add a action to add values to dictionary") + private boolean addToDictionaryAction; + + @Schema(description = "Label of the type") + private String label; + + @Schema(description = "If the Entity has a dictionary") + private boolean hasDictionary; + + @Schema(description = "If the Entity is a system managed and can not be removed") + private boolean systemManaged; + + @Schema(description = "If the ui should hide entries of this type by default if they are skipped") + private boolean autoHideSkipped; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/UntouchedDocumentResponse.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/UntouchedDocumentResponse.java new file mode 100644 index 000000000..b16d5fbd2 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/UntouchedDocumentResponse.java @@ -0,0 +1,17 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class UntouchedDocumentResponse { + + private boolean hasHighlights; + private long fileSize; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/UpdateMyProfileRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/UpdateMyProfileRequest.java new file mode 100644 index 000000000..74f0d1fd4 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/UpdateMyProfileRequest.java @@ -0,0 +1,26 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import javax.validation.constraints.Email; +import javax.validation.constraints.NotEmpty; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class UpdateMyProfileRequest { + + @Schema(description = "Email of user.") + @Email + @NotEmpty + private String email; + + @Schema(description = "First name of user.") + private String firstName; + + @Schema(description = "Last name of user.") + private String lastName; + + @Schema(description = "Password of user.") + private String password; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/UpdateProfileRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/UpdateProfileRequest.java new file mode 100644 index 000000000..bfe537728 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/UpdateProfileRequest.java @@ -0,0 +1,24 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import java.util.ArrayList; +import java.util.List; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class UpdateProfileRequest { + + @Schema(description = "Email of user.") + private String email; + + @Schema(description = "First name of user.") + private String firstName; + + @Schema(description = "Last name of user.") + private String lastName; + + @Schema(description = "Roles.") + private List roles = new ArrayList<>(); + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/UpdateTypeValue.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/UpdateTypeValue.java new file mode 100644 index 000000000..418b52375 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/UpdateTypeValue.java @@ -0,0 +1,53 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Schema(description = "Object containing information of type to be updated.") +public class UpdateTypeValue { + + @Schema(description = "The value of color must be a correct hex color") + private String hexColor; + + @Schema(description = "The value of color for recommendations must be a correct hex color") + private String recommendationHexColor; + + @Schema(description = "The value of color for skipped must be a correct hex color") + private String skippedHexColor; + + @Schema(description = "True if the type just for hint, not for redaction, default is false.") + private boolean hint; + + @Schema(description = "The rank of this dictionary, higher rank means higher importance.") + private int rank; + + @Schema(description = "True if the entries in this type should be matched case insensitively, default is false.") + private boolean caseInsensitive; + + @Schema(description = "True if the type just for recommendations, not for redaction, default is false.") + private boolean recommendation; + + @Schema(description = "The description of the dictionary type") + private String description; + + @Schema(description = "If true the ui will add a action to add values to dictionary") + private boolean addToDictionaryAction; + + @Schema(description = "Label of the type") + private String label; + + @Schema(description = "If the Entity has a dictionary") + private boolean hasDictionary; + + @Schema(description = "If the ui should hide entries of this type by default if they are skipped") + private boolean autoHideSkipped; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/VersionsResponse.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/VersionsResponse.java new file mode 100644 index 000000000..fe2695847 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/VersionsResponse.java @@ -0,0 +1,16 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Value; + +@Value +@Schema(description = "Object containing a list of values of user.") +public class VersionsResponse { + + @Schema(description = "The current dictionary version.") + long dictionaryVersion; + + @Schema(description = "The current rules version.") + long rulesVersion; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/ViewedPages.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/ViewedPages.java new file mode 100644 index 000000000..6fad128c1 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/ViewedPages.java @@ -0,0 +1,23 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import java.util.HashSet; +import java.util.Set; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ViewedPage; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class ViewedPages { + + @Builder.Default + private Set pages = new HashSet<>(); + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/ViewedPagesRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/ViewedPagesRequest.java new file mode 100644 index 000000000..bee6e1d41 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/ViewedPagesRequest.java @@ -0,0 +1,15 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class ViewedPagesRequest { + + private int page; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/WatermarkModel.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/WatermarkModel.java new file mode 100644 index 000000000..eee36c5b4 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/WatermarkModel.java @@ -0,0 +1,47 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model; + +import java.time.OffsetDateTime; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.WatermarkOrientation; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class WatermarkModel { + + @Schema(description = "The watermark Id. Generated by the system on create.") + private Long id; + @Schema(description = "The name of this watermark configuration. Must be set on create / update requests") + private String name; + @Schema(description = "The name of this dossierTemplate. Must be set on create / update requests") + private boolean enabled; + @Schema(description = "The dossier template id to which watermark belongs") + private String dossierTemplateId; + @Schema(description = "The text used for this watermark") + private String text; + @Schema(description = "The hex color used in watermark") + private String hexColor; + @Schema(description = "The opacity used in watermark") + private int opacity; + @Schema(description = "The font size used for watermark") + private int fontSize; + @Schema(description = "The font type used for watermark") + private String fontType; + @Schema(description = "The watermark orientation") + private WatermarkOrientation orientation; + @Schema(description = "The userId of the user who created this watermark. Set by the system.") + private String createdBy; + @Schema(description = "The date when this watermark was created. Set by System on create.") + private OffsetDateTime dateAdded; + @Schema(description = "The date when this watermark was last modified. Set by System on create.") + private OffsetDateTime dateModified; + +} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/AddRedactionRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/AddRedactionRequest.java similarity index 81% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/AddRedactionRequest.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/AddRedactionRequest.java index 3c9e78859..da90dd4e4 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/AddRedactionRequest.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/AddRedactionRequest.java @@ -1,9 +1,9 @@ -package com.iqser.red.service.persistence.service.v1.api.model.annotations; +package com.iqser.red.service.persistence.service.v1.api.shared.model.annotations; import java.util.ArrayList; import java.util.List; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.DictionaryEntryType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionaryEntryType; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/AnnotationStatus.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/AnnotationStatus.java new file mode 100644 index 000000000..29841005c --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/AnnotationStatus.java @@ -0,0 +1,8 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.annotations; + +public enum AnnotationStatus { + REQUESTED, + APPROVED, + DECLINED + +} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/Comment.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/Comment.java similarity index 67% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/Comment.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/Comment.java index 004735e80..43807615f 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/Comment.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/Comment.java @@ -1,8 +1,8 @@ -package com.iqser.red.service.persistence.service.v1.api.model.annotations; +package com.iqser.red.service.persistence.service.v1.api.shared.model.annotations; import java.time.OffsetDateTime; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileModel; import lombok.AllArgsConstructor; import lombok.Builder; @@ -22,6 +22,5 @@ public class Comment { private String text; private String user; private OffsetDateTime softDeletedTime; - private FileModel fileStatus; } diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/CommentRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/CommentRequest.java similarity index 75% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/CommentRequest.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/CommentRequest.java index 2c8b9c857..3b238d6ab 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/CommentRequest.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/CommentRequest.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.annotations; +package com.iqser.red.service.persistence.service.v1.api.shared.model.annotations; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/DeleteImportedRedactionsRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/DeleteImportedRedactionsRequest.java similarity index 80% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/DeleteImportedRedactionsRequest.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/DeleteImportedRedactionsRequest.java index 3c471252e..4b96de748 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/DeleteImportedRedactionsRequest.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/DeleteImportedRedactionsRequest.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.annotations; +package com.iqser.red.service.persistence.service.v1.api.shared.model.annotations; import java.util.Set; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ForceRedactionRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/ForceRedactionRequest.java similarity index 82% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ForceRedactionRequest.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/ForceRedactionRequest.java index 870da2186..5e0cdc677 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ForceRedactionRequest.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/ForceRedactionRequest.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.annotations; +package com.iqser.red.service.persistence.service.v1.api.shared.model.annotations; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ImageRecategorizationRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/ImageRecategorizationRequest.java similarity index 82% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ImageRecategorizationRequest.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/ImageRecategorizationRequest.java index 6dd15bc98..cf31c02e8 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ImageRecategorizationRequest.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/ImageRecategorizationRequest.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.annotations; +package com.iqser.red.service.persistence.service.v1.api.shared.model.annotations; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/LegalBasisChangeRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/LegalBasisChangeRequest.java similarity index 84% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/LegalBasisChangeRequest.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/LegalBasisChangeRequest.java index 20a4a65e0..2e04f8c00 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/LegalBasisChangeRequest.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/LegalBasisChangeRequest.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.annotations; +package com.iqser.red.service.persistence.service.v1.api.shared.model.annotations; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ManualAddResponse.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/ManualAddResponse.java similarity index 76% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ManualAddResponse.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/ManualAddResponse.java index f21359da6..5a7dcdb19 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ManualAddResponse.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/ManualAddResponse.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.annotations; +package com.iqser.red.service.persistence.service.v1.api.shared.model.annotations; import lombok.AllArgsConstructor; import lombok.Builder; @@ -10,7 +10,6 @@ import lombok.NoArgsConstructor; @AllArgsConstructor @NoArgsConstructor public class ManualAddResponse { - private String annotationId; private Long commentId; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ManualRedactions.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/ManualRedactions.java similarity index 55% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ManualRedactions.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/ManualRedactions.java index 19d79d9f8..d0fa582e5 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ManualRedactions.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/ManualRedactions.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.annotations; +package com.iqser.red.service.persistence.service.v1.api.shared.model.annotations; import java.util.HashMap; import java.util.HashSet; @@ -6,12 +6,12 @@ import java.util.List; import java.util.Map; import java.util.Set; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.entitymapped.IdRemoval; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.entitymapped.ManualForceRedaction; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.entitymapped.ManualImageRecategorization; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.entitymapped.ManualLegalBasisChange; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.entitymapped.ManualRedactionEntry; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.entitymapped.ManualResizeRedaction; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.IdRemoval; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualForceRedaction; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualImageRecategorization; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualLegalBasisChange; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualRedactionEntry; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualResizeRedaction; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/Rectangle.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/Rectangle.java similarity index 79% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/Rectangle.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/Rectangle.java index 4efd7896f..7b1eaca73 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/Rectangle.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/Rectangle.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.annotations; +package com.iqser.red.service.persistence.service.v1.api.shared.model.annotations; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/RemoveRedactionRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/RemoveRedactionRequest.java similarity index 82% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/RemoveRedactionRequest.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/RemoveRedactionRequest.java index d655589e7..1319251df 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/RemoveRedactionRequest.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/RemoveRedactionRequest.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.annotations; +package com.iqser.red.service.persistence.service.v1.api.shared.model.annotations; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ResizeRedactionRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/ResizeRedactionRequest.java similarity index 88% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ResizeRedactionRequest.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/ResizeRedactionRequest.java index 351ee1ac8..2e8b0c729 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ResizeRedactionRequest.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/ResizeRedactionRequest.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.annotations; +package com.iqser.red.service.persistence.service.v1.api.shared.model.annotations; import java.util.ArrayList; import java.util.List; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/UpdateRedactionRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/UpdateRedactionRequest.java similarity index 79% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/UpdateRedactionRequest.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/UpdateRedactionRequest.java index 25c61ae15..99efab2d4 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/UpdateRedactionRequest.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/UpdateRedactionRequest.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.annotations; +package com.iqser.red.service.persistence.service.v1.api.shared.model.annotations; import java.util.List; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ViewedPage.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/ViewedPage.java similarity index 79% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ViewedPage.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/ViewedPage.java index 52ab65f5a..57e9e64f2 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ViewedPage.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/ViewedPage.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.annotations; +package com.iqser.red.service.persistence.service.v1.api.shared.model.annotations; import java.time.OffsetDateTime; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/entitymapped/BaseAnnotation.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/entitymapped/BaseAnnotation.java similarity index 75% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/entitymapped/BaseAnnotation.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/entitymapped/BaseAnnotation.java index aa78c033b..b6f9c882e 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/entitymapped/BaseAnnotation.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/entitymapped/BaseAnnotation.java @@ -1,8 +1,8 @@ -package com.iqser.red.service.persistence.service.v1.api.model.annotations.entitymapped; +package com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped; import java.time.OffsetDateTime; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; import lombok.AllArgsConstructor; import lombok.Data; @@ -25,6 +25,7 @@ public class BaseAnnotation { public boolean isApproved() { + return AnnotationStatus.APPROVED == status; } diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/entitymapped/IdRemoval.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/entitymapped/IdRemoval.java similarity index 81% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/entitymapped/IdRemoval.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/entitymapped/IdRemoval.java index 91140b6df..924af6ba6 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/entitymapped/IdRemoval.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/entitymapped/IdRemoval.java @@ -1,8 +1,8 @@ -package com.iqser.red.service.persistence.service.v1.api.model.annotations.entitymapped; +package com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped; import java.time.OffsetDateTime; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; import lombok.Builder; import lombok.Data; @@ -31,5 +31,4 @@ public class IdRemoval extends BaseAnnotation { this.removeFromDictionary = removeFromDictionary; } - } diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/entitymapped/ManualForceRedaction.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/entitymapped/ManualForceRedaction.java similarity index 82% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/entitymapped/ManualForceRedaction.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/entitymapped/ManualForceRedaction.java index abf99e810..20f72bcbe 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/entitymapped/ManualForceRedaction.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/entitymapped/ManualForceRedaction.java @@ -1,8 +1,8 @@ -package com.iqser.red.service.persistence.service.v1.api.model.annotations.entitymapped; +package com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped; import java.time.OffsetDateTime; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; import lombok.Builder; import lombok.Data; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/entitymapped/ManualImageRecategorization.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/entitymapped/ManualImageRecategorization.java similarity index 82% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/entitymapped/ManualImageRecategorization.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/entitymapped/ManualImageRecategorization.java index f38ab6074..680c5b48c 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/entitymapped/ManualImageRecategorization.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/entitymapped/ManualImageRecategorization.java @@ -1,8 +1,8 @@ -package com.iqser.red.service.persistence.service.v1.api.model.annotations.entitymapped; +package com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped; import java.time.OffsetDateTime; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; import lombok.Builder; import lombok.Data; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/entitymapped/ManualLegalBasisChange.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/entitymapped/ManualLegalBasisChange.java similarity index 85% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/entitymapped/ManualLegalBasisChange.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/entitymapped/ManualLegalBasisChange.java index 7d3457069..d99d0b0de 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/entitymapped/ManualLegalBasisChange.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/entitymapped/ManualLegalBasisChange.java @@ -1,8 +1,8 @@ -package com.iqser.red.service.persistence.service.v1.api.model.annotations.entitymapped; +package com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped; import java.time.OffsetDateTime; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; import lombok.Builder; import lombok.Data; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/entitymapped/ManualRedactionEntry.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/entitymapped/ManualRedactionEntry.java similarity index 89% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/entitymapped/ManualRedactionEntry.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/entitymapped/ManualRedactionEntry.java index e60645e7e..ce2058d70 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/entitymapped/ManualRedactionEntry.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/entitymapped/ManualRedactionEntry.java @@ -1,11 +1,11 @@ -package com.iqser.red.service.persistence.service.v1.api.model.annotations.entitymapped; +package com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped; import java.time.OffsetDateTime; import java.util.ArrayList; import java.util.List; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.Rectangle; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.Rectangle; import lombok.Builder; import lombok.Data; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/entitymapped/ManualResizeRedaction.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/entitymapped/ManualResizeRedaction.java similarity index 83% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/entitymapped/ManualResizeRedaction.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/entitymapped/ManualResizeRedaction.java index d51b0b7e1..30985b218 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/entitymapped/ManualResizeRedaction.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/annotations/entitymapped/ManualResizeRedaction.java @@ -1,11 +1,11 @@ -package com.iqser.red.service.persistence.service.v1.api.model.annotations.entitymapped; +package com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped; import java.time.OffsetDateTime; import java.util.ArrayList; import java.util.List; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus; -import com.iqser.red.service.persistence.service.v1.api.model.annotations.Rectangle; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.Rectangle; import lombok.Builder; import lombok.Data; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/audit/AddNotificationRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/audit/AddNotificationRequest.java similarity index 84% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/audit/AddNotificationRequest.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/audit/AddNotificationRequest.java index 78d04dd17..14507246e 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/audit/AddNotificationRequest.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/audit/AddNotificationRequest.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.audit; +package com.iqser.red.service.persistence.service.v1.api.shared.model.audit; import java.util.HashMap; import java.util.Map; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/audit/AuditModel.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/audit/AuditModel.java similarity index 87% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/audit/AuditModel.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/audit/AuditModel.java index 8bff13bfd..325558fc2 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/audit/AuditModel.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/audit/AuditModel.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.audit; +package com.iqser.red.service.persistence.service.v1.api.shared.model.audit; import java.time.OffsetDateTime; import java.util.HashMap; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/audit/AuditRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/audit/AuditRequest.java similarity index 85% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/audit/AuditRequest.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/audit/AuditRequest.java index cc08b080a..c17d71ab9 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/audit/AuditRequest.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/audit/AuditRequest.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.audit; +package com.iqser.red.service.persistence.service.v1.api.shared.model.audit; import java.util.HashMap; import java.util.Map; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/audit/AuditSearchRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/audit/AuditSearchRequest.java similarity index 86% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/audit/AuditSearchRequest.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/audit/AuditSearchRequest.java index 486839b9e..7af518084 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/audit/AuditSearchRequest.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/audit/AuditSearchRequest.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.audit; +package com.iqser.red.service.persistence.service.v1.api.shared.model.audit; import java.time.OffsetDateTime; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/audit/CategoryModel.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/audit/CategoryModel.java similarity index 73% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/audit/CategoryModel.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/audit/CategoryModel.java index eecba3812..492ac4030 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/audit/CategoryModel.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/audit/CategoryModel.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.audit; +package com.iqser.red.service.persistence.service.v1.api.shared.model.audit; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/common/JSONPrimitive.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/common/JSONPrimitive.java similarity index 80% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/common/JSONPrimitive.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/common/JSONPrimitive.java index 54214bab2..26b968c24 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/common/JSONPrimitive.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/common/JSONPrimitive.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.common; +package com.iqser.red.service.persistence.service.v1.api.shared.model.common; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/common/Page.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/common/Page.java new file mode 100644 index 000000000..65d7325bd --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/common/Page.java @@ -0,0 +1,29 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.common; + +import java.util.ArrayList; +import java.util.List; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditModel; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@AllArgsConstructor +@NoArgsConstructor +@Data +@Builder +public class Page { + + @Builder.Default + protected List elements = new ArrayList<>(); + protected long totalHits; + protected int page; + protected int pageSize; + + public List getData(){ + return this.elements; + } + +} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/component/ComponentsOverrides.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/component/ComponentsOverrides.java similarity index 79% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/component/ComponentsOverrides.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/component/ComponentsOverrides.java index db73708d4..ead7333cb 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/component/ComponentsOverrides.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/component/ComponentsOverrides.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.component; +package com.iqser.red.service.persistence.service.v1.api.shared.model.component; import java.util.HashMap; import java.util.Map; @@ -15,4 +15,5 @@ import lombok.NoArgsConstructor; public class ComponentsOverrides { private Map componentOverrides = new HashMap<>(); + } diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/component/RevertOverrideRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/component/RevertOverrideRequest.java similarity index 79% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/component/RevertOverrideRequest.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/component/RevertOverrideRequest.java index 3bce986a3..ca07ca059 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/component/RevertOverrideRequest.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/component/RevertOverrideRequest.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.component; +package com.iqser.red.service.persistence.service.v1.api.shared.model.component; import java.util.HashSet; import java.util.Set; @@ -15,4 +15,5 @@ import lombok.NoArgsConstructor; public class RevertOverrideRequest { private Set components = new HashSet<>(); + } diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/CloneDossierTemplateRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/CloneDossierTemplateRequest.java similarity index 85% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/CloneDossierTemplateRequest.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/CloneDossierTemplateRequest.java index 1d2a186bd..2171ec216 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/CloneDossierTemplateRequest.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/CloneDossierTemplateRequest.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate; +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate; import java.time.OffsetDateTime; import java.util.HashSet; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/CreateOrUpdateDossierTemplateRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/CreateOrUpdateDossierTemplateRequest.java similarity index 87% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/CreateOrUpdateDossierTemplateRequest.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/CreateOrUpdateDossierTemplateRequest.java index c374d6966..b581351bb 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/CreateOrUpdateDossierTemplateRequest.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/CreateOrUpdateDossierTemplateRequest.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate; +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate; import java.time.OffsetDateTime; import java.util.HashSet; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/DossierAttributeConfig.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/DossierAttributeConfig.java similarity index 67% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/DossierAttributeConfig.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/DossierAttributeConfig.java index 5c63ad07c..d77113bbf 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/DossierAttributeConfig.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/DossierAttributeConfig.java @@ -1,6 +1,6 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate; +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierAttributeType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.DossierAttributeType; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/DossierTemplate.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/DossierTemplate.java similarity index 90% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/DossierTemplate.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/DossierTemplate.java index 91eb6874d..60dd734c0 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/DossierTemplate.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/DossierTemplate.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate; +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate; import java.time.OffsetDateTime; import java.util.HashSet; diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/DossierTemplateDictionaryStats.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/DossierTemplateDictionaryStats.java new file mode 100644 index 000000000..da6e3e82e --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/DossierTemplateDictionaryStats.java @@ -0,0 +1,31 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate; + +import java.util.ArrayList; +import java.util.List; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionarySummary; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Schema(description = "Object aggregation of different stats for a specific dossier template.") +public class DossierTemplateDictionaryStats { + + @Schema(description = "The ID of the dossier template") + private String dossierTemplateId; + + @Schema(description = "The number of types for the dossier template") + private int numberOfDictionaries; + + @Schema(description = "The summary list for every type of the dossier template") + @Builder.Default + private List dictionarySummaryList = new ArrayList<>(); + +} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/DossierTemplateStats.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/DossierTemplateStats.java similarity index 82% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/DossierTemplateStats.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/DossierTemplateStats.java index d05716ade..740b223ad 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/DossierTemplateStats.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/DossierTemplateStats.java @@ -1,10 +1,10 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate; +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate; import java.util.ArrayList; import java.util.List; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.ProcessingStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/DossierTemplateStatus.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/DossierTemplateStatus.java new file mode 100644 index 000000000..615c73c7b --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/DossierTemplateStatus.java @@ -0,0 +1,7 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate; + +public enum DossierTemplateStatus { + INCOMPLETE, + INACTIVE, + ACTIVE +} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/DownloadFileType.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/DownloadFileType.java similarity index 58% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/DownloadFileType.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/DownloadFileType.java index 25f578994..b58e5bccf 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/DownloadFileType.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/DownloadFileType.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate; +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate; public enum DownloadFileType { ORIGINAL, diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/FileAttributesGeneralConfiguration.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/FileAttributesGeneralConfiguration.java similarity index 80% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/FileAttributesGeneralConfiguration.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/FileAttributesGeneralConfiguration.java index 4f8b00fae..d08345dcd 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/FileAttributesGeneralConfiguration.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/FileAttributesGeneralConfiguration.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate; +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/ImportCsvRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/ImportCsvRequest.java similarity index 72% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/ImportCsvRequest.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/ImportCsvRequest.java index ab4978c26..9656dbb74 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/ImportCsvRequest.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/ImportCsvRequest.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate; +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/ImportCsvResponse.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/ImportCsvResponse.java similarity index 82% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/ImportCsvResponse.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/ImportCsvResponse.java index f845832ca..cc46e15da 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/ImportCsvResponse.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/ImportCsvResponse.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate; +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate; import java.util.HashSet; import java.util.Set; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/ReportTemplate.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/ReportTemplate.java similarity index 84% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/ReportTemplate.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/ReportTemplate.java index 72a18683f..fafc93ebd 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/ReportTemplate.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/ReportTemplate.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate; +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate; import java.time.OffsetDateTime; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/ReportTemplateDownload.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/ReportTemplateDownload.java similarity index 72% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/ReportTemplateDownload.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/ReportTemplateDownload.java index 6d555ec4b..05e84fbeb 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/ReportTemplateDownload.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/ReportTemplateDownload.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate; +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/ReportTemplateUploadRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/ReportTemplateUploadRequest.java similarity index 85% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/ReportTemplateUploadRequest.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/ReportTemplateUploadRequest.java index a68d15b05..41158e8bc 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/ReportTemplateUploadRequest.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/ReportTemplateUploadRequest.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate; +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate; import lombok.AccessLevel; import lombok.AllArgsConstructor; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/configuration/ApplicationConfig.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/configuration/ApplicationConfig.java similarity index 65% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/configuration/ApplicationConfig.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/configuration/ApplicationConfig.java index d053ed9ac..413669721 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/configuration/ApplicationConfig.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/configuration/ApplicationConfig.java @@ -1,4 +1,6 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration; +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration; + +import javax.validation.constraints.Min; import lombok.AllArgsConstructor; import lombok.Builder; @@ -11,8 +13,11 @@ import lombok.NoArgsConstructor; @AllArgsConstructor public class ApplicationConfig { + @Min(1) private int downloadCleanupDownloadFilesHours; + @Min(1) private int downloadCleanupNotDownloadFilesHours; + @Min(1) private int softDeleteCleanupTime; } diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/configuration/Colors.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/configuration/Colors.java similarity index 86% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/configuration/Colors.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/configuration/Colors.java index 9183f0e71..ab37d740e 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/configuration/Colors.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/configuration/Colors.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration; +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration; import lombok.AllArgsConstructor; import lombok.Builder; @@ -16,19 +16,14 @@ public class Colors { private String requestAddColor; private String requestRemoveColor; private String dictionaryRequestColor; - private String previewColor; - private String analysisColor; private String updatedColor; - private String recommendationColor; private String hintColor; private String redactionColor; - private String ignoredHintColor; private String skippedColor; - private String appliedRedactionColor; } diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/configuration/DigitalSignature.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/configuration/DigitalSignature.java similarity index 74% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/configuration/DigitalSignature.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/configuration/DigitalSignature.java index 87ce9f9de..c46079677 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/configuration/DigitalSignature.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/configuration/DigitalSignature.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration; +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration; import lombok.AllArgsConstructor; import lombok.Builder; @@ -17,6 +17,6 @@ public class DigitalSignature { private String contactInfo; private String certificateName; private String password; - private byte[] privateKey; + private String privateKey; } diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/configuration/DigitalSignatureType.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/configuration/DigitalSignatureType.java new file mode 100644 index 000000000..f23b87781 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/configuration/DigitalSignatureType.java @@ -0,0 +1,7 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration; + +public enum DigitalSignatureType { + CERTIFICATE, + KMS, + HSM; +} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/configuration/DigitalSignatureUpdateModel.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/configuration/DigitalSignatureUpdateModel.java similarity index 79% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/configuration/DigitalSignatureUpdateModel.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/configuration/DigitalSignatureUpdateModel.java index 8272a8f6c..64fccc2d3 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/configuration/DigitalSignatureUpdateModel.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/configuration/DigitalSignatureUpdateModel.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration; +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration; import lombok.AccessLevel; import lombok.AllArgsConstructor; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/configuration/RuleSet.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/configuration/RuleSet.java similarity index 71% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/configuration/RuleSet.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/configuration/RuleSet.java index 30ddcefa7..2baa26bec 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/configuration/RuleSet.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/configuration/RuleSet.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration; +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/configuration/SMTPConfiguration.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/configuration/SMTPConfiguration.java similarity index 85% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/configuration/SMTPConfiguration.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/configuration/SMTPConfiguration.java index 9c7393d3a..cd9e532ff 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/configuration/SMTPConfiguration.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/configuration/SMTPConfiguration.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration; +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/configuration/WatermarkOrientation.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/configuration/WatermarkOrientation.java new file mode 100644 index 000000000..9eb12cd4b --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/configuration/WatermarkOrientation.java @@ -0,0 +1,7 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration; + +public enum WatermarkOrientation { + VERTICAL, + HORIZONTAL, + DIAGONAL +} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/CreateOrUpdateDossierRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/CreateOrUpdateDossierRequest.java similarity index 83% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/CreateOrUpdateDossierRequest.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/CreateOrUpdateDossierRequest.java index f69164d1a..fba3257cb 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/CreateOrUpdateDossierRequest.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/CreateOrUpdateDossierRequest.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier; +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier; import java.time.OffsetDateTime; import java.util.ArrayList; @@ -6,7 +6,7 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DownloadFileType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DownloadFileType; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/CreateOrUpdateDossierStatusRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/CreateOrUpdateDossierStatusRequest.java similarity index 80% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/CreateOrUpdateDossierStatusRequest.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/CreateOrUpdateDossierStatusRequest.java index 70ae80a00..0a59856a3 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/CreateOrUpdateDossierStatusRequest.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/CreateOrUpdateDossierStatusRequest.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier; +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/DeletedDossier.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/DeletedDossier.java similarity index 67% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/DeletedDossier.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/DeletedDossier.java index cc2323abc..5b6d0ed47 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/DeletedDossier.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/DeletedDossier.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier; +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier; import java.time.OffsetDateTime; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/Dossier.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/Dossier.java similarity index 81% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/Dossier.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/Dossier.java index 62dfc7c76..8891b4db8 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/Dossier.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/Dossier.java @@ -1,11 +1,11 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier; +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier; import java.time.OffsetDateTime; import java.util.HashSet; import java.util.Set; import com.fasterxml.jackson.annotation.JsonProperty; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DownloadFileType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DownloadFileType; import lombok.AllArgsConstructor; import lombok.Builder; @@ -18,7 +18,6 @@ import lombok.NoArgsConstructor; @AllArgsConstructor public class Dossier { - @JsonProperty("dossierId") private String id; private String dossierName; private OffsetDateTime date; @@ -39,4 +38,7 @@ public class Dossier { private String dossierStatusId; private DossierVisibility visibility; + public String getDossierId(){ + return id; + } } diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/DossierAttribute.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/DossierAttribute.java similarity index 76% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/DossierAttribute.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/DossierAttribute.java index 2a411212a..f676a0b4b 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/DossierAttribute.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/DossierAttribute.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier; +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/DossierAttributeType.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/DossierAttributeType.java new file mode 100644 index 000000000..e9bcc5b91 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/DossierAttributeType.java @@ -0,0 +1,8 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier; + +public enum DossierAttributeType { + TEXT, + NUMBER, + DATE, + IMAGE +} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/DossierChange.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/DossierChange.java similarity index 79% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/DossierChange.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/DossierChange.java index 9112aad66..b192a0d45 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/DossierChange.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/DossierChange.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier; +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/DossierStatusInfo.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/DossierStatusInfo.java new file mode 100644 index 000000000..185b8d26a --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/DossierStatusInfo.java @@ -0,0 +1,33 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class DossierStatusInfo { + + @Schema(description = "Dossier Status Id") + @JsonProperty("dossierStatusId") + private String id; + @Schema(description = "Dossier Status name") + private String name; + @Schema(description = "Dossier Status description") + private String description; + @Schema(description = "Dossier Template Id") + private String dossierTemplateId; + @Schema(description = "The color of the dossier status") + private String color; + @Schema(description = "The rank of the dossier status") + private int rank; + @Schema(description = "The count of dossiers in this status") + private Long dossierCount; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/DossierVisibility.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/DossierVisibility.java new file mode 100644 index 000000000..23ee9d977 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/DossierVisibility.java @@ -0,0 +1,7 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier; + +public enum DossierVisibility { + + PRIVATE, + PUBLIC; +} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/file/AddFileRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/file/AddFileRequest.java similarity index 81% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/file/AddFileRequest.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/file/AddFileRequest.java index 226d9e530..18e7c0f54 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/file/AddFileRequest.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/file/AddFileRequest.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file; +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file; import lombok.AccessLevel; import lombok.AllArgsConstructor; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/file/FileAttribute.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/file/FileAttribute.java similarity index 61% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/file/FileAttribute.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/file/FileAttribute.java index a6c0c229a..7b513f0a0 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/file/FileAttribute.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/file/FileAttribute.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file; +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file; import lombok.Data; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/file/FileAttributeConfig.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/file/FileAttributeConfig.java similarity index 84% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/file/FileAttributeConfig.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/file/FileAttributeConfig.java index 408c250ec..ff173b785 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/file/FileAttributeConfig.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/file/FileAttributeConfig.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file; +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/file/FileAttributeType.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/file/FileAttributeType.java new file mode 100644 index 000000000..16e431605 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/file/FileAttributeType.java @@ -0,0 +1,7 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file; + +public enum FileAttributeType { + TEXT, + NUMBER, + DATE +} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/file/FileModel.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/file/FileModel.java similarity index 96% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/file/FileModel.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/file/FileModel.java index 47e2bd34f..06158291e 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/file/FileModel.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/file/FileModel.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file; +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file; import java.time.OffsetDateTime; import java.util.HashMap; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/file/FileType.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/file/FileType.java similarity index 83% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/file/FileType.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/file/FileType.java index 7b118b924..a234006d6 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/file/FileType.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/file/FileType.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file; +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file; import lombok.Getter; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/file/ProcessingStatus.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/file/ProcessingStatus.java similarity index 80% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/file/ProcessingStatus.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/file/ProcessingStatus.java index 2b867f97b..8c9f2dc06 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/file/ProcessingStatus.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/file/ProcessingStatus.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file; +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file; public enum ProcessingStatus { ANALYSE, diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/file/WorkflowStatus.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/file/WorkflowStatus.java new file mode 100644 index 000000000..6d5a0cf24 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/file/WorkflowStatus.java @@ -0,0 +1,8 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file; + +public enum WorkflowStatus { + NEW, + UNDER_REVIEW, + UNDER_APPROVAL, + APPROVED +} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/importexport/ExportDownloadRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/importexport/ExportDownloadRequest.java similarity index 76% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/importexport/ExportDownloadRequest.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/importexport/ExportDownloadRequest.java index c1367e0df..2174656dc 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/importexport/ExportDownloadRequest.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/importexport/ExportDownloadRequest.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.importexport; +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.importexport; import lombok.AccessLevel; import lombok.AllArgsConstructor; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/importexport/ExportFilename.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/importexport/ExportFilename.java similarity index 88% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/importexport/ExportFilename.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/importexport/ExportFilename.java index 6c81961d8..cf36e012a 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/importexport/ExportFilename.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/importexport/ExportFilename.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.importexport; +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.importexport; import lombok.Getter; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/importexport/ImportDossierTemplateRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/importexport/ImportDossierTemplateRequest.java similarity index 74% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/importexport/ImportDossierTemplateRequest.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/importexport/ImportDossierTemplateRequest.java index 31faf94d3..e160db12d 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/importexport/ImportDossierTemplateRequest.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/importexport/ImportDossierTemplateRequest.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.importexport; +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.importexport; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -10,7 +10,7 @@ import lombok.NonNull; @Data @Builder @AllArgsConstructor -@NoArgsConstructor(access = AccessLevel.PRIVATE) +@NoArgsConstructor public class ImportDossierTemplateRequest { @NonNull diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/importexport/ImportTemplateResult.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/importexport/ImportTemplateResult.java similarity index 54% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/importexport/ImportTemplateResult.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/importexport/ImportTemplateResult.java index 59410be92..c8d1cbe53 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/importexport/ImportTemplateResult.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/importexport/ImportTemplateResult.java @@ -1,20 +1,20 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.importexport; +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.importexport; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierAttributeConfig; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierTemplate; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.FileAttributesGeneralConfiguration; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.ReportTemplateUploadRequest; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.Colors; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.Watermark; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierStatusInfo; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileAttributeConfig; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.legalbasis.LegalBasis; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.Type; +import com.iqser.red.service.persistence.service.v1.api.shared.model.WatermarkModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierAttributeConfig; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierTemplate; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.FileAttributesGeneralConfiguration; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.ReportTemplateUploadRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.Colors; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.DossierStatusInfo; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileAttributeConfig; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.legalbasis.LegalBasis; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.Type; import lombok.AllArgsConstructor; import lombok.Builder; @@ -35,7 +35,7 @@ public class ImportTemplateResult { public DossierTemplate dossierTemplate; @Builder.Default - public List watermarks = new ArrayList<>(); + public List watermarks = new ArrayList<>(); public Colors colors; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/legalbasis/LegalBasis.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/legalbasis/LegalBasis.java similarity index 74% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/legalbasis/LegalBasis.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/legalbasis/LegalBasis.java index f31726c54..92ba577a1 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/legalbasis/LegalBasis.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/legalbasis/LegalBasis.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.legalbasis; +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.legalbasis; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/legalbasis/LegalBasisMapping.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/legalbasis/LegalBasisMapping.java similarity index 75% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/legalbasis/LegalBasisMapping.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/legalbasis/LegalBasisMapping.java index 17d6f5266..b5809b4e1 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/legalbasis/LegalBasisMapping.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/legalbasis/LegalBasisMapping.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.legalbasis; +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.legalbasis; import java.util.ArrayList; import java.util.List; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/type/DictionaryEntry.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/type/DictionaryEntry.java similarity index 80% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/type/DictionaryEntry.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/type/DictionaryEntry.java index ee19c64e5..b1ac0a172 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/type/DictionaryEntry.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/type/DictionaryEntry.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type; +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type; import java.io.Serializable; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/type/DictionaryEntryType.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/type/DictionaryEntryType.java similarity index 50% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/type/DictionaryEntryType.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/type/DictionaryEntryType.java index e6686ff68..d2ada4e12 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/type/DictionaryEntryType.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/type/DictionaryEntryType.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type; +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type; public enum DictionaryEntryType { ENTRY, diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/type/DictionarySummary.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/type/DictionarySummary.java new file mode 100644 index 000000000..14cf28b92 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/type/DictionarySummary.java @@ -0,0 +1,25 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Schema(description = "Short summary for dictionary") +public class DictionarySummary { + + @Schema(description = "The type id") + private String id; + @Schema(description = "The type") + private String type; + @Schema(description = "The type's label") + private String name; + @Schema(description = "The entries size") + private long entriesCount; + +} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/type/DictionarySummaryResponse.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/type/DictionarySummaryResponse.java similarity index 81% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/type/DictionarySummaryResponse.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/type/DictionarySummaryResponse.java index e6554fcd9..154ae57fb 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/type/DictionarySummaryResponse.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/type/DictionarySummaryResponse.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type; +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/type/Type.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/type/Type.java similarity index 93% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/type/Type.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/type/Type.java index 2cbadaa4f..6335ad51b 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/type/Type.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/type/Type.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type; +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type; import java.time.OffsetDateTime; import java.util.ArrayList; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/download/DownloadRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/download/DownloadRequest.java similarity index 84% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/download/DownloadRequest.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/download/DownloadRequest.java index 07060ed5f..0bcf7473a 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/download/DownloadRequest.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/download/DownloadRequest.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.download; +package com.iqser.red.service.persistence.service.v1.api.shared.model.download; import java.util.ArrayList; import java.util.List; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/download/DownloadStatus.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/download/DownloadStatus.java similarity index 80% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/download/DownloadStatus.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/download/DownloadStatus.java index 29de94c94..b1d2f47a7 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/download/DownloadStatus.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/download/DownloadStatus.java @@ -1,10 +1,10 @@ -package com.iqser.red.service.persistence.service.v1.api.model.download; +package com.iqser.red.service.persistence.service.v1.api.shared.model.download; import java.time.OffsetDateTime; import java.util.ArrayList; import java.util.List; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DownloadFileType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DownloadFileType; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/download/DownloadStatusValue.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/download/DownloadStatusValue.java similarity index 52% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/download/DownloadStatusValue.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/download/DownloadStatusValue.java index d7569d8b4..0de2dfbc9 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/download/DownloadStatusValue.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/download/DownloadStatusValue.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.download; +package com.iqser.red.service.persistence.service.v1.api.shared.model.download; public enum DownloadStatusValue { QUEUED, diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/download/DownloadWithOptionRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/download/DownloadWithOptionRequest.java similarity index 79% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/download/DownloadWithOptionRequest.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/download/DownloadWithOptionRequest.java index e69a365f3..8e11ef7fc 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/download/DownloadWithOptionRequest.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/download/DownloadWithOptionRequest.java @@ -1,11 +1,11 @@ -package com.iqser.red.service.persistence.service.v1.api.model.download; +package com.iqser.red.service.persistence.service.v1.api.shared.model.download; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DownloadFileType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DownloadFileType; import lombok.AccessLevel; import lombok.AllArgsConstructor; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/download/SetDownloadedRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/download/SetDownloadedRequest.java similarity index 80% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/download/SetDownloadedRequest.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/download/SetDownloadedRequest.java index 0a0e36226..afc3eb87a 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/download/SetDownloadedRequest.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/download/SetDownloadedRequest.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.download; +package com.iqser.red.service.persistence.service.v1.api.shared.model.download; import lombok.AccessLevel; import lombok.AllArgsConstructor; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/index/IndexInformation.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/index/IndexInformation.java similarity index 80% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/index/IndexInformation.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/index/IndexInformation.java index b01ae176c..e75a78b23 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/index/IndexInformation.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/index/IndexInformation.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.index; +package com.iqser.red.service.persistence.service.v1.api.shared.model.index; import java.time.OffsetDateTime; diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/license/Feature.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/license/Feature.java new file mode 100644 index 000000000..658905ec7 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/license/Feature.java @@ -0,0 +1,18 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.license; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class Feature { + + private String name; + private FeatureType type; + private Object value; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/license/FeatureType.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/license/FeatureType.java new file mode 100644 index 000000000..968d4a864 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/license/FeatureType.java @@ -0,0 +1,10 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.license; + +public enum FeatureType { + + STRING, + NUMBER, + DATE, + BOOLEAN + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/license/License.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/license/License.java new file mode 100644 index 000000000..f50d927a5 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/license/License.java @@ -0,0 +1,21 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.license; + +import java.time.OffsetDateTime; +import java.util.ArrayList; +import java.util.List; + +import lombok.Data; + +@Data +public class License { + + private String id; + private String name; + private String product; + private String licensedTo; + private String licensedToEmail; + private OffsetDateTime validFrom; + private OffsetDateTime validUntil; + private List features = new ArrayList<>(); + +} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/license/LicenseReport.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/license/LicenseReport.java similarity index 90% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/license/LicenseReport.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/license/LicenseReport.java index 3ff6f2e3f..72002e6c5 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/license/LicenseReport.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/license/LicenseReport.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.license; +package com.iqser.red.service.persistence.service.v1.api.shared.model.license; import java.time.Instant; import java.util.ArrayList; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/license/LicenseReportRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/license/LicenseReportRequest.java similarity index 92% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/license/LicenseReportRequest.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/license/LicenseReportRequest.java index 311ae964b..740e69b01 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/license/LicenseReportRequest.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/license/LicenseReportRequest.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.license; +package com.iqser.red.service.persistence.service.v1.api.shared.model.license; import java.time.Instant; import java.time.Year; diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/license/RedactionLicenseModel.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/license/RedactionLicenseModel.java new file mode 100644 index 000000000..6735e07d6 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/license/RedactionLicenseModel.java @@ -0,0 +1,15 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.license; + +import java.util.ArrayList; +import java.util.List; + + +import lombok.Data; + +@Data +public class RedactionLicenseModel { + + private String activeLicense; + private List licenses = new ArrayList<>(); + +} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/license/ReportData.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/license/ReportData.java similarity index 73% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/license/ReportData.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/license/ReportData.java index ff46bdd5d..4f990159a 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/license/ReportData.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/license/ReportData.java @@ -1,8 +1,8 @@ -package com.iqser.red.service.persistence.service.v1.api.model.license; +package com.iqser.red.service.persistence.service.v1.api.shared.model.license; import java.time.Instant; -import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/lombok.config b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/lombok.config new file mode 100644 index 000000000..f902278dd --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/lombok.config @@ -0,0 +1 @@ +lombok.anyConstructor.addConstructorProperties=true \ No newline at end of file diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/manual/AddCommentRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/manual/AddCommentRequest.java new file mode 100644 index 000000000..02d411a70 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/manual/AddCommentRequest.java @@ -0,0 +1,18 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.manual; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.NonNull; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class AddCommentRequest { + + @NonNull + private String text; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/manual/AddRedactionRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/manual/AddRedactionRequest.java new file mode 100644 index 000000000..6d538372d --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/manual/AddRedactionRequest.java @@ -0,0 +1,52 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.manual; + +import java.util.ArrayList; +import java.util.List; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.Rectangle; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionaryEntryType; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.NonNull; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class AddRedactionRequest { + + @NonNull + private String type; + + @NonNull + private String value; + + @NonNull + private String reason; + + private String legalBasis; + + private boolean addToDictionary; + + @NonNull + @Builder.Default + private List positions = new ArrayList<>(); + + private AddCommentRequest comment; + + private boolean addToDossierDictionary; + + private boolean forceAddToDictionary; + + private String section; + + private boolean rectangle; + + private String sourceId; + + private DictionaryEntryType dictionaryEntryType; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/manual/ApproveRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/manual/ApproveRequest.java new file mode 100644 index 000000000..012e8bedb --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/manual/ApproveRequest.java @@ -0,0 +1,14 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.manual; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class ApproveRequest { + + private boolean addOrRemoveFromDictionary; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/manual/ForceRedactionRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/manual/ForceRedactionRequest.java new file mode 100644 index 000000000..bfec48c96 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/manual/ForceRedactionRequest.java @@ -0,0 +1,22 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.manual; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.NonNull; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class ForceRedactionRequest { + + @NonNull + private String annotationId; + + private String comment; + + private String legalBasis; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/manual/ImageRecategorizationRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/manual/ImageRecategorizationRequest.java new file mode 100644 index 000000000..d5a5ab696 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/manual/ImageRecategorizationRequest.java @@ -0,0 +1,18 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.manual; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class ImageRecategorizationRequest { + + private String annotationId; + private String type; + private String comment; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/manual/LegalBasisChangeRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/manual/LegalBasisChangeRequest.java new file mode 100644 index 000000000..22a921949 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/manual/LegalBasisChangeRequest.java @@ -0,0 +1,26 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.manual; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.NonNull; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class LegalBasisChangeRequest { + + @NonNull + private String annotationId; + + private String comment; + + private String legalBasis; + + private String section; + + private String value; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/manual/ManualRedactionWrapper.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/manual/ManualRedactionWrapper.java new file mode 100644 index 000000000..cb6f603bf --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/manual/ManualRedactionWrapper.java @@ -0,0 +1,24 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.manual; + +import java.time.OffsetDateTime; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class ManualRedactionWrapper implements Comparable { + + private String id; + private OffsetDateTime date; + private Object item; + + + @Override + public int compareTo(ManualRedactionWrapper o) { + + // Descending + return o.date.compareTo(this.date); + } + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/manual/RemoveRedactionRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/manual/RemoveRedactionRequest.java new file mode 100644 index 000000000..8075d2654 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/manual/RemoveRedactionRequest.java @@ -0,0 +1,22 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.manual; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.NonNull; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class RemoveRedactionRequest { + + @NonNull + private String annotationId; + + private boolean removeFromDictionary; + + private String comment; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/manual/ResizeRedactionRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/manual/ResizeRedactionRequest.java new file mode 100644 index 000000000..0c57f2a63 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/manual/ResizeRedactionRequest.java @@ -0,0 +1,32 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.manual; + +import java.util.ArrayList; +import java.util.List; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.Rectangle; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.NonNull; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class ResizeRedactionRequest { + + @NonNull + private String annotationId; + + private String comment; + + private String value; + + private Boolean updateDictionary; + + @Builder.Default + private List positions = new ArrayList<>(); + +} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/multitenancy/AzureStorageConnection.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/multitenancy/AzureStorageConnection.java similarity index 76% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/multitenancy/AzureStorageConnection.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/multitenancy/AzureStorageConnection.java index a2276924e..04bc8caad 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/multitenancy/AzureStorageConnection.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/multitenancy/AzureStorageConnection.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.multitenancy; +package com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/multitenancy/DatabaseConnection.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/multitenancy/DatabaseConnection.java similarity index 86% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/multitenancy/DatabaseConnection.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/multitenancy/DatabaseConnection.java index feff472ac..5f8a84b48 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/multitenancy/DatabaseConnection.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/multitenancy/DatabaseConnection.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.multitenancy; +package com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy; import java.util.HashMap; import java.util.Map; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/multitenancy/S3StorageConnection.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/multitenancy/S3StorageConnection.java similarity index 62% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/multitenancy/S3StorageConnection.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/multitenancy/S3StorageConnection.java index a80a84d26..fbd67d59a 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/multitenancy/S3StorageConnection.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/multitenancy/S3StorageConnection.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.multitenancy; +package com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy; import lombok.AllArgsConstructor; import lombok.Builder; @@ -7,10 +7,15 @@ import lombok.NoArgsConstructor; @Data @Builder -@NoArgsConstructor @AllArgsConstructor +@NoArgsConstructor public class S3StorageConnection { + private String tenantId; + private String displayName; + private String guid; + private String jdbcUrl; + private String user; private String key; private String secret; private String signerType; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/multitenancy/SearchConnection.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/multitenancy/SearchConnection.java similarity index 84% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/multitenancy/SearchConnection.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/multitenancy/SearchConnection.java index 4295e1efb..8c7448fdd 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/multitenancy/SearchConnection.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/multitenancy/SearchConnection.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.multitenancy; +package com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy; import java.util.Set; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/multitenancy/TenantRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/multitenancy/TenantRequest.java similarity index 87% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/multitenancy/TenantRequest.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/multitenancy/TenantRequest.java index fbb203c9e..3dcfcabbf 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/multitenancy/TenantRequest.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/multitenancy/TenantRequest.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.multitenancy; +package com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy; import javax.validation.constraints.NotBlank; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/multitenancy/TenantResponse.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/multitenancy/TenantResponse.java similarity index 85% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/multitenancy/TenantResponse.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/multitenancy/TenantResponse.java index 807bdc489..8f75511fa 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/multitenancy/TenantResponse.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/multitenancy/TenantResponse.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.multitenancy; +package com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/notification/EmailNotificationType.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/notification/EmailNotificationType.java similarity index 51% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/notification/EmailNotificationType.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/notification/EmailNotificationType.java index 3a9348665..c088bccbb 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/notification/EmailNotificationType.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/notification/EmailNotificationType.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.notification; +package com.iqser.red.service.persistence.service.v1.api.shared.model.notification; public enum EmailNotificationType { DAILY, diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/notification/Notification.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/notification/Notification.java similarity index 88% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/notification/Notification.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/notification/Notification.java index 7b31c36bc..bf73c5ba1 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/notification/Notification.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/notification/Notification.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.notification; +package com.iqser.red.service.persistence.service.v1.api.shared.model.notification; import java.time.OffsetDateTime; import java.util.HashMap; diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/notification/NotificationPreferences.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/notification/NotificationPreferences.java similarity index 51% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/notification/NotificationPreferences.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/notification/NotificationPreferences.java index 78a7ca4ef..d58304cf0 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/notification/NotificationPreferences.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/notification/NotificationPreferences.java @@ -1,8 +1,9 @@ -package com.iqser.red.service.persistence.service.v1.api.model.notification; +package com.iqser.red.service.persistence.service.v1.api.shared.model.notification; import java.util.ArrayList; import java.util.List; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -10,16 +11,22 @@ import lombok.NoArgsConstructor; @Data @Builder -@NoArgsConstructor @AllArgsConstructor +@NoArgsConstructor +@Schema(description = "Object aggregation for notification preferences of a specific user.") public class NotificationPreferences { + @Schema(description = "Enable inApp notifications") private boolean inAppNotificationsEnabled; + @Schema(description = "Enable email notifications") private boolean emailNotificationsEnabled; + @Schema(description = "Email notification types") private EmailNotificationType emailNotificationType; @Builder.Default + @Schema(description = "The list of enabled notifications for email") private List emailNotifications = new ArrayList<>(); @Builder.Default + @Schema(description = "The list of enabled notifications for inApp") private List inAppNotifications = new ArrayList<>(); } diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/notification/NotificationType.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/notification/NotificationType.java similarity index 81% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/notification/NotificationType.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/notification/NotificationType.java index dd0171682..cfec27527 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/notification/NotificationType.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/notification/NotificationType.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.notification; +package com.iqser.red.service.persistence.service.v1.api.shared.model.notification; public enum NotificationType { diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/permission/CustomPermissionMappingModel.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/permission/CustomPermissionMappingModel.java new file mode 100644 index 000000000..08d45af77 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/permission/CustomPermissionMappingModel.java @@ -0,0 +1,18 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.permission; + +import java.util.ArrayList; +import java.util.List; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class CustomPermissionMappingModel { + + private CustomPermissionModel targetPermission; + private List mappedPermissions = new ArrayList<>(); + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/permission/CustomPermissionModel.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/permission/CustomPermissionModel.java new file mode 100644 index 000000000..1354a3f21 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/permission/CustomPermissionModel.java @@ -0,0 +1,16 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.permission; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.RequiredArgsConstructor; + +@Data +@RequiredArgsConstructor +@EqualsAndHashCode(of = {"mask"}) +public class CustomPermissionModel { + + private final Integer mask; + private final String name; + private final int sort; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/Change.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/Change.java new file mode 100644 index 000000000..31ff8d75f --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/Change.java @@ -0,0 +1,20 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog; + +import java.time.OffsetDateTime; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class Change { + + private int analysisNumber; + private ChangeType type; + private OffsetDateTime dateTime; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/ChangeType.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/ChangeType.java new file mode 100644 index 000000000..9dbb2a4ad --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/ChangeType.java @@ -0,0 +1,7 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog; + +public enum ChangeType { + ADDED, + REMOVED, + CHANGED +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/Engine.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/Engine.java new file mode 100644 index 000000000..de831a11c --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/Engine.java @@ -0,0 +1,7 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog; + +public enum Engine { + DICTIONARY, + NER, + RULE +} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/redactionlog/FilteredRedactionLogRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/FilteredRedactionLogRequest.java similarity index 83% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/redactionlog/FilteredRedactionLogRequest.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/FilteredRedactionLogRequest.java index 01bf8fde8..ef1346c47 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/redactionlog/FilteredRedactionLogRequest.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/FilteredRedactionLogRequest.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.model.redactionlog; +package com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog; import java.time.OffsetDateTime; import java.util.List; diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/ManualChange.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/ManualChange.java new file mode 100644 index 000000000..25982b41e --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/ManualChange.java @@ -0,0 +1,59 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog; + +import java.time.OffsetDateTime; +import java.util.HashMap; +import java.util.Map; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.BaseAnnotation; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class ManualChange { + + private AnnotationStatus annotationStatus; + private ManualRedactionType manualRedactionType; + private OffsetDateTime processedDate; + private OffsetDateTime requestedDate; + private String userId; + private Map propertyChanges = new HashMap<>(); + + + public static ManualChange from(BaseAnnotation baseAnnotation) { + + ManualChange manualChange = new ManualChange(); + manualChange.annotationStatus = baseAnnotation.getStatus(); + manualChange.processedDate = baseAnnotation.getProcessedDate(); + manualChange.requestedDate = baseAnnotation.getRequestDate(); + manualChange.userId = baseAnnotation.getUser(); + return manualChange; + } + + + public boolean isProcessed() { + + return processedDate != null; + } + + + public ManualChange withManualRedactionType(ManualRedactionType manualRedactionType) { + + this.manualRedactionType = manualRedactionType; + return this; + } + + + public ManualChange withChange(String property, String value) { + + this.propertyChanges.put(property, value); + return this; + } + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/ManualRedactionType.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/ManualRedactionType.java new file mode 100644 index 000000000..4bae0910f --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/ManualRedactionType.java @@ -0,0 +1,13 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog; + +public enum ManualRedactionType { + ADD_LOCALLY, + ADD_TO_DICTIONARY, + REMOVE_LOCALLY, + REMOVE_FROM_DICTIONARY, + FORCE_REDACT, + FORCE_HINT, + RECATEGORIZE, + LEGAL_BASIS_CHANGE, + RESIZE +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/Point.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/Point.java new file mode 100644 index 000000000..644f7ebcd --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/Point.java @@ -0,0 +1,15 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Point { + + private float x; + private float y; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/Rectangle.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/Rectangle.java new file mode 100644 index 000000000..4c4ced56f --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/Rectangle.java @@ -0,0 +1,19 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog; + + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Rectangle { + + private Point topLeft; + private float width; + private float height; + + private int page; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/RedactionLog.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/RedactionLog.java new file mode 100644 index 000000000..3fac60f67 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/RedactionLog.java @@ -0,0 +1,35 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog; + +import java.util.ArrayList; +import java.util.List; + + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class RedactionLog { + + /** + * Version 0 Redaction Logs have manual redactions merged inside them + * Version 1 Redaction Logs only contain system ( rule/dictionary ) redactions. Manual Redactions are merged in at runtime. + */ + private long analysisVersion; + + /** + * Which analysis created this redactionLog. + */ + private int analysisNumber; + + private List redactionLogEntry = new ArrayList<>(); + private List legalBasis = new ArrayList<>(); + + private long dictionaryVersion = -1; + private long dossierDictionaryVersion = -1; + private long rulesVersion = -1; + private long legalBasisVersion = -1; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/RedactionLogChanges.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/RedactionLogChanges.java new file mode 100644 index 000000000..e5ea29433 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/RedactionLogChanges.java @@ -0,0 +1,18 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog; + + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class RedactionLogChanges { + + private RedactionLog redactionLog; + private boolean hasChanges; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/RedactionLogComment.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/RedactionLogComment.java new file mode 100644 index 000000000..45594374a --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/RedactionLogComment.java @@ -0,0 +1,22 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog; + +import java.time.OffsetDateTime; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class RedactionLogComment { + + private long id; + private String user; + private String text; + private String annotationId; + private String fileId; + private OffsetDateTime date; + private OffsetDateTime softDeletedTime; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/RedactionLogEntry.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/RedactionLogEntry.java new file mode 100644 index 000000000..36b8c12b7 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/RedactionLogEntry.java @@ -0,0 +1,106 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Optional; +import java.util.Set; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode +public class RedactionLogEntry { + + private String id; + private String type; + private String value; + private String reason; + private int matchedRule; + private boolean rectangle; + private String legalBasis; + + private boolean imported; + + private boolean redacted; + private boolean isHint; + private boolean isRecommendation; + private boolean isFalsePositive; + + private String section; + private float[] color; + + @Builder.Default + private List positions = new ArrayList<>(); + private int sectionNumber; + + private String textBefore; + private String textAfter; + + @Builder.Default + private List comments = new ArrayList<>(); + + private int startOffset; + private int endOffset; + + private boolean isImage; + private boolean imageHasTransparency; + + private boolean isDictionaryEntry; + private boolean isDossierDictionaryEntry; + + private boolean excluded; + + private String sourceId; + + @EqualsAndHashCode.Exclude + @Builder.Default + private List changes = new ArrayList<>(); + + @EqualsAndHashCode.Exclude + @Builder.Default + private List manualChanges = new ArrayList<>(); + + private Set engines = new HashSet<>(); + + private Set reference = new HashSet<>(); + + @Builder.Default + private Set importedRedactionIntersections = new HashSet<>(); + + + public boolean lastChangeIsRemoved() { + + return last(changes).map(c -> c.getType() == ChangeType.REMOVED).orElse(false); + } + + + public boolean isLocalManualRedaction() { + + return manualChanges != null && manualChanges.stream() + .anyMatch(mc -> mc.getManualRedactionType() == ManualRedactionType.ADD_LOCALLY && mc.getAnnotationStatus() == AnnotationStatus.APPROVED); + } + + + public boolean isManuallyRemoved() { + + return manualChanges != null && manualChanges.stream() + .anyMatch(mc -> mc.getManualRedactionType() == ManualRedactionType.REMOVE_LOCALLY && mc.getAnnotationStatus() == AnnotationStatus.APPROVED); + } + + + private Optional last(List list) { + + return list == null || list.isEmpty() ? Optional.empty() : Optional.of(list.get(list.size() - 1)); + } + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/RedactionLogLegalBasis.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/RedactionLogLegalBasis.java new file mode 100644 index 000000000..a43f9760b --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/RedactionLogLegalBasis.java @@ -0,0 +1,16 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class RedactionLogLegalBasis { + + private String name; + private String description; + private String reason; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/imported/ImportedRedaction.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/imported/ImportedRedaction.java new file mode 100644 index 000000000..299a69f93 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/imported/ImportedRedaction.java @@ -0,0 +1,24 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.imported; + +import java.util.ArrayList; +import java.util.List; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Rectangle; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ImportedRedaction { + + private String id; + + @Builder.Default + private List positions = new ArrayList<>(); + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/imported/ImportedRedactions.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/imported/ImportedRedactions.java new file mode 100644 index 000000000..31bce07da --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/imported/ImportedRedactions.java @@ -0,0 +1,22 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.imported; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ImportedRedactions { + + @Builder.Default + private Map> importedRedactions = new HashMap<>(); + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/section/CellRectangle.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/section/CellRectangle.java new file mode 100644 index 000000000..feb3155cc --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/section/CellRectangle.java @@ -0,0 +1,18 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.section; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Point; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class CellRectangle { + + private Point topLeft; + private float width; + private float height; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/section/SectionArea.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/section/SectionArea.java new file mode 100644 index 000000000..59dfa95a4 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/section/SectionArea.java @@ -0,0 +1,37 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.section; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Point; +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Rectangle; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SectionArea { + + private Point topLeft; + private float width; + private float height; + private int page; + private String header; + + + public boolean contains(Rectangle other) { + + return page == other.getPage() && this.topLeft.getX() <= other.getTopLeft().getX() && this.topLeft.getX() + this.getWidth() >= other.getTopLeft() + .getX() + other.getWidth() && this.getTopLeft().getY() <= other.getTopLeft().getY() && this.getTopLeft().getY() + this.getHeight() >= other.getTopLeft() + .getY() + other.getHeight(); + } + + + // TODO we should only use one rectangle class. + public boolean contains(com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.Rectangle other) { + + return page == other.getPage() && this.topLeft.getX() <= other.getTopLeftX() && this.topLeft.getX() + this.getWidth() >= other.getTopLeftX() + other.getWidth() && this.getTopLeft() + .getY() <= other.getTopLeftY() && this.getTopLeft().getY() + this.getHeight() >= other.getTopLeftY() + other.getHeight(); + } + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/section/SectionGrid.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/section/SectionGrid.java new file mode 100644 index 000000000..7ca40545d --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/section/SectionGrid.java @@ -0,0 +1,35 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.section; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class SectionGrid { + + private Map> rectanglesPerPage = new HashMap<>(); + + private List sections = new ArrayList<>(); + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class SectionGridSection { + + private int sectionNumber; + private String headline; + private Set pages; + private List sectionAreas; + + } + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/section/SectionRectangle.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/section/SectionRectangle.java new file mode 100644 index 000000000..59cfd73d8 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/redactionlog/section/SectionRectangle.java @@ -0,0 +1,24 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.section; + +import java.util.List; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Point; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class SectionRectangle { + + private Point topLeft; + private float width; + private float height; + private int part; + private int numberOfParts; + + private List tableCells; + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/rss/RSSFileResponse.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/rss/RSSFileResponse.java new file mode 100644 index 000000000..fc721f85a --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/rss/RSSFileResponse.java @@ -0,0 +1,26 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.rss; + +import java.util.Map; +import java.util.TreeMap; + +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlCData; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class RSSFileResponse { + + @JacksonXmlCData + private String filename; + + @JacksonXmlCData + @Builder.Default + private Map result = new TreeMap<>(); + +} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/rss/RSSResponse.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/rss/RSSResponse.java new file mode 100644 index 000000000..5afce3d4e --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/rss/RSSResponse.java @@ -0,0 +1,20 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.rss; + +import java.util.ArrayList; +import java.util.List; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class RSSResponse { + + @Builder.Default + private List files = new ArrayList<>(); + +} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/utils/SuppressFBWarnings.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/utils/SuppressFBWarnings.java similarity index 86% rename from persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/utils/SuppressFBWarnings.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/utils/SuppressFBWarnings.java index 2bd7904e5..741ae75c0 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/utils/SuppressFBWarnings.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/utils/SuppressFBWarnings.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.utils; +package com.iqser.red.service.persistence.service.v1.api.shared.model.utils; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/test/java/com/iqser/red/service/persistence/service/v1/api/shared/IdentityTest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/test/java/com/iqser/red/service/persistence/service/v1/api/shared/IdentityTest.java new file mode 100644 index 000000000..078e00da2 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/test/java/com/iqser/red/service/persistence/service/v1/api/shared/IdentityTest.java @@ -0,0 +1,16 @@ +package com.iqser.red.service.persistence.service.v1.api.shared; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.Test; + +public class IdentityTest { + + @Test + public void mockTest() { + + int i = 1; + assertThat(i).isEqualTo(1); + } + +} diff --git a/persistence-service-v1/pom.xml b/persistence-service-v1/pom.xml index 91616c269..d5bb34fda 100755 --- a/persistence-service-v1/pom.xml +++ b/persistence-service-v1/pom.xml @@ -19,16 +19,22 @@ pom - persistence-service-api-v1 + keycloak-commons + persistence-service-shared-api-v1 + persistence-service-internal-api-v1 + persistence-service-external-api-v1 persistence-service-processor-v1 persistence-service-server-v1 + persistence-service-external-api-impl-v1 + persistence-service-internal-api-impl-v1 - 3.206.0 - 2.39.0 - 3.157.0 - 3.63.0 + 4.0.0 + 4.0.0 + 4.0.0 + 4.0.0 + 20.0.1 @@ -40,6 +46,11 @@ import pom + + org.springdoc + springdoc-openapi-ui + 1.6.13 + com.iqser.red.service redaction-service-api-v1 @@ -54,12 +65,6 @@ com.iqser.red.service redaction-report-service-api-v1 ${redaction-report-service.version} - - - com.iqser.red.service - persistence-service-api-v1 - - com.iqser.red.service