From d873d19a8cc93130cb9a8307fffe73cdeece7d2a Mon Sep 17 00:00:00 2001 From: Andreas Dinauer Date: Sun, 3 May 2026 10:11:59 +0200 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Add=20DTOs=20and=20mappers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dev/dinauer/maven/app/ArtifactDTO.java | 9 ++++ .../dev/dinauer/maven/app/ArtifactMapper.java | 45 +++++++++++++++++++ .../dinauer/maven/app/ArtifactResource.java | 18 +++----- .../java/dev/dinauer/maven/app/GroupDTO.java | 7 +++ .../dev/dinauer/maven/app/GroupMapper.java | 34 ++++++++++++++ .../dev/dinauer/maven/app/GroupResource.java | 7 ++- .../java/dev/dinauer/maven/app/JarDTO.java | 5 +++ .../java/dev/dinauer/maven/app/JarMapper.java | 20 +++++++++ .../java/dev/dinauer/maven/app/PomDTO.java | 5 +++ .../java/dev/dinauer/maven/app/PomMapper.java | 13 ++++++ .../dinauer/maven/app/ReleaseVersionDTO.java | 35 +++++++++++++++ .../maven/app/ResponseEnhancementService.java | 5 +-- .../dinauer/maven/app/SnapshotVersionDTO.java | 11 +++++ .../dev/dinauer/maven/app/VersionDTO.java | 30 +++++++++++++ .../dev/dinauer/maven/app/VersionMapper.java | 39 ++++++++++++++++ .../java/dev/dinauer/maven/event/Event.java | 5 ++- .../dinauer/maven/event/EventsResource.java | 3 +- .../dinauer/maven/maven/core/ArtifactId.java | 15 ++----- .../dev/dinauer/maven/maven/core/GroupId.java | 11 ++++- .../dev/dinauer/maven/maven/core/Version.java | 4 +- .../maven/core/release/ReleaseVersion.java | 5 ++- .../maven/core/snapshot/SnapshotVersion.java | 8 ++++ .../dinauer/maven/shared/UserReferencing.java | 11 ++++- 23 files changed, 307 insertions(+), 38 deletions(-) create mode 100644 src/main/java/dev/dinauer/maven/app/ArtifactDTO.java create mode 100644 src/main/java/dev/dinauer/maven/app/ArtifactMapper.java create mode 100644 src/main/java/dev/dinauer/maven/app/GroupDTO.java create mode 100644 src/main/java/dev/dinauer/maven/app/GroupMapper.java create mode 100644 src/main/java/dev/dinauer/maven/app/JarDTO.java create mode 100644 src/main/java/dev/dinauer/maven/app/JarMapper.java create mode 100644 src/main/java/dev/dinauer/maven/app/PomDTO.java create mode 100644 src/main/java/dev/dinauer/maven/app/PomMapper.java create mode 100644 src/main/java/dev/dinauer/maven/app/ReleaseVersionDTO.java create mode 100644 src/main/java/dev/dinauer/maven/app/SnapshotVersionDTO.java create mode 100644 src/main/java/dev/dinauer/maven/app/VersionDTO.java create mode 100644 src/main/java/dev/dinauer/maven/app/VersionMapper.java diff --git a/src/main/java/dev/dinauer/maven/app/ArtifactDTO.java b/src/main/java/dev/dinauer/maven/app/ArtifactDTO.java new file mode 100644 index 0000000..c41c1d7 --- /dev/null +++ b/src/main/java/dev/dinauer/maven/app/ArtifactDTO.java @@ -0,0 +1,9 @@ +package dev.dinauer.maven.app; + +import dev.dinauer.maven.user.User; + +import java.util.List; + +public record ArtifactDTO(String id, String groupId, String artifactId, List versions) +{ +} \ No newline at end of file diff --git a/src/main/java/dev/dinauer/maven/app/ArtifactMapper.java b/src/main/java/dev/dinauer/maven/app/ArtifactMapper.java new file mode 100644 index 0000000..fe0e9f4 --- /dev/null +++ b/src/main/java/dev/dinauer/maven/app/ArtifactMapper.java @@ -0,0 +1,45 @@ +package dev.dinauer.maven.app; + +import dev.dinauer.maven.maven.core.ArtifactId; +import dev.dinauer.maven.maven.core.GroupId; +import dev.dinauer.maven.shared.UserReferencing; +import dev.dinauer.maven.user.User; +import dev.dinauer.maven.user.UserClient; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import org.eclipse.microprofile.rest.client.inject.RestClient; + +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +@ApplicationScoped +public class ArtifactMapper +{ + @Inject + VersionMapper versionMapper; + + @RestClient + UserClient userClient; + + public List map(List input) + { + return input.stream().map(artifact -> this.map(artifact, userClient.get(UserReferencing.collect(input)))).toList(); + } + + public List map(List input, Map users) + { + return input.stream().map(artifact -> this.map(artifact, users)).toList(); + } + + public ArtifactDTO map(ArtifactId input) + { + return map(input, userClient.get(input.getUserIds())); + } + + public ArtifactDTO map(ArtifactId input, Map users) + { + return new ArtifactDTO(input.getId(), input.getGroup().getGroupId(), input.getArtifactId(), versionMapper.map(input.getVersions(), users)); + } +} \ No newline at end of file diff --git a/src/main/java/dev/dinauer/maven/app/ArtifactResource.java b/src/main/java/dev/dinauer/maven/app/ArtifactResource.java index c873a6b..3725e52 100644 --- a/src/main/java/dev/dinauer/maven/app/ArtifactResource.java +++ b/src/main/java/dev/dinauer/maven/app/ArtifactResource.java @@ -23,23 +23,20 @@ public class ArtifactResource @Inject ArtifactRepo artifactRepo; - @RestClient - UserClient userClient; - @Inject - ResponseEnhancementService responseEnhancementService; + ArtifactMapper artifactMapper; @GET - public EnhancedResponse get() + public List get() { - return find(); + return artifactMapper.map(artifactRepo.listAll()); } @GET @Path("/{id}") - public ArtifactId getById(@PathParam("id") String id) + public ArtifactDTO getById(@PathParam("id") String id) { - return artifactRepo.findById(id); + return artifactMapper.map(artifactRepo.findById(id)); } @DELETE @@ -49,9 +46,4 @@ public class ArtifactResource { artifactRepo.deleteById(id); } - - private EnhancedResponse find() - { - return responseEnhancementService.enhance(artifactRepo.listAll()); - } } diff --git a/src/main/java/dev/dinauer/maven/app/GroupDTO.java b/src/main/java/dev/dinauer/maven/app/GroupDTO.java new file mode 100644 index 0000000..25444cd --- /dev/null +++ b/src/main/java/dev/dinauer/maven/app/GroupDTO.java @@ -0,0 +1,7 @@ +package dev.dinauer.maven.app; + +import java.util.List; + +public record GroupDTO(String id, String groupId, List artifacts) +{ +} \ No newline at end of file diff --git a/src/main/java/dev/dinauer/maven/app/GroupMapper.java b/src/main/java/dev/dinauer/maven/app/GroupMapper.java new file mode 100644 index 0000000..682507f --- /dev/null +++ b/src/main/java/dev/dinauer/maven/app/GroupMapper.java @@ -0,0 +1,34 @@ +package dev.dinauer.maven.app; + +import dev.dinauer.maven.maven.core.GroupId; +import dev.dinauer.maven.shared.UserReferencing; +import dev.dinauer.maven.user.User; +import dev.dinauer.maven.user.UserClient; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import org.eclipse.microprofile.rest.client.inject.RestClient; + +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +@ApplicationScoped +public class GroupMapper +{ + @Inject + ArtifactMapper artifactMapper; + + @RestClient + UserClient userClient; + + public List map(List input) + { + return input.stream().map(group -> this.map(group, userClient.get(UserReferencing.collect(input)))).toList(); + } + + public GroupDTO map(GroupId input, Map users) + { + return new GroupDTO(input.getId(), input.getGroupId(), artifactMapper.map(input.getArtifacts(), users)); + } +} diff --git a/src/main/java/dev/dinauer/maven/app/GroupResource.java b/src/main/java/dev/dinauer/maven/app/GroupResource.java index ca338ce..3bc6056 100644 --- a/src/main/java/dev/dinauer/maven/app/GroupResource.java +++ b/src/main/java/dev/dinauer/maven/app/GroupResource.java @@ -29,10 +29,13 @@ public class GroupResource @Inject SecurityIdentity securityIdentity; + @Inject + GroupMapper groupMapper; + @GET - public List get() + public List get() { - return groupRepo.listAll(); + return groupMapper.map(groupRepo.listAll()); } @GET diff --git a/src/main/java/dev/dinauer/maven/app/JarDTO.java b/src/main/java/dev/dinauer/maven/app/JarDTO.java new file mode 100644 index 0000000..aa2e0e8 --- /dev/null +++ b/src/main/java/dev/dinauer/maven/app/JarDTO.java @@ -0,0 +1,5 @@ +package dev.dinauer.maven.app; + +public record JarDTO(String filename, String classifier, String md5, String sha1) +{ +} diff --git a/src/main/java/dev/dinauer/maven/app/JarMapper.java b/src/main/java/dev/dinauer/maven/app/JarMapper.java new file mode 100644 index 0000000..4778fc5 --- /dev/null +++ b/src/main/java/dev/dinauer/maven/app/JarMapper.java @@ -0,0 +1,20 @@ +package dev.dinauer.maven.app; + +import dev.dinauer.maven.maven.core.release.ReleaseJar; +import jakarta.enterprise.context.ApplicationScoped; + +import java.util.List; + +@ApplicationScoped +public class JarMapper +{ + public List map(List input) + { + return input.stream().map(this::map).toList(); + } + + public JarDTO map(ReleaseJar input) + { + return new JarDTO(input.getFilename(), input.getClassifier(), input.getMd5(), input.getSha1()); + } +} diff --git a/src/main/java/dev/dinauer/maven/app/PomDTO.java b/src/main/java/dev/dinauer/maven/app/PomDTO.java new file mode 100644 index 0000000..add9f8b --- /dev/null +++ b/src/main/java/dev/dinauer/maven/app/PomDTO.java @@ -0,0 +1,5 @@ +package dev.dinauer.maven.app; + +public record PomDTO(String filename, String md5, String sha1) +{ +} diff --git a/src/main/java/dev/dinauer/maven/app/PomMapper.java b/src/main/java/dev/dinauer/maven/app/PomMapper.java new file mode 100644 index 0000000..adf31bc --- /dev/null +++ b/src/main/java/dev/dinauer/maven/app/PomMapper.java @@ -0,0 +1,13 @@ +package dev.dinauer.maven.app; + +import dev.dinauer.maven.maven.core.release.ReleasePom; +import jakarta.enterprise.context.ApplicationScoped; + +@ApplicationScoped +public class PomMapper +{ + public PomDTO map(ReleasePom input) + { + return new PomDTO(input.getFilename(), input.getMd5(), input.getSha1()); + } +} diff --git a/src/main/java/dev/dinauer/maven/app/ReleaseVersionDTO.java b/src/main/java/dev/dinauer/maven/app/ReleaseVersionDTO.java new file mode 100644 index 0000000..075ac5b --- /dev/null +++ b/src/main/java/dev/dinauer/maven/app/ReleaseVersionDTO.java @@ -0,0 +1,35 @@ +package dev.dinauer.maven.app; + +import dev.dinauer.maven.user.User; + +import java.util.List; + +public class ReleaseVersionDTO extends VersionDTO +{ + private final PomDTO pom; + private final List jars; + private final User uploadedBy; + + public ReleaseVersionDTO(String id, String version, PomDTO pom, List jars, User uploadedBy) + { + super(id, version, false); + this.pom = pom; + this.jars = jars; + this.uploadedBy = uploadedBy; + } + + public PomDTO getPom() + { + return pom; + } + + public List getJars() + { + return jars; + } + + public User getUploadedBy() + { + return uploadedBy; + } +} diff --git a/src/main/java/dev/dinauer/maven/app/ResponseEnhancementService.java b/src/main/java/dev/dinauer/maven/app/ResponseEnhancementService.java index a1786e8..5a62785 100644 --- a/src/main/java/dev/dinauer/maven/app/ResponseEnhancementService.java +++ b/src/main/java/dev/dinauer/maven/app/ResponseEnhancementService.java @@ -6,8 +6,7 @@ import jakarta.enterprise.context.ApplicationScoped; import org.eclipse.microprofile.rest.client.inject.RestClient; import java.util.Collection; -import java.util.List; -import java.util.stream.Collectors; +import java.util.Map; @ApplicationScoped public class ResponseEnhancementService @@ -17,6 +16,6 @@ public class ResponseEnhancementService public

