package com.kamco.cd.kamcoback.auth; import com.kamco.cd.kamcoback.auth.dto.AuthDto; import com.kamco.cd.kamcoback.auth.dto.AuthDto.Basic; import com.kamco.cd.kamcoback.auth.service.AuthService; import com.kamco.cd.kamcoback.config.api.ApiResponseDto; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; 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; @Tag(name = "관리자 관리", description = "관리자 관리 API") @RestController @RequiredArgsConstructor @RequestMapping("/api/auth") public class AuthApiController { private final AuthService authService; @Operation(summary = "관리자 등록", description = "관리자를 등록 합니다.") @ApiResponses( value = { @ApiResponse( responseCode = "201", description = "관리자 등록 성공", content = @Content( mediaType = "application/json", schema = @Schema(implementation = Long.class))), @ApiResponse(responseCode = "400", description = "잘못된 요청 데이터", content = @Content), @ApiResponse(responseCode = "404", description = "코드를 찾을 수 없음", content = @Content), @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) }) @PostMapping("/save") public ApiResponseDto save( @io.swagger.v3.oas.annotations.parameters.RequestBody( description = "관리자 정보", required = true, content = @Content( mediaType = "application/json", schema = @Schema(implementation = AuthDto.SaveReq.class))) @RequestBody @Valid AuthDto.SaveReq saveReq) { return ApiResponseDto.createOK(authService.save(saveReq).getId()); } @Operation(summary = "관리자 정보 수정", description = "관리자 정보를 수정 합니다.") @ApiResponses( value = { @ApiResponse( responseCode = "201", description = "관리자 정보 수정 성공", content = @Content( mediaType = "application/json", schema = @Schema(implementation = Long.class))), @ApiResponse(responseCode = "400", description = "잘못된 요청 데이터", content = @Content), @ApiResponse(responseCode = "404", description = "코드를 찾을 수 없음", content = @Content), @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) }) @PutMapping("/update/{id}") public ApiResponseDto update( @PathVariable Long id, @RequestBody AuthDto.SaveReq saveReq ) { return ApiResponseDto.createOK(authService.update(id, saveReq).getId()); } @Operation(summary = "관리자 정보 탈퇴처리", description = "관리자 정보를 탈퇴처리 합니다.") @ApiResponses( value = { @ApiResponse( responseCode = "201", description = "관리자 탈퇴처리 성공", content = @Content( mediaType = "application/json", schema = @Schema(implementation = Long.class))), @ApiResponse(responseCode = "400", description = "잘못된 요청 데이터", content = @Content), @ApiResponse(responseCode = "404", description = "코드를 찾을 수 없음", content = @Content), @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) }) @PutMapping("/withdrawal/{id}") public ApiResponseDto withdrawal(@PathVariable Long id) { return ApiResponseDto.deleteOk(authService.withdrawal(id).getId()); } @ApiResponses( value = { @ApiResponse( responseCode = "200", description = "조회 성공", content = @Content( mediaType = "application/json", schema = @Schema(implementation = AuthDto.Basic.class))), @ApiResponse(responseCode = "404", description = "코드를 찾을 수 없음", content = @Content), @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) }) @Operation(summary = "관리자 상세조회", description = "관리자 정보를 조회 합니다.") @GetMapping("/detail") public ApiResponseDto getDetail( @io.swagger.v3.oas.annotations.parameters.RequestBody( description = "관리자 목록 id", required = true) @RequestParam Long id) { return ApiResponseDto.ok(authService.getFindUserById(id)); } @Operation(summary = "관리자 목록", description = "관리자 목록 조회") @ApiResponses( value = { @ApiResponse( responseCode = "200", description = "검색 성공", content = @Content( mediaType = "application/json", schema = @Schema(implementation = Page.class))), @ApiResponse(responseCode = "400", description = "잘못된 검색 조건", content = @Content), @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) }) @GetMapping("/list") public ApiResponseDto> getUserList( @Parameter(description = "관리자 이름") @RequestParam(required = false) String userNm, @Parameter(description = "페이지 번호 (0부터 시작)", example = "0") @RequestParam(defaultValue = "0") int page, @Parameter(description = "페이지 크기", example = "20") @RequestParam(defaultValue = "20") int size, @Parameter(description = "정렬 조건 (형식: 필드명,방향)", example = "name,asc") @RequestParam(required = false) String sort ) { AuthDto.SearchReq searchReq = new AuthDto.SearchReq(userNm, page, size, sort); Page userList = authService.getUserList(searchReq); return ApiResponseDto.ok(userList); } }