fix(aihr): protect model and knowledge admin APIs

This commit is contained in:
2026-07-14 05:18:54 +08:00
parent cd4e930832
commit 0c941ba578
4 changed files with 37 additions and 1 deletions
@@ -1,5 +1,7 @@
package org.dromara.aihr.controller;
import cn.dev33.satoken.annotation.SaCheckRole;
import cn.dev33.satoken.annotation.SaMode;
import lombok.RequiredArgsConstructor;
import org.dromara.aihr.domain.AihrModelDto.ChatRequest;
import org.dromara.aihr.domain.AihrModelDto.ChatResponse;
@@ -10,6 +12,7 @@ import org.dromara.aihr.domain.AihrModelDto.ProviderRequest;
import org.dromara.aihr.domain.AihrModelDto.ProviderResponse;
import org.dromara.aihr.domain.AihrModelDto.ProviderStatusRequest;
import org.dromara.aihr.service.AihrModelSeedService;
import org.dromara.common.core.constant.TenantConstants;
import org.dromara.common.core.domain.R;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PatchMapping;
@@ -30,54 +33,65 @@ import java.util.List;
@RequestMapping("/api/aihr/model")
public class AihrModelController {
private static final String HR_OPERATOR_ROLE = "hr_operator";
private final AihrModelSeedService modelSeedService;
@SaCheckRole(value = {TenantConstants.SUPER_ADMIN_ROLE_KEY, HR_OPERATOR_ROLE}, mode = SaMode.OR)
@GetMapping("/providers")
public R<List<ProviderResponse>> providers() {
return R.ok(modelSeedService.providers());
}
@SaCheckRole(value = {TenantConstants.SUPER_ADMIN_ROLE_KEY, HR_OPERATOR_ROLE}, mode = SaMode.OR)
@PostMapping("/providers")
public R<Void> createProvider(@RequestBody ProviderRequest request) {
modelSeedService.createProvider(request);
return R.ok();
}
@SaCheckRole(value = {TenantConstants.SUPER_ADMIN_ROLE_KEY, HR_OPERATOR_ROLE}, mode = SaMode.OR)
@PutMapping("/providers/{providerCode}")
public R<Void> updateProvider(@PathVariable String providerCode, @RequestBody ProviderRequest request) {
modelSeedService.updateProvider(providerCode, request);
return R.ok();
}
@SaCheckRole(value = {TenantConstants.SUPER_ADMIN_ROLE_KEY, HR_OPERATOR_ROLE}, mode = SaMode.OR)
@PatchMapping("/providers/{providerCode}/status")
public R<Void> updateProviderStatus(@PathVariable String providerCode, @RequestBody ProviderStatusRequest request) {
modelSeedService.updateProviderStatus(providerCode, request);
return R.ok();
}
@SaCheckRole(value = {TenantConstants.SUPER_ADMIN_ROLE_KEY, HR_OPERATOR_ROLE}, mode = SaMode.OR)
@GetMapping("/configs")
public R<List<ConfigResponse>> configs() {
return R.ok(modelSeedService.configs());
}
@SaCheckRole(value = {TenantConstants.SUPER_ADMIN_ROLE_KEY, HR_OPERATOR_ROLE}, mode = SaMode.OR)
@PostMapping("/configs")
public R<Void> createConfig(@RequestBody ConfigRequest request) {
modelSeedService.createConfig(request);
return R.ok();
}
@SaCheckRole(value = {TenantConstants.SUPER_ADMIN_ROLE_KEY, HR_OPERATOR_ROLE}, mode = SaMode.OR)
@PutMapping("/configs/{id}")
public R<Void> updateConfig(@PathVariable Long id, @RequestBody ConfigRequest request) {
modelSeedService.updateConfig(id, request);
return R.ok();
}
@SaCheckRole(value = {TenantConstants.SUPER_ADMIN_ROLE_KEY, HR_OPERATOR_ROLE}, mode = SaMode.OR)
@PatchMapping("/configs/{id}/enabled")
public R<Void> updateConfigEnabled(@PathVariable Long id, @RequestBody ConfigEnabledRequest request) {
modelSeedService.updateConfigEnabled(id, request);
return R.ok();
}
@SaCheckRole(value = {TenantConstants.SUPER_ADMIN_ROLE_KEY, HR_OPERATOR_ROLE}, mode = SaMode.OR)
@PostMapping("/chat")
public R<ChatResponse> chat(@RequestBody(required = false) ChatRequest request) {
return R.ok(modelSeedService.chat(request));
@@ -1,5 +1,7 @@
package org.dromara.aihr.controller;
import cn.dev33.satoken.annotation.SaCheckRole;
import cn.dev33.satoken.annotation.SaMode;
import lombok.RequiredArgsConstructor;
import org.dromara.aihr.domain.AihrSopDto.AnswerFeedbackItemResponse;
import org.dromara.aihr.domain.AihrSopDto.AnswerFeedbackRequest;
@@ -23,6 +25,7 @@ import org.dromara.aihr.domain.AihrSopDto.VectorIndexStatusResponse;
import org.dromara.aihr.domain.AihrSopDto.VectorizeResponse;
import org.dromara.aihr.service.AihrSopSeedService;
import org.dromara.aihr.service.AihrUploadQueueService;
import org.dromara.common.core.constant.TenantConstants;
import org.dromara.common.core.domain.R;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@@ -44,9 +47,12 @@ import java.util.List;
@RequestMapping("/api/knowledge")
public class AihrSopController {
private static final String HR_OPERATOR_ROLE = "hr_operator";
private final AihrSopSeedService sopSeedService;
private final AihrUploadQueueService uploadQueueService;
@SaCheckRole(value = {TenantConstants.SUPER_ADMIN_ROLE_KEY, HR_OPERATOR_ROLE}, mode = SaMode.OR)
@PostMapping("/doc/upload-async")
public R<UploadEnqueueResponse> uploadAsync(@RequestPart("file") MultipartFile file,
@RequestParam(value = "category", required = false) String category,
@@ -54,12 +60,14 @@ public class AihrSopController {
return R.ok(uploadQueueService.enqueue(file, category, batchId));
}
@SaCheckRole(value = {TenantConstants.SUPER_ADMIN_ROLE_KEY, HR_OPERATOR_ROLE}, mode = SaMode.OR)
@GetMapping("/doc/upload-items")
public R<List<UploadItemResponse>> uploadItems(@RequestParam(value = "batchId", required = false) String batchId,
@RequestParam(value = "limit", required = false, defaultValue = "50") int limit) {
return R.ok(uploadQueueService.items(batchId, limit));
}
@SaCheckRole(value = {TenantConstants.SUPER_ADMIN_ROLE_KEY, HR_OPERATOR_ROLE}, mode = SaMode.OR)
@PostMapping("/doc/upload-items/{id}/retry")
public R<UploadItemResponse> retryUploadItem(@PathVariable Long id) {
return R.ok(uploadQueueService.retry(id));
@@ -81,18 +89,21 @@ public class AihrSopController {
return R.ok(sopSeedService.answerFeedback(request));
}
@SaCheckRole(value = {TenantConstants.SUPER_ADMIN_ROLE_KEY, HR_OPERATOR_ROLE}, mode = SaMode.OR)
@GetMapping("/answer-feedback")
public R<List<AnswerFeedbackItemResponse>> answerFeedbackList(@RequestParam(value = "status", required = false, defaultValue = "待复核") String status,
@RequestParam(value = "limit", required = false, defaultValue = "50") int limit) {
return R.ok(sopSeedService.answerFeedbackList(status, limit));
}
@SaCheckRole(value = {TenantConstants.SUPER_ADMIN_ROLE_KEY, HR_OPERATOR_ROLE}, mode = SaMode.OR)
@PostMapping("/answer-feedback/{id}/review")
public R<AnswerFeedbackReviewResponse> reviewAnswerFeedback(@PathVariable Long id) {
AnswerFeedbackReviewResponse response = sopSeedService.reviewAnswerFeedback(id);
return response == null ? R.fail("答案反馈记录不存在") : R.ok(response);
}
@SaCheckRole(value = {TenantConstants.SUPER_ADMIN_ROLE_KEY, HR_OPERATOR_ROLE}, mode = SaMode.OR)
@PostMapping("/reviews/{id}")
public R<SopReviewResponse> review(@PathVariable Long id, @RequestBody(required = false) SopReviewRequest request) {
SopReviewResponse response = sopSeedService.reviewSearch(id, request);
@@ -104,46 +115,55 @@ public class AihrSopController {
return R.ok(sopSeedService.summaryCard(request));
}
@SaCheckRole(value = {TenantConstants.SUPER_ADMIN_ROLE_KEY, HR_OPERATOR_ROLE}, mode = SaMode.OR)
@PostMapping("/doc/upload")
public R<UploadResponse> uploadDoc(@RequestPart("file") MultipartFile file, @RequestParam("category") String category) {
return R.ok(sopSeedService.uploadDoc(file, category));
}
@SaCheckRole(value = {TenantConstants.SUPER_ADMIN_ROLE_KEY, HR_OPERATOR_ROLE}, mode = SaMode.OR)
@PostMapping("/doc/import-local")
public R<LocalImportResponse> importLocalDocs(@RequestBody LocalImportRequest request) {
return R.ok(sopSeedService.importLocalDocs(request));
}
@SaCheckRole(value = {TenantConstants.SUPER_ADMIN_ROLE_KEY, HR_OPERATOR_ROLE}, mode = SaMode.OR)
@PostMapping("/doc/import-local-task")
public R<LocalImportTaskResponse> startLocalImportTask(@RequestBody LocalImportRequest request) {
return R.ok(sopSeedService.startLocalImportTask(request));
}
@SaCheckRole(value = {TenantConstants.SUPER_ADMIN_ROLE_KEY, HR_OPERATOR_ROLE}, mode = SaMode.OR)
@PostMapping("/doc/vectorize-missing")
public R<VectorizeResponse> vectorizeMissing() {
return R.ok(sopSeedService.vectorizeMissing());
}
@SaCheckRole(value = {TenantConstants.SUPER_ADMIN_ROLE_KEY, HR_OPERATOR_ROLE}, mode = SaMode.OR)
@GetMapping("/doc/vector-index-status")
public R<VectorIndexStatusResponse> vectorIndexStatus() {
return R.ok(sopSeedService.vectorIndexStatus());
}
@SaCheckRole(value = {TenantConstants.SUPER_ADMIN_ROLE_KEY, HR_OPERATOR_ROLE}, mode = SaMode.OR)
@PostMapping("/doc/rebuild-vector-index")
public R<VectorizeResponse> rebuildVectorIndex() {
return R.ok(sopSeedService.rebuildVectorIndex());
}
@SaCheckRole(value = {TenantConstants.SUPER_ADMIN_ROLE_KEY, HR_OPERATOR_ROLE}, mode = SaMode.OR)
@GetMapping("/doc/import-tasks")
public R<List<LocalImportTaskResponse>> localImportTasks() {
return R.ok(sopSeedService.localImportTasks());
}
@SaCheckRole(value = {TenantConstants.SUPER_ADMIN_ROLE_KEY, HR_OPERATOR_ROLE}, mode = SaMode.OR)
@PostMapping("/doc/import-tasks/{id}/cancel")
public R<LocalImportTaskResponse> cancelLocalImportTask(@PathVariable Long id) {
return R.ok(sopSeedService.cancelLocalImportTask(id));
}
@SaCheckRole(value = {TenantConstants.SUPER_ADMIN_ROLE_KEY, HR_OPERATOR_ROLE}, mode = SaMode.OR)
@GetMapping("/processing/overview")
public R<ProcessingOverviewResponse> processingOverview() {
return R.ok(sopSeedService.processingOverview());