-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
- Loading branch information
Showing
20 changed files
with
554 additions
and
67 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,4 @@ | ||
[*.{kt,kts}] | ||
ktlint_code_style = intellij_idea | ||
ktlint_standard_no-wildcard-imports = disabled | ||
ij_continuation_indent_size = 4 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
24 changes: 24 additions & 0 deletions
24
botalka/src/main/kotlin/ru/itmo/lms/botalka/api/http/endpoint/HomeworkHttpApi.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
package ru.itmo.lms.botalka.api.http.endpoint | ||
|
||
import org.springframework.beans.factory.annotation.Autowired | ||
import org.springframework.http.ResponseEntity | ||
import org.springframework.web.bind.annotation.RestController | ||
import ru.itmo.lms.botalka.api.http.HomeworkDraftMessage | ||
import ru.itmo.lms.botalka.api.http.HomeworkMessage | ||
import ru.itmo.lms.botalka.api.http.apis.HomeworkApi | ||
import ru.itmo.lms.botalka.api.http.message.toMessage | ||
import ru.itmo.lms.botalka.api.http.message.toModel | ||
import ru.itmo.lms.botalka.logic.HomeworkService | ||
|
||
@RestController | ||
class HomeworkHttpApi( | ||
@Autowired private val service: HomeworkService, | ||
) : HomeworkApi { | ||
override suspend fun homeworkPost( | ||
homeworkDraftMessage: HomeworkDraftMessage, | ||
): ResponseEntity<HomeworkMessage> { | ||
val draft = homeworkDraftMessage.toModel() | ||
val homework = service.create(draft) | ||
return ResponseEntity.ok(homework.toMessage()) | ||
} | ||
} |
31 changes: 31 additions & 0 deletions
31
botalka/src/main/kotlin/ru/itmo/lms/botalka/api/http/message/HomeworkMapping.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
package ru.itmo.lms.botalka.api.http.message | ||
|
||
import ru.itmo.lms.botalka.api.http.HomeworkDraftMessage | ||
import ru.itmo.lms.botalka.api.http.HomeworkMessage | ||
import ru.itmo.lms.botalka.domain.model.Homework | ||
|
||
fun Homework.toMessage(): HomeworkMessage = | ||
HomeworkMessage( | ||
id = this.id.number, | ||
title = this.title.text, | ||
description = this.description.text, | ||
maxScore = this.maxScore.value.toInt(), | ||
publicationMoment = this.publicationMoment, | ||
creationMoment = this.creationMoment, | ||
) | ||
|
||
fun Homework.Draft.toMessage(): HomeworkDraftMessage = | ||
HomeworkDraftMessage( | ||
title = this.title.text, | ||
description = this.description.text, | ||
maxScore = this.maxScore.value.toInt(), | ||
publicationMoment = this.publicationMoment, | ||
) | ||
|
||
fun HomeworkDraftMessage.toModel(): Homework.Draft = | ||
Homework.Draft( | ||
title = Homework.Title(this.title), | ||
description = Homework.Description(this.description), | ||
maxScore = Homework.Score(this.maxScore.toShort()), | ||
publicationMoment = this.publicationMoment, | ||
) |
6 changes: 6 additions & 0 deletions
6
botalka/src/main/kotlin/ru/itmo/lms/botalka/commons/Abbreviate.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
package ru.itmo.lms.botalka.commons | ||
|
||
import org.apache.commons.lang3.StringUtils | ||
|
||
fun String.abbreviated(maxLength: Int = 8): String = | ||
StringUtils.abbreviate(this, maxLength) |
78 changes: 78 additions & 0 deletions
78
botalka/src/main/kotlin/ru/itmo/lms/botalka/domain/model/Homework.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
package ru.itmo.lms.botalka.domain.model | ||
|
||
import ru.itmo.lms.botalka.commons.abbreviated | ||
import java.time.OffsetDateTime | ||
|
||
data class Homework( | ||
val id: Id, | ||
val title: Title, | ||
val description: Description, | ||
val maxScore: Score, | ||
val publicationMoment: OffsetDateTime, | ||
val creationMoment: OffsetDateTime, | ||
) { | ||
@JvmInline | ||
value class Id(val number: Int) { | ||
init { | ||
require(0 < number) { | ||
""" | ||
Unique id must be a positive, got $number | ||
""".trimIndent() | ||
} | ||
} | ||
} | ||
|
||
@JvmInline | ||
value class Title(val text: String) { | ||
init { | ||
require(text.length in lengthRange) { | ||
""" | ||
Title must be in range $lengthRange, | ||
got ${text.abbreviated()} with length ${text.length} | ||
""".trimIndent() | ||
} | ||
} | ||
|
||
companion object { | ||
private val lengthRange = 8..64 | ||
} | ||
} | ||
|
||
@JvmInline | ||
value class Description(val text: String) { | ||
init { | ||
require(text.length in lengthRange) { | ||
""" | ||
Description must be in range $lengthRange, " | ||
got ${text.abbreviated()} with length ${text.length} | ||
""".trimIndent() | ||
} | ||
} | ||
|
||
companion object { | ||
private val lengthRange = 8..16_384 | ||
} | ||
} | ||
|
||
@JvmInline | ||
value class Score(val value: Short) { | ||
init { | ||
require(value in range) { | ||
""" | ||
Score must be in range $range, got $value | ||
""".trimIndent() | ||
} | ||
} | ||
|
||
companion object { | ||
private val range = 0..2000 | ||
} | ||
} | ||
|
||
data class Draft( | ||
val title: Title, | ||
val description: Description, | ||
val maxScore: Score, | ||
val publicationMoment: OffsetDateTime, | ||
) | ||
} |
7 changes: 7 additions & 0 deletions
7
botalka/src/main/kotlin/ru/itmo/lms/botalka/logic/HomeworkService.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
package ru.itmo.lms.botalka.logic | ||
|
||
import ru.itmo.lms.botalka.domain.model.Homework | ||
|
||
interface HomeworkService { | ||
suspend fun create(homework: Homework.Draft): Homework | ||
} |
15 changes: 15 additions & 0 deletions
15
botalka/src/main/kotlin/ru/itmo/lms/botalka/logic/basic/BasicHomeworkService.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
package ru.itmo.lms.botalka.logic.basic | ||
|
||
import org.springframework.beans.factory.annotation.Autowired | ||
import org.springframework.stereotype.Service | ||
import ru.itmo.lms.botalka.domain.model.Homework | ||
import ru.itmo.lms.botalka.logic.HomeworkService | ||
import ru.itmo.lms.botalka.storage.HomeworkStorage | ||
|
||
@Service | ||
class BasicHomeworkService( | ||
@Autowired private val storage: HomeworkStorage, | ||
) : HomeworkService { | ||
override suspend fun create(homework: Homework.Draft): Homework = | ||
storage.create(homework) | ||
} |
7 changes: 7 additions & 0 deletions
7
botalka/src/main/kotlin/ru/itmo/lms/botalka/storage/HomeworkStorage.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
package ru.itmo.lms.botalka.storage | ||
|
||
import ru.itmo.lms.botalka.domain.model.Homework | ||
|
||
interface HomeworkStorage { | ||
suspend fun create(homework: Homework.Draft): Homework | ||
} |
8 changes: 8 additions & 0 deletions
8
botalka/src/main/kotlin/ru/itmo/lms/botalka/storage/jooq/JooqDatabase.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
package ru.itmo.lms.botalka.storage.jooq | ||
|
||
import org.jooq.DSLContext | ||
import org.springframework.beans.factory.annotation.Autowired | ||
import org.springframework.stereotype.Component | ||
|
||
@Component | ||
data class JooqDatabase(@Autowired val execute: DSLContext) |
35 changes: 35 additions & 0 deletions
35
botalka/src/main/kotlin/ru/itmo/lms/botalka/storage/jooq/JooqHomeworkStorage.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
package ru.itmo.lms.botalka.storage.jooq | ||
|
||
import kotlinx.coroutines.reactor.awaitSingle | ||
import org.springframework.beans.factory.annotation.Autowired | ||
import org.springframework.stereotype.Repository | ||
import ru.itmo.lms.botalka.domain.model.Homework | ||
import ru.itmo.lms.botalka.storage.HomeworkStorage | ||
import ru.itmo.lms.botalka.storage.jooq.entity.toModel | ||
import ru.itmo.lms.botalka.storage.jooq.tables.references.HOMEWORK | ||
|
||
@Repository | ||
class JooqHomeworkStorage( | ||
@Autowired private val database: JooqDatabase, | ||
) : HomeworkStorage { | ||
override suspend fun create(homework: Homework.Draft): Homework = | ||
database.execute | ||
.insertInto( | ||
HOMEWORK, | ||
HOMEWORK.TITLE, | ||
HOMEWORK.DESCRIPTION, | ||
HOMEWORK.MAX_SCORE, | ||
HOMEWORK.PUBLICATION_MOMENT, | ||
) | ||
.values( | ||
homework.title.text, | ||
homework.description.text, | ||
homework.maxScore.value, | ||
homework.publicationMoment, | ||
) | ||
.returningResult(HOMEWORK.fields().asList()) | ||
.coerce(HOMEWORK) | ||
.toMono() | ||
.map { it.toModel() } | ||
.awaitSingle() | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
14 changes: 14 additions & 0 deletions
14
botalka/src/main/kotlin/ru/itmo/lms/botalka/storage/jooq/entity/HomeworkMapping.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
package ru.itmo.lms.botalka.storage.jooq.entity | ||
|
||
import ru.itmo.lms.botalka.domain.model.Homework | ||
import ru.itmo.lms.botalka.storage.jooq.tables.records.HomeworkRecord | ||
|
||
fun HomeworkRecord.toModel(): Homework = | ||
Homework( | ||
id = Homework.Id(this.id!!), | ||
title = Homework.Title(this.title), | ||
description = Homework.Description(this.description), | ||
maxScore = Homework.Score(this.maxScore), | ||
publicationMoment = this.publicationMoment, | ||
creationMoment = this.creationMoment!!, | ||
) |
Oops, something went wrong.