EnhancedResponse enhance(Collection

data) { - return new EnhancedResponse(data, userClient.get(data.stream().map(UserReferencing::getUserIds).flatMap(List::stream).collect(Collectors.toSet()))); + return new EnhancedResponse(data, Map.of()); } } diff --git a/src/main/java/dev/dinauer/maven/app/SnapshotVersionDTO.java b/src/main/java/dev/dinauer/maven/app/SnapshotVersionDTO.java new file mode 100644 index 0000000..98e3379 --- /dev/null +++ b/src/main/java/dev/dinauer/maven/app/SnapshotVersionDTO.java @@ -0,0 +1,11 @@ +package dev.dinauer.maven.app; + +import dev.dinauer.maven.user.User; + +public class SnapshotVersionDTO extends VersionDTO +{ + public SnapshotVersionDTO(String id, String version) + { + super(id, version, true); + } +} diff --git a/src/main/java/dev/dinauer/maven/app/VersionDTO.java b/src/main/java/dev/dinauer/maven/app/VersionDTO.java new file mode 100644 index 0000000..4b2f555 --- /dev/null +++ b/src/main/java/dev/dinauer/maven/app/VersionDTO.java @@ -0,0 +1,30 @@ +package dev.dinauer.maven.app; + +public class VersionDTO +{ + private final String id; + private final String version; + private final boolean isSnapshot; + + public VersionDTO(String id, String version, boolean isSnapshot) + { + this.id = id; + this.version = version; + this.isSnapshot = isSnapshot; + } + + public String getId() + { + return id; + } + + public String getVersion() + { + return version; + } + + public boolean isSnapshot() + { + return isSnapshot; + } +} diff --git a/src/main/java/dev/dinauer/maven/app/VersionMapper.java b/src/main/java/dev/dinauer/maven/app/VersionMapper.java new file mode 100644 index 0000000..9f37339 --- /dev/null +++ b/src/main/java/dev/dinauer/maven/app/VersionMapper.java @@ -0,0 +1,39 @@ +package dev.dinauer.maven.app; + +import dev.dinauer.maven.maven.core.Version; +import dev.dinauer.maven.maven.core.release.ReleaseVersion; +import dev.dinauer.maven.maven.core.snapshot.SnapshotVersion; +import dev.dinauer.maven.user.User; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; + +import java.util.List; +import java.util.Map; + +@ApplicationScoped +public class VersionMapper +{ + @Inject + PomMapper pomMapper; + + @Inject + JarMapper jarMapper; + + public List map(List input, Map users) + { + return input.stream().map(version -> this.map(version, users)).toList(); + } + + public VersionDTO map(Version input, Map users) + { + if (input instanceof ReleaseVersion releaseVersion) + { + return new ReleaseVersionDTO(releaseVersion.getId(), releaseVersion.getVersion(), pomMapper.map(releaseVersion.getPom()), jarMapper.map(releaseVersion.getJars()), users.get(releaseVersion.getUploadedBy())); + } + if (input instanceof SnapshotVersion snapshotVersion) + { + return new SnapshotVersionDTO(snapshotVersion.getId(), snapshotVersion.getVersion()); + } + throw new IllegalStateException(); + } +} diff --git a/src/main/java/dev/dinauer/maven/event/Event.java b/src/main/java/dev/dinauer/maven/event/Event.java index e7cce28..af40668 100644 --- a/src/main/java/dev/dinauer/maven/event/Event.java +++ b/src/main/java/dev/dinauer/maven/event/Event.java @@ -9,6 +9,7 @@ import jakarta.persistence.*; import java.time.ZonedDateTime; import java.util.List; +import java.util.Set; @Entity @Table(name = "event") @@ -87,8 +88,8 @@ public class Event implements UserReferencing } @Override - public List getUserIds() + public Set getUserIds() { - return List.of(userId); + return Set.of(userId); } } diff --git a/src/main/java/dev/dinauer/maven/event/EventsResource.java b/src/main/java/dev/dinauer/maven/event/EventsResource.java index ab5af8a..5fe0963 100644 --- a/src/main/java/dev/dinauer/maven/event/EventsResource.java +++ b/src/main/java/dev/dinauer/maven/event/EventsResource.java @@ -6,6 +6,7 @@ import dev.dinauer.maven.user.User; import dev.dinauer.maven.event.repo.EventRepo; import dev.dinauer.maven.user.UserClient; import io.quarkus.panache.common.Sort; +import io.vertx.ext.web.RoutingContext; import jakarta.inject.Inject; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; @@ -27,7 +28,7 @@ public class EventsResource ResponseEnhancementService responseEnhancementService; @GET - public EnhancedResponse get() + public EnhancedResponse get(RoutingContext context) { return responseEnhancementService.enhance(eventRepo.listAll(Sort.by("timestamp", Sort.Direction.Descending))); } diff --git a/src/main/java/dev/dinauer/maven/maven/core/ArtifactId.java b/src/main/java/dev/dinauer/maven/maven/core/ArtifactId.java index 9d67ba2..98c013d 100644 --- a/src/main/java/dev/dinauer/maven/maven/core/ArtifactId.java +++ b/src/main/java/dev/dinauer/maven/maven/core/ArtifactId.java @@ -10,10 +10,8 @@ import jakarta.persistence.*; import org.apache.maven.artifact.versioning.DefaultArtifactVersion; import java.time.ZonedDateTime; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.LinkedList; -import java.util.List; +import java.util.*; +import java.util.stream.Collectors; import java.util.stream.Stream; @Entity @@ -163,13 +161,8 @@ public class ArtifactId implements UserReferencing } @Override - public List getUserIds() + public Set getUserIds() { - List userIds = new LinkedList<>(); - for (ReleaseVersion releaseVersion : releaseVersions) - { - userIds.addAll(releaseVersion.getUserIds()); - } - return userIds; + return getVersions().stream().flatMap(version -> version.getUserIds().stream()).collect(Collectors.toSet()); } } diff --git a/src/main/java/dev/dinauer/maven/maven/core/GroupId.java b/src/main/java/dev/dinauer/maven/maven/core/GroupId.java index 96c7651..19f726f 100644 --- a/src/main/java/dev/dinauer/maven/maven/core/GroupId.java +++ b/src/main/java/dev/dinauer/maven/maven/core/GroupId.java @@ -1,15 +1,18 @@ package dev.dinauer.maven.maven.core; import com.fasterxml.jackson.annotation.JsonManagedReference; +import dev.dinauer.maven.shared.UserReferencing; import jakarta.persistence.*; import java.time.ZonedDateTime; import java.util.ArrayList; import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; @Entity @Table(name = "group_id") -public class GroupId +public class GroupId implements UserReferencing { @Id @GeneratedValue(strategy = GenerationType.UUID) @@ -33,6 +36,12 @@ public class GroupId return id; } + @Override + public Set getUserIds() + { + return artifacts.stream().flatMap(artifact -> artifact.getUserIds().stream()).collect(Collectors.toSet()); + } + public GroupId setId(String id) { this.id = id; diff --git a/src/main/java/dev/dinauer/maven/maven/core/Version.java b/src/main/java/dev/dinauer/maven/maven/core/Version.java index 92b65cd..33a7a3f 100644 --- a/src/main/java/dev/dinauer/maven/maven/core/Version.java +++ b/src/main/java/dev/dinauer/maven/maven/core/Version.java @@ -1,6 +1,8 @@ package dev.dinauer.maven.maven.core; -public interface Version +import dev.dinauer.maven.shared.UserReferencing; + +public interface Version extends UserReferencing { String getVersion(); boolean isSnapshot(); diff --git a/src/main/java/dev/dinauer/maven/maven/core/release/ReleaseVersion.java b/src/main/java/dev/dinauer/maven/maven/core/release/ReleaseVersion.java index f36276d..5b393c4 100644 --- a/src/main/java/dev/dinauer/maven/maven/core/release/ReleaseVersion.java +++ b/src/main/java/dev/dinauer/maven/maven/core/release/ReleaseVersion.java @@ -12,6 +12,7 @@ import java.time.ZonedDateTime; import java.util.ArrayList; import java.util.List; import java.util.Optional; +import java.util.Set; @Entity @Table(name = "release_version") @@ -211,9 +212,9 @@ public class ReleaseVersion implements Version, UserReferencing } @Override - public List getUserIds() + public Set getUserIds() { - return List.of(uploadedBy); + return Set.of(uploadedBy); } @Override diff --git a/src/main/java/dev/dinauer/maven/maven/core/snapshot/SnapshotVersion.java b/src/main/java/dev/dinauer/maven/maven/core/snapshot/SnapshotVersion.java index 6b77310..3f703ac 100644 --- a/src/main/java/dev/dinauer/maven/maven/core/snapshot/SnapshotVersion.java +++ b/src/main/java/dev/dinauer/maven/maven/core/snapshot/SnapshotVersion.java @@ -8,6 +8,8 @@ import jakarta.persistence.*; import java.time.ZonedDateTime; import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; @Entity @Table(name = "snapshot_version") @@ -36,6 +38,12 @@ public class SnapshotVersion implements Version return id; } + @Override + public Set getUserIds() + { + return snapshotBundles.stream().map(SnapshotBundle::getUploadedBy).collect(Collectors.toSet()); + } + public SnapshotVersion setId(String id) { this.id = id; diff --git a/src/main/java/dev/dinauer/maven/shared/UserReferencing.java b/src/main/java/dev/dinauer/maven/shared/UserReferencing.java index 5fcb79c..b6b44d6 100644 --- a/src/main/java/dev/dinauer/maven/shared/UserReferencing.java +++ b/src/main/java/dev/dinauer/maven/shared/UserReferencing.java @@ -2,10 +2,17 @@ package dev.dinauer.maven.shared; import com.fasterxml.jackson.annotation.JsonIgnore; -import java.util.List; +import java.util.Collection; +import java.util.Set; +import java.util.stream.Collectors; public interface UserReferencing { @JsonIgnore - List getUserIds(); + Set getUserIds(); + + static Set collect(Collection items) + { + return items.stream().flatMap(item -> item.getUserIds().stream()).collect(Collectors.toSet()); + } } \ No newline at end of file