Skip to content

Commit d2e01e4

Browse files
committed
refactor: remove JsonSchemaAop
1 parent 0109cea commit d2e01e4

File tree

12 files changed

+93
-124
lines changed

12 files changed

+93
-124
lines changed

src/main/kotlin/plus/maa/backend/common/annotation/JsonSchema.kt

-9
This file was deleted.

src/main/kotlin/plus/maa/backend/common/aop/JsonSchemaAop.kt

-86
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
package plus.maa.backend.config.accesslimit
22

3-
import com.fasterxml.jackson.databind.ObjectMapper
43
import org.springframework.context.annotation.Configuration
54
import org.springframework.data.redis.core.StringRedisTemplate
65
import org.springframework.web.servlet.config.annotation.InterceptorRegistry
76
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer
7+
import plus.maa.backend.service.DataTransferService
88

99
@Configuration
1010
class AccessLimitConfig(
1111
private val stringRedisTemplate: StringRedisTemplate,
12-
private val objectMapper: ObjectMapper,
12+
private val dataTransferService: DataTransferService,
1313
) : WebMvcConfigurer {
1414
override fun addInterceptors(registry: InterceptorRegistry) {
15-
registry.addInterceptor(AccessLimitInterceptor(stringRedisTemplate, objectMapper))
15+
registry.addInterceptor(AccessLimitInterceptor(stringRedisTemplate, dataTransferService))
1616
}
1717
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package plus.maa.backend.config.validation
2+
3+
import jakarta.validation.Constraint
4+
import jakarta.validation.Payload
5+
import kotlin.reflect.KClass
6+
7+
@MustBeDocumented
8+
@Constraint(validatedBy = [JsonSchemaMatchValidator::class])
9+
@Target(AnnotationTarget.FIELD)
10+
@Retention(AnnotationRetention.RUNTIME)
11+
annotation class JsonSchemaMatch(
12+
val message: String = "Not Satisfying Json Schema",
13+
val schema: String,
14+
val groups: Array<KClass<*>> = [],
15+
val payload: Array<KClass<out Payload>> = [],
16+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package plus.maa.backend.config.validation
2+
3+
import jakarta.validation.ConstraintValidator
4+
import jakarta.validation.ConstraintValidatorContext
5+
import org.everit.json.schema.Schema
6+
import org.everit.json.schema.loader.SchemaLoader
7+
import org.json.JSONObject
8+
import org.json.JSONTokener
9+
import org.springframework.core.io.ClassPathResource
10+
11+
class JsonSchemaMatchValidator : ConstraintValidator<JsonSchemaMatch, String> {
12+
private lateinit var schema: String
13+
override fun initialize(constraintAnnotation: JsonSchemaMatch) {
14+
super.initialize(constraintAnnotation)
15+
schema = constraintAnnotation.schema
16+
}
17+
18+
override fun isValid(text: String?, ctx: ConstraintValidatorContext): Boolean {
19+
try {
20+
if (text == null) return true
21+
val validator = validators[schema] ?: return false
22+
validator.validate(text.let(::JSONObject))
23+
return true
24+
} catch (e: Exception) {
25+
ctx.disableDefaultConstraintViolation()
26+
ctx.buildConstraintViolationWithTemplate(e.message).addConstraintViolation()
27+
return false
28+
}
29+
}
30+
31+
companion object {
32+
const val COPILOT_SCHEMA_JSON = "static/templates/maa-copilot-schema.json"
33+
val validators = mapOf(
34+
loadSchema(COPILOT_SCHEMA_JSON),
35+
)
36+
37+
@Suppress("SameParameterValue")
38+
private fun loadSchema(path: String): Pair<String, Schema> {
39+
val schema = ClassPathResource(path).inputStream.let(::JSONTokener).let(::JSONObject).let(SchemaLoader::load)
40+
return path to schema
41+
}
42+
}
43+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package plus.maa.backend.config.validation
2+
3+
import jakarta.validation.Constraint
4+
import jakarta.validation.Payload
5+
import jakarta.validation.ReportAsSingleViolation
6+
import jakarta.validation.constraints.Pattern
7+
import kotlin.reflect.KClass
8+
9+
@MustBeDocumented
10+
@Target(AnnotationTarget.FIELD)
11+
@Retention(AnnotationRetention.RUNTIME)
12+
@Constraint(validatedBy = [])
13+
@ReportAsSingleViolation
14+
@Pattern(regexp = "Like|Dislike|None")
15+
annotation class RatingType(
16+
val message: String = "The rating must be one of Like, Dislike, None",
17+
val groups: Array<KClass<*>> = [],
18+
val payload: Array<KClass<out Payload>> = [],
19+
)

src/main/kotlin/plus/maa/backend/controller/CommentsAreaController.kt

+1-4
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,13 @@ import io.swagger.v3.oas.annotations.Operation
44
import io.swagger.v3.oas.annotations.responses.ApiResponse
55
import io.swagger.v3.oas.annotations.tags.Tag
66
import jakarta.validation.Valid
7-
import jakarta.validation.constraints.NotBlank
87
import org.springdoc.core.annotations.ParameterObject
98
import org.springframework.web.bind.annotation.GetMapping
109
import org.springframework.web.bind.annotation.PostMapping
1110
import org.springframework.web.bind.annotation.RequestBody
1211
import org.springframework.web.bind.annotation.RequestMapping
1312
import org.springframework.web.bind.annotation.RequestParam
1413
import org.springframework.web.bind.annotation.RestController
15-
import plus.maa.backend.common.annotation.JsonSchema
1614
import plus.maa.backend.common.annotation.SensitiveWordDetection
1715
import plus.maa.backend.config.doc.RequireJwt
1816
import plus.maa.backend.config.security.AuthenticationHelper
@@ -62,7 +60,6 @@ class CommentsAreaController(
6260
return success("评论已删除")
6361
}
6462

65-
@JsonSchema
6663
@Operation(summary = "为评论点赞")
6764
@ApiResponse(description = "点赞结果")
6865
@RequireJwt
@@ -84,7 +81,7 @@ class CommentsAreaController(
8481
@Operation(summary = "设置通知接收状态")
8582
@RequireJwt
8683
@GetMapping("/status")
87-
fun modifyStatus(@RequestParam id: @NotBlank String, @RequestParam status: Boolean): MaaResult<String> {
84+
fun modifyStatus(@RequestParam id: String, @RequestParam status: Boolean): MaaResult<String> {
8885
commentsAreaService.notificationStatus(authHelper.requireUserId(), id, status)
8986
return success("success")
9087
}

src/main/kotlin/plus/maa/backend/controller/CopilotController.kt

+3-7
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import org.springframework.web.bind.annotation.RequestBody
1616
import org.springframework.web.bind.annotation.RequestMapping
1717
import org.springframework.web.bind.annotation.RequestParam
1818
import org.springframework.web.bind.annotation.RestController
19-
import plus.maa.backend.common.annotation.JsonSchema
2019
import plus.maa.backend.common.annotation.SensitiveWordDetection
2120
import plus.maa.backend.config.doc.RequireJwt
2221
import plus.maa.backend.config.security.AuthenticationHelper
@@ -45,12 +44,11 @@ class CopilotController(
4544
@Operation(summary = "上传作业")
4645
@ApiResponse(description = "上传作业结果")
4746
@RequireJwt
48-
@JsonSchema
4947
@SensitiveWordDetection(
5048
"#request.content != null ? #objectMapper.readTree(#request.content).get('doc')?.toString() : null",
5149
)
5250
@PostMapping("/upload")
53-
fun uploadCopilot(@RequestBody request: CopilotCUDRequest): MaaResult<Long> =
51+
fun uploadCopilot(@RequestBody @Valid request: CopilotCUDRequest): MaaResult<Long> =
5452
success(copilotService.upload(helper.requireUserId(), request.content))
5553

5654
@Operation(summary = "删除作业")
@@ -83,21 +81,19 @@ class CopilotController(
8381
@Operation(summary = "更新作业")
8482
@ApiResponse(description = "更新结果")
8583
@RequireJwt
86-
@JsonSchema
8784
@SensitiveWordDetection(
8885
"#copilotCUDRequest.content != null ? #objectMapper.readTree(#copilotCUDRequest.content).get('doc')?.toString() : null",
8986
)
9087
@PostMapping("/update")
91-
fun updateCopilot(@RequestBody copilotCUDRequest: CopilotCUDRequest): MaaResult<Unit> {
88+
fun updateCopilot(@RequestBody @Valid copilotCUDRequest: CopilotCUDRequest): MaaResult<Unit> {
9289
copilotService.update(helper.requireUserId(), copilotCUDRequest)
9390
return success()
9491
}
9592

9693
@Operation(summary = "为作业评分")
9794
@ApiResponse(description = "评分结果")
98-
@JsonSchema
9995
@PostMapping("/rating")
100-
fun ratesCopilotOperation(@RequestBody copilotRatingReq: CopilotRatingReq): MaaResult<String> {
96+
fun ratesCopilotOperation(@RequestBody @Valid copilotRatingReq: CopilotRatingReq): MaaResult<String> {
10197
copilotService.rates(helper.obtainUserIdOrIpAddress(), copilotRatingReq)
10298
return success("评分成功")
10399
}

src/main/kotlin/plus/maa/backend/controller/request/comments/CommentsRatingDTO.kt

+2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package plus.maa.backend.controller.request.comments
22

33
import jakarta.validation.constraints.NotBlank
4+
import plus.maa.backend.config.validation.RatingType
45

56
/**
67
* @author LoMu
@@ -10,5 +11,6 @@ data class CommentsRatingDTO(
1011
@field:NotBlank(message = "评分id不可为空")
1112
val commentId: String,
1213
@field:NotBlank(message = "评分不能为空")
14+
@field:RatingType
1315
val rating: String,
1416
)
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
package plus.maa.backend.controller.request.copilot
22

3+
import plus.maa.backend.config.validation.JsonSchemaMatch
4+
import plus.maa.backend.config.validation.JsonSchemaMatchValidator
5+
36
data class CopilotCUDRequest(
7+
@JsonSchemaMatch(schema = JsonSchemaMatchValidator.COPILOT_SCHEMA_JSON)
48
val content: String? = null,
59
val id: Long? = null,
610
)

src/main/kotlin/plus/maa/backend/controller/request/copilot/CopilotRatingReq.kt

+2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package plus.maa.backend.controller.request.copilot
22

33
import jakarta.validation.constraints.NotBlank
4+
import plus.maa.backend.config.validation.RatingType
45

56
/**
67
* @author LoMu
@@ -10,5 +11,6 @@ data class CopilotRatingReq(
1011
@NotBlank(message = "评分作业id不能为空")
1112
val id: Long,
1213
@NotBlank(message = "评分不能为空")
14+
@RatingType
1315
val rating: String,
1416
)

src/main/resources/static/templates/maa-rating-schema.json

-15
This file was deleted.

0 commit comments

Comments
 (0)