🎉 Init

This commit is contained in:
Andreas Dinauer 2026-02-14 20:20:36 +01:00
parent a3db67696c
commit 25f44a2a9d
12 changed files with 185 additions and 8 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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<PingEntity> pings, Double last1Hour, Double last24Hour, PingResult status)
{
public PingResult getStatus()
{
if (!pings.isEmpty())
{
return pings.getFirst().getResult();
}
return null;
}
}

View File

@ -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<PingEntity> 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<PingEntity> getPings()
{
return pings;
}
public HealthcheckEntity setPings(List<PingEntity> pings)
{
this.pings = pings;
return this;
}
}

View File

@ -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<HealthcheckEntity, String>
{
public List<HealthcheckEntity> findByGroup(GroupEntity group)
{
return list("group = :group", Parameters.with("group", group));
}
}

View File

@ -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);
}
}

View File

@ -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<Healthcheck> 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<String, dev.dinauer.pingo.config.Healthcheck> healthcheckEntry)
{
HealthcheckEntity target = healthcheckRepo.findByIdOptional(healthcheckEntry.getKey())
.orElse(new HealthcheckEntity().setId(healthcheckEntry.getKey()).setDisplayName(healthcheckEntry.getValue().displayName())).setGroup(group);
healthcheckRepo.persist(target);
return target;
}
}

View File

@ -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;

View File

@ -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;