Skip to content

Commit 165f1bf

Browse files
author
andrewwilsonnew
committed
adding validation
1 parent 7d67448 commit 165f1bf

8 files changed

Lines changed: 69 additions & 64 deletions

File tree

modules/openapi-generator/src/main/resources/kotlin-misk/apiController.mustache

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,21 +20,20 @@ package {{package}}
2020
{{/swagger1AnnotationLibrary}}
2121

2222
{{#useBeanValidation}}
23-
import {{javaxPackage}}.validation.Valid
24-
import {{javaxPackage}}.validation.constraints.DecimalMax
25-
import {{javaxPackage}}.validation.constraints.DecimalMin
26-
import {{javaxPackage}}.validation.constraints.Email
27-
import {{javaxPackage}}.validation.constraints.Max
28-
import {{javaxPackage}}.validation.constraints.Min
29-
import {{javaxPackage}}.validation.constraints.NotNull
30-
import {{javaxPackage}}.validation.constraints.Pattern
31-
import {{javaxPackage}}.validation.constraints.Size
23+
import {{javaxPackage}}.validation.Valid
24+
import {{javaxPackage}}.validation.constraints.DecimalMax
25+
import {{javaxPackage}}.validation.constraints.DecimalMin
26+
import {{javaxPackage}}.validation.constraints.Email
27+
import {{javaxPackage}}.validation.constraints.Max
28+
import {{javaxPackage}}.validation.constraints.Min
29+
import {{javaxPackage}}.validation.constraints.NotNull
30+
import {{javaxPackage}}.validation.constraints.Pattern
31+
import {{javaxPackage}}.validation.constraints.Size
3232
{{/useBeanValidation}}
3333

3434
import jakarta.inject.Inject
3535
import jakarta.inject.Singleton
3636

37-
// TODO("Only import what we need")
3837
import misk.web.Delete
3938
import misk.web.Description
4039
import misk.web.Get
@@ -55,9 +54,6 @@ import okhttp3.Headers
5554
{{#useBeanValidation}}
5655
@Validated
5756
{{/useBeanValidation}}
58-
{{#swagger1AnnotationLibrary}}
59-
@Api(value = "{{{baseName}}}", description = "The {{{baseName}}} API")
60-
{{/swagger1AnnotationLibrary}}
6157
{{#operations}}
6258
@Singleton
6359
class {{classname}}Controller @Inject constructor(
@@ -70,8 +66,7 @@ import okhttp3.Headers
7066
@RequestContentType({{#consumes}}{{{mediaType}}}{{^-last}}, {{/-last}}{{/consumes}}){{/hasConsumes}}{{#hasProduces}}
7167
@ResponseContentType({{#produces}}{{{mediaType}}}{{^-last}}, {{/-last}}{{/produces}}){{/hasProduces}}
7268
@LogRequestResponse(bodySampling = 1.0, errorBodySampling = 1.0)
73-
@Suppress("unused")
74-
override fun {{operationId}}({{#allParams}}{{#isQueryParam}}@QueryParam {{{paramName}}}: {{>optionalDataType}}{{/isQueryParam}}{{#isPathParam}}@PathParam("{{baseName}}") {{{paramName}}}: {{>optionalDataType}}{{/isPathParam}}{{#isHeaderParam}} @RequestHeaders headers: Headers{{/isHeaderParam}}{{#isCookieParam}}{{{paramName}}}: HttpCall{{/isCookieParam}}{{#isBodyParam}}@RequestBody(required = {{^required}}false{{/required}}{{#required}}false{{/required}}) {{{paramName}}}: {{>optionalDataType}}{{/isBodyParam}}{{^-last}},{{/-last}}{{/allParams}}) =
69+
override fun {{operationId}}({{#allParams}}{{#isQueryParam}}@QueryParam {{{paramName}}}: {{>optionalDataType}}{{/isQueryParam}}{{#isPathParam}}@PathParam("{{baseName}}") {{{paramName}}}: {{>optionalDataType}}{{/isPathParam}}{{#isHeaderParam}} @RequestHeaders headers: Headers{{/isHeaderParam}}{{#isCookieParam}}{{{paramName}}}: HttpCall{{/isCookieParam}}{{#isBodyParam}}@RequestBody {{{paramName}}}: {{>optionalDataType}}{{/isBodyParam}}{{^-last}},{{/-last}}{{/allParams}}) =
7570
{{#lambda.camelcase}}{{classname}}{{/lambda.camelcase}}.{{operationId}}({{#allParams}}{{{paramName}}}{{^-last}}, {{/-last}}{{/allParams}})
7671
{{/operation}}
7772
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{{#isQueryParam}}{{#useBeanValidation}}{{>beanValidationQueryParams}}{{/useBeanValidation}}{{#swagger2AnnotationLibrary}}@Parameter(description = "{{{description}}}"{{#required}}, required = true{{/required}}{{#allowableValues}}{{#defaultValue}}, schema = Schema(allowableValues = [{{#values}}"{{{.}}}"{{^-last}}, {{/-last}}{{/values}}]{{^isContainer}}, defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{{defaultValue}}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{/isContainer}}){{/defaultValue}}{{/allowableValues}}{{#allowableValues}}{{^defaultValue}}, schema = Schema(allowableValues = [{{#values}}"{{{.}}}"{{^-last}}, {{/-last}}{{/values}}]){{/defaultValue}}{{/allowableValues}}{{^allowableValues}}{{#defaultValue}}{{^isContainer}}, schema = Schema(defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{{defaultValue}}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}){{/isContainer}}{{/defaultValue}}{{/allowableValues}}){{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}}@ApiParam(value = "{{{description}}}"{{#required}}, required = true{{/required}}{{#allowableValues}}, allowableValues = "{{#values}}{{{.}}}{{^-last}}, {{/-last}}{{/values}}"{{/allowableValues}}{{^isContainer}}{{#defaultValue}}, defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{{defaultValue}}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{/defaultValue}}{{/isContainer}}){{/swagger1AnnotationLibrary}}{{#useBeanValidation}} @Valid{{/useBeanValidation}}{{^isModel}} @RequestParam(value = "{{baseName}}"{{#required}}, required = true{{/required}}{{^required}}, required = false{{/required}}{{^isContainer}}{{#defaultValue}}, defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{{defaultValue}}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{/defaultValue}}{{/isContainer}}){{/isModel}}{{#isDate}} @org.springframework.format.annotation.DateTimeFormat(iso = org.springframework.format.annotation.DateTimeFormat.ISO.DATE){{/isDate}}{{#isDateTime}} @org.springframework.format.annotation.DateTimeFormat(iso = org.springframework.format.annotation.DateTimeFormat.ISO.DATE_TIME){{/isDateTime}} {{{paramName}}}: {{>optionalDataType}}{{/isQueryParam}}
1+
{{#isQueryParam}}{{^isModel}} @RequestParam(value = "{{baseName}}"{{#required}}, required = true{{/required}}{{^required}}, required = false{{/required}}{{^isContainer}}{{#defaultValue}}, defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{{defaultValue}}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{/defaultValue}}{{/isContainer}}){{/isModel}}{{#isDate}} @org.springframework.format.annotation.DateTimeFormat(iso = org.springframework.format.annotation.DateTimeFormat.ISO.DATE){{/isDate}}{{#isDateTime}} @org.springframework.format.annotation.DateTimeFormat(iso = org.springframework.format.annotation.DateTimeFormat.ISO.DATE_TIME){{/isDateTime}} {{{paramName}}}: {{>optionalDataType}}{{/isQueryParam}}

samples/server/petstore/kotlin-misk/src/main/kotlin/org/openapitools/server/api/api/PetApiController.kt

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,15 @@ package org.openapitools.server.api.api
33
import org.openapitools.server.api.model.ModelApiResponse
44
import org.openapitools.server.api.model.Pet
55

6+
import javax.validation.Valid
7+
import javax.validation.constraints.DecimalMax
8+
import javax.validation.constraints.DecimalMin
9+
import javax.validation.constraints.Email
10+
import javax.validation.constraints.Max
11+
import javax.validation.constraints.Min
12+
import javax.validation.constraints.NotNull
13+
import javax.validation.constraints.Pattern
14+
import javax.validation.constraints.Size
615

716
import jakarta.inject.Inject
817
import jakarta.inject.Singleton
@@ -25,6 +34,7 @@ import misk.web.interceptors.LogRequestResponse
2534
import misk.web.mediatype.MediaTypes
2635
import okhttp3.Headers
2736

37+
@Validated
2838
@Singleton
2939
class PetApiController @Inject constructor(
3040
private val petApi: PetApi
@@ -35,38 +45,33 @@ import okhttp3.Headers
3545
@RequestContentType(MediaTypes.APPLICATION_JSON, MediaTypes.APPLICATION_XML)
3646
@ResponseContentType(MediaTypes.APPLICATION_XML, MediaTypes.APPLICATION_JSON)
3747
@LogRequestResponse(bodySampling = 1.0, errorBodySampling = 1.0)
38-
@Suppress("unused")
39-
override fun addPet(@RequestBody(required = false) pet: Pet) =
48+
override fun addPet(@RequestBody pet: Pet) =
4049
petApi.addPet(pet)
4150

4251
@Delete("/pet/{petId}")
4352
@Description("Deletes a pet")
4453
@LogRequestResponse(bodySampling = 1.0, errorBodySampling = 1.0)
45-
@Suppress("unused")
4654
override fun deletePet(@PathParam("petId") petId: kotlin.Long, @RequestHeaders headers: Headers) =
4755
petApi.deletePet(petId, apiKey)
4856

4957
@Get("/pet/findByStatus")
5058
@Description("Finds Pets by status")
5159
@ResponseContentType(MediaTypes.APPLICATION_XML, MediaTypes.APPLICATION_JSON)
5260
@LogRequestResponse(bodySampling = 1.0, errorBodySampling = 1.0)
53-
@Suppress("unused")
5461
override fun findPetsByStatus(@QueryParam status: kotlin.Array<kotlin.String>) =
5562
petApi.findPetsByStatus(status)
5663

5764
@Get("/pet/findByTags")
5865
@Description("Finds Pets by tags")
5966
@ResponseContentType(MediaTypes.APPLICATION_XML, MediaTypes.APPLICATION_JSON)
6067
@LogRequestResponse(bodySampling = 1.0, errorBodySampling = 1.0)
61-
@Suppress("unused")
6268
override fun findPetsByTags(@QueryParam tags: kotlin.Array<kotlin.String>) =
6369
petApi.findPetsByTags(tags)
6470

6571
@Get("/pet/{petId}")
6672
@Description("Find pet by ID")
6773
@ResponseContentType(MediaTypes.APPLICATION_XML, MediaTypes.APPLICATION_JSON)
6874
@LogRequestResponse(bodySampling = 1.0, errorBodySampling = 1.0)
69-
@Suppress("unused")
7075
override fun getPetById(@PathParam("petId") petId: kotlin.Long) =
7176
petApi.getPetById(petId)
7277

@@ -75,24 +80,21 @@ import okhttp3.Headers
7580
@RequestContentType(MediaTypes.APPLICATION_JSON, MediaTypes.APPLICATION_XML)
7681
@ResponseContentType(MediaTypes.APPLICATION_XML, MediaTypes.APPLICATION_JSON)
7782
@LogRequestResponse(bodySampling = 1.0, errorBodySampling = 1.0)
78-
@Suppress("unused")
79-
override fun updatePet(@RequestBody(required = false) pet: Pet) =
83+
override fun updatePet(@RequestBody pet: Pet) =
8084
petApi.updatePet(pet)
8185

8286
@Post("/pet/{petId}")
8387
@Description("Updates a pet in the store with form data")
8488
@RequestContentType(MediaTypes.APPLICATION_FORM_URLENCODED)
8589
@LogRequestResponse(bodySampling = 1.0, errorBodySampling = 1.0)
86-
@Suppress("unused")
8790
override fun updatePetWithForm(@PathParam("petId") petId: kotlin.Long,,) =
8891
petApi.updatePetWithForm(petId, name, status)
8992

9093
@Post("/pet/{petId}/uploadImage")
9194
@Description("uploads an image")
92-
@RequestContentType()
95+
@RequestContentType(MediaTypes.APPLICATION_OCTETSTREAM /* unknown -> multipart/form-data */ )
9396
@ResponseContentType(MediaTypes.APPLICATION_JSON)
9497
@LogRequestResponse(bodySampling = 1.0, errorBodySampling = 1.0)
95-
@Suppress("unused")
9698
override fun uploadFile(@PathParam("petId") petId: kotlin.Long,,) =
9799
petApi.uploadFile(petId, additionalMetadata, file)
98100
}

samples/server/petstore/kotlin-misk/src/main/kotlin/org/openapitools/server/api/api/PetApiImpl.kt

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,35 +14,35 @@ import okhttp3.Headers
1414
class PetApiImpl @Inject constructor(
1515
): PetApi {
1616

17-
override fun addPet(pet: Pet): Pet {
17+
override fun addPet(pet: Pet) {
1818
TODO()
1919
}
2020

21-
override fun deletePet(petId: kotlin.Long, headers: Headers) {
21+
override fun deletePet(petId: kotlin.Long, headers: Headers) {
2222
TODO()
2323
}
2424

25-
override fun findPetsByStatus(status: kotlin.Array<kotlin.String>): kotlin.Array<Pet> {
25+
override fun findPetsByStatus(status: kotlin.Array<kotlin.String>) {
2626
TODO()
2727
}
2828

29-
override fun findPetsByTags(tags: kotlin.Array<kotlin.String>): kotlin.Array<Pet> {
29+
override fun findPetsByTags(tags: kotlin.Array<kotlin.String>) {
3030
TODO()
3131
}
3232

33-
override fun getPetById(petId: kotlin.Long): Pet {
33+
override fun getPetById(petId: kotlin.Long) {
3434
TODO()
3535
}
3636

37-
override fun updatePet(pet: Pet): Pet {
37+
override fun updatePet(pet: Pet) {
3838
TODO()
3939
}
4040

41-
override fun updatePetWithForm(petId: kotlin.Long, , ) {
41+
override fun updatePetWithForm(petId: kotlin.Long, , ) {
4242
TODO()
4343
}
4444

45-
override fun uploadFile(petId: kotlin.Long, , ): ModelApiResponse {
45+
override fun uploadFile(petId: kotlin.Long, , ) {
4646
TODO()
4747
}
4848
}

samples/server/petstore/kotlin-misk/src/main/kotlin/org/openapitools/server/api/api/StoreApiController.kt

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,15 @@ package org.openapitools.server.api.api
22

33
import org.openapitools.server.api.model.Order
44

5+
import javax.validation.Valid
6+
import javax.validation.constraints.DecimalMax
7+
import javax.validation.constraints.DecimalMin
8+
import javax.validation.constraints.Email
9+
import javax.validation.constraints.Max
10+
import javax.validation.constraints.Min
11+
import javax.validation.constraints.NotNull
12+
import javax.validation.constraints.Pattern
13+
import javax.validation.constraints.Size
514

615
import jakarta.inject.Inject
716
import jakarta.inject.Singleton
@@ -24,6 +33,7 @@ import misk.web.interceptors.LogRequestResponse
2433
import misk.web.mediatype.MediaTypes
2534
import okhttp3.Headers
2635

36+
@Validated
2737
@Singleton
2838
class StoreApiController @Inject constructor(
2939
private val storeApi: StoreApi
@@ -32,23 +42,20 @@ import okhttp3.Headers
3242
@Delete("/store/order/{orderId}")
3343
@Description("Delete purchase order by ID")
3444
@LogRequestResponse(bodySampling = 1.0, errorBodySampling = 1.0)
35-
@Suppress("unused")
3645
override fun deleteOrder(@PathParam("orderId") orderId: kotlin.String) =
3746
storeApi.deleteOrder(orderId)
3847

3948
@Get("/store/inventory")
4049
@Description("Returns pet inventories by status")
4150
@ResponseContentType(MediaTypes.APPLICATION_JSON)
4251
@LogRequestResponse(bodySampling = 1.0, errorBodySampling = 1.0)
43-
@Suppress("unused")
4452
override fun getInventory() =
4553
storeApi.getInventory()
4654

4755
@Get("/store/order/{orderId}")
4856
@Description("Find purchase order by ID")
4957
@ResponseContentType(MediaTypes.APPLICATION_XML, MediaTypes.APPLICATION_JSON)
5058
@LogRequestResponse(bodySampling = 1.0, errorBodySampling = 1.0)
51-
@Suppress("unused")
5259
override fun getOrderById(@PathParam("orderId") orderId: kotlin.Long) =
5360
storeApi.getOrderById(orderId)
5461

@@ -57,7 +64,6 @@ import okhttp3.Headers
5764
@RequestContentType(MediaTypes.APPLICATION_JSON)
5865
@ResponseContentType(MediaTypes.APPLICATION_XML, MediaTypes.APPLICATION_JSON)
5966
@LogRequestResponse(bodySampling = 1.0, errorBodySampling = 1.0)
60-
@Suppress("unused")
61-
override fun placeOrder(@RequestBody(required = false) order: Order) =
67+
override fun placeOrder(@RequestBody order: Order) =
6268
storeApi.placeOrder(order)
6369
}

samples/server/petstore/kotlin-misk/src/main/kotlin/org/openapitools/server/api/api/StoreApiImpl.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,19 @@ import okhttp3.Headers
1313
class StoreApiImpl @Inject constructor(
1414
): StoreApi {
1515

16-
override fun deleteOrder(orderId: kotlin.String) {
16+
override fun deleteOrder(orderId: kotlin.String) {
1717
TODO()
1818
}
1919

20-
override fun getInventory(): kotlin.collections.Map<kotlin.String, kotlin.Int> {
20+
override fun getInventory() {
2121
TODO()
2222
}
2323

24-
override fun getOrderById(orderId: kotlin.Long): Order {
24+
override fun getOrderById(orderId: kotlin.Long) {
2525
TODO()
2626
}
2727

28-
override fun placeOrder(order: Order): Order {
28+
override fun placeOrder(order: Order) {
2929
TODO()
3030
}
3131
}

samples/server/petstore/kotlin-misk/src/main/kotlin/org/openapitools/server/api/api/UserApiController.kt

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,15 @@ package org.openapitools.server.api.api
22

33
import org.openapitools.server.api.model.User
44

5+
import javax.validation.Valid
6+
import javax.validation.constraints.DecimalMax
7+
import javax.validation.constraints.DecimalMin
8+
import javax.validation.constraints.Email
9+
import javax.validation.constraints.Max
10+
import javax.validation.constraints.Min
11+
import javax.validation.constraints.NotNull
12+
import javax.validation.constraints.Pattern
13+
import javax.validation.constraints.Size
514

615
import jakarta.inject.Inject
716
import jakarta.inject.Singleton
@@ -24,6 +33,7 @@ import misk.web.interceptors.LogRequestResponse
2433
import misk.web.mediatype.MediaTypes
2534
import okhttp3.Headers
2635

36+
@Validated
2737
@Singleton
2838
class UserApiController @Inject constructor(
2939
private val userApi: UserApi
@@ -33,61 +43,53 @@ import okhttp3.Headers
3343
@Description("Create user")
3444
@RequestContentType(MediaTypes.APPLICATION_JSON)
3545
@LogRequestResponse(bodySampling = 1.0, errorBodySampling = 1.0)
36-
@Suppress("unused")
37-
override fun createUser(@RequestBody(required = false) user: User) =
46+
override fun createUser(@RequestBody user: User) =
3847
userApi.createUser(user)
3948

4049
@Post("/user/createWithArray")
4150
@Description("Creates list of users with given input array")
4251
@RequestContentType(MediaTypes.APPLICATION_JSON)
4352
@LogRequestResponse(bodySampling = 1.0, errorBodySampling = 1.0)
44-
@Suppress("unused")
45-
override fun createUsersWithArrayInput(@RequestBody(required = false) user: kotlin.Array<User>) =
53+
override fun createUsersWithArrayInput(@RequestBody user: kotlin.Array<User>) =
4654
userApi.createUsersWithArrayInput(user)
4755

4856
@Post("/user/createWithList")
4957
@Description("Creates list of users with given input array")
5058
@RequestContentType(MediaTypes.APPLICATION_JSON)
5159
@LogRequestResponse(bodySampling = 1.0, errorBodySampling = 1.0)
52-
@Suppress("unused")
53-
override fun createUsersWithListInput(@RequestBody(required = false) user: kotlin.Array<User>) =
60+
override fun createUsersWithListInput(@RequestBody user: kotlin.Array<User>) =
5461
userApi.createUsersWithListInput(user)
5562

5663
@Delete("/user/{username}")
5764
@Description("Delete user")
5865
@LogRequestResponse(bodySampling = 1.0, errorBodySampling = 1.0)
59-
@Suppress("unused")
6066
override fun deleteUser(@PathParam("username") username: kotlin.String) =
6167
userApi.deleteUser(username)
6268

6369
@Get("/user/{username}")
6470
@Description("Get user by user name")
6571
@ResponseContentType(MediaTypes.APPLICATION_XML, MediaTypes.APPLICATION_JSON)
6672
@LogRequestResponse(bodySampling = 1.0, errorBodySampling = 1.0)
67-
@Suppress("unused")
6873
override fun getUserByName(@PathParam("username") username: kotlin.String) =
6974
userApi.getUserByName(username)
7075

7176
@Get("/user/login")
7277
@Description("Logs user into the system")
7378
@ResponseContentType(MediaTypes.APPLICATION_XML, MediaTypes.APPLICATION_JSON)
7479
@LogRequestResponse(bodySampling = 1.0, errorBodySampling = 1.0)
75-
@Suppress("unused")
7680
override fun loginUser(@QueryParam username: kotlin.String,@QueryParam password: kotlin.String) =
7781
userApi.loginUser(username, password)
7882

7983
@Get("/user/logout")
8084
@Description("Logs out current logged in user session")
8185
@LogRequestResponse(bodySampling = 1.0, errorBodySampling = 1.0)
82-
@Suppress("unused")
8386
override fun logoutUser() =
8487
userApi.logoutUser()
8588

8689
@Put("/user/{username}")
8790
@Description("Updated user")
8891
@RequestContentType(MediaTypes.APPLICATION_JSON)
8992
@LogRequestResponse(bodySampling = 1.0, errorBodySampling = 1.0)
90-
@Suppress("unused")
91-
override fun updateUser(@PathParam("username") username: kotlin.String,@RequestBody(required = false) user: User) =
93+
override fun updateUser(@PathParam("username") username: kotlin.String,@RequestBody user: User) =
9294
userApi.updateUser(username, user)
9395
}

0 commit comments

Comments
 (0)