From 25f44a2a9d47b4724c12e54dc8780b7eb5e66d51 Mon Sep 17 00:00:00 2001 From: Andreas Dinauer Date: Sat, 14 Feb 2026 20:20:36 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=89=20Init?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/dev/dinauer/pingo/Core.java | 4 +- .../java/dev/dinauer/pingo/PingService.java | 2 +- .../java/dev/dinauer/pingo/group/Group.java | 2 +- .../dev/dinauer/pingo/group/GroupEntity.java | 2 +- .../dev/dinauer/pingo/group/GroupService.java | 2 +- .../pingo/healthcheck/Healthcheck.java | 18 +++++ .../pingo/healthcheck/HealthcheckEntity.java | 71 +++++++++++++++++++ .../pingo/healthcheck/HealthcheckRepo.java | 17 +++++ .../healthcheck/HealthcheckResource.java | 20 ++++++ .../pingo/healthcheck/HealthcheckService.java | 51 +++++++++++++ .../dev/dinauer/pingo/ping/PingEntity.java | 2 +- .../java/dev/dinauer/pingo/ping/PingRepo.java | 2 +- 12 files changed, 185 insertions(+), 8 deletions(-) create mode 100644 src/main/java/dev/dinauer/pingo/healthcheck/Healthcheck.java create mode 100644 src/main/java/dev/dinauer/pingo/healthcheck/HealthcheckEntity.java create mode 100644 src/main/java/dev/dinauer/pingo/healthcheck/HealthcheckRepo.java create mode 100644 src/main/java/dev/dinauer/pingo/healthcheck/HealthcheckResource.java create mode 100644 src/main/java/dev/dinauer/pingo/healthcheck/HealthcheckService.java diff --git a/src/main/java/dev/dinauer/pingo/Core.java b/src/main/java/dev/dinauer/pingo/Core.java index a80eab0..75dd5b6 100644 --- a/src/main/java/dev/dinauer/pingo/Core.java +++ b/src/main/java/dev/dinauer/pingo/Core.java @@ -8,8 +8,8 @@ import dev.dinauer.pingo.group.GroupService; import dev.dinauer.pingo.ping.PingResult; import dev.dinauer.pingo.config.Config; import dev.dinauer.pingo.config.Healthcheck; -import dev.dinauer.pingo.target.HealthcheckEntity; -import dev.dinauer.pingo.target.HealthcheckService; +import dev.dinauer.pingo.healthcheck.HealthcheckEntity; +import dev.dinauer.pingo.healthcheck.HealthcheckService; import io.quarkus.runtime.Startup; import io.smallrye.mutiny.Multi; import io.smallrye.mutiny.infrastructure.Infrastructure; diff --git a/src/main/java/dev/dinauer/pingo/PingService.java b/src/main/java/dev/dinauer/pingo/PingService.java index d9b6a7e..2d6bc22 100644 --- a/src/main/java/dev/dinauer/pingo/PingService.java +++ b/src/main/java/dev/dinauer/pingo/PingService.java @@ -1,7 +1,7 @@ package dev.dinauer.pingo; import dev.dinauer.pingo.group.GroupRepo; -import dev.dinauer.pingo.target.*; +import dev.dinauer.pingo.healthcheck.*; import dev.dinauer.pingo.ping.PingEntity; import dev.dinauer.pingo.ping.PingRepo; import dev.dinauer.pingo.ping.PingResult; diff --git a/src/main/java/dev/dinauer/pingo/group/Group.java b/src/main/java/dev/dinauer/pingo/group/Group.java index dbe145e..be651e5 100644 --- a/src/main/java/dev/dinauer/pingo/group/Group.java +++ b/src/main/java/dev/dinauer/pingo/group/Group.java @@ -1,6 +1,6 @@ package dev.dinauer.pingo.group; -import dev.dinauer.pingo.target.Healthcheck; +import dev.dinauer.pingo.healthcheck.Healthcheck; import java.util.List; diff --git a/src/main/java/dev/dinauer/pingo/group/GroupEntity.java b/src/main/java/dev/dinauer/pingo/group/GroupEntity.java index f91ec58..35f8509 100644 --- a/src/main/java/dev/dinauer/pingo/group/GroupEntity.java +++ b/src/main/java/dev/dinauer/pingo/group/GroupEntity.java @@ -1,6 +1,6 @@ package dev.dinauer.pingo.group; -import dev.dinauer.pingo.target.HealthcheckEntity; +import dev.dinauer.pingo.healthcheck.HealthcheckEntity; import jakarta.persistence.*; import java.util.ArrayList; diff --git a/src/main/java/dev/dinauer/pingo/group/GroupService.java b/src/main/java/dev/dinauer/pingo/group/GroupService.java index e7db37c..05e8987 100644 --- a/src/main/java/dev/dinauer/pingo/group/GroupService.java +++ b/src/main/java/dev/dinauer/pingo/group/GroupService.java @@ -1,6 +1,6 @@ package dev.dinauer.pingo.group; -import dev.dinauer.pingo.target.HealthcheckService; +import dev.dinauer.pingo.healthcheck.HealthcheckService; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import jakarta.transaction.Transactional; diff --git a/src/main/java/dev/dinauer/pingo/healthcheck/Healthcheck.java b/src/main/java/dev/dinauer/pingo/healthcheck/Healthcheck.java new file mode 100644 index 0000000..a43b10f --- /dev/null +++ b/src/main/java/dev/dinauer/pingo/healthcheck/Healthcheck.java @@ -0,0 +1,18 @@ +package dev.dinauer.pingo.healthcheck; + +import dev.dinauer.pingo.ping.PingEntity; +import dev.dinauer.pingo.ping.PingResult; + +import java.util.List; + +public record Healthcheck(String key, String displayName, List pings, Double last1Hour, Double last24Hour, PingResult status) +{ + public PingResult getStatus() + { + if (!pings.isEmpty()) + { + return pings.getFirst().getResult(); + } + return null; + } +} diff --git a/src/main/java/dev/dinauer/pingo/healthcheck/HealthcheckEntity.java b/src/main/java/dev/dinauer/pingo/healthcheck/HealthcheckEntity.java new file mode 100644 index 0000000..2d1d61d --- /dev/null +++ b/src/main/java/dev/dinauer/pingo/healthcheck/HealthcheckEntity.java @@ -0,0 +1,71 @@ +package dev.dinauer.pingo.healthcheck; +import com.fasterxml.jackson.annotation.JsonIgnore; +import dev.dinauer.pingo.group.GroupEntity; +import dev.dinauer.pingo.ping.PingEntity; +import jakarta.persistence.*; + +import java.util.ArrayList; +import java.util.List; + +@Entity +@Table(name = "target") +public class HealthcheckEntity +{ + @Id + private String id; + + @Column(name = "display_name") + private String displayName; + + @ManyToOne + @JoinColumn(name = "target_group_id") + @JsonIgnore + private GroupEntity group; + + @OneToMany(mappedBy = "target", fetch = FetchType.LAZY) + private List pings = new ArrayList<>(); + + public String getId() + { + return id; + } + + public HealthcheckEntity setId(String id) + { + this.id = id; + return this; + } + + public String getDisplayName() + { + return displayName; + } + + public HealthcheckEntity setDisplayName(String display) + { + this.displayName = display; + return this; + } + + public GroupEntity getGroup() + { + return group; + } + + public HealthcheckEntity setGroup(GroupEntity group) + { + this.group = group; + return this; + } + + public List getPings() + { + return pings; + } + + public HealthcheckEntity setPings(List pings) + { + this.pings = pings; + return this; + } +} diff --git a/src/main/java/dev/dinauer/pingo/healthcheck/HealthcheckRepo.java b/src/main/java/dev/dinauer/pingo/healthcheck/HealthcheckRepo.java new file mode 100644 index 0000000..2b02667 --- /dev/null +++ b/src/main/java/dev/dinauer/pingo/healthcheck/HealthcheckRepo.java @@ -0,0 +1,17 @@ +package dev.dinauer.pingo.healthcheck; + +import dev.dinauer.pingo.group.GroupEntity; +import io.quarkus.hibernate.orm.panache.PanacheRepositoryBase; +import io.quarkus.panache.common.Parameters; +import jakarta.enterprise.context.ApplicationScoped; + +import java.util.List; + +@ApplicationScoped +public class HealthcheckRepo implements PanacheRepositoryBase +{ + public List findByGroup(GroupEntity group) + { + return list("group = :group", Parameters.with("group", group)); + } +} diff --git a/src/main/java/dev/dinauer/pingo/healthcheck/HealthcheckResource.java b/src/main/java/dev/dinauer/pingo/healthcheck/HealthcheckResource.java new file mode 100644 index 0000000..caddf71 --- /dev/null +++ b/src/main/java/dev/dinauer/pingo/healthcheck/HealthcheckResource.java @@ -0,0 +1,20 @@ +package dev.dinauer.pingo.healthcheck; + +import jakarta.inject.Inject; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; + +@Path("/healthchecks") +public class HealthcheckResource +{ + @Inject + HealthcheckService healthcheckService; + + @GET + @Path("/{key}") + public Healthcheck getByKey(@PathParam("key") String key) + { + return healthcheckService.findByKey(key); + } +} diff --git a/src/main/java/dev/dinauer/pingo/healthcheck/HealthcheckService.java b/src/main/java/dev/dinauer/pingo/healthcheck/HealthcheckService.java new file mode 100644 index 0000000..4a924dd --- /dev/null +++ b/src/main/java/dev/dinauer/pingo/healthcheck/HealthcheckService.java @@ -0,0 +1,51 @@ +package dev.dinauer.pingo.healthcheck; + +import dev.dinauer.pingo.PingService; +import dev.dinauer.pingo.group.GroupEntity; +import dev.dinauer.pingo.ping.PingRepo; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.transaction.Transactional; + +import java.time.ZonedDateTime; +import java.util.List; +import java.util.Map; + +@ApplicationScoped +public class HealthcheckService +{ + @Inject + HealthcheckRepo healthcheckRepo; + + @Inject + PingService pingService; + + @Inject + PingRepo pingRepo; + + public Healthcheck findByKey(String key) + { + return map(healthcheckRepo.findById(key)); + } + + public List findByGroup(GroupEntity group) + { + return healthcheckRepo.findByGroup(group).stream().map(this::map).toList(); + } + + private Healthcheck map(HealthcheckEntity entity) + { + ZonedDateTime now = ZonedDateTime.now(); + return new Healthcheck(entity.getId(), entity.getDisplayName(), pingRepo.findPageByTarget(entity, 0, 50), pingService.findUptimeRatio(entity, now.minusHours(1)), pingService.findUptimeRatio(entity, now.minusHours(24)), pingService.findResult(entity)); + + } + + @Transactional + public HealthcheckEntity create(GroupEntity group, Map.Entry healthcheckEntry) + { + HealthcheckEntity target = healthcheckRepo.findByIdOptional(healthcheckEntry.getKey()) + .orElse(new HealthcheckEntity().setId(healthcheckEntry.getKey()).setDisplayName(healthcheckEntry.getValue().displayName())).setGroup(group); + healthcheckRepo.persist(target); + return target; + } +} diff --git a/src/main/java/dev/dinauer/pingo/ping/PingEntity.java b/src/main/java/dev/dinauer/pingo/ping/PingEntity.java index ed04bbd..0a618e3 100644 --- a/src/main/java/dev/dinauer/pingo/ping/PingEntity.java +++ b/src/main/java/dev/dinauer/pingo/ping/PingEntity.java @@ -1,7 +1,7 @@ package dev.dinauer.pingo.ping; import com.fasterxml.jackson.annotation.JsonIgnore; -import dev.dinauer.pingo.target.HealthcheckEntity; +import dev.dinauer.pingo.healthcheck.HealthcheckEntity; import jakarta.persistence.*; import java.time.ZonedDateTime; diff --git a/src/main/java/dev/dinauer/pingo/ping/PingRepo.java b/src/main/java/dev/dinauer/pingo/ping/PingRepo.java index 9f45f9e..7e12fb1 100644 --- a/src/main/java/dev/dinauer/pingo/ping/PingRepo.java +++ b/src/main/java/dev/dinauer/pingo/ping/PingRepo.java @@ -1,6 +1,6 @@ package dev.dinauer.pingo.ping; -import dev.dinauer.pingo.target.HealthcheckEntity; +import dev.dinauer.pingo.healthcheck.HealthcheckEntity; import io.quarkus.hibernate.orm.panache.PanacheRepositoryBase; import io.quarkus.panache.common.Page; import io.quarkus.panache.common.Parameters;