[api] SSO 관리 작업

This commit is contained in:
2026-05-28 14:53:52 +09:00
parent b0646a0d3d
commit e8004a7da9
19 changed files with 791 additions and 1 deletions
@@ -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<ApiResponse<AdminSsoListVo>> 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<ApiResponse<AdminSsoViewVo>> 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<ApiResponse<AdminSsoAddVo>> 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<ApiResponse<AdminSsoModifyVo>> 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<ApiResponse<AdminSsoDeleteVo>> 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 클라이언트 삭제");
}
}
@@ -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;
}
@@ -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;
}
@@ -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;
}
@@ -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;
}
@@ -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;
}
}
@@ -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;
}
}
@@ -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;
}
}
@@ -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;
}
}
@@ -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<AdminSsoVo> 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);
}
@@ -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<AdminSsoVo> 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;
}
}
@@ -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;
}
@@ -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;
}
@@ -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<AdminSsoVo> ssoList;
}
@@ -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;
}
@@ -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;
}
@@ -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;
}
@@ -4,7 +4,7 @@ import lombok.Getter;
@Getter @Getter
public class SsoClientVo { public class SsoClientVo {
private Long ssoClientIdx; private Integer ssoClientIdx;
private String clientId; private String clientId;
private String clientName; private String clientName;
private String redirectUri; private String redirectUri;
@@ -0,0 +1,123 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.alist.api.modules.admin.sso.mapper.AdminSsoMapper">
<sql id="adminSsoWhere">
FROM ALISTLMS.SSO_CLIENT SC
WHERE SC.DEL_YN = 'N'
<if test="keyword != null and keyword != ''">
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}, '%')
)
</if>
<if test="useYn != null and useYn != ''">
AND SC.USE_YN = #{useYn}
</if>
</sql>
<select id="selectAdminSsoCount" resultType="int">
/*AdminSsoMapper.selectAdminSsoCount*/
SELECT COUNT(*)
<include refid="adminSsoWhere"/>
</select>
<select id="selectAdminSsoList" resultType="com.alist.api.modules.admin.sso.vo.AdminSsoVo">
/*AdminSsoMapper.selectAdminSsoList*/
SELECT SC.SSO_CLIENT_IDX
, SC.CLIENT_ID
, SC.CLIENT_NAME
, SC.REDIRECT_URI
, SC.MEMO
, SC.USE_YN
, SC.CREATE_DATE
, SC.UPDATE_DATE
<include refid="adminSsoWhere"/>
ORDER BY SC.SSO_CLIENT_IDX DESC
LIMIT #{limit}
OFFSET #{offset}
</select>
<select id="selectAdminSsoView" resultType="com.alist.api.modules.admin.sso.vo.AdminSsoViewVo">
/*AdminSsoMapper.selectAdminSsoView*/
SELECT SC.SSO_CLIENT_IDX
, SC.CLIENT_ID
, SC.CLIENT_NAME
, SC.REDIRECT_URI
, SC.MEMO
, SC.USE_YN
, SC.DEL_YN
, SC.CREATE_DATE
, SC.CREATE_MEMBER
, SC.UPDATE_DATE
, SC.UPDATE_MEMBER
FROM ALISTLMS.SSO_CLIENT SC
WHERE SC.SSO_CLIENT_IDX = #{ssoClientIdx}
AND SC.DEL_YN = 'N'
</select>
<select id="selectAdminSsoDuplicateCount" resultType="int">
/*AdminSsoMapper.selectAdminSsoDuplicateCount*/
SELECT COUNT(*)
FROM ALISTLMS.SSO_CLIENT SC
WHERE SC.DEL_YN = 'N'
AND SC.CLIENT_ID = #{clientId}
</select>
<select id="selectAdminSsoModifyDuplicateCount" resultType="int">
/*AdminSsoMapper.selectAdminSsoModifyDuplicateCount*/
SELECT COUNT(*)
FROM ALISTLMS.SSO_CLIENT SC
WHERE SC.DEL_YN = 'N'
AND SC.CLIENT_ID = #{clientId}
AND SC.SSO_CLIENT_IDX != #{ssoClientIdx}
</select>
<insert id="insertAdminSsoAdd" parameterType="com.alist.api.modules.admin.sso.dto.AdminSsoAddDto" useGeneratedKeys="true" keyProperty="ssoClientIdx">
/*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}
)
</insert>
<update id="updateAdminSsoModify" parameterType="com.alist.api.modules.admin.sso.dto.AdminSsoModifyDto">
/*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'
</update>
<update id="updateAdminSsoDelete" parameterType="com.alist.api.modules.admin.sso.dto.AdminSsoDeleteDto">
/*AdminSsoMapper.updateAdminSsoDelete*/
UPDATE ALISTLMS.SSO_CLIENT
SET DEL_YN = 'Y'
, UPDATE_MEMBER = #{updateMember}
WHERE SSO_CLIENT_IDX = #{ssoClientIdx}
AND DEL_YN = 'N'
</update>
</mapper>