guardia-hrm/backend/src/main/java/com/zioinfo/hrm/admin/AdminController.java
2026-06-16 21:45:08 +09:00

83 lines
3.0 KiB
Java

package com.zioinfo.hrm.admin;
import com.zioinfo.hrm.auth.HrmUser;
import com.zioinfo.hrm.common.ApiResponse;
import com.zioinfo.hrm.common.AuthSupport;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.Authentication;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("/api/hrm/admin")
@RequiredArgsConstructor
public class AdminController {
private final AdminMapper adminMapper;
private final PasswordEncoder passwordEncoder;
@GetMapping("/users")
public ApiResponse<List<HrmUser>> users() {
List<HrmUser> users = adminMapper.findAllUsers();
users.forEach(u -> u.setPasswordHash(null)); // 비밀번호 해시 미노출
return ApiResponse.ok(users);
}
@PostMapping("/users")
public ApiResponse<Void> createUser(@RequestBody HrmUser user) {
user.setPasswordHash(passwordEncoder.encode(user.getPasswordHash()));
user.setActive(true);
adminMapper.insertUser(user);
return ApiResponse.ok(null);
}
@PutMapping("/users/{id}")
public ApiResponse<Void> updateUser(@PathVariable Long id, @RequestBody HrmUser user) {
user.setId(id);
if (user.getPasswordHash() != null && !user.getPasswordHash().isEmpty()) {
user.setPasswordHash(passwordEncoder.encode(user.getPasswordHash()));
}
adminMapper.updateUser(user);
return ApiResponse.ok(null);
}
@PatchMapping("/users/{id}/active")
public ApiResponse<Void> toggleActive(@PathVariable Long id, @RequestParam boolean active) {
adminMapper.updateUserActive(id, active);
return ApiResponse.ok(null);
}
@GetMapping("/audit")
public ApiResponse<Map<String, Object>> audit(
@RequestParam(required = false) String actor,
@RequestParam(required = false) String action,
@RequestParam(defaultValue = "1") int page,
@RequestParam(defaultValue = "50") int size) {
int offset = (page - 1) * size;
List<Map<String, Object>> rows = adminMapper.findAuditLogs(actor, action, offset, size);
long total = adminMapper.countAuditLogs(actor, action);
Map<String, Object> r = new HashMap<>();
r.put("items", rows);
r.put("total", total);
return ApiResponse.ok(r);
}
@GetMapping("/settings")
public ApiResponse<List<Map<String, Object>>> settings() {
return ApiResponse.ok(adminMapper.findSettings());
}
@PutMapping("/settings/{key}")
public ApiResponse<Void> upsertSetting(@PathVariable String key,
@RequestBody Map<String, Object> body, Authentication auth) {
body.put("key", key);
body.put("updatedBy", AuthSupport.actor(auth));
adminMapper.upsertSetting(body);
return ApiResponse.ok(null);
}
}