Skip to content

Commit

Permalink
Merge pull request #399 from it-at-m/145-implementierung-von-wahlbezi…
Browse files Browse the repository at this point in the history
…rke-laden

145 implementierung von wahlbezirke laden
  • Loading branch information
Nic12345678 authored Aug 22, 2024
2 parents c09d14a + 7b17928 commit 743c454
Show file tree
Hide file tree
Showing 40 changed files with 1,743 additions and 29 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
id: add authorities basisdaten wahlbezirke
author: Nic12345678
realm: ${SSO_REALM}
changes:
- addRole:
name: Basisdaten_BUSINESSACTION_GetWahlbezirke
clientRole: true
clientId: ${SSO_CLIENT_ID}
- assignRoleToGroup:
group: allBasisdatenAuthorities
role: Basisdaten_BUSINESSACTION_GetWahlbezirke
clientId: ${SSO_CLIENT_ID}

- addRole:
name: Basisdaten_READ_Wahltag
clientRole: true
clientId: ${SSO_CLIENT_ID}
- assignRoleToGroup:
group: allBasisdatenAuthorities
role: Basisdaten_READ_Wahltag
clientId: ${SSO_CLIENT_ID}

- addRole:
name: Basisdaten_READ_Wahl
clientRole: true
clientId: ${SSO_CLIENT_ID}
- assignRoleToGroup:
group: allBasisdatenAuthorities
role: Basisdaten_READ_Wahl
clientId: ${SSO_CLIENT_ID}

