added round API
This commit is contained in:
44
src/main/java/com/poststats/golf/rs/api/RoundApi.java
Normal file
44
src/main/java/com/poststats/golf/rs/api/RoundApi.java
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
package com.poststats.golf.rs.api;
|
||||||
|
|
||||||
|
import java.math.BigInteger;
|
||||||
|
|
||||||
|
import com.poststats.golf.rs.api.model.Round;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
|
import io.swagger.v3.oas.annotations.responses.ApiResponse;
|
||||||
|
import io.swagger.v3.oas.annotations.responses.ApiResponses;
|
||||||
|
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
|
||||||
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import jakarta.annotation.security.RolesAllowed;
|
||||||
|
import jakarta.validation.constraints.NotNull;
|
||||||
|
import jakarta.validation.constraints.Positive;
|
||||||
|
import jakarta.ws.rs.GET;
|
||||||
|
import jakarta.ws.rs.PUT;
|
||||||
|
import jakarta.ws.rs.Path;
|
||||||
|
import jakarta.ws.rs.PathParam;
|
||||||
|
import jakarta.ws.rs.Produces;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author brian.long@poststats.com
|
||||||
|
*/
|
||||||
|
@Path("/golf/round/{roundId}")
|
||||||
|
@Tag(name = "Round API")
|
||||||
|
@ApiResponses({
|
||||||
|
@ApiResponse(responseCode = "200", description = "Success"),
|
||||||
|
@ApiResponse(responseCode = "404", description = "A round with the specified ID could not be found")
|
||||||
|
})
|
||||||
|
public interface RoundApi {
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Produces(Constants.V1_JSON)
|
||||||
|
@Operation(summary = "Retrieves limited meta-data about a round.")
|
||||||
|
Round get(@NotNull @Positive @PathParam("roundId") BigInteger roundId);
|
||||||
|
|
||||||
|
@PUT
|
||||||
|
@Path("/recompute")
|
||||||
|
@RolesAllowed(Constants.ADMIN_ROLE)
|
||||||
|
@SecurityRequirement(name = "basic")
|
||||||
|
@Operation(summary = "Recomputes a round's score and its impact on leaderboards and future handicaps.")
|
||||||
|
void recompute(@NotNull @Positive @PathParam("roundId") BigInteger roundId);
|
||||||
|
|
||||||
|
}
|
38
src/main/java/com/poststats/golf/rs/api/RoundsApi.java
Normal file
38
src/main/java/com/poststats/golf/rs/api/RoundsApi.java
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
package com.poststats.golf.rs.api;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.poststats.golf.rs.api.model.Round;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
|
import io.swagger.v3.oas.annotations.responses.ApiResponse;
|
||||||
|
import io.swagger.v3.oas.annotations.responses.ApiResponses;
|
||||||
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import jakarta.validation.constraints.NotNull;
|
||||||
|
import jakarta.validation.constraints.Positive;
|
||||||
|
import jakarta.ws.rs.GET;
|
||||||
|
import jakarta.ws.rs.Path;
|
||||||
|
import jakarta.ws.rs.Produces;
|
||||||
|
import jakarta.ws.rs.QueryParam;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author brian.long@poststats.com
|
||||||
|
*/
|
||||||
|
@Path("/golf/rounds")
|
||||||
|
@Tag(name = "Round API")
|
||||||
|
@ApiResponses({
|
||||||
|
@ApiResponse(responseCode = "200", description = "Success"),
|
||||||
|
@ApiResponse(responseCode = "400", description = "A query parameter is not valid"),
|
||||||
|
@ApiResponse(responseCode = "404", description = "No matching rounds were found")
|
||||||
|
})
|
||||||
|
public interface RoundsApi {
|
||||||
|
|
||||||
|
// FIXME String to LocalDate
|
||||||
|
@GET
|
||||||
|
@Path("/byDate")
|
||||||
|
@Produces(Constants.V1_JSON)
|
||||||
|
@Operation(summary = "Finds rounds before a date.", description = "Searches for rounds by date, exclusive.")
|
||||||
|
List<Round> findByDate(@NotNull @Positive @QueryParam("personId") long personId,
|
||||||
|
@QueryParam("cutoffDate") String cutoffDate);
|
||||||
|
|
||||||
|
}
|
48
src/main/java/com/poststats/golf/rs/api/model/BaseRound.java
Normal file
48
src/main/java/com/poststats/golf/rs/api/model/BaseRound.java
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
package com.poststats.golf.rs.api.model;
|
||||||
|
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.time.LocalTime;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
import com.poststats.rs.api.annotation.MapEntry;
|
||||||
|
import com.poststats.rs.api.model.BaseModel;
|
||||||
|
|
||||||
|
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||||
|
public abstract class BaseRound<ConcreteT extends BaseRound<ConcreteT>> extends BaseModel<ConcreteT> {
|
||||||
|
|
||||||
|
@JsonProperty
|
||||||
|
@MapEntry
|
||||||
|
private LocalDate teedate;
|
||||||
|
|
||||||
|
@JsonProperty
|
||||||
|
@MapEntry
|
||||||
|
private LocalTime teetime;
|
||||||
|
|
||||||
|
public LocalDate getTeedate() {
|
||||||
|
return teedate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTeedate(LocalDate teedate) {
|
||||||
|
this.teedate = teedate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LocalTime getTeetime() {
|
||||||
|
return teetime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTeetime(LocalTime teetime) {
|
||||||
|
this.teetime = teetime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ConcreteT withTeedate(LocalDate teedate) {
|
||||||
|
this.teedate = teedate;
|
||||||
|
return this.withThis();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ConcreteT withTeetime(LocalTime teetime) {
|
||||||
|
this.teetime = teetime;
|
||||||
|
return this.withThis();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -0,0 +1,9 @@
|
|||||||
|
package com.poststats.golf.rs.api.model;
|
||||||
|
|
||||||
|
import java.math.BigInteger;
|
||||||
|
|
||||||
|
public interface ReferenceableRound {
|
||||||
|
|
||||||
|
BigInteger getId();
|
||||||
|
|
||||||
|
}
|
48
src/main/java/com/poststats/golf/rs/api/model/Round.java
Normal file
48
src/main/java/com/poststats/golf/rs/api/model/Round.java
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
package com.poststats.golf.rs.api.model;
|
||||||
|
|
||||||
|
import java.math.BigInteger;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty.Access;
|
||||||
|
import com.poststats.rs.api.annotation.MapEntry;
|
||||||
|
|
||||||
|
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||||
|
public class Round extends BaseRound<Round> implements ReferenceableRound {
|
||||||
|
|
||||||
|
@JsonProperty(required = true, access = Access.READ_ONLY)
|
||||||
|
@MapEntry("roundID")
|
||||||
|
private BigInteger roundId;
|
||||||
|
|
||||||
|
@JsonProperty
|
||||||
|
@MapEntry
|
||||||
|
private Golfer golfer;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BigInteger getId() {
|
||||||
|
return roundId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(BigInteger roundId) {
|
||||||
|
this.roundId = roundId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Golfer getGolfer() {
|
||||||
|
return golfer;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setGolfer(Golfer golfer) {
|
||||||
|
this.golfer = golfer;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Round withId(BigInteger roundId) {
|
||||||
|
this.roundId = roundId;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Round withGolfer(Golfer golfer) {
|
||||||
|
this.golfer = golfer;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Reference in New Issue
Block a user