From 7e64c57a5af2b034e23556764b216b8c417e4e96 Mon Sep 17 00:00:00 2001 From: Savosin Denis Date: Tue, 3 Jun 2025 15:27:29 +0700 Subject: [PATCH] edge-contracts: add rest-api contracts --- edge-contracts/build.gradle.kts | 6 +- .../demo/edgecontracts/api/CustomerApi.kt | 18 +++++ .../demo/edgecontracts/api/GreetingApi.kt | 12 ++++ .../demo/edgecontracts/api/NekoApi.kt | 22 ++++++ .../demo/edgecontracts/api/ProductApi.kt | 72 +++++++++++++++++++ .../api/exceptions/ApiException.kt | 6 ++ .../api/exceptions/NotFoundException.kt | 8 +++ .../api/exceptions/UnprocessableException.kt | 6 ++ .../edgecontracts/api/model/CityApiModel.kt | 21 ++++++ .../api/model/CustomerApiModel.kt | 20 ++++++ .../api/model/NekoImageApiModel.kt | 9 ++- .../api/model/ProductApiModel.kt | 25 +++++++ .../api/model/ResponseStatusModel.kt | 4 +- .../api/request}/CreateProductRequest.kt | 4 +- .../api/response/GetCustomerResponse.kt | 11 +++ .../api/response/GetNekoImagesResponse.kt | 9 +++ .../api/response/common/BadRequestResponse.kt | 7 ++ .../api/response/common/BaseResponse.kt | 7 ++ .../api/response/common/NotFoundResponse.kt | 5 ++ .../response/common/UnprocessableResponse.kt | 11 +++ .../api/response}/page/PageMetaDto.kt | 2 +- .../api/response}/page/PageResponse.kt | 2 +- .../OffsetDateTimeSerialization.kt | 0 .../serialialization/UuidSerialization.kt | 0 24 files changed, 276 insertions(+), 11 deletions(-) create mode 100644 edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/CustomerApi.kt create mode 100644 edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/GreetingApi.kt create mode 100644 edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/NekoApi.kt create mode 100644 edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/ProductApi.kt create mode 100644 edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/exceptions/ApiException.kt create mode 100644 edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/exceptions/NotFoundException.kt create mode 100644 edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/exceptions/UnprocessableException.kt create mode 100644 edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/model/CityApiModel.kt create mode 100644 edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/model/CustomerApiModel.kt rename src/main/kotlin/com/github/dannecron/demo/http/responses/neko/Image.kt => edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/model/NekoImageApiModel.kt (62%) create mode 100644 edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/model/ProductApiModel.kt rename src/main/kotlin/com/github/dannecron/demo/http/responses/ResponseStatus.kt => edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/model/ResponseStatusModel.kt (61%) rename {src/main/kotlin/com/github/dannecron/demo/http/requests => edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/request}/CreateProductRequest.kt (73%) create mode 100644 edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/response/GetCustomerResponse.kt create mode 100644 edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/response/GetNekoImagesResponse.kt create mode 100644 edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/response/common/BadRequestResponse.kt create mode 100644 edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/response/common/BaseResponse.kt create mode 100644 edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/response/common/NotFoundResponse.kt create mode 100644 edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/response/common/UnprocessableResponse.kt rename {src/main/kotlin/com/github/dannecron/demo/http/responses => edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/response}/page/PageMetaDto.kt (65%) rename {src/main/kotlin/com/github/dannecron/demo/http/responses => edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/response}/page/PageResponse.kt (85%) rename {db/src/main/kotlin/com/github/dannecron/demo/db => edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts}/serialialization/OffsetDateTimeSerialization.kt (100%) rename {db/src/main/kotlin/com/github/dannecron/demo/db => edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts}/serialialization/UuidSerialization.kt (100%) diff --git a/edge-contracts/build.gradle.kts b/edge-contracts/build.gradle.kts index dcc289a..8b491d0 100644 --- a/edge-contracts/build.gradle.kts +++ b/edge-contracts/build.gradle.kts @@ -1,4 +1,8 @@ dependencies { - implementation(rootProject.libs.spring.cloud.stream) implementation(rootProject.libs.json.schema.validator) + implementation(rootProject.libs.springBoot.starter.web) + implementation(rootProject.libs.springData.commons) + implementation(rootProject.libs.springDoc.openapi.starter) + implementation(rootProject.libs.springCloud.stream) + } diff --git a/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/CustomerApi.kt b/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/CustomerApi.kt new file mode 100644 index 0000000..5c79749 --- /dev/null +++ b/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/CustomerApi.kt @@ -0,0 +1,18 @@ +package com.github.dannecron.demo.edgecontracts.api + +import com.github.dannecron.demo.edgecontracts.api.exceptions.NotFoundException +import com.github.dannecron.demo.edgecontracts.api.response.GetCustomerResponse +import org.springframework.http.MediaType +import org.springframework.http.ResponseEntity +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PathVariable +import org.springframework.web.bind.annotation.RequestMapping +import java.util.UUID + +@RequestMapping(value = ["/api/customer"], produces = [MediaType.APPLICATION_JSON_VALUE]) +interface CustomerApi { + + @GetMapping("/{guid}") + @Throws(NotFoundException::class) + fun getCustomer(@PathVariable guid: UUID): ResponseEntity +} diff --git a/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/GreetingApi.kt b/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/GreetingApi.kt new file mode 100644 index 0000000..108d28d --- /dev/null +++ b/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/GreetingApi.kt @@ -0,0 +1,12 @@ +package com.github.dannecron.demo.edgecontracts.api + +import org.springframework.web.bind.annotation.GetMapping + +interface GreetingApi { + + @GetMapping("/greeting") + fun greet(): String + + @GetMapping(value = ["/example/html"], produces = ["text/html"]) + fun exampleHtml(): String +} diff --git a/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/NekoApi.kt b/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/NekoApi.kt new file mode 100644 index 0000000..6e803f4 --- /dev/null +++ b/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/NekoApi.kt @@ -0,0 +1,22 @@ +package com.github.dannecron.demo.edgecontracts.api + +import com.github.dannecron.demo.edgecontracts.api.response.GetNekoImagesResponse +import org.springframework.http.MediaType +import org.springframework.http.ResponseEntity +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PathVariable +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RequestParam + +@RequestMapping(value = ["/api/neko"], produces = [MediaType.APPLICATION_JSON_VALUE]) +interface NekoApi { + + @GetMapping("/categories") + fun categories(): ResponseEntity> + + @GetMapping("/images/{category}") + fun images( + @PathVariable category: String, + @RequestParam imagesCount: Int = 1, + ): ResponseEntity +} diff --git a/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/ProductApi.kt b/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/ProductApi.kt new file mode 100644 index 0000000..e7bec3a --- /dev/null +++ b/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/ProductApi.kt @@ -0,0 +1,72 @@ +package com.github.dannecron.demo.edgecontracts.api + +import com.github.dannecron.demo.edgecontracts.api.exceptions.NotFoundException +import com.github.dannecron.demo.edgecontracts.api.exceptions.UnprocessableException +import com.github.dannecron.demo.edgecontracts.api.model.ProductApiModel +import com.github.dannecron.demo.edgecontracts.api.request.CreateProductRequest +import com.github.dannecron.demo.edgecontracts.api.response.common.BaseResponse +import com.github.dannecron.demo.edgecontracts.api.response.common.NotFoundResponse +import com.github.dannecron.demo.edgecontracts.api.response.page.PageResponse +import io.swagger.v3.oas.annotations.media.Content +import io.swagger.v3.oas.annotations.media.Schema +import io.swagger.v3.oas.annotations.responses.ApiResponse +import io.swagger.v3.oas.annotations.responses.ApiResponses +import jakarta.validation.Valid +import org.springdoc.core.annotations.ParameterObject +import org.springframework.data.domain.Pageable +import org.springframework.http.MediaType +import org.springframework.http.ResponseEntity +import org.springframework.web.bind.annotation.DeleteMapping +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PathVariable +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RequestParam +import java.util.UUID + +@RequestMapping(value = ["/api/product"], produces = [MediaType.APPLICATION_JSON_VALUE]) +interface ProductApi { + + @GetMapping("") + @ApiResponses(value = [ + ApiResponse(responseCode = "200", content = [ + Content(mediaType = "application/json", schema = Schema(implementation = PageResponse::class)), + ]), + ]) + fun getProducts( + @ParameterObject pageable: Pageable, + ): ResponseEntity> + + @GetMapping("/{guid}") + @ApiResponses(value = [ + ApiResponse(responseCode = "200", content = [ + Content(mediaType = "application/json", schema = Schema(implementation = ProductApiModel::class)), + ]), + ApiResponse(responseCode = "404", content = [ + Content(mediaType = "application/json", schema = Schema(implementation = NotFoundResponse::class)) + ]) + ]) + @Throws(NotFoundException::class) + fun getProduct( + @PathVariable guid: UUID, + ): ResponseEntity + + @PostMapping(value = [""], consumes = [MediaType.APPLICATION_JSON_VALUE]) + fun createProduct( + @Valid @RequestBody product: CreateProductRequest, + ): ResponseEntity + + @DeleteMapping("/{guid}") + @Throws(NotFoundException::class, UnprocessableException::class) + fun deleteProduct( + @PathVariable guid: UUID, + ): ResponseEntity + + @PostMapping("/{guid}/send") + @Throws(NotFoundException::class) + fun sendProduct( + @PathVariable guid: UUID, + @RequestParam(required = false) topic: String? + ): ResponseEntity +} diff --git a/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/exceptions/ApiException.kt b/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/exceptions/ApiException.kt new file mode 100644 index 0000000..84f080e --- /dev/null +++ b/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/exceptions/ApiException.kt @@ -0,0 +1,6 @@ +package com.github.dannecron.demo.edgecontracts.api.exceptions + +open class ApiException( + override val message: String, + override val cause: Throwable?, +) : RuntimeException(message, cause) diff --git a/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/exceptions/NotFoundException.kt b/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/exceptions/NotFoundException.kt new file mode 100644 index 0000000..a4618f8 --- /dev/null +++ b/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/exceptions/NotFoundException.kt @@ -0,0 +1,8 @@ +package com.github.dannecron.demo.edgecontracts.api.exceptions + +class NotFoundException( + override val cause: Throwable?, +): ApiException( + message = "Not found", + cause = cause, +) diff --git a/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/exceptions/UnprocessableException.kt b/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/exceptions/UnprocessableException.kt new file mode 100644 index 0000000..0bd51ff --- /dev/null +++ b/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/exceptions/UnprocessableException.kt @@ -0,0 +1,6 @@ +package com.github.dannecron.demo.edgecontracts.api.exceptions + +class UnprocessableException( + override val message: String, + override val cause: Throwable? = null, +): RuntimeException(message, cause) diff --git a/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/model/CityApiModel.kt b/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/model/CityApiModel.kt new file mode 100644 index 0000000..60e71fe --- /dev/null +++ b/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/model/CityApiModel.kt @@ -0,0 +1,21 @@ +package com.github.dannecron.demo.edgecontracts.api.model + +import com.github.dannecron.demo.db.serialialization.OffsetDateTimeSerialization +import com.github.dannecron.demo.db.serialialization.UuidSerialization +import kotlinx.serialization.Serializable +import java.time.OffsetDateTime +import java.util.UUID + +@Serializable +data class CityApiModel( + val id: Long, + @Serializable(with = UuidSerialization::class) + val guid: UUID, + val name: String, + @Serializable(with = OffsetDateTimeSerialization::class) + val createdAt: OffsetDateTime, + @Serializable(with = OffsetDateTimeSerialization::class) + val updatedAt: OffsetDateTime?, + @Serializable(with = OffsetDateTimeSerialization::class) + val deletedAt: OffsetDateTime?, +) diff --git a/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/model/CustomerApiModel.kt b/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/model/CustomerApiModel.kt new file mode 100644 index 0000000..e101d1c --- /dev/null +++ b/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/model/CustomerApiModel.kt @@ -0,0 +1,20 @@ +package com.github.dannecron.demo.edgecontracts.api.model + +import com.github.dannecron.demo.db.serialialization.OffsetDateTimeSerialization +import com.github.dannecron.demo.db.serialialization.UuidSerialization +import kotlinx.serialization.Serializable +import java.time.OffsetDateTime +import java.util.UUID + +@Serializable +data class CustomerApiModel( + val id: Long, + @Serializable(with = UuidSerialization::class) + val guid: UUID, + val name: String, + val cityId: Long?, + @Serializable(with = OffsetDateTimeSerialization::class) + val createdAt: OffsetDateTime, + @Serializable(with = OffsetDateTimeSerialization::class) + val updatedAt: OffsetDateTime?, +) diff --git a/src/main/kotlin/com/github/dannecron/demo/http/responses/neko/Image.kt b/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/model/NekoImageApiModel.kt similarity index 62% rename from src/main/kotlin/com/github/dannecron/demo/http/responses/neko/Image.kt rename to edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/model/NekoImageApiModel.kt index 2897ce7..a358c2e 100644 --- a/src/main/kotlin/com/github/dannecron/demo/http/responses/neko/Image.kt +++ b/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/model/NekoImageApiModel.kt @@ -1,14 +1,13 @@ -package com.github.dannecron.demo.http.responses.neko +package com.github.dannecron.demo.edgecontracts.api.model import kotlinx.serialization.Serializable @Serializable -data class Image( +data class NekoImageApiModel( val url: String, val animeName: String?, val artistHref: String?, val artistName: String?, val sourceUrl: String?, -) { - fun isGif() = animeName != null -} + val isGif: Boolean, +) diff --git a/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/model/ProductApiModel.kt b/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/model/ProductApiModel.kt new file mode 100644 index 0000000..7cfb31c --- /dev/null +++ b/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/model/ProductApiModel.kt @@ -0,0 +1,25 @@ +package com.github.dannecron.demo.edgecontracts.api.model + +import com.github.dannecron.demo.db.serialialization.OffsetDateTimeSerialization +import com.github.dannecron.demo.db.serialialization.UuidSerialization +import kotlinx.serialization.Serializable +import java.time.OffsetDateTime +import java.util.UUID + +@Serializable +data class ProductApiModel( + val id: Long, + @Serializable(with = UuidSerialization::class) + val guid: UUID, + val name: String, + val description: String?, + val price: Long, + @Serializable(with = OffsetDateTimeSerialization::class) + val createdAt: OffsetDateTime, + @Serializable(with = OffsetDateTimeSerialization::class) + val updatedAt: OffsetDateTime?, + @Serializable(with = OffsetDateTimeSerialization::class) + val deletedAt: OffsetDateTime?, + val priceDouble: Double, + val isDeleted: Boolean, +) diff --git a/src/main/kotlin/com/github/dannecron/demo/http/responses/ResponseStatus.kt b/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/model/ResponseStatusModel.kt similarity index 61% rename from src/main/kotlin/com/github/dannecron/demo/http/responses/ResponseStatus.kt rename to edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/model/ResponseStatusModel.kt index 46942f2..6a1d490 100644 --- a/src/main/kotlin/com/github/dannecron/demo/http/responses/ResponseStatus.kt +++ b/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/model/ResponseStatusModel.kt @@ -1,8 +1,8 @@ -package com.github.dannecron.demo.http.responses +package com.github.dannecron.demo.edgecontracts.api.model import com.fasterxml.jackson.annotation.JsonValue -enum class ResponseStatus(@JsonValue val status: String) { +enum class ResponseStatusModel(@JsonValue val status: String) { OK("ok"), NOT_FOUND("not found"), BAD_REQUEST("bad request"), diff --git a/src/main/kotlin/com/github/dannecron/demo/http/requests/CreateProductRequest.kt b/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/request/CreateProductRequest.kt similarity index 73% rename from src/main/kotlin/com/github/dannecron/demo/http/requests/CreateProductRequest.kt rename to edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/request/CreateProductRequest.kt index f4ae410..5d85ff4 100644 --- a/src/main/kotlin/com/github/dannecron/demo/http/requests/CreateProductRequest.kt +++ b/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/request/CreateProductRequest.kt @@ -1,8 +1,10 @@ -package com.github.dannecron.demo.http.requests +package com.github.dannecron.demo.edgecontracts.api.request import jakarta.validation.constraints.Min import jakarta.validation.constraints.NotBlank +import kotlinx.serialization.Serializable +@Serializable data class CreateProductRequest( @field:NotBlank(message = "name value required") val name: String, diff --git a/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/response/GetCustomerResponse.kt b/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/response/GetCustomerResponse.kt new file mode 100644 index 0000000..29e1806 --- /dev/null +++ b/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/response/GetCustomerResponse.kt @@ -0,0 +1,11 @@ +package com.github.dannecron.demo.edgecontracts.api.response + +import com.github.dannecron.demo.edgecontracts.api.model.CityApiModel +import com.github.dannecron.demo.edgecontracts.api.model.CustomerApiModel +import kotlinx.serialization.Serializable + +@Serializable +data class GetCustomerResponse( + val customer: CustomerApiModel, + val city: CityApiModel?, +) diff --git a/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/response/GetNekoImagesResponse.kt b/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/response/GetNekoImagesResponse.kt new file mode 100644 index 0000000..fc29255 --- /dev/null +++ b/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/response/GetNekoImagesResponse.kt @@ -0,0 +1,9 @@ +package com.github.dannecron.demo.edgecontracts.api.response + +import com.github.dannecron.demo.edgecontracts.api.model.NekoImageApiModel +import kotlinx.serialization.Serializable + +@Serializable +data class GetNekoImagesResponse( + val images: List, +) diff --git a/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/response/common/BadRequestResponse.kt b/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/response/common/BadRequestResponse.kt new file mode 100644 index 0000000..494c0e7 --- /dev/null +++ b/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/response/common/BadRequestResponse.kt @@ -0,0 +1,7 @@ +package com.github.dannecron.demo.edgecontracts.api.response.common + +import com.github.dannecron.demo.edgecontracts.api.model.ResponseStatusModel + +data class BadRequestResponse( + val cause: String, +): BaseResponse(status = ResponseStatusModel.BAD_REQUEST) diff --git a/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/response/common/BaseResponse.kt b/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/response/common/BaseResponse.kt new file mode 100644 index 0000000..f3e8b40 --- /dev/null +++ b/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/response/common/BaseResponse.kt @@ -0,0 +1,7 @@ +package com.github.dannecron.demo.edgecontracts.api.response.common + +import com.github.dannecron.demo.edgecontracts.api.model.ResponseStatusModel + +open class BaseResponse(val status: ResponseStatusModel) + +fun makeOkResponse(): BaseResponse = BaseResponse(status = ResponseStatusModel.OK) diff --git a/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/response/common/NotFoundResponse.kt b/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/response/common/NotFoundResponse.kt new file mode 100644 index 0000000..65eff42 --- /dev/null +++ b/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/response/common/NotFoundResponse.kt @@ -0,0 +1,5 @@ +package com.github.dannecron.demo.edgecontracts.api.response.common + +import com.github.dannecron.demo.edgecontracts.api.model.ResponseStatusModel + +class NotFoundResponse: BaseResponse(ResponseStatusModel.NOT_FOUND) diff --git a/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/response/common/UnprocessableResponse.kt b/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/response/common/UnprocessableResponse.kt new file mode 100644 index 0000000..2ed3fb6 --- /dev/null +++ b/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/response/common/UnprocessableResponse.kt @@ -0,0 +1,11 @@ +package com.github.dannecron.demo.edgecontracts.api.response.common + +import com.github.dannecron.demo.edgecontracts.api.model.ResponseStatusModel +import org.springframework.validation.ObjectError + +class UnprocessableResponse( + val cause: String, + val errors: List? +): BaseResponse(status = ResponseStatusModel.UNPROCESSABLE) { + constructor(cause: String): this(cause, null) +} diff --git a/src/main/kotlin/com/github/dannecron/demo/http/responses/page/PageMetaDto.kt b/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/response/page/PageMetaDto.kt similarity index 65% rename from src/main/kotlin/com/github/dannecron/demo/http/responses/page/PageMetaDto.kt rename to edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/response/page/PageMetaDto.kt index feedb41..cb3465c 100644 --- a/src/main/kotlin/com/github/dannecron/demo/http/responses/page/PageMetaDto.kt +++ b/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/response/page/PageMetaDto.kt @@ -1,4 +1,4 @@ -package com.github.dannecron.demo.http.responses.page +package com.github.dannecron.demo.edgecontracts.api.response.page import kotlinx.serialization.Serializable diff --git a/src/main/kotlin/com/github/dannecron/demo/http/responses/page/PageResponse.kt b/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/response/page/PageResponse.kt similarity index 85% rename from src/main/kotlin/com/github/dannecron/demo/http/responses/page/PageResponse.kt rename to edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/response/page/PageResponse.kt index de71300..de35874 100644 --- a/src/main/kotlin/com/github/dannecron/demo/http/responses/page/PageResponse.kt +++ b/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/api/response/page/PageResponse.kt @@ -1,4 +1,4 @@ -package com.github.dannecron.demo.http.responses.page +package com.github.dannecron.demo.edgecontracts.api.response.page import kotlinx.serialization.Serializable import org.springframework.data.domain.Page diff --git a/db/src/main/kotlin/com/github/dannecron/demo/db/serialialization/OffsetDateTimeSerialization.kt b/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/serialialization/OffsetDateTimeSerialization.kt similarity index 100% rename from db/src/main/kotlin/com/github/dannecron/demo/db/serialialization/OffsetDateTimeSerialization.kt rename to edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/serialialization/OffsetDateTimeSerialization.kt diff --git a/db/src/main/kotlin/com/github/dannecron/demo/db/serialialization/UuidSerialization.kt b/edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/serialialization/UuidSerialization.kt similarity index 100% rename from db/src/main/kotlin/com/github/dannecron/demo/db/serialialization/UuidSerialization.kt rename to edge-contracts/src/main/kotlin/com/github/dannecron/demo/edgecontracts/serialialization/UuidSerialization.kt