Skip to content

Commit 5bbc599

Browse files
ilya-shaydullinIlya Shaydullin
andauthored
WD-318 Update validation logic (#17)
* WD-318 Add error list field, changes tests and make old methods as deprecated * WD-318 Up the version * WD-318 Fixes after review * WD-318 Fixes * WD-318 Update README * WD-318 Remvoe isValidRecursive, change return type for validateRecursive method to bool Co-authored-by: Ilya Shaydullin <shaydullin@icerockdev.com>
1 parent 90c9b7b commit 5bbc599

File tree

5 files changed

+37
-35
lines changed

5 files changed

+37
-35
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ repositories {
1212
}
1313

1414
// Append dependency
15-
implementation("com.icerockdev:web-utils:0.5.0")
15+
implementation("com.icerockdev:web-utils:0.6.0")
1616
````
1717

1818
## Library usage

sample/src/main/kotlin/com/icerockdev/sample/server.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import io.ktor.routing.get
2929
import io.ktor.routing.post
3030
import io.ktor.routing.routing
3131
import io.ktor.util.KtorExperimentalAPI
32+
import javax.validation.constraints.Email
3233

3334
@KtorExperimentalAPI
3435
fun Application.main() {
@@ -88,8 +89,8 @@ fun Application.main() {
8889

8990
post("/object") {
9091
val request = call.receiveRequest<TestRequest>()
91-
if (!request.isValid()) {
92-
throw ValidationException(request.validate())
92+
if (!request.validate()) {
93+
throw ValidationException(request.getErrorList())
9394
}
9495
call.respond(TestResponse2(200, request.email, request.password))
9596
}
@@ -118,7 +119,7 @@ fun Application.main() {
118119
}
119120
}
120121

121-
class TestRequest(val email: String, @JsonSecret val password: String) : Request()
122+
class TestRequest(@field:Email val email: String, @JsonSecret val password: String) : Request()
122123
class TestResponse2(status: Int, val email: String, @JsonSecret val password: String) :
123124
AbstractResponse(status, success = true) {
124125
}

web-utils/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ apply(plugin = "java")
1313
apply(plugin = "kotlin")
1414

1515
group = "com.icerockdev"
16-
version = "0.5.0"
16+
version = "0.6.0"
1717

1818
val sourcesJar by tasks.registering(Jar::class) {
1919
classifier = "sources"

web-utils/src/main/kotlin/com/icerockdev/api/Request.kt

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,21 @@ abstract class Request(
2323
.buildValidatorFactory()
2424
) {
2525
private val validator: Validator? = validatorFactory.validator
26+
private var errorList: Set<ConstraintViolation<Request>> = emptySet()
2627

27-
fun validate(): Set<ConstraintViolation<Request>> {
28+
@JsonIgnore
29+
fun validate(): Boolean {
2830
if (validator == null) {
2931
throw ValidatorException("Validator doesn't defined")
3032
}
31-
32-
return validator.validate(this)
33+
errorList = validator.validate(this)
34+
return errorList.isEmpty()
3335
}
3436

35-
fun validateRecursive(propertyPath: String = "*"): Set<ConstraintViolation<Request>> {
36-
val constraintSet = validate().toMutableSet()
37+
@JsonIgnore
38+
fun validateRecursive(propertyPath: String = "*"): Boolean {
39+
validate()
40+
val constraintSet = getErrorList().toMutableSet()
3741

3842
@Suppress("UNCHECKED_CAST")
3943
val self = this::class as KClass<Request>
@@ -44,29 +48,31 @@ abstract class Request(
4448
val propertyName = kProperty.name
4549
when (property) {
4650
is Request -> {
47-
constraintSet.addAll(property.validateRecursive("$propertyPath -> $propertyName"))
51+
val isValid = property.validateRecursive("$propertyPath -> $propertyName")
52+
if (!isValid) {
53+
constraintSet.addAll(property.getErrorList())
54+
}
4855
}
4956
is List<*> -> {
5057
property.forEach { listItem ->
5158
if (listItem is Request) {
52-
constraintSet.addAll(listItem.validateRecursive("$propertyPath -> $propertyName"))
59+
val isValid = listItem.validateRecursive("$propertyPath -> $propertyName")
60+
if (!isValid) {
61+
constraintSet.addAll(listItem.getErrorList())
62+
}
5363
}
5464
}
5565
}
5666
}
5767
}
5868

59-
return constraintSet
60-
}
61-
62-
@JsonIgnore
63-
fun isValid(): Boolean {
64-
return validate().isEmpty()
69+
errorList = constraintSet
70+
return errorList.isEmpty()
6571
}
6672

6773
@JsonIgnore
68-
fun isValidRecursive(): Boolean {
69-
return validateRecursive().isEmpty()
74+
fun getErrorList(): Set<ConstraintViolation<Request>> {
75+
return errorList
7076
}
7177

7278
@JsonIgnore

web-utils/src/test/kotlin/com/icerockdev/api/ToolsTest.kt

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,9 @@ class ToolsTest {
1818
@Test
1919
fun successValidationRulesTest() {
2020
val testObj = TestRequest()
21-
val errors = testObj.validate()
22-
val errorsRecursive = testObj.validateRecursive()
2321

24-
assertEquals(0, errors.size)
25-
assertTrue(testObj.isValid())
26-
assertEquals(0, errorsRecursive.size)
27-
assertTrue(testObj.isValidRecursive())
22+
assertTrue(testObj.validate())
23+
assertEquals(0, testObj.getErrorList().size)
2824
}
2925

3026
@Test
@@ -39,13 +35,10 @@ class ToolsTest {
3935
testObj.passwordRepeat = "123457"
4036
testObj.nested.list.add(NestedTestListItemRequest(10, "test10"))
4137

42-
val errors = testObj.validate()
43-
val errorsRecursive = testObj.validateRecursive()
44-
45-
assertEquals(7, errors.size)
46-
assertFalse(testObj.isValid())
47-
assertEquals(8, errorsRecursive.size)
48-
assertFalse(testObj.isValidRecursive())
38+
assertFalse(testObj.validate())
39+
assertEquals(7, testObj.getErrorList().size)
40+
assertFalse(testObj.validateRecursive())
41+
assertEquals(8, testObj.getErrorList().size)
4942
}
5043

5144
@Test
@@ -60,7 +53,8 @@ class ToolsTest {
6053
testObj.passwordRepeat = "123457"
6154
testObj.nested.list.add(NestedTestListItemRequest(10, "test10"))
6255

63-
val errorsResponse = ErrorResponse(testObj.validateRecursive())
56+
testObj.validateRecursive()
57+
val errorsResponse = ErrorResponse(testObj.getErrorList())
6458
errorsResponse.timestamp = 1566554901677
6559

6660
val expectedErrors = arrayOf(
@@ -95,7 +89,8 @@ class ToolsTest {
9589
val testObj = TestRequest()
9690
testObj.age = 12
9791

98-
val errorsResponse = ErrorResponse(testObj.validate())
92+
testObj.validateRecursive()
93+
val errorsResponse = ErrorResponse(testObj.getErrorList())
9994
errorsResponse.timestamp = 1566554901677
10095

10196
val expectedErrors = arrayOf(

0 commit comments

Comments
 (0)