- addRole:
name: Basisdaten_READ_Wahlbezirk
clientRole: true
clientId: ${SSO_CLIENT_ID}
- assignRoleToGroup:
group: allBasisdatenAuthorities
role: Basisdaten_READ_Wahlbezirk
clientId: ${SSO_CLIENT_ID}
- addRole:
name: Basisdaten_WRITE_Wahlbezirk
clientRole: true
clientId: ${SSO_CLIENT_ID}
- assignRoleToGroup:
group: allBasisdatenAuthorities
role: Basisdaten_WRITE_Wahlbezirk
clientId: ${SSO_CLIENT_ID}
- addRole:
name: Basisdaten_DELETE_Wahlbezirk
clientRole: true
clientId: ${SSO_CLIENT_ID}
- assignRoleToGroup:
group: allBasisdatenAuthorities
role: Basisdaten_DELETE_Wahlbezirk
clientId: ${SSO_CLIENT_ID}
1 change: 1 addition & 0 deletions stack/keycloak/migration/keycloak-changelog.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,3 +39,4 @@ includes:
- path: add-authorities-basisdaten-referendumvorlagen.yml
- path: add-authorities-basisdaten-wahlen.yml
- path: add-authorities-basisdaten-kopfdaten.yml
- path: add-authorities-basisdaten-wahlbezirke.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,14 @@
import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.KonfigurierterWahltagClient;
import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.KonfigurierterWahltagModel;
import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.StimmzettelgebietModel;
import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.WahlbezirkModel;
import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.WahldatenClient;
import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.referendumvorlagen.ReferendumoptionModel;
import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.referendumvorlagen.ReferendumvorlageModel;
import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.referendumvorlagen.ReferendumvorlagenClient;
import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.referendumvorlagen.ReferendumvorlagenModel;
import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.referendumvorlagen.ReferendumvorlagenReferenceModel;
import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlbezirke.WahlbezirkModel;
import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlbezirke.WahlbezirkeClient;
import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlen.WahlModel;
import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlen.WahlenClient;
import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahltag.WahltagModel;
Expand All @@ -41,7 +42,8 @@
@Component
@Profile(Profiles.DUMMY_CLIENTS)
public class DummyClientImpl
implements WahlvorschlaegeClient, WahltageClient, ReferendumvorlagenClient, WahlenClient, KonfigurierterWahltagClient, WahldatenClient {
implements WahlvorschlaegeClient, WahltageClient, ReferendumvorlagenClient, WahlenClient, KonfigurierterWahltagClient, WahldatenClient,
WahlbezirkeClient {

@Override
public WahlvorschlaegeModel getWahlvorschlaege(BezirkUndWahlID bezirkUndWahlID) {
Expand Down Expand Up @@ -107,4 +109,14 @@ public BasisdatenModel loadBasisdaten(LocalDate forDate, String wahlterminNummer
new StimmzettelgebietModel("szgID", "120", "Munich", forDate, StimmzettelgebietsartModel.SG),
new StimmzettelgebietModel("szgIDOther", "920", "Munich Center", forDate, StimmzettelgebietsartModel.SB)));
}

@Override
public Set<WahlbezirkModel> loadWahlbezirke(LocalDate forDate, String withNummer) throws WlsException {
return Set.of(
new WahlbezirkModel("wahlbezirkID1_1", WahlbezirkArtModel.UWB, "1201", forDate, "0", "wahlID1"),
new WahlbezirkModel("wahlbezirkID1_2", WahlbezirkArtModel.BWB, "1251", forDate, "0", "wahlID1"),
new WahlbezirkModel("wahlbezirkID2_1", WahlbezirkArtModel.UWB, "1202", forDate, "0", "wahlID1"),
new WahlbezirkModel("wahlbezirkID2_2", WahlbezirkArtModel.BWB, "1252", forDate, "0", "wahlID1"),
new WahlbezirkModel("wahlbezirkID2_2", WahlbezirkArtModel.BWB, "1252", forDate, "1", "wahlID2"));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package de.muenchen.oss.wahllokalsystem.basisdatenservice.clients;

import de.muenchen.oss.wahllokalsystem.basisdatenservice.configuration.Profiles;
import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.client.WahldatenControllerApi;
import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.WahlbezirkDTO;
import de.muenchen.oss.wahllokalsystem.basisdatenservice.exception.ExceptionConstants;
import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlbezirke.WahlbezirkModel;
import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlbezirke.WahlbezirkeClient;
import de.muenchen.oss.wahllokalsystem.wls.common.exception.WlsException;
import de.muenchen.oss.wahllokalsystem.wls.common.exception.util.ExceptionFactory;
import java.time.LocalDate;
import java.util.Set;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;

@Component
@Profile(Profiles.NOT + Profiles.DUMMY_CLIENTS)
@RequiredArgsConstructor
@Slf4j
public class WahlbezirkeClientImpl implements WahlbezirkeClient {

private final ExceptionFactory exceptionFactory;
private final WahldatenControllerApi wahldatenControllerApi;
private final WahlbezirkeClientMapper wahlbezirkeClientMapper;

@Override
public Set<WahlbezirkModel> loadWahlbezirke(LocalDate forDate, String wahltagNummer) throws WlsException {
final Set<WahlbezirkDTO> wahlbezirkDTOS;
try {
wahlbezirkDTOS = wahldatenControllerApi.loadWahlbezirke(forDate, wahltagNummer);
} catch (final Exception exception) {
log.info("exception on loadWahlbezirke from external", exception);
throw exceptionFactory.createTechnischeWlsException(ExceptionConstants.FAILED_COMMUNICATION_WITH_EAI);
}
if (wahlbezirkDTOS == null) {
throw exceptionFactory.createFachlicheWlsException(ExceptionConstants.NULL_FROM_CLIENT);
}
return wahlbezirkeClientMapper.fromRemoteSetOfDTOsToSetOfModels(wahlbezirkDTOS);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package de.muenchen.oss.wahllokalsystem.basisdatenservice.clients;

import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.WahlbezirkDTO;
import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlbezirke.WahlbezirkModel;
import java.util.Set;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;

@Mapper
public interface WahlbezirkeClientMapper {

@Mapping(source = "identifikator", target = "wahlbezirkID")
@Mapping(source = "wahlbezirkArt", target = "wahlbezirkart")
WahlbezirkModel fromClientDTOToModel(WahlbezirkDTO clientDTO);

Set<WahlbezirkModel> fromRemoteSetOfDTOsToSetOfModels(Set<WahlbezirkDTO> wahlbezirkDTOs);

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

import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.BasisdatenDTO;
import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.WahlDTO;
import de.muenchen.oss.wahllokalsystem.basisdatenservice.eai.aou.model.WahlbezirkDTO;
import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten.BasisdatenModel;
import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlbezirke.WahlbezirkModel;
import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlen.WahlModel;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
Expand All @@ -15,4 +17,8 @@ public interface WahldatenClientMapper {
default WahlModel wahlDTOToWahlModel(WahlDTO wahlDTO) {
return Mappers.getMapper(WahlenClientMapper.class).toModel(wahlDTO);
}

default WahlbezirkModel walbezirkDTOToWahlbezirkModel(WahlbezirkDTO wahlbezirkDTO) {
return Mappers.getMapper(WahlbezirkeClientMapper.class).fromClientDTOToModel(wahlbezirkDTO);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package de.muenchen.oss.wahllokalsystem.basisdatenservice.domain;

import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.Id;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import java.time.LocalDate;
import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;

@Entity
@Getter
@Setter
@EqualsAndHashCode
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Wahlbezirk {

@Id
@NotNull
@Size(max = 1024)
private String wahlbezirkID;

@NotNull
private LocalDate wahltag;

@NotNull
@Size(max = 255)
private String nummer;

@Enumerated(EnumType.STRING)
@NotNull
private WahlbezirkArt wahlbezirkart;

@NotNull
@Size(max = 255)
private String wahlnummer;

@NotNull
@Size(max = 255)
private String wahlID;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package de.muenchen.oss.wahllokalsystem.basisdatenservice.domain;

import java.time.LocalDate;
import java.util.List;
import java.util.Optional;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.repository.CrudRepository;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.transaction.annotation.Transactional;

@PreAuthorize("hasAuthority('Basisdaten_READ_Wahlbezirk')")
@Transactional
public interface WahlbezirkRepository extends CrudRepository<Wahlbezirk, String> {

String CACHE = "WAHLBEZIRK_CACHE";

@PreAuthorize("hasAuthority('Basisdaten_DELETE_Wahlbezirk')")
void deleteByWahltag(LocalDate wahltag);

int countByWahltag(LocalDate wahltag);

List<Wahlbezirk> findByWahltag(LocalDate wahltag);

@Override
List<Wahlbezirk> findAll();

@Override
@Cacheable(value = CACHE, key = "#p0")
Optional<Wahlbezirk> findById(String wahlbezirkID);

@Override
@CachePut(value = CACHE, key = "#p0.wahlbezirkID")
@PreAuthorize("hasAuthority('Basisdaten_WRITE_Wahlbezirk')")
<S extends Wahlbezirk> S save(S entity);

@Override
@PreAuthorize("hasAuthority('Basisdaten_WRITE_Wahlbezirk')")
<S extends Wahlbezirk> Iterable<S> saveAll(Iterable<S> entities);

@Override
@CacheEvict(value = CACHE, key = "#p0")
@PreAuthorize("hasAuthority('Basisdaten_DELETE_Wahlbezirk')")
void deleteById(String wahlbezirkID);

@Override
@CacheEvict(value = CACHE, key = "#p0.wahlbezirkID")
@PreAuthorize("hasAuthority('Basisdaten_DELETE_Wahlbezirk')")
void delete(Wahlbezirk entity);

@Override
@CacheEvict(value = CACHE, allEntries = true)
@PreAuthorize("hasAuthority('Basisdaten_DELETE_Wahlbezirk')")
void deleteAll(Iterable<? extends Wahlbezirk> entities);

@Override
@CacheEvict(value = CACHE, allEntries = true)
@PreAuthorize("hasAuthority('Basisdaten_DELETE_Wahlbezirk')")
void deleteAll();
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ public class ExceptionConstants {
private static final String CODE_UNSAVEABLE = "903";
private static final String MSG_UNSAVEABLE = "Fehler beim speichern: Daten konnten nicht gespeichert werden.";

private static final String CODE_NO_DATA_WAHLBEZIRK = "402";

public static ExceptionDataWrapper SUCHKRITERIEN_UNVOLLSTAENDIG = new ExceptionDataWrapper(CODE_SUCHKRITERIEN_UNVOLLSTAENDIG,
MSG_SUCHKRITERIEN_UNVOLLSTAENDIG);

Expand Down Expand Up @@ -58,8 +60,11 @@ public class ExceptionConstants {
"postWahlen: Suchkriterien unvollständig. Die wahltagID ist leer oder null.");
public static ExceptionDataWrapper CODE_POSTWAHLEN_UNSAVEABLE = new ExceptionDataWrapper("318",
"postWahlen: Die Wahlen konnten nicht gespeichert werden.");

public static ExceptionDataWrapper CODE_GETWAHLBEZIRKE_PARAMETER_UNVOLLSTAENDIG = new ExceptionDataWrapper("312",
"getWahlbezirke: Suchkriterien unvollständig. Die wahltagID ist leer oder null.");
public static ExceptionDataWrapper CODE_GETWAHLBEZIRKE_NO_WAHLTAG = new ExceptionDataWrapper("313",
"getWahlen: Es wurde kein Wahltag zu dieser WahltagID gefunden. Bitte legen Sie die Basisdaten an.");
"Es wurde kein Wahltag zu dieser WahltagID gefunden. Bitte legen Sie die Basisdaten an.");

public static final ExceptionDataWrapper GETKOPFDATEN_PARAMETER_UNVOLLSTAENDIG = new ExceptionDataWrapper("303",
"getKopfdaten: Suchkriterien unvollständig.");
Expand All @@ -71,5 +76,7 @@ public class ExceptionConstants {
public static final ExceptionDataWrapper INITIALIZE_KOPFDATEN_NO_WAHL_WAHLBEZIRK_STIMMZETTELGEBIET = new ExceptionDataWrapper("321",
"initializeKopfdaten: Die vorhandenen Daten führen zu keinem richtigen Ergebnis, bitte überprüfen Sie die IVU Konfiguration");
public static final ExceptionDataWrapper INITIALIZE_KOPFDATEN_BASISDATEN_DATA_INCONSISTENTCY = new ExceptionDataWrapper("323",
"BasisdatenValidierung: Es gab Inkonsistenzen in den Bestandteilen der Basisdaten. Basisstrukturdaten, Wahlen, Wahlbezirke, Stimmzettelgebiete konnten nicht eindeutig einander zugeordnet werden.");
"BasisdatenValidierung: Es gab Inkonsistenzen in den Bestandteilen der Basisdaten. Basisstrukturdaten, Wahlen, Wahlbezirke, Stimmzettelgebiete konnten nicht eindeutig einander zugeordnetwerden.");
public static final ExceptionDataWrapper GETWAHLBEZIRKE_NO_DATA = new ExceptionDataWrapper(CODE_NO_DATA_WAHLBEZIRK,
"Es wurden keine Wahlbezirke gefunden.");
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package de.muenchen.oss.wahllokalsystem.basisdatenservice.rest.wahlbezirke;

import jakarta.validation.constraints.NotNull;
import java.time.LocalDate;
import lombok.Builder;

@Builder
public record WahlbezirkDTO(@NotNull String wahlbezirkID,
@NotNull LocalDate wahltag,
@NotNull String nummer,
@NotNull WahlbezirkartDTO wahlbezirkart,
@NotNull String wahlnummer,
@NotNull String wahlID) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package de.muenchen.oss.wahllokalsystem.basisdatenservice.rest.wahlbezirke;

import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlbezirke.WahlbezirkModel;
import java.util.List;
import org.mapstruct.Mapper;

@Mapper
public interface WahlbezirkDTOMapper {
List<WahlbezirkDTO> fromListOfWahlbezirkModelToListOfWahlbezirkDTO(List<WahlbezirkModel> wahlbezirkModelList);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package de.muenchen.oss.wahllokalsystem.basisdatenservice.rest.wahlbezirke;

public enum WahlbezirkartDTO {
UWB, BWB
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package de.muenchen.oss.wahllokalsystem.basisdatenservice.rest.wahlbezirke;

import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlbezirke.WahlbezirkeService;
import io.swagger.v3.oas.annotations.Operation;
import java.util.List;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/businessActions/wahlbezirke")
@RequiredArgsConstructor
@Slf4j
public class WahlbezirkeController {

private final WahlbezirkeService wahlbezirkeService;
private final WahlbezirkDTOMapper wahlbezirkDTOMapper;

@Operation(description = "Laden der Liste der Wahlbezirke, die einem vorgegebenen Wahltag (Parameter wahltagID) entsprechen.")
@GetMapping("/{wahltagID}")
public List<WahlbezirkDTO> getWahlbezirke(@PathVariable("wahltagID") final String wahltagID) {
return wahlbezirkDTOMapper.fromListOfWahlbezirkModelToListOfWahlbezirkDTO(wahlbezirkeService.getWahlbezirke(wahltagID));
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package de.muenchen.oss.wahllokalsystem.basisdatenservice.services.kopfdaten;

import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlbezirke.WahlbezirkModel;
import de.muenchen.oss.wahllokalsystem.basisdatenservice.services.wahlen.WahlModel;
import jakarta.validation.constraints.NotNull;
import java.util.Set;
Expand Down
Loading

0 comments on commit 743c454

Please sign in to comment.