diff --git a/src/main/kotlin/fr/dcproject/component/workgroup/routes/CreateWorkgroup.kt b/src/main/kotlin/fr/dcproject/component/workgroup/routes/CreateWorkgroup.kt
index 4c7f2b1..fcec099 100644
--- a/src/main/kotlin/fr/dcproject/component/workgroup/routes/CreateWorkgroup.kt
+++ b/src/main/kotlin/fr/dcproject/component/workgroup/routes/CreateWorkgroup.kt
@@ -1,8 +1,9 @@
package fr.dcproject.component.workgroup.routes
-import fr.dcproject.common.response.toOutput
+import fr.dcproject.application.http.badRequestIfNotValid
import fr.dcproject.common.security.assert
import fr.dcproject.common.utils.receiveOrBadRequest
+import fr.dcproject.common.validation.isUrl
import fr.dcproject.component.auth.citizen
import fr.dcproject.component.auth.citizenOrNull
import fr.dcproject.component.auth.mustBeAuth
@@ -10,6 +11,9 @@ import fr.dcproject.component.workgroup.WorkgroupAccessControl
import fr.dcproject.component.workgroup.database.WorkgroupForUpdate
import fr.dcproject.component.workgroup.database.WorkgroupRepository
import fr.dcproject.component.workgroup.routes.CreateWorkgroup.PostWorkgroupRequest.Input
+import io.konform.validation.Validation
+import io.konform.validation.jsonschema.maxLength
+import io.konform.validation.jsonschema.minLength
import io.ktor.application.call
import io.ktor.http.HttpStatusCode
import io.ktor.locations.KtorExperimentalLocationsAPI
@@ -29,13 +33,30 @@ object CreateWorkgroup {
val description: String,
val logo: String?,
val anonymous: Boolean?
- )
+ ) {
+ fun validate() = Validation {
+ Input::name {
+ minLength(5)
+ maxLength(80)
+ }
+ Input::description {
+ minLength(50)
+ maxLength(6000)
+ }
+ Input::logo ifPresent {
+ isUrl()
+ maxLength(2048)
+ }
+ }.validate(this)
+ }
}
fun Route.createWorkgroup(repo: WorkgroupRepository, ac: WorkgroupAccessControl) {
post {
mustBeAuth()
call.receiveOrBadRequest().run {
+ validate().badRequestIfNotValid()
+
WorkgroupForUpdate(
id ?: UUID.randomUUID(),
name,
diff --git a/src/main/resources/openapi.yaml b/src/main/resources/openapi.yaml
index de03709..6afa21e 100644
--- a/src/main/resources/openapi.yaml
+++ b/src/main/resources/openapi.yaml
@@ -1403,6 +1403,12 @@ paths:
application/json:
schema:
$ref: '#/components/schemas/Workgroup'
+ 400:
+ description: BadReqest
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/400'
/workgroups/{workgroup}:
parameters:
- $ref: '#/components/parameters/workgroup'
diff --git a/src/test/kotlin/integration/Workgroup routes.kt b/src/test/kotlin/integration/Workgroup routes.kt
index c6182c4..6a7adfb 100644
--- a/src/test/kotlin/integration/Workgroup routes.kt
+++ b/src/test/kotlin/integration/Workgroup routes.kt
@@ -77,7 +77,7 @@ class `Workgroup routes` : BaseTest() {
{
"id":"f496d86d-6654-4068-91ff-90e1dbcc5f38",
"name":"Les Bouffons",
- "description":"La vie est belle",
+ "description":"Pellentesque eleifend malesuada aliquam. Maecenas et urna quis nunc lacinia scelerisque.",
"anonymous":false
}
"""
@@ -85,7 +85,7 @@ class `Workgroup routes` : BaseTest() {
} `Then the response should be` Created and {
`And the response should contain`("$.id", "f496d86d-6654-4068-91ff-90e1dbcc5f38")
`And the response should contain`("$.name", "Les Bouffons")
- `And the response should contain`("$.description", "La vie est belle")
+ `And the response should contain`("$.description", "Pellentesque eleifend malesuada aliquam. Maecenas et urna quis nunc lacinia scelerisque.")
`And the response should contain`("$.anonymous", false)
}
@@ -95,6 +95,36 @@ class `Workgroup routes` : BaseTest() {
}
}
+ @Test
+ @Tag("BadRequest")
+ fun `I cannot create a workgroup with wrong request`() {
+ withIntegrationApplication {
+ `Given I have citizen`("Werner", "Heisenberg")
+ `When I send a POST request`("/workgroups") {
+ `authenticated as`("Werner", "Heisenberg")
+ `with body`(
+ """
+ {
+ "id":"f496d86d-6654-4068-91ff-90e1dbcc5f38",
+ "name":"sm",
+ "description":"small",
+ "anonymous":false,
+ "logo": "www.plop.com"
+ }
+ """
+ )
+ } `Then the response should be` BadRequest and {
+ `And the response should not be null`()
+ `And the response should contain`("$.invalidParams[0].name", ".name")
+ `And the response should contain`("$.invalidParams[0].reason", "must have at least 5 characters")
+ `And the response should contain`("$.invalidParams[1].name", ".description")
+ `And the response should contain`("$.invalidParams[1].reason", "must have at least 50 characters")
+ `And the response should contain`("$.invalidParams[2].name", ".logo")
+ `And the response should contain`("$.invalidParams[2].reason", "is not url")
+ }
+ }
+ }
+
@Test
fun `I can edit a workgroup`() {
withIntegrationApplication {