Hashes for metadata

This commit is contained in:
Andreas Dinauer 2026-04-25 22:21:47 +02:00
parent b25c5500b9
commit 591b0e0b18
9 changed files with 67 additions and 12 deletions

View File

@ -55,10 +55,26 @@ public class Dev
tokenRepo.persist(entity); tokenRepo.persist(entity);
QuarkusTransaction.commit(); QuarkusTransaction.commit();
uploadRelease_01();
uploadRelease_02();
uploadSnapshot_01(); uploadSnapshot_01();
uploadSnapshot_02(); uploadSnapshot_02();
} }
private void uploadRelease_01() throws IOException
{
mavenService.upload("/org/postgresql/postgresql/42.7.8/postgresql-42.7.8.pom", readFile("/jar/postgresql-42.7.9.pom"));
mavenService.upload("/org/postgresql/postgresql/42.7.8/postgresql-42.7.8.jar", readFile("/jar/postgresql-42.7.9.jar"));
mavenService.upload("/org/postgresql/postgresql/42.7.8/postgresql-42.7.8-tests.jar", readFile("/jar/postgresql-42.7.9.jar"));
mavenService.upload("/org/postgresql/postgresql/42.7.8/postgresql-42.7.8-javadocs.jar", readFile("/jar/postgresql-42.7.9.jar"));
}
private void uploadRelease_02() throws IOException
{
mavenService.upload("/org/postgresql/postgresql/42.7.9/postgresql-42.7.9.jar", readFile("/jar/postgresql-42.7.9.jar"));
mavenService.upload("/org/postgresql/postgresql/42.7.9/postgresql-42.7.9.pom", readFile("/jar/postgresql-42.7.9.pom"));
}
private void uploadSnapshot_01() throws IOException private void uploadSnapshot_01() throws IOException
{ {
mavenService.upload("/org/postgresql/postgresql/42.7.9-SNAPSHOT/postgresql-42.7.9-20250419.123456-1.jar", readFile("/jar/postgresql-42.7.9.jar")); mavenService.upload("/org/postgresql/postgresql/42.7.9-SNAPSHOT/postgresql-42.7.9-20250419.123456-1.jar", readFile("/jar/postgresql-42.7.9.jar"));

View File

@ -1,5 +1,9 @@
package dev.dinauer.maven.app; package dev.dinauer.maven.app;
import dev.dinauer.maven.event.Event;
import dev.dinauer.maven.event.EventType;
import dev.dinauer.maven.event.Resource;
import dev.dinauer.maven.event.repo.EventRepo;
import dev.dinauer.maven.maven.core.GroupRepo; import dev.dinauer.maven.maven.core.GroupRepo;
import dev.dinauer.maven.maven.core.GroupId; import dev.dinauer.maven.maven.core.GroupId;
import jakarta.inject.Inject; import jakarta.inject.Inject;
@ -9,6 +13,7 @@ import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path; import jakarta.ws.rs.Path;
import jakarta.ws.rs.PathParam; import jakarta.ws.rs.PathParam;
import java.time.ZonedDateTime;
import java.util.List; import java.util.List;
@Path("/groups") @Path("/groups")
@ -16,6 +21,8 @@ public class GroupResource
{ {
@Inject @Inject
GroupRepo groupRepo; GroupRepo groupRepo;
@Inject
EventRepo eventRepo;
@GET @GET
public List<GroupId> get() public List<GroupId> get()
@ -35,6 +42,11 @@ public class GroupResource
@Transactional @Transactional
public void delete(@PathParam("id") String id) public void delete(@PathParam("id") String id)
{ {
groupRepo.deleteById(id); GroupId groupId = groupRepo.findById(id);
if (groupId != null)
{
groupRepo.delete(groupId);
eventRepo.persist(new Event().setType(EventType.DELETE).setTimestamp(ZonedDateTime.now()).setResource(new Resource().setGroupId(groupId.getGroupId())));
}
} }
} }

View File

@ -92,7 +92,7 @@ public class ArtifactId
public List<Version> getVersions() public List<Version> getVersions()
{ {
return Stream.concat(snapshotVersions.stream(), releaseVersions.stream()).toList(); return Stream.concat(snapshotVersions.stream(), releaseVersions.stream()).sorted(Comparator.comparing(item -> new DefaultArtifactVersion(item.getVersion()))).toList().reversed();
} }
public ArtifactId setVersions(List<ReleaseVersion> releaseVersions) public ArtifactId setVersions(List<ReleaseVersion> releaseVersions)

View File

@ -83,9 +83,16 @@ public class MavenService
} }
} }
if (Objects.equals(FileExt.XML, context.extensions().ext())) if (Objects.equals(FileExt.XML, context.extensions().ext()))
{
if (context.extensions().hashExt().isEmpty())
{ {
return Response.status(200).type(MediaType.APPLICATION_XML).entity(snapshotMetadataService.generate(versionContext)).build(); return Response.status(200).type(MediaType.APPLICATION_XML).entity(snapshotMetadataService.generate(versionContext)).build();
} }
else
{
return Response.status(200).type(MediaType.TEXT_PLAIN).entity(snapshotMetadataService.generateHash(versionContext)).build();
}
}
} }
if (context.getClass() == ArtifactContext.class) if (context.getClass() == ArtifactContext.class)
{ {

View File

@ -26,11 +26,11 @@ public class SnapshotBundle
@JsonBackReference @JsonBackReference
private SnapshotVersion snapshotVersion; private SnapshotVersion snapshotVersion;
@OneToMany(mappedBy = "snapshotBundle") @OneToMany(mappedBy = "snapshotBundle", cascade = CascadeType.REMOVE)
@JsonManagedReference @JsonManagedReference
private List<SnapshotJar> jars; private List<SnapshotJar> jars;
@OneToOne(mappedBy = "snapshotBundle") @OneToOne(mappedBy = "snapshotBundle", cascade = CascadeType.REMOVE)
@JsonManagedReference @JsonManagedReference
private SnapshotPom pom; private SnapshotPom pom;

View File

@ -1,6 +1,7 @@
package dev.dinauer.maven.maven.core.snapshot; package dev.dinauer.maven.maven.core.snapshot;
import com.fasterxml.jackson.annotation.JsonBackReference; import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonIgnore;
import jakarta.persistence.*; import jakarta.persistence.*;
@Entity @Entity
@ -16,6 +17,8 @@ public class SnapshotJar
private String sha1; private String sha1;
@Column(columnDefinition = "bytea") @Column(columnDefinition = "bytea")
@JsonIgnore
@Basic(fetch = FetchType.LAZY)
private byte[] jar; private byte[] jar;
private String classifier; private String classifier;

View File

@ -23,7 +23,7 @@ public class SnapshotVersion implements Version
@JsonBackReference @JsonBackReference
private ArtifactId artifact; private ArtifactId artifact;
@OneToMany(mappedBy = "snapshotVersion") @OneToMany(mappedBy = "snapshotVersion", cascade = CascadeType.REMOVE)
@JsonManagedReference @JsonManagedReference
private List<SnapshotBundle> snapshotBundles; private List<SnapshotBundle> snapshotBundles;

View File

@ -14,6 +14,7 @@ import dev.dinauer.maven.metadata.Metadata;
import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject; import jakarta.inject.Inject;
import jakarta.ws.rs.InternalServerErrorException; import jakarta.ws.rs.InternalServerErrorException;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.Strings; import org.apache.commons.lang3.Strings;
import java.util.List; import java.util.List;
@ -39,6 +40,22 @@ public class SnapshotMetadataService
} }
} }
public String generateHash(VersionContext versionContext)
{
switch (versionContext.extensions().hashExt().orElseThrow())
{
case MD5 ->
{
return DigestUtils.md5Hex(generate(versionContext));
}
case SHA256 ->
{
return DigestUtils.sha256Hex(generate(versionContext));
}
}
throw new IllegalArgumentException();
}
private SnapshotMetadata generateMetadata(VersionContext versionContext) private SnapshotMetadata generateMetadata(VersionContext versionContext)
{ {
SnapshotBundle latest = snapshotBundleRepo.latest(versionContext); SnapshotBundle latest = snapshotBundleRepo.latest(versionContext);

View File

@ -1,4 +1,5 @@
# HTTP # HTTP
quarkus.http.host=0.0.0.0
%dev.quarkus.http.cors.enabled=true %dev.quarkus.http.cors.enabled=true
%dev.quarkus.http.port=8081 %dev.quarkus.http.port=8081
%dev.quarkus.http.cors.origins=/.*/ %dev.quarkus.http.cors.origins=/.*/
@ -24,11 +25,10 @@ quarkus.datasource.db-kind=postgresql
quarkus.flyway.migrate-at-start=true quarkus.flyway.migrate-at-start=true
# OIDC Server # OIDC Server
quarkus.oidc.auth-server-url=http://localhost:8089/api/realms/maven quarkus.oidc.auth-server-url=https://auth.dinauer.dev/api/realms/dev
quarkus.oidc.client-id=backend quarkus.oidc.client-id=dev
quarkus.oidc-client.auth-server-url=http://localhost:8089/api/realms/maven quarkus.oidc-client.auth-server-url=https://auth.dinauer.dev/api/realms/dev
quarkus.oidc-client.client-id=backend quarkus.oidc-client.client-id=dev
quarkus.oidc-client.credentials.secret=backend
# OIDC REST # OIDC REST
quarkus.rest-client.idp.url=http://localhost:8089/api/realms/maven quarkus.rest-client.idp.url=https://auth.dinauer.dev/api/realms/dev