Skip to content

Commit

Permalink
Remove link between Announcements and Releases
Browse files Browse the repository at this point in the history
RISDEV-0000
  • Loading branch information
malte-laukoetter committed Feb 25, 2025
1 parent f4d124c commit eda5eeb
Show file tree
Hide file tree
Showing 19 changed files with 382 additions and 342 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,13 @@
import de.bund.digitalservice.ris.norms.adapter.input.restapi.schema.ReleaseResponseSchema;
import de.bund.digitalservice.ris.norms.application.port.input.CreateAnnouncementUseCase;
import de.bund.digitalservice.ris.norms.application.port.input.LoadAllAnnouncementsUseCase;
import de.bund.digitalservice.ris.norms.application.port.input.LoadAnnouncementByNormEliUseCase;
import de.bund.digitalservice.ris.norms.application.port.input.LoadNormUseCase;
import de.bund.digitalservice.ris.norms.application.port.input.ReleaseAnnouncementUseCase;
import de.bund.digitalservice.ris.norms.application.port.input.LoadReleasesByNormExpressionEliUseCase;
import de.bund.digitalservice.ris.norms.application.port.input.ReleaseNormExpressionUseCase;
import de.bund.digitalservice.ris.norms.domain.entity.Announcement;
import de.bund.digitalservice.ris.norms.domain.entity.Norm;
import de.bund.digitalservice.ris.norms.domain.entity.Release;
import de.bund.digitalservice.ris.norms.domain.entity.eli.NormExpressionEli;
import java.io.IOException;
import java.util.Comparator;
import java.util.List;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
Expand All @@ -32,21 +30,21 @@
public class AnnouncementController {

private final LoadAllAnnouncementsUseCase loadAllAnnouncementsUseCase;
private final LoadAnnouncementByNormEliUseCase loadAnnouncementByNormEliUseCase;
private final ReleaseAnnouncementUseCase releaseAnnouncementUseCase;
private final LoadReleasesByNormExpressionEliUseCase loadReleasesByNormExpressionEliUseCase;
private final ReleaseNormExpressionUseCase releaseNormExpressionUseCase;
private final CreateAnnouncementUseCase createAnnouncementUseCase;
private final LoadNormUseCase loadNormUseCase;

public AnnouncementController(
LoadAllAnnouncementsUseCase loadAllAnnouncementsUseCase,
LoadAnnouncementByNormEliUseCase loadAnnouncementByNormEliUseCase,
ReleaseAnnouncementUseCase releaseAnnouncementUseCase,
LoadReleasesByNormExpressionEliUseCase loadReleasesByNormExpressionEliUseCase,
ReleaseNormExpressionUseCase releaseNormExpressionUseCase,
CreateAnnouncementUseCase createAnnouncementUseCase,
LoadNormUseCase loadNormUseCase
) {
this.loadAllAnnouncementsUseCase = loadAllAnnouncementsUseCase;
this.loadAnnouncementByNormEliUseCase = loadAnnouncementByNormEliUseCase;
this.releaseAnnouncementUseCase = releaseAnnouncementUseCase;
this.loadReleasesByNormExpressionEliUseCase = loadReleasesByNormExpressionEliUseCase;
this.releaseNormExpressionUseCase = releaseNormExpressionUseCase;
this.createAnnouncementUseCase = createAnnouncementUseCase;
this.loadNormUseCase = loadNormUseCase;
}
Expand Down Expand Up @@ -86,13 +84,11 @@ public ResponseEntity<List<NormResponseSchema>> getAllAnnouncements() {
produces = { APPLICATION_JSON_VALUE }
)
public ResponseEntity<List<ReleaseResponseSchema>> getReleases(final NormExpressionEli eli) {
var announcement = loadAnnouncementByNormEliUseCase.loadAnnouncementByNormEli(
new LoadAnnouncementByNormEliUseCase.Query(eli)
var releases = loadReleasesByNormExpressionEliUseCase.loadReleasesByNormExpressionEli(
new LoadReleasesByNormExpressionEliUseCase.Query(eli)
);

return ResponseEntity.ok(
announcement.getReleases().stream().map(ReleaseResponseMapper::fromRelease).toList()
);
return ResponseEntity.ok(releases.stream().map(ReleaseResponseMapper::fromRelease).toList());
}

/**
Expand All @@ -109,16 +105,10 @@ public ResponseEntity<List<ReleaseResponseSchema>> getReleases(final NormExpress
produces = { APPLICATION_JSON_VALUE }
)
public ResponseEntity<ReleaseResponseSchema> postReleases(final NormExpressionEli eli) {
var announcement = releaseAnnouncementUseCase.releaseAnnouncement(
new ReleaseAnnouncementUseCase.Query(eli)
var release = releaseNormExpressionUseCase.releaseNormExpression(
new ReleaseNormExpressionUseCase.Query(eli)
);
var latestRelease = announcement
.getReleases()
.stream()
.max(Comparator.comparing(Release::getReleasedAt))
.orElseThrow();

return ResponseEntity.ok(ReleaseResponseMapper.fromRelease(latestRelease));
return ResponseEntity.ok(ReleaseResponseMapper.fromRelease(release));
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,9 @@

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.JoinTable;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import lombok.AllArgsConstructor;
import lombok.Builder;
Expand All @@ -37,13 +31,4 @@ public class AnnouncementDto {

@Column(name = "eli_norm_expression")
private String eliNormExpression;

@OneToMany(fetch = FetchType.EAGER)
@JoinTable(
name = "announcement_releases",
joinColumns = @JoinColumn(name = "announcement_id"),
inverseJoinColumns = @JoinColumn(name = "release_id")
)
@Builder.Default
private List<ReleaseDto> releases = new ArrayList<>();
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@
import de.bund.digitalservice.ris.norms.adapter.output.database.dto.AnnouncementDto;
import de.bund.digitalservice.ris.norms.domain.entity.Announcement;
import de.bund.digitalservice.ris.norms.domain.entity.eli.NormExpressionEli;
import java.util.ArrayList;
import java.util.stream.Collectors;

/** Mapper class for converting between {@link AnnouncementDto} and {@link Announcement}. */
public class AnnouncementMapper {
Expand All @@ -22,13 +20,6 @@ public static Announcement mapToDomain(final AnnouncementDto announcementDto) {
return Announcement
.builder()
.eli(NormExpressionEli.fromString(announcementDto.getEliNormExpression()))
.releases(
announcementDto
.getReleases()
.stream()
.map(ReleaseMapper::mapToDomain)
.collect(Collectors.toCollection(ArrayList::new))
)
.build();
}

Expand All @@ -39,10 +30,6 @@ public static Announcement mapToDomain(final AnnouncementDto announcementDto) {
* @return A new {@link AnnouncementDto} mapped from the input {@link Announcement}.
*/
public static AnnouncementDto mapToDto(final Announcement announcement) {
return AnnouncementDto
.builder()
.eliNormExpression(announcement.getEli().toString())
.releases(announcement.getReleases().stream().map(ReleaseMapper::mapToDto).toList())
.build();
return AnnouncementDto.builder().eliNormExpression(announcement.getEli().toString()).build();
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
package de.bund.digitalservice.ris.norms.adapter.output.database.repository;

import de.bund.digitalservice.ris.norms.adapter.output.database.dto.ReleaseDto;
import java.util.List;
import java.util.UUID;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

/**
Expand All @@ -11,4 +14,11 @@
* ReleaseDto}.
*/
@Repository
public interface ReleaseRepository extends JpaRepository<ReleaseDto, UUID> {}
public interface ReleaseRepository extends JpaRepository<ReleaseDto, UUID> {
@Query(
"SELECT r from ReleaseDto r WHERE elements(r.norms) = ANY (SELECT n from NormManifestationDto n where n.expressionEli = :normExpressionEli)"
)
List<ReleaseDto> findAllByNormExpressionEli(
@Param("normExpressionEli") final String normExpressionEli
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -47,13 +47,14 @@ public class DBService
UpdateOrSaveAnnouncementPort,
DeleteAnnouncementByNormEliPort,
DeleteNormPort,
SaveReleaseToAnnouncementPort,
SaveReleasePort,
DeleteQueuedReleasesPort,
LoadNormManifestationElisByPublishStatePort,
LoadLastMigrationLogPort,
LoadRegelungstextPort,
LoadDokumentPort,
UpdateDokumentPort {
UpdateDokumentPort,
LoadReleasesByNormExpressionEliPort {

private final AnnouncementRepository announcementRepository;
private final DokumentRepository dokumentRepository;
Expand Down Expand Up @@ -222,9 +223,7 @@ public Announcement updateOrSaveAnnouncement(UpdateOrSaveAnnouncementPort.Comman
@Override
@Transactional
public void deleteAnnouncementByNormEli(DeleteAnnouncementByNormEliPort.Command command) {
var announcementDto = announcementRepository.findByEliNormExpression(command.eli().toString());
announcementRepository.deleteByEliNormExpression(command.eli().toString());
announcementDto.ifPresent(dto -> releaseRepository.deleteAll(dto.getReleases()));
}

@Override
Expand All @@ -245,7 +244,7 @@ public void deleteNorm(DeleteNormPort.Command command) {
}

@Override
public Release saveReleaseToAnnouncement(SaveReleaseToAnnouncementPort.Command command) {
public Release saveRelease(SaveReleasePort.Command command) {
final ReleaseDto releaseDto = ReleaseMapper.mapToDto(command.release());

command
Expand All @@ -258,28 +257,14 @@ public Release saveReleaseToAnnouncement(SaveReleaseToAnnouncementPort.Command c
);

var release = releaseRepository.save(releaseDto);

announcementRepository
.findByEliNormExpression(command.announcement().getEli().toString())
.ifPresent(announcementDto -> {
announcementDto.getReleases().add(release);
announcementRepository.save(announcementDto);
});

return ReleaseMapper.mapToDomain(release);
}

@Override
public List<Release> deleteQueuedReleases(DeleteQueuedReleasesPort.Command command) {
var announcementDto = announcementRepository.findByEliNormExpression(command.eli().toString());
var releases = releaseRepository.findAllByNormExpressionEli(command.eli().toString());

if (announcementDto.isEmpty()) {
return List.of();
}

var queuedReleaseDtos = announcementDto
.get()
.getReleases()
var queuedReleaseDtos = releases
.stream()
.filter(releaseDto ->
releaseDto
Expand All @@ -290,9 +275,6 @@ public List<Release> deleteQueuedReleases(DeleteQueuedReleasesPort.Command comma
)
.toList();

queuedReleaseDtos.forEach(releaseDto -> announcementDto.get().getReleases().remove(releaseDto));
announcementRepository.save(announcementDto.get());

releaseRepository.deleteAll(queuedReleaseDtos);

return queuedReleaseDtos.stream().map(ReleaseMapper::mapToDomain).toList();
Expand Down Expand Up @@ -357,4 +339,15 @@ public Optional<Dokument> updateDokument(UpdateDokumentPort.Command command) {
return Optional.of(DokumentMapper.mapToDomain(dokumentRepository.saveAndFlush(dokumentDto)));
}
}

@Override
public List<Release> loadReleasesByNormExpressionEli(
LoadReleasesByNormExpressionEliPort.Command command
) {
return releaseRepository
.findAllByNormExpressionEli(command.eli().toString())
.stream()
.map(ReleaseMapper::mapToDomain)
.toList();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package de.bund.digitalservice.ris.norms.application.port.input;

import de.bund.digitalservice.ris.norms.domain.entity.Release;
import de.bund.digitalservice.ris.norms.domain.entity.eli.NormExpressionEli;
import java.util.List;

/**
* Interface representing the use case for loading {@link Release}s of a specific norm expression.
*/
public interface LoadReleasesByNormExpressionEliUseCase {
/**
* Loads all {@link Release}s associated with the norm expression.
*
* @param query Query for loading the releases
* @return A {@link List} of {@link Release} objects, which may be empty if no {@link
* Release}s are found.
*/
List<Release> loadReleasesByNormExpressionEli(Query query);

/**
* A record representing the query for loading {@link Release}s of a specific norm expression.
*
* @param eli The ELI (European Legislation Identifier) used to identify the norm expression.
*/
record Query(NormExpressionEli eli) {}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package de.bund.digitalservice.ris.norms.application.port.input;

import de.bund.digitalservice.ris.norms.domain.entity.Norm;
import de.bund.digitalservice.ris.norms.domain.entity.Release;
import de.bund.digitalservice.ris.norms.domain.entity.eli.NormExpressionEli;

/**
* Interface representing the use case for releasing a new expression of a {@link Norm}.
*/
public interface ReleaseNormExpressionUseCase {
/**
* Releases a new expression of a {@link Norm} based on the provided query.
*
* @param query The query specifying the {@link Norm} to be released.
* @return The created {@link Release}.
*/
Release releaseNormExpression(Query query);

/**
* A record representing the query for releasing a new expression of a {@link Norm}. The query includes the
* ELI (European Legislation Identifier) to identify the {@link Norm}.
*
* @param eli The ELI (European Legislation Identifier) used to identify the {@link Norm}.
*/
record Query(NormExpressionEli eli) {}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package de.bund.digitalservice.ris.norms.application.port.output;

import de.bund.digitalservice.ris.norms.domain.entity.Release;
import de.bund.digitalservice.ris.norms.domain.entity.eli.NormExpressionEli;
import java.util.List;

/**
* Interface representing a port for loading {@link Release}s of a specific norm expression.
*/
public interface LoadReleasesByNormExpressionEliPort {
/**
* Loads {@link Release}s of a specific norm expression.
*
* @param command The command specifying the ELI to identify the norm.
* @return A {@link List} of {@link Release}s, which may be empty if no {@link Release} is found.
*/
List<Release> loadReleasesByNormExpressionEli(final Command command);

/**
* A record representing the command for loading releases of a norm.
*
* @param eli The ELI (European Legislation Identifier) used to identify the norm in the command.
*/
record Command(NormExpressionEli eli) {}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package de.bund.digitalservice.ris.norms.application.port.output;

import de.bund.digitalservice.ris.norms.domain.entity.Release;

/**
* Interface representing a port for saving a {@link Release}.
*/
public interface SaveReleasePort {
/**
* Saves a {@link Release}.
*
* @param command The command specifying the release.
* @return the {@link Release}.
*/
Release saveRelease(final Command command);

/**
* A record representing the command for saving a release.
*
* @param release The release to be saved to the announcement
*/
record Command(Release release) {}
}
Loading

0 comments on commit eda5eeb

Please sign in to comment.