package com.dms.api.v1; import com.dms.common.ApiResponse; import com.dms.common.Payloads; import com.dms.security.AuthRequired; import com.dms.service.IpEntryService; import com.dms.service.OrganizationService; import jakarta.servlet.http.HttpServletRequest; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; /** 组织接口,对齐 backend/dms/api/v1/organizations.py。 */ @RestController @RequestMapping("/api/v1/organizations") public class OrganizationsController { private final OrganizationService organizationService; private final IpEntryService ipEntryService; private final com.dms.config.DmsProperties properties; public OrganizationsController(OrganizationService organizationService, IpEntryService ipEntryService, com.dms.config.DmsProperties properties) { this.organizationService = organizationService; this.ipEntryService = ipEntryService; this.properties = properties; } /** * 高级检索·提供单位选项(契约1.55):机构树第 N 级启用机构清单, * N 由 DMS_SEARCH_ORG_FILTER_LEVEL 配置(缺省 2,二级机构); * 任意登录用户可调。 */ @AuthRequired @GetMapping("/filter-options") public ApiResponse filterOptions() { return ApiResponse.ok(organizationService.filterOptions( properties.searchOrgFilterLevel())); } /** * 机构树(契约1.45):只读接口不再要求ADMIN类别,任意登录用户可调—— * 普通用户(USER)返回本人部门为根的子树(无部门空树),ADMIN类别 * 维持既有管理范围裁剪。 */ @AuthRequired @GetMapping("/tree") public ApiResponse tree(@RequestParam(required = false) String keyword, @RequestParam(required = false) String status) { return ApiResponse.ok(organizationService.organizationTree(keyword, status)); } @AuthRequired(requireAdmin = true) @PostMapping public ResponseEntity> create(@RequestBody Object body, HttpServletRequest request) { return ResponseEntity.status(HttpStatus.CREATED) .body(ApiResponse.ok(organizationService.create(body, request))); } /** 对齐 reorder_organizations_route(契约1.27):机构树同级拖动重排。 */ @AuthRequired(requireAdmin = true) @PutMapping("/reorder") public ApiResponse reorder(@RequestBody Object body, HttpServletRequest request) { return ApiResponse.ok(organizationService.reorder(body, request)); } @AuthRequired(requireAdmin = true) @PutMapping("/{id}") public ApiResponse update(@PathVariable String id, @RequestBody Object body, HttpServletRequest request) { return ApiResponse.ok(organizationService.update( Payloads.pathId(id), body, request)); } @AuthRequired(requireAdmin = true) @DeleteMapping("/{id}") public ApiResponse delete(@PathVariable String id, @RequestParam(required = false) String rowVersion, HttpServletRequest request) { return ApiResponse.ok(organizationService.delete( Payloads.pathId(id), Payloads.deleteRowVersion(rowVersion), request)); } @AuthRequired(requireAdmin = true) @GetMapping("/{id}/ip-assignments") public ApiResponse ipAssignments(@PathVariable String id) { return ApiResponse.ok(ipEntryService.listOrgIpAssignments(Payloads.pathId(id))); } @AuthRequired(requireAdmin = true) @PutMapping("/{id}/ip-assignments") public ApiResponse updateIpAssignments(@PathVariable String id, @RequestBody Object body, HttpServletRequest request) { return ApiResponse.ok(ipEntryService.updateOrgIpAssignments( Payloads.pathId(id), body, request)); } }