diff --git a/botalka/src/main/kotlin/ru/vityaman/lms/botalka/app/spring/api/http/endpoint/PromotionHttpApi.kt b/botalka/src/main/kotlin/ru/vityaman/lms/botalka/app/spring/api/http/endpoint/PromotionHttpApi.kt index b007c3f..bd732c2 100644 --- a/botalka/src/main/kotlin/ru/vityaman/lms/botalka/app/spring/api/http/endpoint/PromotionHttpApi.kt +++ b/botalka/src/main/kotlin/ru/vityaman/lms/botalka/app/spring/api/http/endpoint/PromotionHttpApi.kt @@ -4,13 +4,13 @@ import org.springframework.beans.factory.annotation.Autowired import org.springframework.http.HttpStatus import org.springframework.http.ResponseEntity import org.springframework.web.bind.annotation.RestController -import ru.vityaman.lms.botalka.app.spring.api.http.error.InvalidPromotionRequestStatus import ru.vityaman.lms.botalka.app.spring.api.http.message.toMessage import ru.vityaman.lms.botalka.app.spring.api.http.message.toModel import ru.vityaman.lms.botalka.app.spring.api.http.server.PromotionRequestDraftMessage import ru.vityaman.lms.botalka.app.spring.api.http.server.PromotionRequestMessage import ru.vityaman.lms.botalka.app.spring.api.http.server.PromotionRequestPatchMessage import ru.vityaman.lms.botalka.app.spring.api.http.server.apis.PromotionApi +import ru.vityaman.lms.botalka.core.exception.InvalidValueException import ru.vityaman.lms.botalka.core.logic.PromotionService import ru.vityaman.lms.botalka.core.model.PromotionRequest import ru.vityaman.lms.botalka.core.model.User @@ -27,9 +27,9 @@ class PromotionHttpApi( when (val status = promotionRequestPatchMessage.status.toModel()) { PromotionRequest.Status.CREATED -> { - throw InvalidPromotionRequestStatus( + throw InvalidValueException( buildString { - append("Can't change promotion request status") + append("Can't change promotion request status ") append("to ${status.toMessage()}") }, ) diff --git a/botalka/src/main/kotlin/ru/vityaman/lms/botalka/app/spring/api/http/error/DriverExceptionMapping.kt b/botalka/src/main/kotlin/ru/vityaman/lms/botalka/app/spring/api/http/error/DriverExceptionMapping.kt index c6b4dee..71d73b0 100644 --- a/botalka/src/main/kotlin/ru/vityaman/lms/botalka/app/spring/api/http/error/DriverExceptionMapping.kt +++ b/botalka/src/main/kotlin/ru/vityaman/lms/botalka/app/spring/api/http/error/DriverExceptionMapping.kt @@ -1,25 +1,24 @@ package ru.vityaman.lms.botalka.app.spring.api.http.error -import com.fasterxml.jackson.core.JsonParseException import org.springframework.http.HttpStatus import org.springframework.http.ResponseEntity import org.springframework.web.bind.annotation.ExceptionHandler import org.springframework.web.bind.annotation.RestControllerAdvice +import org.springframework.web.server.ServerWebInputException import ru.vityaman.lms.botalka.app.spring.api.http.server.GeneralErrorMessage @RestControllerAdvice class DriverExceptionMapping { - @ExceptionHandler(JsonParseException::class) - fun handle(exception: JsonParseException): ResponseEntity { + @ExceptionHandler(ServerWebInputException::class) + fun handle(exception: ServerWebInputException) = run { val code = HttpStatus.BAD_REQUEST - val offset = exception.location.offsetDescription() - return ResponseEntity + ResponseEntity .status(code) .body( GeneralErrorMessage( code = code.value(), status = code.reasonPhrase, - message = "Json syntax error at $offset", + message = "Input is invalid: ${exception.reason ?: "?"}", ), ) } diff --git a/botalka/src/main/kotlin/ru/vityaman/lms/botalka/app/spring/api/http/error/InvalidPromotionRequestStatus.kt b/botalka/src/main/kotlin/ru/vityaman/lms/botalka/app/spring/api/http/error/InvalidPromotionRequestStatus.kt deleted file mode 100644 index 357e5eb..0000000 --- a/botalka/src/main/kotlin/ru/vityaman/lms/botalka/app/spring/api/http/error/InvalidPromotionRequestStatus.kt +++ /dev/null @@ -1,4 +0,0 @@ -package ru.vityaman.lms.botalka.app.spring.api.http.error - -class InvalidPromotionRequestStatus(message: String) : - Exception("Invalid promotion request status: $message") diff --git a/botalka/src/main/kotlin/ru/vityaman/lms/botalka/core/model/Homework.kt b/botalka/src/main/kotlin/ru/vityaman/lms/botalka/core/model/Homework.kt index 979d267..bdf7334 100644 --- a/botalka/src/main/kotlin/ru/vityaman/lms/botalka/core/model/Homework.kt +++ b/botalka/src/main/kotlin/ru/vityaman/lms/botalka/core/model/Homework.kt @@ -58,7 +58,7 @@ data class Homework( } companion object { - private val range = 0..2000 + private val range = 1..2000 } } @@ -70,6 +70,10 @@ data class Homework( val deadlineMoment: OffsetDateTime, ) { init { + val maxDeadline = OffsetDateTime.parse("4096-08-08T08:08:08+03:00") + expect(deadlineMoment.isBefore(maxDeadline)) { + append("Homework deadline must be before $maxDeadline") + } expect(publicationMoment.plusMinutes(1).isBefore(deadlineMoment)) { append("Homework must be published 1 minute before deadline") } diff --git a/botalka/src/main/resources/static/openapi/api.yml b/botalka/src/main/resources/static/openapi/api.yml index 50f3cd8..711fb23 100644 --- a/botalka/src/main/resources/static/openapi/api.yml +++ b/botalka/src/main/resources/static/openapi/api.yml @@ -69,6 +69,12 @@ paths: type: array items: $ref: '#/components/schemas/WorkspaceEvent' + 400: + description: Invalid parameters + content: + application/json: + schema: + $ref: '#/components/schemas/GeneralError' 404: description: Homework or student with given id not found content: @@ -160,6 +166,12 @@ paths: application/json: schema: $ref: '#/components/schemas/User' + 400: + description: Invalid parameters + content: + application/json: + schema: + $ref: '#/components/schemas/GeneralError' 404: description: Not found content: @@ -218,6 +230,12 @@ paths: application/json: schema: $ref: '#/components/schemas/PromotionRequest' + 400: + description: Invalid parameters + content: + application/json: + schema: + $ref: '#/components/schemas/GeneralError' 404: description: User not found content: @@ -253,6 +271,12 @@ paths: responses: 204: description: Promotion request resolved + 400: + description: Invalid parameters + content: + application/json: + schema: + $ref: '#/components/schemas/GeneralError' 404: description: Promotion request not found content: diff --git a/docker-compose.yml b/docker-compose.yml index 0053fdd..b52d819 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -44,6 +44,8 @@ services: - GF_SECURITY_ADMIN_PASSWORD=0000 networks: - lms-network + profiles: + - infra prometheus: container_name: lms-prometheus image: prom/prometheus @@ -53,6 +55,8 @@ services: - ./infra/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml networks: - lms-network + profiles: + - infra restler: container_name: lms-restler image: restler