package com.vega.hrm.controller; import com.vega.hrm.core.models.responses.BaseResponse; import com.vega.hrm.request.function.CreateFunctionRequest; import com.vega.hrm.request.function.UpdateFunctionRequest; import com.vega.hrm.response.FunctionDto; import com.vega.hrm.service.FunctionService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import java.util.List; import lombok.RequiredArgsConstructor; 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.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; @RestController @RequestMapping("api/auth/function") @RequiredArgsConstructor @Tag(name = "Auth - Function/Menu", description = "Quản lý menu và chức năng hệ thống") public class FunctionController { private final FunctionService functionService; @PostMapping("/create") @Operation(summary = "Tạo menu mới", description = "Tạo menu/chức năng mới trong hệ thống.") public ResponseEntity> createFunction( @Valid @RequestBody CreateFunctionRequest request, @Parameter(description = "Người tạo (từ token)") @RequestParam(defaultValue = "admin") String currentUser ) { return ResponseEntity.ok(functionService.createFunction(request, currentUser)); } @PutMapping("/update") @Operation(summary = "Cập nhật menu", description = "Cập nhật thông tin menu/chức năng.") public ResponseEntity> updateFunction(@Valid @RequestBody UpdateFunctionRequest request) { return ResponseEntity.ok(functionService.updateFunction(request)); } @DeleteMapping("/delete") @Operation(summary = "Xóa menu", description = "Xóa menu/chức năng (không thể xóa nếu có menu con).") public ResponseEntity> deleteFunction( @Parameter(description = "ID của menu") @RequestParam String functionId ) { return ResponseEntity.ok(functionService.deleteFunction(functionId)); } @GetMapping("/list") @Operation(summary = "Lấy danh sách menu", description = "Lấy tất cả menu dạng flat list.") public ResponseEntity>> getAllFunctions() { return ResponseEntity.ok(functionService.getAllFunctions()); } @GetMapping("/tree") @Operation(summary = "Lấy cây menu", description = "Lấy menu dạng cây phân cấp (parent-children).") public ResponseEntity>> getMenuTree() { return ResponseEntity.ok(functionService.getMenuTree()); } @GetMapping("/detail") @Operation(summary = "Lấy chi tiết menu", description = "Lấy thông tin chi tiết của menu/chức năng.") public ResponseEntity> getFunctionDetail( @Parameter(description = "ID của menu") @RequestParam String functionId ) { return ResponseEntity.ok(functionService.getFunctionDetail(functionId)); } }