Skip to content

Commit

Permalink
#60 Added invalid value exception handler
Browse files Browse the repository at this point in the history
  • Loading branch information
vityaman committed Apr 13, 2024
1 parent 301a9a3 commit 761ebb1
Show file tree
Hide file tree
Showing 10 changed files with 97 additions and 65 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package ru.vityaman.lms.botalka.api.http.error

import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.ExceptionHandler
import org.springframework.web.bind.annotation.RestControllerAdvice
import ru.vityaman.lms.botalka.api.http.server.GeneralErrorMessage
import ru.vityaman.lms.botalka.domain.exception.InvalidValueException

@RestControllerAdvice
class DomainExceptionsMapping {
@ExceptionHandler(InvalidValueException::class)
fun handle(exception: InvalidValueException): ResponseEntity<Any> =
ResponseEntity.badRequest()
.body(
GeneralErrorMessage(
code = 400,
status = "Bad Request",
message = exception.message!!,
),
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package ru.vityaman.lms.botalka.api.http.message

import ru.vityaman.lms.botalka.api.http.server.WorkspaceCommentMessage
import ru.vityaman.lms.botalka.api.http.server.WorkspaceEventKindMessage
import ru.vityaman.lms.botalka.api.http.server.WorkspaceEventMessage
import ru.vityaman.lms.botalka.api.http.server.WorkspaceFeedbackMessage
import ru.vityaman.lms.botalka.api.http.server.WorkspaceSubmissionMessage
import ru.vityaman.lms.botalka.domain.model.Workspace

private val Workspace.Event.kind
get() =
when (this) {
is Workspace.Comment -> WorkspaceEventKindMessage.COMMENT
is Workspace.Feedback -> WorkspaceEventKindMessage.FEEDBACK
is Workspace.Submission -> WorkspaceEventKindMessage.SUBMISSION
}

fun Workspace.Comment.toMessage() =
WorkspaceCommentMessage(
kind = this.kind,
id = this.id.number,
producerId = this.producer.number,
text = this.text,
creationMoment = this.creationMoment,
)

fun Workspace.Feedback.toMessage() =
WorkspaceFeedbackMessage(
kind = this.kind,
id = this.id.number,
producerId = this.producer.number,
comment = this.comment,
score = this.score?.value?.toInt(),
creationMoment = this.creationMoment,
)

fun Workspace.Submission.toMessage() =
WorkspaceSubmissionMessage(
kind = this.kind,
id = this.id.number,
producerId = this.producer.number,
note = this.note,
creationMoment = this.creationMoment,
)

fun Workspace.Event.toMessage(): WorkspaceEventMessage =
when (this) {
is Workspace.Comment -> this.toMessage()
is Workspace.Feedback -> this.toMessage()
is Workspace.Submission -> this.toMessage()
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,9 @@
package ru.vityaman.lms.botalka.api.http.message

import ru.vityaman.lms.botalka.api.http.server.WorkspaceCommentDraftMessage
import ru.vityaman.lms.botalka.api.http.server.WorkspaceCommentMessage
import ru.vityaman.lms.botalka.api.http.server.WorkspaceEventDraftMessage
import ru.vityaman.lms.botalka.api.http.server.WorkspaceEventKindMessage
import ru.vityaman.lms.botalka.api.http.server.WorkspaceEventMessage
import ru.vityaman.lms.botalka.api.http.server.WorkspaceFeedbackDraftMessage
import ru.vityaman.lms.botalka.api.http.server.WorkspaceFeedbackMessage
import ru.vityaman.lms.botalka.api.http.server.WorkspaceSubmissionDraftMessage
import ru.vityaman.lms.botalka.api.http.server.WorkspaceSubmissionMessage
import ru.vityaman.lms.botalka.domain.model.Homework
import ru.vityaman.lms.botalka.domain.model.Teacher
import ru.vityaman.lms.botalka.domain.model.User
Expand Down Expand Up @@ -56,45 +51,3 @@ fun WorkspaceFeedbackDraftMessage.toModel(producer: User.Id) =
comment = this.comment,
score = this.score?.let { Homework.Score(it.toShort()) },
)

private val Workspace.Event.kind
get() =
when (this) {
is Workspace.Comment -> WorkspaceEventKindMessage.COMMENT
is Workspace.Feedback -> WorkspaceEventKindMessage.FEEDBACK
is Workspace.Submission -> WorkspaceEventKindMessage.SUBMISSION
}

fun Workspace.Event.toMessage(): WorkspaceEventMessage =
when (this) {
is Workspace.Comment -> {
WorkspaceCommentMessage(
kind = this.kind,
id = this.id.number,
producerId = this.producer.number,
text = this.text,
creationMoment = this.creationMoment,
)
}

is Workspace.Feedback -> {
WorkspaceFeedbackMessage(
kind = this.kind,
id = this.id.number,
producerId = this.producer.number,
comment = this.comment,
score = this.score?.value?.toInt(),
creationMoment = this.creationMoment,
)
}

is Workspace.Submission -> {
WorkspaceSubmissionMessage(
kind = this.kind,
id = this.id.number,
producerId = this.producer.number,
note = this.note,
creationMoment = this.creationMoment,
)
}
}
12 changes: 0 additions & 12 deletions botalka/src/main/kotlin/ru/vityaman/lms/botalka/commons/Require.kt

This file was deleted.

15 changes: 15 additions & 0 deletions botalka/src/main/kotlin/ru/vityaman/lms/botalka/domain/Require.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package ru.vityaman.lms.botalka.domain

import ru.vityaman.lms.botalka.domain.exception.InvalidValueException

fun expect(isValid: Boolean, message: StringBuilder.() -> Unit) {
if (!isValid) {
throw InvalidValueException(buildString(message))
}
}

fun expectId(number: Int) {
expect(0 < number) {
append("Unique id must be a positive, got $number")
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package ru.vityaman.lms.botalka.domain.exception

class InvalidValueException(string: String) :
DomainException(string)
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package ru.vityaman.lms.botalka.domain.model

import ru.vityaman.lms.botalka.commons.abbreviated
import ru.vityaman.lms.botalka.commons.expect
import ru.vityaman.lms.botalka.commons.expectId
import ru.vityaman.lms.botalka.domain.expect
import ru.vityaman.lms.botalka.domain.expectId
import java.time.OffsetDateTime

data class Homework(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package ru.vityaman.lms.botalka.domain.model

import ru.vityaman.lms.botalka.commons.expectId
import ru.vityaman.lms.botalka.domain.expectId

data class PromotionRequest(
val id: Id,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package ru.vityaman.lms.botalka.domain.model

import ru.vityaman.lms.botalka.commons.abbreviated
import ru.vityaman.lms.botalka.commons.expect
import ru.vityaman.lms.botalka.commons.expectId
import ru.vityaman.lms.botalka.domain.expect
import ru.vityaman.lms.botalka.domain.expectId

data class User(
val id: Id,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package ru.vityaman.lms.botalka.domain.model

import ru.vityaman.lms.botalka.commons.expectId
import ru.vityaman.lms.botalka.domain.expectId
import java.time.OffsetDateTime

data class Workspace(
Expand Down

0 comments on commit 761ebb1

Please sign in to comment.