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

OZG-4391 OZG-4417 move logic to other class

- Implement configuration as list of objects instead of map
parent 0bccafe1
Branches
Tags
No related merge requests found
package de.ozgcloud.alfa.vorgang;
import java.util.HashMap;
import java.util.Map;
import java.util.List;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
......@@ -17,6 +16,5 @@ public class VorgangProperties {
public static final String PREFIX = "ozgcloud.vorgang";
private Map<String, String> bescheid = new HashMap<>();
private List<VorgangProperty> bescheid = List.of();
}
\ No newline at end of file
package de.ozgcloud.alfa.vorgang;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
@Builder
@Setter
@Getter
public class VorgangProperty {
private String formEngineName;
private String formId;
}
......@@ -23,6 +23,7 @@
*/
package de.ozgcloud.alfa.vorgang;
import static java.util.Optional.*;
import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*;
import java.util.Objects;
......@@ -37,7 +38,9 @@ import org.springframework.hateoas.server.RepresentationModelProcessor;
import org.springframework.stereotype.Component;
import de.ozgcloud.alfa.attachment.AttachmentController;
import de.ozgcloud.alfa.common.FeatureToggleProperties;
import de.ozgcloud.alfa.common.ModelBuilder;
import de.ozgcloud.alfa.common.command.CommandController.CommandByRelationController;
import de.ozgcloud.alfa.common.user.CurrentUserService;
import de.ozgcloud.alfa.common.user.UserManagerUrlProvider;
import de.ozgcloud.alfa.common.user.UserRole;
......@@ -56,6 +59,7 @@ class VorgangWithEingangProzessor implements RepresentationModelProcessor<Entity
static final LinkRelation REL_POSTFACH_MAILS = LinkRelation.of("postfachMails");
static final LinkRelation REL_VORGANG_FORWARDING = LinkRelation.of("forwarding");
static final LinkRelation REL_HISTORIE = LinkRelation.of("historie");
static final LinkRelation REL_BESCHEID = LinkRelation.of("createBescheid");
static final String REL_SEARCH_USER = "search-user-profiles";
static final String USER_PROFILE_SEARCH_DELETED_PARAM = "deleted";
......@@ -68,6 +72,12 @@ class VorgangWithEingangProzessor implements RepresentationModelProcessor<Entity
@Autowired
private UserManagerUrlProvider userManagerUrlProvider;
@Autowired
private FeatureToggleProperties featureToggle;
@Autowired
private VorgangProperties vorgangProperties;
private static final Predicate<VorgangWithEingang> HAS_ATTACHMENTS = vorgangWithEingang -> vorgangWithEingang.getEingang()
.getNumberOfAttachments() > 0;
......@@ -98,6 +108,9 @@ class VorgangWithEingangProzessor implements RepresentationModelProcessor<Entity
.addLink(linkTo(methodOn(HistorieController.class).getAll(vorgang.getId())).withRel(REL_HISTORIE))
.ifMatch(() -> userManagerUrlProvider.isConfiguredForSearchUserProfile() && hasOrganisationsEinheitId(vorgang))
.addLink(() -> buildSearchUserProfilesLink(vorgang))
.ifMatch(() -> isCreateBescheidEnabled(vorgang))
.addLink(linkTo(methodOn(CommandByRelationController.class).createCommand(vorgang.getId(), vorgang.getId(), vorgang.getVersion(),
null)).withRel(REL_BESCHEID))
.buildModel();
}
......@@ -123,4 +136,22 @@ class VorgangWithEingangProzessor implements RepresentationModelProcessor<Entity
private String getOrganisationsEinheitId(VorgangWithEingang vorgang) {
return vorgang.getEingang().getZustaendigeStelle().getOrganisationseinheitenId();
}
boolean isCreateBescheidEnabled(VorgangWithEingang vorgang) {
return featureToggle.isCreateBescheid() && hasVorgangCreateBescheidEnabled(vorgang);
}
boolean hasVorgangCreateBescheidEnabled(VorgangWithEingang vorgang) {
return ofNullable(vorgang.getEingang())
.flatMap(eingang -> ofNullable(eingang.getHeader())
.flatMap(eingangHeader -> ofNullable(eingangHeader.getFormId())
.flatMap(formId -> ofNullable(eingangHeader.getFormEngineName())
.map(formEngineName -> isCreateBescheidEnabled(formId, formEngineName)))))
.orElse(false);
}
private boolean isCreateBescheidEnabled(String formId, String formEngineName) {
return vorgangProperties.getBescheid().stream().filter(prop -> prop.getFormId().equals(formId) && prop.getFormEngineName()
.equals(formEngineName)).count() > 0;
}
}
\ No newline at end of file
......@@ -23,7 +23,6 @@
*/
package de.ozgcloud.alfa.vorgang.command;
import static java.util.Optional.*;
import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*;
import java.util.Objects;
......@@ -34,14 +33,12 @@ import org.springframework.hateoas.LinkRelation;
import org.springframework.hateoas.server.RepresentationModelProcessor;
import org.springframework.stereotype.Component;
import de.ozgcloud.alfa.common.FeatureToggleProperties;
import de.ozgcloud.alfa.common.ModelBuilder;
import de.ozgcloud.alfa.common.command.CommandController;
import de.ozgcloud.alfa.common.command.CommandController.CommandByRelationController;
import de.ozgcloud.alfa.common.user.CurrentUserService;
import de.ozgcloud.alfa.common.user.UserRole;
import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus;
import de.ozgcloud.alfa.vorgang.VorgangProperties;
import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
import de.ozgcloud.alfa.vorgang.forwarding.ForwardingController;
......@@ -50,7 +47,6 @@ public class VorgangWithEingangCommandProzessor implements RepresentationModelPr
static final LinkRelation REL_VORGANG_FORWARD = LinkRelation.of("forward");
static final LinkRelation REL_PENDING_COMMANDS = LinkRelation.of("pending-commands");
static final LinkRelation REL_BESCHEID = LinkRelation.of("createBescheid");
@Autowired
private CurrentUserService userService;
......@@ -59,11 +55,6 @@ public class VorgangWithEingangCommandProzessor implements RepresentationModelPr
@Autowired
private CommandController commandController;
@Autowired
private FeatureToggleProperties featureToggle;
@Autowired
private VorgangProperties vorgangProperties;
@Override
public EntityModel<VorgangWithEingang> process(EntityModel<VorgangWithEingang> model) {
var vorgang = model.getContent();
......@@ -77,9 +68,6 @@ public class VorgangWithEingangCommandProzessor implements RepresentationModelPr
null)).withRel(REL_VORGANG_FORWARD))
.ifMatch(this::existsPendingCommands)
.addLink(linkTo(methodOn(CommandController.class).getPendingCommands(true, vorgang.getId())).withRel(REL_PENDING_COMMANDS))
.ifMatch(() -> isCreateBescheidEnabled(vorgang))
.addLink(linkTo(methodOn(CommandByRelationController.class).createCommand(vorgang.getId(), vorgang.getId(), vorgang.getVersion(),
null)).withRel(REL_BESCHEID))
.buildModel();
}
......@@ -97,17 +85,4 @@ public class VorgangWithEingangCommandProzessor implements RepresentationModelPr
private boolean existsPendingCommands(VorgangWithEingang vorgang) {
return commandController.existsPendingCommands(vorgang.getId());
}
boolean isCreateBescheidEnabled(VorgangWithEingang vorgang) {
return featureToggle.isCreateBescheid() && hasVorgangCreateBescheidEnabled(vorgang);
}
boolean hasVorgangCreateBescheidEnabled(VorgangWithEingang vorgang) {
return ofNullable(vorgang.getEingang())
.flatMap(eingang -> ofNullable(eingang.getHeader())
.flatMap(eingangHeader -> ofNullable(eingangHeader.getFormId())
.flatMap(formId -> ofNullable(vorgangProperties.getBescheid().get(eingangHeader.getFormId())))
.map(formEngineName -> formEngineName.equals(eingangHeader.getFormEngineName()))))
.orElse(false);
}
}
\ No newline at end of file
......@@ -27,6 +27,8 @@ import static de.ozgcloud.alfa.common.UserProfileUrlProviderTestFactory.*;
import static org.assertj.core.api.Assertions.*;
import static org.mockito.Mockito.*;
import java.util.List;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
......@@ -35,20 +37,24 @@ import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.EnumSource;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Spy;
import org.springframework.hateoas.EntityModel;
import org.springframework.hateoas.Link;
import org.springframework.hateoas.LinkRelation;
import org.springframework.web.util.UriComponentsBuilder;
import de.ozgcloud.alfa.common.FeatureToggleProperties;
import de.ozgcloud.alfa.common.UserProfileUrlProvider;
import de.ozgcloud.alfa.common.user.CurrentUserService;
import de.ozgcloud.alfa.common.user.UserManagerUrlProvider;
import de.ozgcloud.alfa.common.user.UserRole;
import de.ozgcloud.alfa.postfach.PostfachMailController;
import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus;
import de.ozgcloud.alfa.vorgang.command.VorgangPropertyTestFactory;
class VorgangWithEingangProzessorTest {
@Spy
@InjectMocks
private VorgangWithEingangProzessor processor;
@Mock
......@@ -58,12 +64,13 @@ class VorgangWithEingangProzessorTest {
@Mock
private UserManagerUrlProvider userManagerUrlProvider;
private UserProfileUrlProvider urlProvider = new UserProfileUrlProvider();
@Mock
private FeatureToggleProperties featureToggle;
@BeforeEach
void init() {
initUserProfileUrlProvider(urlProvider);
}
@Mock
private VorgangProperties vorgangProperties;
private UserProfileUrlProvider urlProvider = new UserProfileUrlProvider();
@Nested
class TestAttachmentsLink {
......@@ -213,6 +220,11 @@ class VorgangWithEingangProzessorTest {
@Nested
class TestSearchUserProfileLink {
@BeforeEach
void init() {
initUserProfileUrlProvider(urlProvider);
}
@DisplayName("on configured for search user profile")
@Nested
class TestIsConfigured {
......@@ -273,4 +285,206 @@ class VorgangWithEingangProzessorTest {
return VorgangWithEingangTestFactory.createBuilder().eingang(eingang).build();
}
}
@Nested
class TestHasVorgangCreateBescheidEnabled {
@Nested
class TestWhenBescheidPropertiesEmpty {
@BeforeEach
void setUp() {
when(vorgangProperties.getBescheid()).thenReturn(List.of());
}
@Test
void shouldReturnFalse() {
var hasEnabled = callProcessor(VorgangWithEingangTestFactory.create());
assertThat(hasEnabled).isFalse();
}
}
@Nested
class TestWhenVorgangDataNotComplete {
@Test
void shouldReturnFalseIfEingangNull() {
var hasEnabled = callProcessor(VorgangWithEingangTestFactory.createBuilder().eingang(null).build());
assertThat(hasEnabled).isFalse();
}
@Test
void shouldReturnFalseIfEingangHeaderNull() {
var hasEnabled = callProcessor(
VorgangWithEingangTestFactory.createBuilder().eingang(EingangTestFactory.createBuilder().header(null).build()).build());
assertThat(hasEnabled).isFalse();
}
@Test
void shouldReturnFalseIfFormEngineNameNull() {
var hasEnabled = callProcessor(
VorgangWithEingangTestFactory.createBuilder().eingang(
EingangTestFactory.createBuilder().header(EingangHeaderTestFactory.createBuilder().formEngineName(null).build())
.build()).build());
assertThat(hasEnabled).isFalse();
}
@Test
void shouldReturnFalseIfFormIdNull() {
var hasEnabled = callProcessor(
VorgangWithEingangTestFactory.createBuilder().eingang(
EingangTestFactory.createBuilder().header(EingangHeaderTestFactory.createBuilder().formId(null).build())
.build()).build());
assertThat(hasEnabled).isFalse();
}
}
@Nested
class TestWhenBescheidPropertiesSet {
@BeforeEach
void setUp() {
when(vorgangProperties.getBescheid()).thenReturn(List.of(VorgangPropertyTestFactory.create()));
}
@Test
void shouldReturnFalseIfFormEngineNameNotEquals() {
var hasEnabled = callProcessor(
VorgangWithEingangTestFactory.createBuilder().eingang(
EingangTestFactory.createBuilder()
.header(EingangHeaderTestFactory.createBuilder().formEngineName("different").build())
.build()).build());
assertThat(hasEnabled).isFalse();
}
@Test
void shouldReturnTrue() {
var hasEnabled = callProcessor(VorgangWithEingangTestFactory.create());
assertThat(hasEnabled).isTrue();
}
}
boolean callProcessor(VorgangWithEingang vorgang) {
return processor.hasVorgangCreateBescheidEnabled(vorgang);
}
}
@Nested
class TestIsCreateBescheidEnabled {
@BeforeEach
void setUp() {
when(featureToggle.isCreateBescheid()).thenReturn(true);
}
@Test
void shouldCallFeatureToggleProperties() {
callProcessor(VorgangWithEingangTestFactory.create());
verify(featureToggle).isCreateBescheid();
}
@Test
void shouldCallHasVorgangCreateBescheidEnabled() {
var vorgang = VorgangWithEingangTestFactory.create();
callProcessor(vorgang);
verify(processor).hasVorgangCreateBescheidEnabled(vorgang);
}
@Nested
class TestFeatureToggleDisabled {
@BeforeEach
void setUp() {
when(featureToggle.isCreateBescheid()).thenReturn(false);
}
@Test
void shouldReturnFalse() {
var isEnabled = callProcessor(VorgangWithEingangTestFactory.create());
assertThat(isEnabled).isFalse();
}
}
@Nested
class TestFeatureToggleEnabled {
private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create();
@BeforeEach
void setUp() {
when(featureToggle.isCreateBescheid()).thenReturn(true);
}
@Test
void shouldReturnTrue() {
doReturn(true).when(processor).hasVorgangCreateBescheidEnabled(vorgang);
var isEnabled = callProcessor(vorgang);
assertThat(isEnabled).isTrue();
}
@Test
void shouldReturnFalse() {
doReturn(false).when(processor).hasVorgangCreateBescheidEnabled(vorgang);
var isEnabled = callProcessor(vorgang);
assertThat(isEnabled).isFalse();
}
}
private boolean callProcessor(VorgangWithEingang vorgang) {
return processor.isCreateBescheidEnabled(vorgang);
}
}
@Nested
class TestCreateBescheidLink {
private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create();
private final EntityModel<VorgangWithEingang> vorgangEntityModel = EntityModel.of(vorgang);
@BeforeEach
void activateFeature() {
initUserProfileUrlProvider(urlProvider);
}
@Test
void shouldHaveCreateBescheidLink() {
doReturn(true).when(processor).isCreateBescheidEnabled(vorgang);
var processed = processor.process(vorgangEntityModel);
assertThat(processed.getLink(VorgangWithEingangProzessor.REL_BESCHEID)).isPresent().get()
.extracting(Link::getHref)
.isEqualTo("/api/vorgangs/" + VorgangHeaderTestFactory.ID + "/relations/" + VorgangHeaderTestFactory.ID + "/"
+ VorgangHeaderTestFactory.VERSION + "/commands");
}
@Test
void shouldHaveNoLinkIfDisabled() {
doReturn(false).when(processor).isCreateBescheidEnabled(vorgang);
var processed = processor.process(vorgangEntityModel);
assertThat(processed.getLink(VorgangWithEingangProzessor.REL_BESCHEID)).isEmpty();
}
}
}
\ No newline at end of file
package de.ozgcloud.alfa.vorgang.command;
import de.ozgcloud.alfa.vorgang.EingangHeaderTestFactory;
import de.ozgcloud.alfa.vorgang.VorgangProperty;
public class VorgangPropertyTestFactory {
public static VorgangProperty create() {
return createBuilder().build();
}
public static VorgangProperty.VorgangPropertyBuilder createBuilder() {
return VorgangProperty.builder().formEngineName(EingangHeaderTestFactory.FORM_ENGINE_NAME).formId(EingangHeaderTestFactory.FORM_ID);
}
}
......@@ -29,7 +29,6 @@ import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import java.util.Collections;
import java.util.Map;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
......@@ -45,16 +44,12 @@ import org.springframework.hateoas.EntityModel;
import org.springframework.hateoas.Link;
import org.springframework.hateoas.LinkRelation;
import de.ozgcloud.alfa.common.FeatureToggleProperties;
import de.ozgcloud.alfa.common.UserProfileUrlProvider;
import de.ozgcloud.alfa.common.command.CommandController;
import de.ozgcloud.alfa.common.user.CurrentUserService;
import de.ozgcloud.alfa.common.user.UserRole;
import de.ozgcloud.alfa.vorgang.EingangHeaderTestFactory;
import de.ozgcloud.alfa.vorgang.EingangTestFactory;
import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus;
import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory;
import de.ozgcloud.alfa.vorgang.VorgangProperties;
import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory;
import de.ozgcloud.alfa.vorgang.forwarding.ForwardingController;
......@@ -72,11 +67,6 @@ class VorgangWithEingangCommandProzessorTest {
@Mock
private ForwardingController forwardingController;
@Mock
private FeatureToggleProperties featureToggle;
@Mock
private VorgangProperties vorgangProperties;
private VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create();
private EntityModel<VorgangWithEingang> vorgangEntityModel = EntityModel.of(vorgang);
......@@ -233,202 +223,4 @@ class VorgangWithEingangCommandProzessorTest {
.isEqualTo("/api/commands?pending=true&vorgangId=" + VorgangHeaderTestFactory.ID);
}
}
@Nested
class TestCreateBescheidLink {
@BeforeEach
void activateFeature() {
initUserProfileUrlProvider(urlProvider);
}
@Test
void shouldHaveCreateBescheidLink() {
doReturn(true).when(processor).isCreateBescheidEnabled(vorgang);
var processed = processor.process(vorgangEntityModel);
assertThat(processed.getLink(VorgangWithEingangCommandProzessor.REL_BESCHEID)).isPresent().get()
.extracting(Link::getHref)
.isEqualTo("/api/vorgangs/" + VorgangHeaderTestFactory.ID + "/relations/" + VorgangHeaderTestFactory.ID + "/"
+ VorgangHeaderTestFactory.VERSION + "/commands");
}
@Test
void shouldHaveNoLinkIfDisabled() {
doReturn(false).when(processor).isCreateBescheidEnabled(vorgang);
var processed = processor.process(vorgangEntityModel);
assertThat(processed.getLink(VorgangWithEingangCommandProzessor.REL_BESCHEID)).isEmpty();
}
}
@Nested
class TestIsCreateBescheidEnabled {
@BeforeEach
void setUp() {
when(featureToggle.isCreateBescheid()).thenReturn(true);
}
@Test
void shouldCallFeatureToggleProperties() {
callProcessor(VorgangWithEingangTestFactory.create());
verify(featureToggle).isCreateBescheid();
}
@Test
void shouldCallHasVorgangCreateBescheidEnabled() {
var vorgang = VorgangWithEingangTestFactory.create();
callProcessor(vorgang);
verify(processor).hasVorgangCreateBescheidEnabled(vorgang);
}
@Nested
class TestFeatureToggleDisabled {
@BeforeEach
void setUp() {
when(featureToggle.isCreateBescheid()).thenReturn(false);
}
@Test
void shouldReturnFalse() {
var isEnabled = callProcessor(VorgangWithEingangTestFactory.create());
assertThat(isEnabled).isFalse();
}
}
@Nested
class TestFeatureToggleEnabled {
private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create();
@BeforeEach
void setUp() {
when(featureToggle.isCreateBescheid()).thenReturn(true);
}
@Test
void shouldReturnTrue() {
doReturn(true).when(processor).hasVorgangCreateBescheidEnabled(vorgang);
var isEnabled = callProcessor(vorgang);
assertThat(isEnabled).isTrue();
}
@Test
void shouldReturnFalse() {
doReturn(false).when(processor).hasVorgangCreateBescheidEnabled(vorgang);
var isEnabled = callProcessor(vorgang);
assertThat(isEnabled).isFalse();
}
}
private boolean callProcessor(VorgangWithEingang vorgang) {
return processor.isCreateBescheidEnabled(vorgang);
}
}
@Nested
class TestHasVorgangCreateBescheidEnabled {
@Nested
class TestWhenBescheidPropertiesEmpty {
@BeforeEach
void setUp() {
when(vorgangProperties.getBescheid()).thenReturn(Map.of());
}
@Test
void shouldReturnFalse() {
var hasEnabled = callProcessor(VorgangWithEingangTestFactory.create());
assertThat(hasEnabled).isFalse();
}
}
@Nested
class TestWhenVorgangDataNotComplete {
@Test
void shouldReturnFalseIfEingangNull() {
var hasEnabled = callProcessor(VorgangWithEingangTestFactory.createBuilder().eingang(null).build());
assertThat(hasEnabled).isFalse();
}
@Test
void shouldReturnFalseIfEingangHeaderNull() {
var hasEnabled = callProcessor(
VorgangWithEingangTestFactory.createBuilder().eingang(EingangTestFactory.createBuilder().header(null).build()).build());
assertThat(hasEnabled).isFalse();
}
@Test
void shouldReturnFalseIfFormEngineNameNull() {
var hasEnabled = callProcessor(
VorgangWithEingangTestFactory.createBuilder().eingang(
EingangTestFactory.createBuilder().header(EingangHeaderTestFactory.createBuilder().formEngineName(null).build())
.build()).build());
assertThat(hasEnabled).isFalse();
}
@Test
void shouldReturnFalseIfFormIdNull() {
var hasEnabled = callProcessor(
VorgangWithEingangTestFactory.createBuilder().eingang(
EingangTestFactory.createBuilder().header(EingangHeaderTestFactory.createBuilder().formId(null).build())
.build()).build());
assertThat(hasEnabled).isFalse();
}
}
@Nested
class TestWhenBescheidPropertiesSet {
@BeforeEach
void setUp() {
when(vorgangProperties.getBescheid()).thenReturn(Map.of(EingangHeaderTestFactory.FORM_ID, EingangHeaderTestFactory.FORM_ENGINE_NAME));
}
@Test
void shouldReturnFalseIfFormEngineNameNotEquals() {
var hasEnabled = callProcessor(
VorgangWithEingangTestFactory.createBuilder().eingang(
EingangTestFactory.createBuilder()
.header(EingangHeaderTestFactory.createBuilder().formEngineName("different").build())
.build()).build());
assertThat(hasEnabled).isFalse();
}
@Test
void shouldReturnTrue() {
var hasEnabled = callProcessor(VorgangWithEingangTestFactory.create());
assertThat(hasEnabled).isTrue();
}
}
boolean callProcessor(VorgangWithEingang vorgang) {
return processor.hasVorgangCreateBescheidEnabled(vorgang);
}
}
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment