Skip to content
Snippets Groups Projects
Commit 82a00a07 authored by Tobias Bruns's avatar Tobias Bruns
Browse files

OZG-6988 load report settings to config server

parent 8887f5c7
No related branches found
No related tags found
1 merge request!3Ozg 6988 add reporting
Showing
with 340 additions and 28 deletions
package de.ozgcloud.admin.common;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.stereotype.Service;
@Service
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface DtoService {
String value();
}
package de.ozgcloud.admin.common;
public interface SettingDtoService {
String getSettingKeyName();
Object getDataTransferObject();
}
package de.ozgcloud.admin.reporting;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.NullValueCheckStrategy;
import de.ozgcloud.admin.reporting.ReportingSettingDto.AggregationMappingDto;
@Mapper(nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
public interface AggregationMappingMapper {
@Mapping(target = "fieldMapping", ignore = true)
@Mapping(target = "fieldMappings", source = "mappings")
AggregationMappingDto toMapping(ReportingSetting setting);
}
package de.ozgcloud.admin.reporting;
import java.util.stream.Stream;
import de.ozgcloud.admin.common.DtoService;
import de.ozgcloud.admin.common.SettingDtoService;
import de.ozgcloud.admin.setting.SettingConstants;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
@DtoService(SettingConstants.AGGREGATION_MANAGER)
class ReportingAggregationManagerSettingDTOService implements SettingDtoService {
private final ReportingSettingRepository repository;
private final AggregationMappingMapper mapper;
@Override
public ReportingSettingDto getDataTransferObject() {
return mapToDto(repository.findAll().stream());
}
ReportingSettingDto mapToDto(Stream<ReportingSetting> settings) {
return ReportingSettingDto.builder()
.aggregationMappings(settings.map(mapper::toMapping).toList())
.build();
}
@Override
public String getSettingKeyName() {
return "aggregation";
}
}
......@@ -2,6 +2,7 @@ package de.ozgcloud.admin.reporting;
import java.util.List;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
......@@ -9,34 +10,47 @@ import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.TypeAlias;
import org.springframework.data.mongodb.core.mapping.Document;
import com.fasterxml.jackson.annotation.JsonIgnore;
import de.ozgcloud.admin.reporting.ReportingSettingDto.FormIdentifierDto;
import lombok.Builder;
import lombok.Getter;
import lombok.Singular;
import lombok.extern.jackson.Jacksonized;
@Document("settings")
@TypeAlias("reporting")
@TypeAlias("fieldMapping")
@Jacksonized
@Builder
@Getter
public class ReportingSetting {
@Id
@JsonIgnore
private String id;
@Builder.Default
private String name = "reporting";
private String name = "fieldMapping";
@NotBlank
private String formEngineName;
@NotBlank
private String formId;
@Valid
private FormIdentifierDto formIdentifier;
@NotEmpty
@Singular
private List<FieldMapping> mappings;
@Builder
@Getter
static class FieldMapping {
@NotBlank
private String sourcePath;
@NotBlank
private String targetPath;
}
static class FormIdentifer {
@NotBlank
private String formEngineName;
@NotBlank
private String formId;
}
}
package de.ozgcloud.admin.reporting;
import java.util.List;
import lombok.Builder;
import lombok.Getter;
import lombok.Singular;
import lombok.ToString;
@Builder
@Getter
@ToString
public class ReportingSettingDto {
@Singular
private List<AggregationMappingDto> aggregationMappings;
@Builder
@Getter
static class AggregationMappingDto {
private FormIdentifierDto formIdentifier;
@Singular
private List<FieldMappingDto> fieldMappings;
}
@Builder
@Getter
static class FormIdentifierDto {
private String formEngineName;
private String formId;
}
@Builder
@Getter
static class FieldMappingDto {
private String sourcePath;
private String targetPath;
}
}
package de.ozgcloud.admin.reporting;
import java.util.List;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.mongodb.repository.Query;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
@RepositoryRestResource
public interface ReportingSettingRepository extends MongoRepository<ReportingSetting, String> {
interface ReportingSettingRepository extends MongoRepository<ReportingSetting, String> {
@Override
@Query("{'_class': 'fieldMapping'}")
List<ReportingSetting> findAll();
}
package de.ozgcloud.admin.setting;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import lombok.Builder;
import lombok.Getter;
import lombok.Singular;
@Builder
@Getter
public class MapBasedApplicationSettingDto implements ApplicationSettingDTO {
@Singular
private Map<String, Object> settings;
@JsonAnyGetter
public Map<String, Object> getSettings() {
return settings;
}
}
......@@ -32,4 +32,6 @@ public class SettingConstants {
static final String REL = "settings";
public static final String PATH = "settings";
public static final String AGGREGATION_MANAGER = "OzgCloud_AggregationManager";
}
......@@ -23,6 +23,8 @@
*/
package de.ozgcloud.admin.setting;
import static de.ozgcloud.admin.setting.SettingConstants.*;
import java.util.Map;
import java.util.Optional;
......@@ -41,13 +43,12 @@ import lombok.RequiredArgsConstructor;
@Component
public class SettingEnvironmentRepository implements EnvironmentRepository {
private final SettingService settingService;
private final ObjectMapper objectMapper;
private static final String ALFA = "Alfa";
private static final String VORGANG_MANAGER = "OzgCloud_VorgangManager";
private final SettingService settingService;
private final ObjectMapper objectMapper;
@Override
public Environment findOne(String application, String profile, String label) {
return buildEnvironment(application, findAnwendungSettingDTO(application));
......@@ -59,6 +60,8 @@ public class SettingEnvironmentRepository implements EnvironmentRepository {
return Optional.of(settingService.getAlfaSettingDTO());
case VORGANG_MANAGER:
return Optional.of(settingService.getVorgangManagerSettingDTO());
case AGGREGATION_MANAGER:
return Optional.of(settingService.getAggregationManagerSettingDto());
default:
return Optional.empty();
}
......
......@@ -23,11 +23,20 @@
*/
package de.ozgcloud.admin.setting;
import static de.ozgcloud.admin.setting.SettingConstants.*;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import jakarta.annotation.PostConstruct;
import org.springframework.beans.factory.ListableBeanFactory;
import org.springframework.stereotype.Service;
import de.ozgcloud.admin.common.DtoService;
import de.ozgcloud.admin.common.SettingDtoService;
import de.ozgcloud.admin.organisationseinheit.OrganisationsEinheitSettings;
import de.ozgcloud.admin.setting.postfach.PostfachSettingBody;
import lombok.RequiredArgsConstructor;
......@@ -41,6 +50,21 @@ class SettingService {
private final SettingRepository repository;
private final SettingMapper mapper;
private final ListableBeanFactory beanFactory;
private Map<String, List<SettingDtoService>> dtoServiceByManager;
@PostConstruct
void initDtoServices() {
this.dtoServiceByManager = beanFactory.getBeansWithAnnotation(DtoService.class).values().stream()
.map(dtoService -> (SettingDtoService) dtoService)
.collect(Collectors.groupingBy(dtoService -> getManagerForService(dtoService)));
}
private String getManagerForService(SettingDtoService dtoService) {
var annotation = dtoService.getClass().getDeclaredAnnotation(DtoService.class);
return annotation.value();
}
public AlfaSettingDTO getAlfaSettingDTO() {
var postfachData = getSettingWithPostfachFromDb();
......@@ -63,6 +87,17 @@ class SettingService {
.build();
}
public ApplicationSettingDTO getAggregationManagerSettingDto() {
return MapBasedApplicationSettingDto.builder()
.settings(getDtoService(AGGREGATION_MANAGER).stream()
.collect(Collectors.toMap(SettingDtoService::getSettingKeyName, SettingDtoService::getDataTransferObject)))
.build();
}
private List<SettingDtoService> getDtoService(String managerName) {
return dtoServiceByManager.getOrDefault(managerName, Collections.emptyList());
}
PostfachSettingBody getSettingWithPostfachFromDb() {
return repository.findOneByName(POSTFACH_SETTING_ITEM_NAME)
.map(Setting::getSettingBody)
......@@ -75,4 +110,5 @@ class SettingService {
OrganisationsEinheitWithSettings::organisationsEinheitId,
OrganisationsEinheitWithSettings::settings));
}
}
logging:
config: classpath:log4j2-local.xml
spring:
data:
mongodb:
......
......@@ -21,7 +21,7 @@
# unter der Lizenz sind dem Lizenztext zu entnehmen.
logging:
level:
ROOT: INFO
ROOT: WARN
'[de.ozgcloud]': INFO
management:
......
......@@ -31,8 +31,6 @@ import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import com.fasterxml.jackson.core.exc.StreamReadException;
import com.fasterxml.jackson.databind.DatabindException;
import com.fasterxml.jackson.databind.ObjectMapper;
import de.ozgcloud.admin.common.user.TestId;
......
......@@ -24,11 +24,9 @@
package de.ozgcloud.admin.common;
import static org.assertj.core.api.Assertions.*;
import static org.mockito.Mockito.*;
import java.util.UUID;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
......@@ -36,7 +34,6 @@ import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.NullAndEmptySource;
import org.mockito.Mock;
import org.springframework.context.ApplicationContext;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.RequestMapping;
import lombok.Builder;
......
package de.ozgcloud.admin.reporting;
import static org.assertj.core.api.Assertions.*;
import java.util.stream.Stream;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.mapstruct.factory.Mappers;
import org.mockito.InjectMocks;
import org.mockito.Spy;
class ReportingAggregationManagerSettingDTOServiceTest {
@InjectMocks
private ReportingAggregationManagerSettingDTOService service;
@Spy
private AggregationMappingMapper mapper = Mappers.getMapper(AggregationMappingMapper.class);
@Nested
class TestMapToDto {
@Test
void shouldCreateDto() {
var dto = service.mapToDto(Stream.of(ReportingSettingTestFactory.create()));
assertThat(dto).usingRecursiveComparison().isEqualTo(ReportingSettingDtoTestFactory.create());
}
}
}
package de.ozgcloud.admin.reporting;
import static de.ozgcloud.admin.reporting.ReportingSettingTestFactory.*;
import de.ozgcloud.admin.reporting.ReportingSettingDto.AggregationMappingDto;
import de.ozgcloud.admin.reporting.ReportingSettingDto.FieldMappingDto;
import de.ozgcloud.admin.reporting.ReportingSettingDto.FormIdentifierDto;
class ReportingSettingDtoTestFactory {
public static final FormIdentifierDto FORM_IDENTIFIER = FormIdentifierDto.builder().formId(FORM_ID).formEngineName(FORM_ENGINE_NAME).build();
public static ReportingSettingDto create() {
return createBuilder().build();
}
public static ReportingSettingDto.ReportingSettingDtoBuilder createBuilder() {
return ReportingSettingDto.builder()
.aggregationMapping(AggregationMappingDto.builder()
.formIdentifier(FORM_IDENTIFIER)
.fieldMapping(FieldMappingDto.builder().sourcePath(SOURCE_PATH).targetPath(TARGET_PATH).build())
.build());
}
}
......@@ -6,7 +6,6 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilder
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
......@@ -16,12 +15,13 @@ import org.springframework.security.test.context.support.WithMockUser;
import org.springframework.test.web.servlet.MockMvc;
import de.ozgcloud.common.test.DataITCase;
import de.ozgcloud.common.test.TestUtils;
import lombok.SneakyThrows;
@AutoConfigureMockMvc
@WithMockUser(roles = "ADMIN_ADMIN")
@DataITCase
class ReportingSettingsITCase {
class ReportingSettingITCase {
@Autowired
private MockMvc mockMvc;
......@@ -50,12 +50,11 @@ class ReportingSettingsITCase {
.andExpect(status().isUnprocessableEntity());
}
@Disabled
@Test
@SneakyThrows
void shouldAddReportingSetting() {
mockMvc.perform(post("/api/configuration/reportingSettings").with(csrf())
.contentType(MediaType.APPLICATION_JSON).content("{}"))
.contentType(MediaType.APPLICATION_JSON).content(TestUtils.loadTextFile("reporting/request.json")))
.andExpect(status().isCreated());
var collection = mongoOperations.getCollection("settings");
......
package de.ozgcloud.admin.reporting;
import static org.assertj.core.api.Assertions.*;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoOperations;
import de.ozgcloud.admin.setting.SettingTestFactory;
import de.ozgcloud.common.test.DataITCase;
@DataITCase
class ReportingSettingRepositoryITCase {
@Autowired
private ReportingSettingRepository repository;
@Autowired
private MongoOperations operations;
@BeforeEach
void dropCollection() {
operations.dropCollection("settings");
}
@Test
void shouldLoadOnlyFieldMapping() {
operations.save(ReportingSettingTestFactory.create());
operations.save(SettingTestFactory.create());
var result = repository.findAll();
assertThat(result).hasSize(1);
}
}
package de.ozgcloud.admin.reporting;
import java.util.UUID;
import de.ozgcloud.admin.reporting.ReportingSetting.FieldMapping;
import de.ozgcloud.admin.reporting.ReportingSettingDto.FormIdentifierDto;
class ReportingSettingTestFactory {
public static final String ID = UUID.randomUUID().toString();
public static final String FORM_ENGINE_NAME = "A12";
public static final String FORM_ID = "123AABC";
public static final String SOURCE_PATH = "name";
public static final String TARGET_PATH = "antragsteller.name";
public static ReportingSetting create() {
return createBuilder().build();
}
public static ReportingSetting.ReportingSettingBuilder createBuilder() {
return ReportingSetting.builder()
.id(UUID.randomUUID().toString())
.formIdentifier(FormIdentifierDto.builder()
.formEngineName(FORM_ENGINE_NAME)
.formId(FORM_ID)
.build())
.mapping(FieldMapping.builder().sourcePath(SOURCE_PATH).targetPath(TARGET_PATH).build());
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment