From feab729a3055dc72ed159aeea930c5e8fada3311 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Istv=C3=A1n=20R=C3=A1tkai?= Date: Tue, 27 Jun 2023 16:41:40 +0100 Subject: [PATCH 1/4] Add InstantConverter (using XapiTimestamp) to xapi-server --- .../samples/xapiserver/InstantConverter.java | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 samples/xapi-server/src/main/java/dev/learning/xapi/samples/xapiserver/InstantConverter.java 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..9881078a --- /dev/null +++ b/samples/xapi-server/src/main/java/dev/learning/xapi/samples/xapiserver/InstantConverter.java @@ -0,0 +1,35 @@ +/* + * Copyright 2016-2019 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); + } + +} From 30a766a41144948b2fd6d371251b57c09a29c146 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Istv=C3=A1n=20R=C3=A1tkai?= Date: Tue, 27 Jun 2023 19:19:38 +0100 Subject: [PATCH 2/4] fcs --- .../learning/xapi/samples/xapiserver/InstantConverter.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) 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 index 9881078a..a6aaab8b 100644 --- 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 @@ -21,9 +21,12 @@ public class InstantConverter implements Converter { /** - * Converts string to {@link java.time.Instant}. If the timezone is not specified in string, UTC will be used. + * 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') * - * @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 From ed8bfa868590b7919b815890927ccdb2691fce07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Istv=C3=A1n=20R=C3=A1tkai?= Date: Wed, 28 Jun 2023 09:19:35 +0100 Subject: [PATCH 3/4] fix copyright --- .../dev/learning/xapi/samples/xapiserver/InstantConverter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 index a6aaab8b..1b8a5f71 100644 --- 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 @@ -1,5 +1,5 @@ /* - * Copyright 2016-2019 Berry Cloud Ltd. All rights reserved. + * /* Copyright 2016-2023 Berry Cloud Ltd. All rights reserved. */ package dev.learning.xapi.samples.xapiserver; From 5bfa02e7058e8ceb090c5b3a1740a854263c417b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Istv=C3=A1n=20R=C3=A1tkai?= Date: Wed, 28 Jun 2023 09:44:55 +0100 Subject: [PATCH 4/4] Add tests for the InstantConverter --- .../xapiserver/StatementController.java | 20 +++++++++++++++- .../xapiserver/StatementsControllerTest.java | 23 +++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) 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()); + } + }