diff --git a/samples/xapi-server/src/main/java/dev/learning/xapi/samples/xapiserver/InstantConverter.java b/samples/xapi-server/src/main/java/dev/learning/xapi/samples/xapiserver/InstantConverter.java
new file mode 100644
index 00000000..1b8a5f71
--- /dev/null
+++ b/samples/xapi-server/src/main/java/dev/learning/xapi/samples/xapiserver/InstantConverter.java
@@ -0,0 +1,38 @@
+/*
+ * /* Copyright 2016-2023 Berry Cloud Ltd. All rights reserved.
+ */
+
+package dev.learning.xapi.samples.xapiserver;
+
+import dev.learning.xapi.jackson.model.strict.XapiTimestamp;
+import java.time.Instant;
+import org.springframework.core.convert.converter.Converter;
+import org.springframework.stereotype.Component;
+
+/**
+ *
+ * InstantConverter class.
+ *
+ *
+ * @author István Rátkai (Selindek)
+ * @author Thomas Turrell-Croft
+ */
+@Component
+public class InstantConverter implements Converter {
+
+ /**
+ * Converts string to {@link java.time.Instant}. If the timezone is not specified in string, UTC
+ * will be used.
+ *
+ * @param source the String representation of the datetime in ISO 8601 format (e.q.
+ * '2011-12-03T10:15:30+01:00')
+ *
+ * @return {@link java.time.Instant} of source input
+ */
+ @Override
+ public Instant convert(String source) {
+
+ return XapiTimestamp.parse(source);
+ }
+
+}
diff --git a/samples/xapi-server/src/main/java/dev/learning/xapi/samples/xapiserver/StatementController.java b/samples/xapi-server/src/main/java/dev/learning/xapi/samples/xapiserver/StatementController.java
index e5ce8b66..d97a3994 100644
--- a/samples/xapi-server/src/main/java/dev/learning/xapi/samples/xapiserver/StatementController.java
+++ b/samples/xapi-server/src/main/java/dev/learning/xapi/samples/xapiserver/StatementController.java
@@ -8,6 +8,7 @@
import dev.learning.xapi.model.StatementResult;
import dev.learning.xapi.model.validation.constraints.Statements;
import jakarta.validation.Valid;
+import java.time.Instant;
import java.util.Collection;
import java.util.List;
import java.util.UUID;
@@ -80,7 +81,24 @@ public ResponseEntity getStatement(@RequestParam(required = true) UUI
* "https://github.com/adlnet/xAPI-Spec/blob/master/xAPI-Communication.md#213-get-statements">GET
* Statements
*/
- @GetMapping(params = {"!statementId, !voidedStatementId"})
+ @GetMapping(params = "since")
+ public ResponseEntity getStatementsSince(@RequestParam Instant since) {
+
+ log.debug("GET statements since");
+
+ return ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).build();
+ }
+
+ /**
+ * Get Statements.
+ *
+ * @return the ResponseEntity
+ *
+ * @see GET
+ * Statements
+ */
+ @GetMapping(params = {"!statementId, !voidedStatementId", "!since"})
public ResponseEntity getStatements() {
log.debug("GET statements");
diff --git a/samples/xapi-server/src/test/java/dev/learning/xapi/samples/xapiserver/StatementsControllerTest.java b/samples/xapi-server/src/test/java/dev/learning/xapi/samples/xapiserver/StatementsControllerTest.java
index 2bcca719..1c9bf598 100644
--- a/samples/xapi-server/src/test/java/dev/learning/xapi/samples/xapiserver/StatementsControllerTest.java
+++ b/samples/xapi-server/src/test/java/dev/learning/xapi/samples/xapiserver/StatementsControllerTest.java
@@ -4,6 +4,7 @@
package dev.learning.xapi.samples.xapiserver;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@@ -69,4 +70,26 @@ void whenPostingMultipleStatementsThenStatusIsOk() throws Exception {
.andExpect(status().isOk());
}
+ @Test
+ void whenGettingMultipleStatementsWithSinceParameterThenStatusIsNotImplemented()
+ throws Exception {
+
+ // When Getting Multiple Statements With Since Parameter
+ mvc.perform(get("/xapi/statements?since=2017-03-01T12:30:00.000+00"))
+
+ // Then Status Is Not Implemented
+ .andExpect(status().isNotImplemented());
+ }
+
+ @Test
+ void whenGettingMultipleStatementsWithNegativeTimezoneOffsetThenStatusIsBadRequest()
+ throws Exception {
+
+ // When Getting Multiple Statements With Negative Timezone Offset
+ mvc.perform(get("/xapi/statements?since=2017-03-01T12:30:00.000-00"))
+
+ // Then Status Is Bad Request
+ .andExpect(status().isBadRequest());
+ }
+
}