Skip to content

Commit

Permalink
Merge pull request #463 from it-at-m/148-redesign-save
Browse files Browse the repository at this point in the history
148 redesign Vorschläge und Vorlagen save - use cascade type
  • Loading branch information
MrSebastian authored Oct 10, 2024
2 parents 9025544 + a212647 commit 373cda3
Show file tree
Hide file tree
Showing 8 changed files with 13 additions and 87 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import static java.sql.Types.VARCHAR;

import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID;
import jakarta.persistence.CascadeType;
import jakarta.persistence.Embedded;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
Expand Down Expand Up @@ -45,7 +46,7 @@ public class Referendumvorlagen {
@NotNull
private String stimmzettelgebietID;

@OneToMany(mappedBy = "referendumvorlagen", orphanRemoval = true)
@OneToMany(mappedBy = "referendumvorlagen", orphanRemoval = true, cascade = CascadeType.PERSIST)
@NotNull
private Set<Referendumvorlage> referendumvorlagen = new HashSet<>();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import static java.sql.Types.VARCHAR;

import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID;
import jakarta.persistence.CascadeType;
import jakarta.persistence.Embeddable;
import jakarta.persistence.Embedded;
import jakarta.persistence.Entity;
Expand Down Expand Up @@ -50,7 +51,7 @@ public class Wahlvorschlaege {
@ToString.Include
private String stimmzettelgebietID;

@OneToMany(mappedBy = "wahlvorschlaeage", orphanRemoval = true)
@OneToMany(mappedBy = "wahlvorschlaeage", orphanRemoval = true, cascade = CascadeType.PERSIST)
@NotNull
@Size(min = 1)
private Set<Wahlvorschlag> wahlvorschlaege = new LinkedHashSet<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import static java.sql.Types.VARCHAR;

import jakarta.persistence.CascadeType;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
Expand Down Expand Up @@ -60,7 +61,7 @@ public class Wahlvorschlag {
@ToString.Include
private boolean erhaeltStimmen;

@OneToMany(mappedBy = "wahlvorschlag", orphanRemoval = true)
@OneToMany(mappedBy = "wahlvorschlag", orphanRemoval = true, cascade = CascadeType.PERSIST)
@NotNull
private Set<Kandidat> kandidaten = new LinkedHashSet<>();

Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,12 @@
package de.muenchen.oss.wahllokalsystem.basisdatenservice.services.referendumvorlagen;

import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.referendumvorlagen.ReferendumvorlageRepository;
import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.referendumvorlagen.Referendumvorlagen;
import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.referendumvorlagen.ReferendumvorlagenRepository;
import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import lombok.val;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Service;
import org.springframework.transaction.support.TransactionTemplate;

@Service
@RequiredArgsConstructor
Expand All @@ -22,11 +19,8 @@ public class ReferendumvorlagenService {

private final ReferendumvorlagenClient referendumvorlagenClient;

private final ReferendumvorlageRepository referendumvorlageRepository;
private final ReferendumvorlagenRepository referendumvorlagenRepository;

private final TransactionTemplate transactionTemplate;

@PreAuthorize("hasAuthority('Basisdaten_BUSINESSACTION_GetReferendumvorlagen')")
public ReferendumvorlagenModel getReferendumvorlagen(final ReferendumvorlagenReferenceModel referendumvorlagenReferenceModel) {
log.info("#getReferendumvorlagen");
Expand All @@ -48,19 +42,12 @@ private ReferendumvorlagenModel cacheReferendumvorlagen(ReferendumvorlagenRefere
val importedReferendumvorlagen = referendumvorlagenClient.getReferendumvorlagen(referendumvorlagenReferenceModel);

val entitiesToSave = referendumvorlagenModelMapper.toEntity(importedReferendumvorlagen, referendumBezirkUndWahlID);
saveReferendumvorlagen(entitiesToSave);

return importedReferendumvorlagen;
}

private void saveReferendumvorlagen(final Referendumvorlagen referendumvorlagenToSave) {
try {
transactionTemplate.executeWithoutResult(transactionStatus -> {
referendumvorlagenRepository.save(referendumvorlagenToSave);
referendumvorlageRepository.saveAll(referendumvorlagenToSave.getReferendumvorlagen());
});
referendumvorlagenRepository.save(entitiesToSave);
} catch (final Exception e) {
log.error("#getReferendumvorlagen: Fehler beim Cachen", e);
}

return importedReferendumvorlagen;
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlvorschlag;

import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlvorschlag.KandidatRepository;
import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlvorschlag.Wahlvorschlaege;
import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlvorschlag.WahlvorschlaegeRepository;
import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlvorschlag.WahlvorschlagRepository;
import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID;
Expand Down Expand Up @@ -37,7 +36,7 @@ public WahlvorschlaegeModel getWahlvorschlaege(final BezirkUndWahlID bezirkUndWa
log.debug("#getWahlvorschlaege: Für BezirkUndWahlID {} waren keine Wahlvorschlaege in der Datenbank", bezirkUndWahlID);
val importedWahlvorschlaegeModel = wahlvorschlaegeClient.getWahlvorschlaege(bezirkUndWahlID);
try {
val savedWahlvorschlaege = persistWahlvorschlagModel(importedWahlvorschlaegeModel);
val savedWahlvorschlaege = wahlvorschlaegeRepository.save(wahlvorschlaegeModelMapper.toEntity(importedWahlvorschlaegeModel));
return wahlvorschlaegeModelMapper.toModel(savedWahlvorschlaege);
} catch (final Exception exception) {
log.error("#getWahlvorschlaege: Fehler beim Cachen", exception);
Expand All @@ -48,15 +47,4 @@ public WahlvorschlaegeModel getWahlvorschlaege(final BezirkUndWahlID bezirkUndWa
}
}

protected Wahlvorschlaege persistWahlvorschlagModel(final WahlvorschlaegeModel wahlvorschlaegeModel) {
val entityToCreate = wahlvorschlaegeModelMapper.toEntity(wahlvorschlaegeModel);
val createdEntity = wahlvorschlaegeRepository.save(entityToCreate);
entityToCreate.getWahlvorschlaege().forEach(wahlvorschlag -> {
wahlvorschlagRepository.save(wahlvorschlag);
kandidatRepository.saveAll(wahlvorschlag.getKandidaten());
});

return createdEntity;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import static de.muenchen.oss.wahllokalsystem.basisdatenservice.TestConstants.SPRING_NO_SECURITY_PROFILE;
import static de.muenchen.oss.wahllokalsystem.basisdatenservice.TestConstants.SPRING_TEST_PROFILE;
import static org.mockito.ArgumentMatchers.any;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

import com.fasterxml.jackson.databind.ObjectMapper;
Expand Down Expand Up @@ -106,7 +105,7 @@ void loadedFromExternal() throws Exception {

@Test
@Transactional
void returnExistingDataWithoutImport() throws Exception {
void should_persistData_when_importedViaClient() throws Exception {
val wahlID = "wahlID";
val wahlbezirkID = "wahlbezirkID";

Expand Down Expand Up @@ -181,29 +180,6 @@ void fachlicheWlsExceptionWhenPathVariableIsInvalid() throws Exception {
Assertions.assertThat(responseBodyAsDTO).isEqualTo(expectedBodyDTO);
}

@Test
void alleReferendumdataIsStoredTransactional() throws Exception {
val wahlID = "wahlID";
val wahlbezirkID = "wahlbezirkID";

val eaiReferendumvorschlage = createClientReferendumvorlagenDTO();
defineStubForGetReferendumvorlage(eaiReferendumvorschlage, wahlID, wahlbezirkID, HttpStatus.OK);

val mockedSaveAllException = new RuntimeException("save all failed");
Mockito.doThrow(mockedSaveAllException).when(referendumvorlageRepository).saveAll(any());

val request = MockMvcRequestBuilders.get(BUSINESS_ACTIONS_REFERENDUMVORLAGEN + wahlID + "/" + wahlbezirkID);

val response = mockMvc.perform(request).andExpect(status().isOk()).andReturn();
val responseBodyAsDTO = objectMapper.readValue(response.getResponse().getContentAsByteArray(), ReferendumvorlagenDTO.class);

val expectedBodyDTO = referendumvorlagenDTOMapper.toDTO(referendumvorlagenClientMapper.toModel(eaiReferendumvorschlage));
Assertions.assertThat(responseBodyAsDTO).isEqualTo(expectedBodyDTO);

Assertions.assertThat(referendumvorlagenRepository.count()).isEqualTo(0);
Assertions.assertThat(referendumvorlageRepository.count()).isEqualTo(0);
}

private de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.ReferendumvorlagenDTO createClientReferendumvorlagenDTO() {
val dto = new de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.ReferendumvorlagenDTO();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,13 @@
import static org.mockito.ArgumentMatchers.eq;

import ch.qos.logback.classic.Level;
import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.referendumvorlagen.ReferendumvorlageRepository;
import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.referendumvorlagen.Referendumvorlagen;
import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.referendumvorlagen.ReferendumvorlagenRepository;
import de.muenchen.oss.wahllokalsystem.basisdatenservice.utils.LoggerExtension;
import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID;
import java.util.Collections;
import java.util.Optional;
import java.util.UUID;
import java.util.function.Consumer;
import lombok.val;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Nested;
Expand All @@ -21,11 +19,7 @@
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.Spy;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.transaction.TransactionException;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionTemplate;

@ExtendWith(MockitoExtension.class)
class ReferendumvorlagenServiceTest {
Expand All @@ -39,20 +33,9 @@ class ReferendumvorlagenServiceTest {
@Mock
ReferendumvorlagenClient referendumvorlagenClient;

@Mock
ReferendumvorlageRepository referendumvorlageRepository;

@Mock
ReferendumvorlagenRepository referendumvorlagenRepository;

@Spy
TransactionTemplate transactionTemplate = new TransactionTemplate() {
@Override
public void executeWithoutResult(Consumer<TransactionStatus> action) throws TransactionException {
action.accept(Mockito.mock(TransactionStatus.class));
}
};

@InjectMocks
ReferendumvorlagenService unitUnderTest;

Expand Down Expand Up @@ -83,7 +66,6 @@ void dataImportedAndSavedWhenNoDataExists() {
Assertions.assertThat(result).isEqualTo(mockedClientRerefendumvorlagenModel);

Mockito.verify(referendumvorlagenRepository).save(mockedMappendModelAsEntity);
Mockito.verify(referendumvorlageRepository).saveAll(Collections.emptySet());
}

@Test
Expand All @@ -103,7 +85,7 @@ void returnExistingDataWithoutImport() {
val result = unitUnderTest.getReferendumvorlagen(referendumvorlagenReference);

Assertions.assertThat(result).isEqualTo(mockedRepoEntityAsModel);
Mockito.verifyNoMoreInteractions(referendumvorlageRepository, referendumvorlagenRepository, referendumvorlagenClient);
Mockito.verifyNoMoreInteractions(referendumvorlagenRepository, referendumvorlagenClient);
Assertions.assertThat(loggerExtension.getLoggedEventsStream().filter(event -> event.getLevel() == Level.ERROR).count()).isEqualTo(0);
}

Expand All @@ -129,7 +111,7 @@ void noExceptionWhenSaveOfImportedFailed() {

Assertions.assertThat(result).isEqualTo(mockedClientRerefendumvorlagenModel);

Mockito.verifyNoMoreInteractions(referendumvorlageRepository, referendumvorlagenRepository);
Mockito.verifyNoMoreInteractions(referendumvorlagenRepository);
Assertions.assertThat(loggerExtension.getLoggedEventsStream().filter(event -> event.getLevel() == Level.ERROR).count()).isEqualTo(1);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,9 @@
import static org.mockito.Mockito.times;

import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlvorschlag.Kandidat;
import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlvorschlag.KandidatRepository;
import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlvorschlag.Wahlvorschlaege;
import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlvorschlag.WahlvorschlaegeRepository;
import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlvorschlag.Wahlvorschlag;
import de.muenchen.oss.wahllokalsystem.basisdatenservice.domain.wahlvorschlag.WahlvorschlagRepository;
import de.muenchen.oss.wahllokalsystem.wls.common.security.domain.BezirkUndWahlID;
import java.util.Optional;
import java.util.Set;
Expand All @@ -29,10 +27,6 @@ class WahlvorschlaegeServiceTest {
@Mock
WahlvorschlaegeRepository wahlvorschlaegeRepository;
@Mock
WahlvorschlagRepository wahlvorschlagRepository;
@Mock
KandidatRepository kandidatRepository;
@Mock
WahlvorschlaegeModelMapper wahlvorschlaegeModelMapper;
@Mock
WahlvorschlaegeValidator wahlvorschlaegeValidator;
Expand Down Expand Up @@ -82,10 +76,6 @@ void missingDataIsLoadedAndStored() {

Assertions.assertThat(result).isSameAs(mockedMappedSavedEntity);
Mockito.verify(wahlvorschlaegeRepository).save(mockedMappedEntity);
Mockito.verify(wahlvorschlagRepository).save(mockedWahlvorschlagEntity1);
Mockito.verify(wahlvorschlagRepository).save(mockedWahlvorschlagEntity2);
Mockito.verify(kandidatRepository).saveAll(mockedWahlvorschlagEntity1.getKandidaten());
Mockito.verify(kandidatRepository).saveAll(mockedWahlvorschlagEntity2.getKandidaten());
}

@Test
Expand Down

0 comments on commit 373cda3

Please sign in to comment.