From e8004a7da92be12b0a2cb96389d7c56ebd12b552 Mon Sep 17 00:00:00 2001 From: sdw086 Date: Thu, 28 May 2026 14:53:52 +0900 Subject: [PATCH] =?UTF-8?q?[api]=20SSO=20=EA=B4=80=EB=A6=AC=20=EC=9E=91?= =?UTF-8?q?=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/admin/sso/AdminSsoController.java | 127 +++++++++++++++ .../modules/admin/sso/dto/AdminSsoAddDto.java | 17 ++ .../admin/sso/dto/AdminSsoDeleteDto.java | 11 ++ .../admin/sso/dto/AdminSsoListDto.java | 12 ++ .../admin/sso/dto/AdminSsoModifyDto.java | 16 ++ .../admin/sso/form/AdminSsoAddForm.java | 47 ++++++ .../admin/sso/form/AdminSsoDeleteForm.java | 22 +++ .../admin/sso/form/AdminSsoListForm.java | 27 ++++ .../admin/sso/form/AdminSsoModifyForm.java | 53 ++++++ .../admin/sso/mapper/AdminSsoMapper.java | 30 ++++ .../admin/sso/service/AdminSsoService.java | 151 ++++++++++++++++++ .../modules/admin/sso/vo/AdminSsoAddVo.java | 21 +++ .../admin/sso/vo/AdminSsoDeleteVo.java | 18 +++ .../modules/admin/sso/vo/AdminSsoListVo.java | 16 ++ .../admin/sso/vo/AdminSsoModifyVo.java | 18 +++ .../modules/admin/sso/vo/AdminSsoViewVo.java | 45 ++++++ .../api/modules/admin/sso/vo/AdminSsoVo.java | 36 +++++ .../modules/front/auth/vo/SsoClientVo.java | 2 +- .../mapper/admin/sso/AdminSsoMapper.xml | 123 ++++++++++++++ 19 files changed, 791 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/alist/api/modules/admin/sso/AdminSsoController.java create mode 100644 src/main/java/com/alist/api/modules/admin/sso/dto/AdminSsoAddDto.java create mode 100644 src/main/java/com/alist/api/modules/admin/sso/dto/AdminSsoDeleteDto.java create mode 100644 src/main/java/com/alist/api/modules/admin/sso/dto/AdminSsoListDto.java create mode 100644 src/main/java/com/alist/api/modules/admin/sso/dto/AdminSsoModifyDto.java create mode 100644 src/main/java/com/alist/api/modules/admin/sso/form/AdminSsoAddForm.java create mode 100644 src/main/java/com/alist/api/modules/admin/sso/form/AdminSsoDeleteForm.java create mode 100644 src/main/java/com/alist/api/modules/admin/sso/form/AdminSsoListForm.java create mode 100644 src/main/java/com/alist/api/modules/admin/sso/form/AdminSsoModifyForm.java create mode 100644 src/main/java/com/alist/api/modules/admin/sso/mapper/AdminSsoMapper.java create mode 100644 src/main/java/com/alist/api/modules/admin/sso/service/AdminSsoService.java create mode 100644 src/main/java/com/alist/api/modules/admin/sso/vo/AdminSsoAddVo.java create mode 100644 src/main/java/com/alist/api/modules/admin/sso/vo/AdminSsoDeleteVo.java create mode 100644 src/main/java/com/alist/api/modules/admin/sso/vo/AdminSsoListVo.java create mode 100644 src/main/java/com/alist/api/modules/admin/sso/vo/AdminSsoModifyVo.java create mode 100644 src/main/java/com/alist/api/modules/admin/sso/vo/AdminSsoViewVo.java create mode 100644 src/main/java/com/alist/api/modules/admin/sso/vo/AdminSsoVo.java create mode 100644 src/main/resources/mapper/admin/sso/AdminSsoMapper.xml diff --git a/src/main/java/com/alist/api/modules/admin/sso/AdminSsoController.java b/src/main/java/com/alist/api/modules/admin/sso/AdminSsoController.java new file mode 100644 index 0000000..7f428db --- /dev/null +++ b/src/main/java/com/alist/api/modules/admin/sso/AdminSsoController.java @@ -0,0 +1,127 @@ +package com.alist.api.modules.admin.sso; + +import com.alist.api.common.response.ApiResponse; +import com.alist.api.common.response.ApiResponseCode; +import com.alist.api.modules.admin.sso.form.AdminSsoAddForm; +import com.alist.api.modules.admin.sso.form.AdminSsoDeleteForm; +import com.alist.api.modules.admin.sso.form.AdminSsoListForm; +import com.alist.api.modules.admin.sso.form.AdminSsoModifyForm; +import com.alist.api.modules.admin.sso.service.AdminSsoService; +import com.alist.api.modules.admin.sso.vo.*; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@Tag(name = "505. SSO 클라이언트 관리", description = "관리자 SSO 클라이언트 관리 API") +@RestController +@RequestMapping("/admin/sso") +public class AdminSsoController { + private final AdminSsoService adminSsoService; + + public AdminSsoController(AdminSsoService adminSsoService) { + this.adminSsoService = adminSsoService; + } + + @Operation( + summary = "SSO 클라이언트 목록 조회" + , description = "관리자가 SSO 클라이언트 목록을 검색 조건과 페이징으로 조회합니다." + ) + @GetMapping("/list") + public ResponseEntity> adminSsoList( + @ModelAttribute AdminSsoListForm adminSsoListForm + ) { + AdminSsoListVo adminSsoListVo = adminSsoService.selectAdminSsoList(adminSsoListForm.toDto()); + + if (adminSsoListVo.getSsoList() == null || adminSsoListVo.getSsoList().isEmpty()) { + return ApiResponse.entity(adminSsoListVo, ApiResponseCode.CODE_2003); + } + + return ApiResponse.entity(adminSsoListVo, ApiResponseCode.CODE_2001, "SSO 클라이언트"); + } + + @Operation( + summary = "SSO 클라이언트 상세 조회" + , description = "관리자가 SSO 클라이언트 PK 기준으로 상세 정보를 조회합니다." + ) + @GetMapping("/view") + public ResponseEntity> adminSsoView( + @RequestParam Integer ssoClientIdx + ) { + AdminSsoViewVo adminSsoViewVo = adminSsoService.selectAdminSsoView(ssoClientIdx); + + if (adminSsoViewVo == null) { + return ApiResponse.entity((AdminSsoViewVo) null, ApiResponseCode.CODE_2003); + } + + return ApiResponse.entity(adminSsoViewVo, ApiResponseCode.CODE_2001, "SSO 클라이언트"); + } + + @Operation( + summary = "SSO 클라이언트 등록" + , description = "관리자가 SSO 클라이언트를 등록합니다. CLIENT_ID가 중복되면 등록하지 않습니다." + ) + @PostMapping("/add") + public ResponseEntity> adminSsoAdd( + @Valid @RequestBody AdminSsoAddForm adminSsoAddForm + ) { + AdminSsoAddVo adminSsoAddVo = adminSsoService.insertAdminSsoAdd(adminSsoAddForm.toDto()); + + if (adminSsoAddVo.getResultCode() == 401) { + return ApiResponse.entity(adminSsoAddVo, ApiResponseCode.CODE_401); + } + + if (!adminSsoAddVo.isProcessed()) { + return ApiResponse.entity(adminSsoAddVo, ApiResponseCode.CODE_2004, "SSO 클라이언트"); + } + + return ApiResponse.entity(adminSsoAddVo, ApiResponseCode.CODE_2002, "SSO 클라이언트"); + } + + @Operation( + summary = "SSO 클라이언트 수정" + , description = "관리자가 SSO 클라이언트 PK 기준으로 클라이언트 ID, 이름, redirect URI 등 기본 정보를 수정합니다." + ) + @PutMapping("/modify") + public ResponseEntity> adminSsoModify( + @Valid @RequestBody AdminSsoModifyForm adminSsoModifyForm + ) { + AdminSsoModifyVo adminSsoModifyVo = adminSsoService.updateAdminSsoModify(adminSsoModifyForm.toDto()); + + if (adminSsoModifyVo.getResultCode() == 401) { + return ApiResponse.entity(adminSsoModifyVo, ApiResponseCode.CODE_401); + } + + if (adminSsoModifyVo.getResultCode() == 2004) { + return ApiResponse.entity(adminSsoModifyVo, ApiResponseCode.CODE_2004, "SSO 클라이언트"); + } + + if (!adminSsoModifyVo.isProcessed()) { + return ApiResponse.entity(adminSsoModifyVo, ApiResponseCode.CODE_2003); + } + + return ApiResponse.entity(adminSsoModifyVo, ApiResponseCode.CODE_2005, "SSO 클라이언트 수정"); + } + + @Operation( + summary = "SSO 클라이언트 삭제" + , description = "관리자가 SSO 클라이언트 PK 기준으로 삭제 처리합니다. 실제 삭제가 아닌 DEL_YN 변경 방식입니다." + ) + @PatchMapping("/delete") + public ResponseEntity> adminSsoDelete( + @Valid @RequestBody AdminSsoDeleteForm adminSsoDeleteForm + ) { + AdminSsoDeleteVo adminSsoDeleteVo = adminSsoService.updateAdminSsoDelete(adminSsoDeleteForm.toDto()); + + if (adminSsoDeleteVo.getResultCode() == 401) { + return ApiResponse.entity(adminSsoDeleteVo, ApiResponseCode.CODE_401); + } + + if (!adminSsoDeleteVo.isProcessed()) { + return ApiResponse.entity(adminSsoDeleteVo, ApiResponseCode.CODE_2003); + } + + return ApiResponse.entity(adminSsoDeleteVo, ApiResponseCode.CODE_2005, "SSO 클라이언트 삭제"); + } +} diff --git a/src/main/java/com/alist/api/modules/admin/sso/dto/AdminSsoAddDto.java b/src/main/java/com/alist/api/modules/admin/sso/dto/AdminSsoAddDto.java new file mode 100644 index 0000000..ac7f2e4 --- /dev/null +++ b/src/main/java/com/alist/api/modules/admin/sso/dto/AdminSsoAddDto.java @@ -0,0 +1,17 @@ +package com.alist.api.modules.admin.sso.dto; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class AdminSsoAddDto { + private Integer ssoClientIdx; + private String clientId; + private String clientName; + private String redirectUri; + private String memo; + private String useYn; + private Integer createMember; + private Integer updateMember; +} diff --git a/src/main/java/com/alist/api/modules/admin/sso/dto/AdminSsoDeleteDto.java b/src/main/java/com/alist/api/modules/admin/sso/dto/AdminSsoDeleteDto.java new file mode 100644 index 0000000..c935a77 --- /dev/null +++ b/src/main/java/com/alist/api/modules/admin/sso/dto/AdminSsoDeleteDto.java @@ -0,0 +1,11 @@ +package com.alist.api.modules.admin.sso.dto; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class AdminSsoDeleteDto { + private Integer ssoClientIdx; + private Integer updateMember; +} diff --git a/src/main/java/com/alist/api/modules/admin/sso/dto/AdminSsoListDto.java b/src/main/java/com/alist/api/modules/admin/sso/dto/AdminSsoListDto.java new file mode 100644 index 0000000..3029523 --- /dev/null +++ b/src/main/java/com/alist/api/modules/admin/sso/dto/AdminSsoListDto.java @@ -0,0 +1,12 @@ +package com.alist.api.modules.admin.sso.dto; + +import com.alist.api.common.paging.PageRequest; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class AdminSsoListDto extends PageRequest { + private String keyword; + private String useYn; +} diff --git a/src/main/java/com/alist/api/modules/admin/sso/dto/AdminSsoModifyDto.java b/src/main/java/com/alist/api/modules/admin/sso/dto/AdminSsoModifyDto.java new file mode 100644 index 0000000..bc11818 --- /dev/null +++ b/src/main/java/com/alist/api/modules/admin/sso/dto/AdminSsoModifyDto.java @@ -0,0 +1,16 @@ +package com.alist.api.modules.admin.sso.dto; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class AdminSsoModifyDto { + private Integer ssoClientIdx; + private String clientId; + private String clientName; + private String redirectUri; + private String memo; + private String useYn; + private Integer updateMember; +} diff --git a/src/main/java/com/alist/api/modules/admin/sso/form/AdminSsoAddForm.java b/src/main/java/com/alist/api/modules/admin/sso/form/AdminSsoAddForm.java new file mode 100644 index 0000000..2f36a9a --- /dev/null +++ b/src/main/java/com/alist/api/modules/admin/sso/form/AdminSsoAddForm.java @@ -0,0 +1,47 @@ +package com.alist.api.modules.admin.sso.form; + +import com.alist.api.modules.admin.sso.dto.AdminSsoAddDto; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.Size; +import lombok.Getter; +import lombok.Setter; + +@Schema(description = "관리자 SSO 클라이언트 등록 요청") +@Getter +@Setter +public class AdminSsoAddForm { + @NotBlank + @Size(max = 100) + @Schema(description = "클라이언트 식별자", example = "a-campus-client", requiredMode = Schema.RequiredMode.REQUIRED) + private String clientId; + + @NotBlank + @Size(max = 200) + @Schema(description = "클라이언트명", example = "a-campus.co.kr", requiredMode = Schema.RequiredMode.REQUIRED) + private String clientName; + + @NotBlank + @Size(max = 500) + @Schema(description = "허용 redirect URI", example = "https://a-campus.co.kr/auth/callback", requiredMode = Schema.RequiredMode.REQUIRED) + private String redirectUri; + + @Size(max = 500) + @Schema(description = "비고", example = "운영") + private String memo; + + @Pattern(regexp = "Y|N") + @Schema(description = "사용 여부. Y: 사용, N: 미사용. 미입력 시 Y", example = "Y") + private String useYn; + + public AdminSsoAddDto toDto() { + AdminSsoAddDto adminSsoAddDto = new AdminSsoAddDto(); + adminSsoAddDto.setClientId(clientId.trim()); + adminSsoAddDto.setClientName(clientName.trim()); + adminSsoAddDto.setRedirectUri(redirectUri.trim()); + adminSsoAddDto.setMemo(memo == null ? null : memo.trim()); + adminSsoAddDto.setUseYn(useYn == null || useYn.trim().isEmpty() ? "Y" : useYn.trim()); + return adminSsoAddDto; + } +} diff --git a/src/main/java/com/alist/api/modules/admin/sso/form/AdminSsoDeleteForm.java b/src/main/java/com/alist/api/modules/admin/sso/form/AdminSsoDeleteForm.java new file mode 100644 index 0000000..dd393ac --- /dev/null +++ b/src/main/java/com/alist/api/modules/admin/sso/form/AdminSsoDeleteForm.java @@ -0,0 +1,22 @@ +package com.alist.api.modules.admin.sso.form; + +import com.alist.api.modules.admin.sso.dto.AdminSsoDeleteDto; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Getter; +import lombok.Setter; + +@Schema(description = "관리자 SSO 클라이언트 삭제 요청") +@Getter +@Setter +public class AdminSsoDeleteForm { + @NotNull + @Schema(description = "SSO 클라이언트 PK", example = "19", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer ssoClientIdx; + + public AdminSsoDeleteDto toDto() { + AdminSsoDeleteDto adminSsoDeleteDto = new AdminSsoDeleteDto(); + adminSsoDeleteDto.setSsoClientIdx(ssoClientIdx); + return adminSsoDeleteDto; + } +} diff --git a/src/main/java/com/alist/api/modules/admin/sso/form/AdminSsoListForm.java b/src/main/java/com/alist/api/modules/admin/sso/form/AdminSsoListForm.java new file mode 100644 index 0000000..24e9db7 --- /dev/null +++ b/src/main/java/com/alist/api/modules/admin/sso/form/AdminSsoListForm.java @@ -0,0 +1,27 @@ +package com.alist.api.modules.admin.sso.form; + +import com.alist.api.common.paging.PageRequest; +import com.alist.api.modules.admin.sso.dto.AdminSsoListDto; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +@Schema(description = "관리자 SSO 클라이언트 목록 검색 조건") +@Getter +@Setter +public class AdminSsoListForm extends PageRequest { + @Schema(description = "검색어. 클라이언트 ID, 클라이언트명, redirect URI, 비고를 대상으로 검색합니다.", example = "client") + private String keyword; + + @Schema(description = "사용 여부. Y: 사용, N: 미사용", example = "Y") + private String useYn; + + public AdminSsoListDto toDto() { + AdminSsoListDto adminSsoListDto = new AdminSsoListDto(); + adminSsoListDto.setPage(getPage()); + adminSsoListDto.setSize(getSize()); + adminSsoListDto.setKeyword(keyword == null ? null : keyword.trim()); + adminSsoListDto.setUseYn(useYn == null ? null : useYn.trim()); + return adminSsoListDto; + } +} diff --git a/src/main/java/com/alist/api/modules/admin/sso/form/AdminSsoModifyForm.java b/src/main/java/com/alist/api/modules/admin/sso/form/AdminSsoModifyForm.java new file mode 100644 index 0000000..98f5d5b --- /dev/null +++ b/src/main/java/com/alist/api/modules/admin/sso/form/AdminSsoModifyForm.java @@ -0,0 +1,53 @@ +package com.alist.api.modules.admin.sso.form; + +import com.alist.api.modules.admin.sso.dto.AdminSsoModifyDto; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.Size; +import lombok.Getter; +import lombok.Setter; + +@Schema(description = "관리자 SSO 클라이언트 수정 요청") +@Getter +@Setter +public class AdminSsoModifyForm { + @NotNull + @Schema(description = "SSO 클라이언트 PK", example = "19", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer ssoClientIdx; + + @NotBlank + @Size(max = 100) + @Schema(description = "클라이언트 식별자", example = "a-campus-client", requiredMode = Schema.RequiredMode.REQUIRED) + private String clientId; + + @NotBlank + @Size(max = 200) + @Schema(description = "클라이언트명", example = "a-campus.co.kr", requiredMode = Schema.RequiredMode.REQUIRED) + private String clientName; + + @NotBlank + @Size(max = 500) + @Schema(description = "허용 redirect URI", example = "https://a-campus.co.kr/auth/callback", requiredMode = Schema.RequiredMode.REQUIRED) + private String redirectUri; + + @Size(max = 500) + @Schema(description = "비고", example = "운영") + private String memo; + + @Pattern(regexp = "Y|N") + @Schema(description = "사용 여부. Y: 사용, N: 미사용. 미입력 시 Y", example = "Y") + private String useYn; + + public AdminSsoModifyDto toDto() { + AdminSsoModifyDto adminSsoModifyDto = new AdminSsoModifyDto(); + adminSsoModifyDto.setSsoClientIdx(ssoClientIdx); + adminSsoModifyDto.setClientId(clientId.trim()); + adminSsoModifyDto.setClientName(clientName.trim()); + adminSsoModifyDto.setRedirectUri(redirectUri.trim()); + adminSsoModifyDto.setMemo(memo == null ? null : memo.trim()); + adminSsoModifyDto.setUseYn(useYn == null || useYn.trim().isEmpty() ? "Y" : useYn.trim()); + return adminSsoModifyDto; + } +} diff --git a/src/main/java/com/alist/api/modules/admin/sso/mapper/AdminSsoMapper.java b/src/main/java/com/alist/api/modules/admin/sso/mapper/AdminSsoMapper.java new file mode 100644 index 0000000..ad4728e --- /dev/null +++ b/src/main/java/com/alist/api/modules/admin/sso/mapper/AdminSsoMapper.java @@ -0,0 +1,30 @@ +package com.alist.api.modules.admin.sso.mapper; + +import com.alist.api.modules.admin.sso.dto.AdminSsoAddDto; +import com.alist.api.modules.admin.sso.dto.AdminSsoDeleteDto; +import com.alist.api.modules.admin.sso.dto.AdminSsoListDto; +import com.alist.api.modules.admin.sso.dto.AdminSsoModifyDto; +import com.alist.api.modules.admin.sso.vo.AdminSsoViewVo; +import com.alist.api.modules.admin.sso.vo.AdminSsoVo; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface AdminSsoMapper { + int selectAdminSsoCount(AdminSsoListDto adminSsoListDto); + + List selectAdminSsoList(AdminSsoListDto adminSsoListDto); + + AdminSsoViewVo selectAdminSsoView(Integer ssoClientIdx); + + int selectAdminSsoDuplicateCount(AdminSsoAddDto adminSsoAddDto); + + int insertAdminSsoAdd(AdminSsoAddDto adminSsoAddDto); + + int selectAdminSsoModifyDuplicateCount(AdminSsoModifyDto adminSsoModifyDto); + + int updateAdminSsoModify(AdminSsoModifyDto adminSsoModifyDto); + + int updateAdminSsoDelete(AdminSsoDeleteDto adminSsoDeleteDto); +} diff --git a/src/main/java/com/alist/api/modules/admin/sso/service/AdminSsoService.java b/src/main/java/com/alist/api/modules/admin/sso/service/AdminSsoService.java new file mode 100644 index 0000000..92b72e6 --- /dev/null +++ b/src/main/java/com/alist/api/modules/admin/sso/service/AdminSsoService.java @@ -0,0 +1,151 @@ +package com.alist.api.modules.admin.sso.service; + +import com.alist.api.common.utils.SecurityUtil; +import com.alist.api.modules.admin.auth.mapper.AdminAuthMapper; +import com.alist.api.modules.admin.auth.vo.AdminAuthLoginVo; +import com.alist.api.modules.admin.sso.dto.AdminSsoAddDto; +import com.alist.api.modules.admin.sso.dto.AdminSsoDeleteDto; +import com.alist.api.modules.admin.sso.dto.AdminSsoListDto; +import com.alist.api.modules.admin.sso.dto.AdminSsoModifyDto; +import com.alist.api.modules.admin.sso.mapper.AdminSsoMapper; +import com.alist.api.modules.admin.sso.vo.*; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +public class AdminSsoService { + private final AdminSsoMapper adminSsoMapper; + private final AdminAuthMapper adminAuthMapper; + + public AdminSsoService(AdminSsoMapper adminSsoMapper, AdminAuthMapper adminAuthMapper) { + this.adminSsoMapper = adminSsoMapper; + this.adminAuthMapper = adminAuthMapper; + } + + @Transactional(readOnly = true) + public AdminSsoListVo selectAdminSsoList(AdminSsoListDto adminSsoListDto) { + int totalCount = adminSsoMapper.selectAdminSsoCount(adminSsoListDto); + List ssoList = adminSsoMapper.selectAdminSsoList(adminSsoListDto); + + AdminSsoListVo adminSsoListVo = new AdminSsoListVo(); + adminSsoListVo.setSsoList(ssoList); + adminSsoListVo.setPaging(adminSsoListDto, totalCount); + + return adminSsoListVo; + } + + @Transactional(readOnly = true) + public AdminSsoViewVo selectAdminSsoView(Integer ssoClientIdx) { + return adminSsoMapper.selectAdminSsoView(ssoClientIdx); + } + + @Transactional + public AdminSsoAddVo insertAdminSsoAdd(AdminSsoAddDto adminSsoAddDto) { + AdminSsoAddVo adminSsoAddVo = new AdminSsoAddVo(); + + Integer loginUserTokenIdx = SecurityUtil.getLoginUserTokenIdx(); + + if (loginUserTokenIdx == null) { + adminSsoAddVo.setResultCode(401); + adminSsoAddVo.setProcessed(false); + return adminSsoAddVo; + } + + AdminAuthLoginVo adminAuthLoginVo = adminAuthMapper.selectAdminTokenByUserTokenIdx(loginUserTokenIdx); + + if (adminAuthLoginVo == null || adminAuthLoginVo.getUserIdx() == null) { + adminSsoAddVo.setResultCode(401); + adminSsoAddVo.setProcessed(false); + return adminSsoAddVo; + } + + adminSsoAddDto.setCreateMember(adminAuthLoginVo.getUserIdx()); + adminSsoAddDto.setUpdateMember(adminAuthLoginVo.getUserIdx()); + + int duplicateCount = adminSsoMapper.selectAdminSsoDuplicateCount(adminSsoAddDto); + + if (duplicateCount > 0) { + adminSsoAddVo.setResultCode(2004); + adminSsoAddVo.setProcessed(false); + return adminSsoAddVo; + } + + int insertCount = adminSsoMapper.insertAdminSsoAdd(adminSsoAddDto); + + adminSsoAddVo.setResultCode(2002); + adminSsoAddVo.setProcessed(insertCount > 0); + adminSsoAddVo.setSsoClientIdx(adminSsoAddDto.getSsoClientIdx()); + + return adminSsoAddVo; + } + + @Transactional + public AdminSsoModifyVo updateAdminSsoModify(AdminSsoModifyDto adminSsoModifyDto) { + AdminSsoModifyVo adminSsoModifyVo = new AdminSsoModifyVo(); + + Integer loginUserTokenIdx = SecurityUtil.getLoginUserTokenIdx(); + + if (loginUserTokenIdx == null) { + adminSsoModifyVo.setResultCode(401); + adminSsoModifyVo.setProcessed(false); + return adminSsoModifyVo; + } + + AdminAuthLoginVo adminAuthLoginVo = adminAuthMapper.selectAdminTokenByUserTokenIdx(loginUserTokenIdx); + + if (adminAuthLoginVo == null || adminAuthLoginVo.getUserIdx() == null) { + adminSsoModifyVo.setResultCode(401); + adminSsoModifyVo.setProcessed(false); + return adminSsoModifyVo; + } + + adminSsoModifyDto.setUpdateMember(adminAuthLoginVo.getUserIdx()); + + int duplicateCount = adminSsoMapper.selectAdminSsoModifyDuplicateCount(adminSsoModifyDto); + + if (duplicateCount > 0) { + adminSsoModifyVo.setResultCode(2004); + adminSsoModifyVo.setProcessed(false); + return adminSsoModifyVo; + } + + int updateCount = adminSsoMapper.updateAdminSsoModify(adminSsoModifyDto); + + adminSsoModifyVo.setResultCode(2005); + adminSsoModifyVo.setProcessed(updateCount > 0); + + return adminSsoModifyVo; + } + + @Transactional + public AdminSsoDeleteVo updateAdminSsoDelete(AdminSsoDeleteDto adminSsoDeleteDto) { + AdminSsoDeleteVo adminSsoDeleteVo = new AdminSsoDeleteVo(); + + Integer loginUserTokenIdx = SecurityUtil.getLoginUserTokenIdx(); + + if (loginUserTokenIdx == null) { + adminSsoDeleteVo.setResultCode(401); + adminSsoDeleteVo.setProcessed(false); + return adminSsoDeleteVo; + } + + AdminAuthLoginVo adminAuthLoginVo = adminAuthMapper.selectAdminTokenByUserTokenIdx(loginUserTokenIdx); + + if (adminAuthLoginVo == null || adminAuthLoginVo.getUserIdx() == null) { + adminSsoDeleteVo.setResultCode(401); + adminSsoDeleteVo.setProcessed(false); + return adminSsoDeleteVo; + } + + adminSsoDeleteDto.setUpdateMember(adminAuthLoginVo.getUserIdx()); + + int updateCount = adminSsoMapper.updateAdminSsoDelete(adminSsoDeleteDto); + + adminSsoDeleteVo.setResultCode(2005); + adminSsoDeleteVo.setProcessed(updateCount > 0); + + return adminSsoDeleteVo; + } +} diff --git a/src/main/java/com/alist/api/modules/admin/sso/vo/AdminSsoAddVo.java b/src/main/java/com/alist/api/modules/admin/sso/vo/AdminSsoAddVo.java new file mode 100644 index 0000000..cba0e29 --- /dev/null +++ b/src/main/java/com/alist/api/modules/admin/sso/vo/AdminSsoAddVo.java @@ -0,0 +1,21 @@ +package com.alist.api.modules.admin.sso.vo; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +@Schema(description = "관리자 SSO 클라이언트 등록 응답") +@Getter +@Setter +public class AdminSsoAddVo { + @Schema(description = "SSO 클라이언트 등록 여부", example = "true") + private boolean processed; + + @Schema(description = "등록된 SSO 클라이언트 PK", example = "19") + private Integer ssoClientIdx; + + @JsonIgnore + @Schema(hidden = true) + private int resultCode; +} diff --git a/src/main/java/com/alist/api/modules/admin/sso/vo/AdminSsoDeleteVo.java b/src/main/java/com/alist/api/modules/admin/sso/vo/AdminSsoDeleteVo.java new file mode 100644 index 0000000..282fb45 --- /dev/null +++ b/src/main/java/com/alist/api/modules/admin/sso/vo/AdminSsoDeleteVo.java @@ -0,0 +1,18 @@ +package com.alist.api.modules.admin.sso.vo; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +@Schema(description = "관리자 SSO 클라이언트 삭제 응답") +@Getter +@Setter +public class AdminSsoDeleteVo { + @Schema(description = "SSO 클라이언트 삭제 여부", example = "true") + private boolean processed; + + @JsonIgnore + @Schema(hidden = true) + private int resultCode; +} diff --git a/src/main/java/com/alist/api/modules/admin/sso/vo/AdminSsoListVo.java b/src/main/java/com/alist/api/modules/admin/sso/vo/AdminSsoListVo.java new file mode 100644 index 0000000..1ff5cf8 --- /dev/null +++ b/src/main/java/com/alist/api/modules/admin/sso/vo/AdminSsoListVo.java @@ -0,0 +1,16 @@ +package com.alist.api.modules.admin.sso.vo; + +import com.alist.api.common.paging.PageResponse; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Schema(description = "관리자 SSO 클라이언트 목록 조회 응답") +@Getter +@Setter +public class AdminSsoListVo extends PageResponse { + @Schema(description = "SSO 클라이언트 목록") + private List ssoList; +} diff --git a/src/main/java/com/alist/api/modules/admin/sso/vo/AdminSsoModifyVo.java b/src/main/java/com/alist/api/modules/admin/sso/vo/AdminSsoModifyVo.java new file mode 100644 index 0000000..5a2612c --- /dev/null +++ b/src/main/java/com/alist/api/modules/admin/sso/vo/AdminSsoModifyVo.java @@ -0,0 +1,18 @@ +package com.alist.api.modules.admin.sso.vo; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +@Schema(description = "관리자 SSO 클라이언트 수정 응답") +@Getter +@Setter +public class AdminSsoModifyVo { + @Schema(description = "SSO 클라이언트 수정 여부", example = "true") + private boolean processed; + + @JsonIgnore + @Schema(hidden = true) + private int resultCode; +} diff --git a/src/main/java/com/alist/api/modules/admin/sso/vo/AdminSsoViewVo.java b/src/main/java/com/alist/api/modules/admin/sso/vo/AdminSsoViewVo.java new file mode 100644 index 0000000..c014622 --- /dev/null +++ b/src/main/java/com/alist/api/modules/admin/sso/vo/AdminSsoViewVo.java @@ -0,0 +1,45 @@ +package com.alist.api.modules.admin.sso.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDateTime; + +@Schema(description = "관리자 SSO 클라이언트 상세 조회 응답") +@Getter +@Setter +public class AdminSsoViewVo { + @Schema(description = "SSO 클라이언트 PK", example = "19") + private Integer ssoClientIdx; + + @Schema(description = "클라이언트 식별자", example = "a-campus-client") + private String clientId; + + @Schema(description = "클라이언트명", example = "a-campus.co.kr") + private String clientName; + + @Schema(description = "허용 redirect URI", example = "https://a-campus.co.kr/") + private String redirectUri; + + @Schema(description = "비고", example = "운영") + private String memo; + + @Schema(description = "사용 여부", example = "Y") + private String useYn; + + @Schema(description = "삭제 여부", example = "N") + private String delYn; + + @Schema(description = "등록일시", example = "2026-04-06 17:28:56") + private LocalDateTime createDate; + + @Schema(description = "등록자", example = "1") + private Integer createMember; + + @Schema(description = "수정일시", example = "2026-04-06 17:28:56") + private LocalDateTime updateDate; + + @Schema(description = "마지막 수정자", example = "1") + private Integer updateMember; +} diff --git a/src/main/java/com/alist/api/modules/admin/sso/vo/AdminSsoVo.java b/src/main/java/com/alist/api/modules/admin/sso/vo/AdminSsoVo.java new file mode 100644 index 0000000..a01b4b7 --- /dev/null +++ b/src/main/java/com/alist/api/modules/admin/sso/vo/AdminSsoVo.java @@ -0,0 +1,36 @@ +package com.alist.api.modules.admin.sso.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDateTime; + +@Schema(description = "관리자 SSO 클라이언트 목록 항목") +@Getter +@Setter +public class AdminSsoVo { + @Schema(description = "SSO 클라이언트 PK", example = "19") + private Integer ssoClientIdx; + + @Schema(description = "클라이언트 식별자", example = "a-campus-client") + private String clientId; + + @Schema(description = "클라이언트명", example = "https://a-campus.co.kr/") + private String clientName; + + @Schema(description = "허용 redirect URI", example = "https://a-campus.co.kr/") + private String redirectUri; + + @Schema(description = "비고", example = "운영") + private String memo; + + @Schema(description = "사용 여부", example = "Y") + private String useYn; + + @Schema(description = "생성일", example = "2026-04-06 17:28:56") + private LocalDateTime createDate; + + @Schema(description = "수정일", example = "2026-04-06 17:28:56") + private LocalDateTime updateDate; +} diff --git a/src/main/java/com/alist/api/modules/front/auth/vo/SsoClientVo.java b/src/main/java/com/alist/api/modules/front/auth/vo/SsoClientVo.java index ba96084..4999f86 100644 --- a/src/main/java/com/alist/api/modules/front/auth/vo/SsoClientVo.java +++ b/src/main/java/com/alist/api/modules/front/auth/vo/SsoClientVo.java @@ -4,7 +4,7 @@ import lombok.Getter; @Getter public class SsoClientVo { - private Long ssoClientIdx; + private Integer ssoClientIdx; private String clientId; private String clientName; private String redirectUri; diff --git a/src/main/resources/mapper/admin/sso/AdminSsoMapper.xml b/src/main/resources/mapper/admin/sso/AdminSsoMapper.xml new file mode 100644 index 0000000..a0b3fd5 --- /dev/null +++ b/src/main/resources/mapper/admin/sso/AdminSsoMapper.xml @@ -0,0 +1,123 @@ + + + + + + FROM ALISTLMS.SSO_CLIENT SC + WHERE SC.DEL_YN = 'N' + + AND ( + SC.CLIENT_ID LIKE CONCAT('%', #{keyword}, '%') + OR SC.CLIENT_NAME LIKE CONCAT('%', #{keyword}, '%') + OR SC.REDIRECT_URI LIKE CONCAT('%', #{keyword}, '%') + OR SC.MEMO LIKE CONCAT('%', #{keyword}, '%') + ) + + + AND SC.USE_YN = #{useYn} + + + + + + + + + + + + + + + /*AdminSsoMapper.insertAdminSsoAdd*/ + INSERT INTO ALISTLMS.SSO_CLIENT ( + CLIENT_ID + , CLIENT_NAME + , REDIRECT_URI + , MEMO + , USE_YN + , DEL_YN + , CREATE_MEMBER + , UPDATE_MEMBER + ) VALUES ( + #{clientId} + , #{clientName} + , #{redirectUri} + , #{memo} + , #{useYn} + , 'N' + , #{createMember} + , #{updateMember} + ) + + + + + /*AdminSsoMapper.updateAdminSsoModify*/ + UPDATE ALISTLMS.SSO_CLIENT + SET CLIENT_ID = #{clientId} + , CLIENT_NAME = #{clientName} + , REDIRECT_URI = #{redirectUri} + , MEMO = #{memo} + , USE_YN = #{useYn} + , UPDATE_MEMBER = #{updateMember} + WHERE SSO_CLIENT_IDX = #{ssoClientIdx} + AND DEL_YN = 'N' + + + + /*AdminSsoMapper.updateAdminSsoDelete*/ + UPDATE ALISTLMS.SSO_CLIENT + SET DEL_YN = 'Y' + , UPDATE_MEMBER = #{updateMember} + WHERE SSO_CLIENT_IDX = #{ssoClientIdx} + AND DEL_YN = 'N' + + \ No newline at end of file