diff --git a/src/main/java/telraam/App.java b/src/main/java/telraam/App.java index 4e6eb03..27be8c2 100644 --- a/src/main/java/telraam/App.java +++ b/src/main/java/telraam/App.java @@ -103,7 +103,7 @@ public void run(AppConfiguration configuration, Environment environment) throws jersey.register(new LapSourceSwitchoverResource(database.onDemand(LapSourceSwitchoverDAO.class))); jersey.register(new AcceptedLapsResource()); jersey.register(new TimeResource()); - jersey.register(new LapCountResource(database.onDemand(TeamDAO.class))); + jersey.register(new LapCountResource(database.onDemand(TeamDAO.class), database.onDemand(LapDAO.class))); jersey.register(new MonitoringResource(database)); environment.healthChecks().register("template", new TemplateHealthCheck(configuration.getTemplate())); diff --git a/src/main/java/telraam/api/LapCountResource.java b/src/main/java/telraam/api/LapCountResource.java index b8ca04d..edb7b03 100644 --- a/src/main/java/telraam/api/LapCountResource.java +++ b/src/main/java/telraam/api/LapCountResource.java @@ -1,15 +1,20 @@ package telraam.api; +import telraam.database.daos.LapDAO; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.ws.rs.*; import jakarta.ws.rs.core.MediaType; import telraam.database.daos.TeamDAO; import telraam.database.models.Lap; +import telraam.database.models.LapCount; import telraam.database.models.Team; import telraam.util.AcceptedLapsUtil; +import java.sql.Timestamp; +import java.time.LocalDateTime; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Optional; @@ -17,10 +22,12 @@ @Tag(name="Lap Counts") @Produces(MediaType.APPLICATION_JSON) public class LapCountResource { - TeamDAO teamDAO; + private TeamDAO teamDAO; + private LapDAO lapDAO; - public LapCountResource(TeamDAO teamDAO) { + public LapCountResource(TeamDAO teamDAO, LapDAO lapDAO) { this.teamDAO = teamDAO; + this.lapDAO = lapDAO; } @GET @@ -53,4 +60,27 @@ public Map getLapCounts() { return perName; } + + @GET + @Path("/{lapSourceId}") + public List getLapCountForLapSource(@PathParam("lapSourceId") Integer id, @QueryParam("end") Optional endTimestamp) { + LocalDateTime dateTime = LocalDateTime.now(); + if (endTimestamp.isPresent()) { + dateTime = LocalDateTime.parse(endTimestamp.get()); + } + List laps = lapDAO.getAllBeforeTime(id, Timestamp.valueOf(dateTime)); + return laps; + } + + // EndTimestamp should be a ISO formatted date timestamp + @GET + @Path("/{lapSourceId}/{teamId}") + public Integer getLapCountForLapSource(@PathParam("lapSourceId") Integer id, @PathParam("teamId") Integer teamId, @QueryParam("end") Optional endTimestamp) { + LocalDateTime dateTime = LocalDateTime.now(); + if (endTimestamp.isPresent()) { + dateTime = LocalDateTime.parse(endTimestamp.get()); + } + LapCount lapInfo = lapDAO.getAllForTeamBeforeTime(id, teamId, Timestamp.valueOf(dateTime)); + return lapInfo.getCount(); + } } diff --git a/src/main/java/telraam/database/daos/LapDAO.java b/src/main/java/telraam/database/daos/LapDAO.java index f484f6f..8afd163 100644 --- a/src/main/java/telraam/database/daos/LapDAO.java +++ b/src/main/java/telraam/database/daos/LapDAO.java @@ -8,6 +8,7 @@ import org.jdbi.v3.sqlobject.statement.SqlQuery; import org.jdbi.v3.sqlobject.statement.SqlUpdate; import telraam.database.models.Lap; +import telraam.database.models.LapCount; import telraam.database.models.TeamLapCount; import java.sql.Timestamp; @@ -29,6 +30,14 @@ public interface LapDAO extends DAO { @RegisterBeanMapper(Lap.class) List getAllBySourceSorted(@Bind("lapSourceId") Integer lapSourceId); + @SqlQuery("SELECT t.id as team_id, (SELECT COUNT(*) FROM lap WHERE lap_source_id = :lapSourceId AND timestamp <= :timestamp and team_id = t.id) as count FROM team t") + @RegisterBeanMapper(LapCount.class) + List getAllBeforeTime(@Bind("lapSourceId") Integer lapSourceId, @Bind("timestamp") Timestamp timestamp); + + @SqlQuery("SELECT t.id as team_id, (SELECT COUNT(*) FROM lap WHERE lap_source_id = :lapSourceId AND timestamp <= :timestamp and team_id = t.id) as count FROM team t where id = :teamId") + @RegisterBeanMapper(LapCount.class) + LapCount getAllForTeamBeforeTime(@Bind("lapSourceId") Integer lapSourceId, @Bind("teamId") Integer teamId, @Bind("timestamp") Timestamp timestamp); + @SqlUpdate("INSERT INTO lap (team_id, lap_source_id, timestamp) " + "VALUES (:teamId, :lapSourceId, :timestamp)") @GetGeneratedKeys({"id"}) diff --git a/src/main/java/telraam/database/models/LapCount.java b/src/main/java/telraam/database/models/LapCount.java new file mode 100644 index 0000000..a3831a5 --- /dev/null +++ b/src/main/java/telraam/database/models/LapCount.java @@ -0,0 +1,11 @@ +package telraam.database.models; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter @Setter @NoArgsConstructor +public class LapCount { + private int teamId; + private int count; +}