From 00f7be57a8ea668c187920baf8bcd158474905cd Mon Sep 17 00:00:00 2001 From: vityaman Date: Sat, 20 Apr 2024 12:44:40 +0300 Subject: [PATCH] #63 Added deadline field --- .../lms/botalka/api/http/message/HomeworkMapping.kt | 3 +++ .../ru/vityaman/lms/botalka/domain/model/Homework.kt | 10 +++++++++- .../lms/botalka/storage/jooq/JooqHomeworkStorage.kt | 2 ++ .../lms/botalka/storage/jooq/entity/HomeworkMapping.kt | 1 + botalka/src/main/resources/database/schema.sql | 1 + botalka/src/main/resources/static/openapi/api.yml | 8 ++++++++ .../lms/botalka/api/http/endpoint/HomeworkApiTest.kt | 9 +++++++++ .../lms/botalka/api/http/endpoint/RatingApiTest.kt | 1 + .../lms/botalka/api/http/endpoint/WorkspaceApiTest.kt | 1 + 9 files changed, 35 insertions(+), 1 deletion(-) diff --git a/botalka/src/main/kotlin/ru/vityaman/lms/botalka/api/http/message/HomeworkMapping.kt b/botalka/src/main/kotlin/ru/vityaman/lms/botalka/api/http/message/HomeworkMapping.kt index c45d2e3..4423a5f 100644 --- a/botalka/src/main/kotlin/ru/vityaman/lms/botalka/api/http/message/HomeworkMapping.kt +++ b/botalka/src/main/kotlin/ru/vityaman/lms/botalka/api/http/message/HomeworkMapping.kt @@ -12,6 +12,7 @@ fun Homework.toMessage(): HomeworkMessage = maxScore = this.maxScore.value.toInt(), publicationMoment = this.publicationMoment, creationMoment = this.creationMoment, + deadlineMoment = this.deadlineMoment, ) fun Homework.Draft.toMessage(): HomeworkDraftMessage = @@ -20,6 +21,7 @@ fun Homework.Draft.toMessage(): HomeworkDraftMessage = description = this.description.text, maxScore = this.maxScore.value.toInt(), publicationMoment = this.publicationMoment, + deadlineMoment = this.deadlineMoment, ) fun HomeworkDraftMessage.toModel(): Homework.Draft = @@ -28,4 +30,5 @@ fun HomeworkDraftMessage.toModel(): Homework.Draft = description = Homework.Description(this.description), maxScore = Homework.Score(this.maxScore.toShort()), publicationMoment = this.publicationMoment, + deadlineMoment = this.deadlineMoment, ) diff --git a/botalka/src/main/kotlin/ru/vityaman/lms/botalka/domain/model/Homework.kt b/botalka/src/main/kotlin/ru/vityaman/lms/botalka/domain/model/Homework.kt index 493529a..d82942a 100644 --- a/botalka/src/main/kotlin/ru/vityaman/lms/botalka/domain/model/Homework.kt +++ b/botalka/src/main/kotlin/ru/vityaman/lms/botalka/domain/model/Homework.kt @@ -11,6 +11,7 @@ data class Homework( val description: Description, val maxScore: Score, val publicationMoment: OffsetDateTime, + val deadlineMoment: OffsetDateTime, val creationMoment: OffsetDateTime, ) { @JvmInline @@ -66,5 +67,12 @@ data class Homework( val description: Description, val maxScore: Score, val publicationMoment: OffsetDateTime, - ) + val deadlineMoment: OffsetDateTime, + ) { + init { + expect(publicationMoment < deadlineMoment) { + append("Homework must be published before deadline") + } + } + } } diff --git a/botalka/src/main/kotlin/ru/vityaman/lms/botalka/storage/jooq/JooqHomeworkStorage.kt b/botalka/src/main/kotlin/ru/vityaman/lms/botalka/storage/jooq/JooqHomeworkStorage.kt index 3155966..7931396 100644 --- a/botalka/src/main/kotlin/ru/vityaman/lms/botalka/storage/jooq/JooqHomeworkStorage.kt +++ b/botalka/src/main/kotlin/ru/vityaman/lms/botalka/storage/jooq/JooqHomeworkStorage.kt @@ -20,12 +20,14 @@ class JooqHomeworkStorage( HOMEWORK.DESCRIPTION, HOMEWORK.MAX_SCORE, HOMEWORK.PUBLICATION_MOMENT, + HOMEWORK.DEADLINE_MOMENT, ) .values( homework.title.text, homework.description.text, homework.maxScore.value, homework.publicationMoment, + homework.deadlineMoment, ) .returningResult(HOMEWORK.fields().asList()) .coerce(HOMEWORK) diff --git a/botalka/src/main/kotlin/ru/vityaman/lms/botalka/storage/jooq/entity/HomeworkMapping.kt b/botalka/src/main/kotlin/ru/vityaman/lms/botalka/storage/jooq/entity/HomeworkMapping.kt index e55510c..ce20825 100644 --- a/botalka/src/main/kotlin/ru/vityaman/lms/botalka/storage/jooq/entity/HomeworkMapping.kt +++ b/botalka/src/main/kotlin/ru/vityaman/lms/botalka/storage/jooq/entity/HomeworkMapping.kt @@ -11,4 +11,5 @@ fun HomeworkRecord.toModel(): Homework = maxScore = Homework.Score(this.maxScore), publicationMoment = this.publicationMoment, creationMoment = this.creationMoment!!, + deadlineMoment = this.deadlineMoment, ) diff --git a/botalka/src/main/resources/database/schema.sql b/botalka/src/main/resources/database/schema.sql index 52dbb54..4b73712 100644 --- a/botalka/src/main/resources/database/schema.sql +++ b/botalka/src/main/resources/database/schema.sql @@ -49,6 +49,7 @@ CREATE TABLE lms.homework ( description text NOT NULL, max_score lms.score NOT NULL, publication_moment timestamptz NOT NULL, + deadline_moment timestamptz NOT NULL, creation_moment timestamptz NOT NULL DEFAULT CURRENT_TIMESTAMP ); diff --git a/botalka/src/main/resources/static/openapi/api.yml b/botalka/src/main/resources/static/openapi/api.yml index dd8c61f..7cbead0 100644 --- a/botalka/src/main/resources/static/openapi/api.yml +++ b/botalka/src/main/resources/static/openapi/api.yml @@ -296,6 +296,11 @@ components: format: date-time description: A moment when this homework must be published example: 2024-03-11T12:00:00Z + HomeworkDeadlineMoment: + type: string + format: date-time + description: A moment when is a deadline for this homework + example: 2024-03-11T12:00:00Z CreationMoment: type: string format: date-time @@ -312,11 +317,14 @@ components: $ref: '#/components/schemas/HomeworkScore' publication_moment: $ref: '#/components/schemas/HomeworkPublicationMoment' + deadline_moment: + $ref: '#/components/schemas/HomeworkDeadlineMoment' required: - title - description - max_score - publication_moment + - deadline_moment Homework: allOf: - $ref: '#/components/schemas/HomeworkDraft' diff --git a/botalka/src/test/kotlin/ru/vityaman/lms/botalka/api/http/endpoint/HomeworkApiTest.kt b/botalka/src/test/kotlin/ru/vityaman/lms/botalka/api/http/endpoint/HomeworkApiTest.kt index 9e67211..f2d3728 100644 --- a/botalka/src/test/kotlin/ru/vityaman/lms/botalka/api/http/endpoint/HomeworkApiTest.kt +++ b/botalka/src/test/kotlin/ru/vityaman/lms/botalka/api/http/endpoint/HomeworkApiTest.kt @@ -2,6 +2,7 @@ package ru.vityaman.lms.botalka.api.http.endpoint import io.kotest.matchers.collections.shouldBeUnique import io.kotest.matchers.date.shouldBeAfter +import io.kotest.matchers.date.shouldBeBefore import io.kotest.matchers.date.shouldHaveSameInstantAs import io.kotest.matchers.shouldBe import kotlinx.coroutines.async @@ -23,24 +24,28 @@ class HomeworkApiTest( description = "Test Homework 1 Description", maxScore = 100, publicationMoment = time("2024-04-01T10:15:30+03:00"), + deadlineMoment = time("2024-05-02T10:11:33+03:00"), ), HomeworkDraftMessage( title = "Test Homework 2", description = "Test Homework 2 Description", maxScore = 250, publicationMoment = time("2024-05-01T12:00:30+03:00"), + deadlineMoment = time("2024-07-01T12:11:30+03:00") ), HomeworkDraftMessage( title = "Test Homework 3", description = "Test Homework 3 Description", maxScore = 100, publicationMoment = time("2024-05-02T12:00:30+03:00"), + deadlineMoment = time("2024-05-03T06:11:30+03:00") ), HomeworkDraftMessage( title = "Test Homework 4", description = "Test Homework 4 Description", maxScore = 300, publicationMoment = time("2024-05-02T12:00:30+03:00"), + deadlineMoment = time("2024-05-05T06:10:30+03:00") ), ) @@ -59,11 +64,15 @@ class HomeworkApiTest( l.description shouldBe r.description l.maxScore shouldBe r.maxScore l.publicationMoment shouldHaveSameInstantAs r.publicationMoment + l.deadlineMoment shouldHaveSameInstantAs r.deadlineMoment } + val endingPoint = OffsetDateTime.now() + val results = draftToResultList.map { it.second } results.forEach { it.creationMoment shouldBeAfter startingPoint + it.creationMoment shouldBeBefore endingPoint } val ids = results.map { it.id } diff --git a/botalka/src/test/kotlin/ru/vityaman/lms/botalka/api/http/endpoint/RatingApiTest.kt b/botalka/src/test/kotlin/ru/vityaman/lms/botalka/api/http/endpoint/RatingApiTest.kt index 4161408..9317d85 100644 --- a/botalka/src/test/kotlin/ru/vityaman/lms/botalka/api/http/endpoint/RatingApiTest.kt +++ b/botalka/src/test/kotlin/ru/vityaman/lms/botalka/api/http/endpoint/RatingApiTest.kt @@ -35,6 +35,7 @@ class RatingApiTest( description = "Description Any", maxScore = 200, publicationMoment = OffsetDateTime.now(), + deadlineMoment = OffsetDateTime.now().plusDays(1) ) private val dummySubmit = diff --git a/botalka/src/test/kotlin/ru/vityaman/lms/botalka/api/http/endpoint/WorkspaceApiTest.kt b/botalka/src/test/kotlin/ru/vityaman/lms/botalka/api/http/endpoint/WorkspaceApiTest.kt index a18da89..9fdff47 100644 --- a/botalka/src/test/kotlin/ru/vityaman/lms/botalka/api/http/endpoint/WorkspaceApiTest.kt +++ b/botalka/src/test/kotlin/ru/vityaman/lms/botalka/api/http/endpoint/WorkspaceApiTest.kt @@ -47,6 +47,7 @@ class WorkspaceApiTest( description = "Description Any", maxScore = 200, publicationMoment = OffsetDateTime.now(), + deadlineMoment = OffsetDateTime.now().plusDays(1) ), ).awaitSingle().id }