diff --git a/src/main/java/com/alist/api/config/cache/CorsAllowedOriginsCache.java b/src/main/java/com/alist/api/config/cache/CorsCache.java similarity index 66% rename from src/main/java/com/alist/api/config/cache/CorsAllowedOriginsCache.java rename to src/main/java/com/alist/api/config/cache/CorsCache.java index b7d7a2c..62c3150 100644 --- a/src/main/java/com/alist/api/config/cache/CorsAllowedOriginsCache.java +++ b/src/main/java/com/alist/api/config/cache/CorsCache.java @@ -1,9 +1,8 @@ package com.alist.api.config.cache; -import com.alist.api.modules.cors.mapper.CorsAllowMapper; -import com.alist.api.modules.cors.vo.CorsOriginCacheVo; +import com.alist.api.modules.cors.mapper.CorsMapper; +import com.alist.api.modules.cors.vo.CorsCacheVo; import jakarta.annotation.PostConstruct; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -14,13 +13,16 @@ import java.util.stream.Collectors; @Slf4j @Component -@RequiredArgsConstructor -public class CorsAllowedOriginsCache { +public class CorsCache { - private final CorsAllowMapper corsAllowMapper; + private final CorsMapper corsMapper; // Thread-safe List (volatile로 가시성 보장) - private volatile List allowedOrigins = new ArrayList<>(); + private volatile List corsOriginList = new ArrayList<>(); + + public CorsCache(CorsMapper corsMapper) { + this.corsMapper = corsMapper; + } /** * 서버 시작 시 DB에서 전체 CORS 목록 로딩 @@ -28,7 +30,7 @@ public class CorsAllowedOriginsCache { @PostConstruct public void loadFromDatabase() { refresh(); - log.info("CORS allowed origins loaded from database"); + log.info("CORS allowed origins loaded..."); } /** @@ -36,19 +38,19 @@ public class CorsAllowedOriginsCache { */ public synchronized void refresh() { try { - List origins = corsAllowMapper.selectCorsAllowedCacheList() + List corsOriginList = corsMapper.selectCorsCacheList() .stream() .filter(Objects::nonNull) - .map(CorsOriginCacheVo::getAllowedOrigin) + .map(CorsCacheVo::getAllowedOrigin) .filter(Objects::nonNull) .map(String::trim) .filter(origin -> !origin.isEmpty()) .distinct() .collect(Collectors.toList()); - this.allowedOrigins = origins; + this.corsOriginList = corsOriginList; - log.info("CORS cache refreshed. Total origins: {}", origins.size()); + log.info("CORS cache refreshed. Total origins: {}", corsOriginList.size()); } catch (Exception e) { log.error("Failed to refresh CORS cache", e); @@ -60,7 +62,7 @@ public class CorsAllowedOriginsCache { * @return 허용 도메인 리스트 */ public List getAllowedOrigins() { - return new ArrayList<>(allowedOrigins); + return new ArrayList<>(corsOriginList); } /** @@ -68,6 +70,6 @@ public class CorsAllowedOriginsCache { * @return 캐시 상태 정보 */ public List getCacheStatus() { - return new ArrayList<>(allowedOrigins); + return new ArrayList<>(corsOriginList); } } diff --git a/src/main/java/com/alist/api/config/filter/DynamicCorsFilter.java b/src/main/java/com/alist/api/config/filter/DynamicCorsFilter.java index 514f0f3..dd74be1 100644 --- a/src/main/java/com/alist/api/config/filter/DynamicCorsFilter.java +++ b/src/main/java/com/alist/api/config/filter/DynamicCorsFilter.java @@ -1,6 +1,6 @@ package com.alist.api.config.filter; -import com.alist.api.config.cache.CorsAllowedOriginsCache; +import com.alist.api.config.cache.CorsCache; import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; @@ -21,7 +21,7 @@ import java.util.List; @RequiredArgsConstructor public class DynamicCorsFilter extends OncePerRequestFilter { - private final CorsAllowedOriginsCache corsCache; + private final CorsCache corsCache; @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { diff --git a/src/main/java/com/alist/api/modules/cors/CorsAllowController.java b/src/main/java/com/alist/api/modules/cors/CorsAllowController.java deleted file mode 100644 index b225849..0000000 --- a/src/main/java/com/alist/api/modules/cors/CorsAllowController.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.alist.api.modules.cors; - -import com.alist.api.common.response.ApiResponse; -import com.alist.api.common.response.ApiResponseCode; -import com.alist.api.config.cache.CorsAllowedOriginsCache; -import com.alist.api.modules.cors.form.CorsOriginAddForm; -import com.alist.api.modules.cors.form.CorsOriginDeleteForm; -import com.alist.api.modules.cors.form.CorsOriginSearchForm; -import com.alist.api.modules.cors.service.CorsAllowService; -import com.alist.api.modules.cors.vo.CorsOriginAddVo; -import com.alist.api.modules.cors.vo.CorsOriginDeleteVo; -import com.alist.api.modules.cors.vo.CorsOriginListVo; -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.*; - -import java.util.List; - -@Tag(name = "901. CRS 갱신", description = "테스트 CORS 설정 관리 API") -@RestController -@RequestMapping("/cors") -public class CorsAllowController { - private final CorsAllowedOriginsCache corsCache; - private final CorsAllowService corsAllowService; - - public CorsAllowController(CorsAllowedOriginsCache corsCache, CorsAllowService corsAllowService) { - this.corsCache = corsCache; - this.corsAllowService = corsAllowService; - } - - @Operation( - summary = "CORS 허용 도메인 목록 조회", - description = "DB에 등록된 CORS 허용 도메인 목록을 검색 조건과 페이징으로 조회합니다." - ) - @GetMapping("/list") - public ResponseEntity> corsAllowedList( - @ModelAttribute CorsOriginSearchForm corsOriginSearchForm - ) { - CorsOriginListVo result = corsAllowService.selectCorsAllowedList(corsOriginSearchForm.toCorsOriginSearchDto()); - - if (result.getCorsOriginList() == null || result.getCorsOriginList().isEmpty()) { - return ApiResponse.entity(result, ApiResponseCode.CODE_2003); - } - - return ApiResponse.entity(result, ApiResponseCode.CODE_2001, "CORS 허용 도메인"); - } - - @Operation( - summary = "CORS 허용 도메인 추가", - description = "CORS 허용 도메인을 추가합니다. 추가 후 CORS 캐시를 갱신합니다." - ) - @PostMapping("/add") - public ResponseEntity> addCorsAllowedOrigin( - @Valid @RequestBody CorsOriginAddForm corsOriginAddForm - ) { - CorsOriginAddVo result = corsAllowService.insertCorsAllowedOrigin(corsOriginAddForm.toCorsOriginAddDto()); - - if (!result.isCorsOriginAdded()) { - return ApiResponse.entity(result, ApiResponseCode.CODE_2004, "CORS 허용 도메인"); - } - - corsCache.refresh(); - return ApiResponse.entity(result, ApiResponseCode.CODE_2002, "CORS 허용 도메인"); - } - - @Operation( - summary = "CORS 화이트리스트 갱신", - description = "DB에서 CORS 허용 도메인 목록을 다시 로딩합니다. DB에 도메인 추가 후 호출하세요." - ) - @PostMapping("/reload") - public ResponseEntity>> reloadCors() { - corsCache.refresh(); - List cacheStatus = corsCache.getCacheStatus(); - return ApiResponse.entity(cacheStatus, ApiResponseCode.CODE_200); - } - - @Operation( - summary = "CORS 허용 도메인 삭제", - description = "CORS 허용 도메인 PK 기준으로 삭제 처리합니다. 실제 삭제가 아닌 del_yn 변경 방식입니다." - ) - @PatchMapping("/delete") - public ResponseEntity> deleteCorsAllowedOrigin( - @Valid @RequestBody CorsOriginDeleteForm corsOriginDeleteForm - ) { - CorsOriginDeleteVo result = corsAllowService.deleteCorsAllowedOrigin(corsOriginDeleteForm.toCorsOriginDeleteDto()); - - if (!result.isCorsOriginDeleted()) { - return ApiResponse.entity(result, ApiResponseCode.CODE_2003); - } - - corsCache.refresh(); - return ApiResponse.entity(result, ApiResponseCode.CODE_2005, "CORS 허용 도메인 삭제"); - } -} diff --git a/src/main/java/com/alist/api/modules/cors/CorsController.java b/src/main/java/com/alist/api/modules/cors/CorsController.java new file mode 100644 index 0000000..74407b1 --- /dev/null +++ b/src/main/java/com/alist/api/modules/cors/CorsController.java @@ -0,0 +1,96 @@ +package com.alist.api.modules.cors; + +import com.alist.api.common.response.ApiResponse; +import com.alist.api.common.response.ApiResponseCode; +import com.alist.api.config.cache.CorsCache; +import com.alist.api.modules.cors.form.CorsAddForm; +import com.alist.api.modules.cors.form.CorsDeleteForm; +import com.alist.api.modules.cors.form.CorsListForm; +import com.alist.api.modules.cors.service.CorsService; +import com.alist.api.modules.cors.vo.CorsAddVo; +import com.alist.api.modules.cors.vo.CorsDeleteVo; +import com.alist.api.modules.cors.vo.CorsListVo; +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.*; + +import java.util.List; + +@Tag(name = "901. CRS 갱신", description = "테스트 CORS 설정 관리 API") +@RestController +@RequestMapping("/cors") +public class CorsController { + private final CorsCache corsCache; + private final CorsService corsService; + + public CorsController(CorsCache corsCache, CorsService corsService) { + this.corsCache = corsCache; + this.corsService = corsService; + } + + @Operation( + summary = "CORS 허용 도메인 목록 조회" + , description = "DB에 등록된 CORS 허용 도메인 목록을 검색 조건과 페이징으로 조회합니다." + ) + @GetMapping("/list") + public ResponseEntity> corsList( + @ModelAttribute CorsListForm corsListForm + ) { + CorsListVo corsListVo = corsService.selectCorsList(corsListForm.toDto()); + + if (corsListVo.getCorsList() == null || corsListVo.getCorsList().isEmpty()) { + return ApiResponse.entity(corsListVo, ApiResponseCode.CODE_2003); + } + + return ApiResponse.entity(corsListVo, ApiResponseCode.CODE_2001, "CORS 허용 도메인"); + } + + @Operation( + summary = "CORS 허용 도메인 추가" + , description = "CORS 허용 도메인을 추가합니다. 추가 후 CORS 캐시를 갱신합니다." + ) + @PostMapping("/add") + public ResponseEntity> corsAdd( + @Valid @RequestBody CorsAddForm corsAddForm + ) { + CorsAddVo corsAddVo = corsService.insertCorsAdd(corsAddForm.toDto()); + + if (!corsAddVo.isProcessed()) { + return ApiResponse.entity(corsAddVo, ApiResponseCode.CODE_2004, "CORS 허용 도메인"); + } + + corsCache.refresh(); + return ApiResponse.entity(corsAddVo, ApiResponseCode.CODE_2002, "CORS 허용 도메인"); + } + + @Operation( + summary = "CORS 허용 도메인 삭제" + , description = "CORS 허용 도메인 PK 기준으로 삭제 처리합니다. 실제 삭제가 아닌 del_yn 변경 방식입니다." + ) + @PatchMapping("/delete") + public ResponseEntity> corsDelete( + @Valid @RequestBody CorsDeleteForm corsDeleteForm + ) { + CorsDeleteVo corsDeleteVo = corsService.updateCorsDelete(corsDeleteForm.toDto()); + + if (!corsDeleteVo.isProcessed()) { + return ApiResponse.entity(corsDeleteVo, ApiResponseCode.CODE_2003); + } + + corsCache.refresh(); + return ApiResponse.entity(corsDeleteVo, ApiResponseCode.CODE_2005, "CORS 허용 도메인 삭제"); + } + + @Operation( + summary = "CORS 화이트리스트 갱신" + , description = "DB에서 CORS 허용 도메인 목록을 다시 로딩합니다. DB에 도메인 추가 후 호출하세요." + ) + @PostMapping("/reload") + public ResponseEntity>> corsReload() { + corsCache.refresh(); + List cacheStatus = corsCache.getCacheStatus(); + return ApiResponse.entity(cacheStatus, ApiResponseCode.CODE_200); + } +} diff --git a/src/main/java/com/alist/api/modules/cors/dto/CorsOriginAddDto.java b/src/main/java/com/alist/api/modules/cors/dto/CorsAddDto.java similarity index 81% rename from src/main/java/com/alist/api/modules/cors/dto/CorsOriginAddDto.java rename to src/main/java/com/alist/api/modules/cors/dto/CorsAddDto.java index 26b52c8..05165b9 100644 --- a/src/main/java/com/alist/api/modules/cors/dto/CorsOriginAddDto.java +++ b/src/main/java/com/alist/api/modules/cors/dto/CorsAddDto.java @@ -5,6 +5,6 @@ import lombok.Setter; @Getter @Setter -public class CorsOriginAddDto { +public class CorsAddDto { private String allowedOrigin; } diff --git a/src/main/java/com/alist/api/modules/cors/dto/CorsOriginDeleteDto.java b/src/main/java/com/alist/api/modules/cors/dto/CorsDeleteDto.java similarity index 79% rename from src/main/java/com/alist/api/modules/cors/dto/CorsOriginDeleteDto.java rename to src/main/java/com/alist/api/modules/cors/dto/CorsDeleteDto.java index 799e5bd..340dc75 100644 --- a/src/main/java/com/alist/api/modules/cors/dto/CorsOriginDeleteDto.java +++ b/src/main/java/com/alist/api/modules/cors/dto/CorsDeleteDto.java @@ -5,6 +5,6 @@ import lombok.Setter; @Getter @Setter -public class CorsOriginDeleteDto { +public class CorsDeleteDto { private Integer corsIdx; } diff --git a/src/main/java/com/alist/api/modules/cors/dto/CorsOriginSearchDto.java b/src/main/java/com/alist/api/modules/cors/dto/CorsListDto.java similarity index 76% rename from src/main/java/com/alist/api/modules/cors/dto/CorsOriginSearchDto.java rename to src/main/java/com/alist/api/modules/cors/dto/CorsListDto.java index b397233..a40497d 100644 --- a/src/main/java/com/alist/api/modules/cors/dto/CorsOriginSearchDto.java +++ b/src/main/java/com/alist/api/modules/cors/dto/CorsListDto.java @@ -6,6 +6,6 @@ import lombok.Setter; @Getter @Setter -public class CorsOriginSearchDto extends PageRequest { +public class CorsListDto extends PageRequest { private String keyword; } diff --git a/src/main/java/com/alist/api/modules/cors/form/CorsOriginAddForm.java b/src/main/java/com/alist/api/modules/cors/form/CorsAddForm.java similarity index 59% rename from src/main/java/com/alist/api/modules/cors/form/CorsOriginAddForm.java rename to src/main/java/com/alist/api/modules/cors/form/CorsAddForm.java index 785f957..4853b5f 100644 --- a/src/main/java/com/alist/api/modules/cors/form/CorsOriginAddForm.java +++ b/src/main/java/com/alist/api/modules/cors/form/CorsAddForm.java @@ -1,6 +1,6 @@ package com.alist.api.modules.cors.form; -import com.alist.api.modules.cors.dto.CorsOriginAddDto; +import com.alist.api.modules.cors.dto.CorsAddDto; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.Pattern; @@ -10,19 +10,19 @@ import lombok.Setter; @Schema(description = "CORS 허용 도메인 추가 요청 폼") @Getter @Setter -public class CorsOriginAddForm { +public class CorsAddForm { @Schema(description = "CORS 허용 도메인", example = "https://admin.alist.co.kr", requiredMode = Schema.RequiredMode.REQUIRED) @NotBlank(message = "CORS 허용 도메인은 필수입니다.") @Pattern( - regexp = "^(\\*|https?://[A-Za-z0-9.-]+(:[0-9]{1,5})?)$", - message = "CORS 허용 도메인은 http(s)://domain 또는 * 형식이어야 합니다." + regexp = "^(\\*|https?://[A-Za-z0-9.-]+(:[0-9]{1,5})?)$" + , message = "CORS 허용 도메인은 http(s)://domain 또는 * 형식이어야 합니다." ) private String allowedOrigin; - public CorsOriginAddDto toCorsOriginAddDto() { - CorsOriginAddDto corsOriginAddDto = new CorsOriginAddDto(); - corsOriginAddDto.setAllowedOrigin(allowedOrigin == null ? null : allowedOrigin.trim()); - return corsOriginAddDto; + public CorsAddDto toDto() { + CorsAddDto corsAddDto = new CorsAddDto(); + corsAddDto.setAllowedOrigin(allowedOrigin == null ? null : allowedOrigin.trim()); + return corsAddDto; } } diff --git a/src/main/java/com/alist/api/modules/cors/form/CorsOriginDeleteForm.java b/src/main/java/com/alist/api/modules/cors/form/CorsDeleteForm.java similarity index 60% rename from src/main/java/com/alist/api/modules/cors/form/CorsOriginDeleteForm.java rename to src/main/java/com/alist/api/modules/cors/form/CorsDeleteForm.java index ef53c84..3d54fd1 100644 --- a/src/main/java/com/alist/api/modules/cors/form/CorsOriginDeleteForm.java +++ b/src/main/java/com/alist/api/modules/cors/form/CorsDeleteForm.java @@ -1,6 +1,6 @@ package com.alist.api.modules.cors.form; -import com.alist.api.modules.cors.dto.CorsOriginDeleteDto; +import com.alist.api.modules.cors.dto.CorsDeleteDto; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotNull; import lombok.Getter; @@ -9,15 +9,15 @@ import lombok.Setter; @Schema(description = "CORS 허용 도메인 삭제 요청 폼") @Getter @Setter -public class CorsOriginDeleteForm { +public class CorsDeleteForm { @Schema(description = "CORS 허용 도메인 PK", example = "1", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "CORS 허용 도메인 PK는 필수입니다.") private Integer corsIdx; - public CorsOriginDeleteDto toCorsOriginDeleteDto() { - CorsOriginDeleteDto corsOriginDeleteDto = new CorsOriginDeleteDto(); - corsOriginDeleteDto.setCorsIdx(corsIdx); - return corsOriginDeleteDto; + public CorsDeleteDto toDto() { + CorsDeleteDto corsDeleteDto = new CorsDeleteDto(); + corsDeleteDto.setCorsIdx(corsIdx); + return corsDeleteDto; } } diff --git a/src/main/java/com/alist/api/modules/cors/form/CorsListForm.java b/src/main/java/com/alist/api/modules/cors/form/CorsListForm.java new file mode 100644 index 0000000..d66784c --- /dev/null +++ b/src/main/java/com/alist/api/modules/cors/form/CorsListForm.java @@ -0,0 +1,24 @@ +package com.alist.api.modules.cors.form; + +import com.alist.api.common.paging.PageRequest; +import com.alist.api.modules.cors.dto.CorsListDto; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +@Schema(description = "CORS 허용 도메인 목록 검색 조건") +@Getter +@Setter +public class CorsListForm extends PageRequest { + + @Schema(description = "검색어. CORS 허용 도메인을 대상으로 검색합니다.", example = "alist.co.kr") + private String keyword; + + public CorsListDto toDto() { + CorsListDto corsListDto = new CorsListDto(); + corsListDto.setPage(getPage()); + corsListDto.setSize(getSize()); + corsListDto.setKeyword(keyword); + return corsListDto; + } +} diff --git a/src/main/java/com/alist/api/modules/cors/form/CorsOriginSearchForm.java b/src/main/java/com/alist/api/modules/cors/form/CorsOriginSearchForm.java deleted file mode 100644 index d958192..0000000 --- a/src/main/java/com/alist/api/modules/cors/form/CorsOriginSearchForm.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.alist.api.modules.cors.form; - -import com.alist.api.common.paging.PageRequest; -import com.alist.api.modules.cors.dto.CorsOriginSearchDto; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Getter; -import lombok.Setter; - -@Schema(description = "CORS 허용 도메인 목록 검색 조건") -@Getter -@Setter -public class CorsOriginSearchForm extends PageRequest { - - @Schema(description = "검색어. CORS 허용 도메인을 대상으로 검색합니다.", example = "alist.co.kr") - private String keyword; - - public CorsOriginSearchDto toCorsOriginSearchDto() { - CorsOriginSearchDto corsOriginSearchDto = new CorsOriginSearchDto(); - corsOriginSearchDto.setPage(getPage()); - corsOriginSearchDto.setSize(getSize()); - corsOriginSearchDto.setKeyword(keyword); - return corsOriginSearchDto; - } -} diff --git a/src/main/java/com/alist/api/modules/cors/mapper/CorsAllowMapper.java b/src/main/java/com/alist/api/modules/cors/mapper/CorsAllowMapper.java deleted file mode 100644 index 55fec2c..0000000 --- a/src/main/java/com/alist/api/modules/cors/mapper/CorsAllowMapper.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.alist.api.modules.cors.mapper; - -import com.alist.api.modules.cors.dto.CorsOriginAddDto; -import com.alist.api.modules.cors.dto.CorsOriginDeleteDto; -import com.alist.api.modules.cors.dto.CorsOriginSearchDto; -import com.alist.api.modules.cors.vo.CorsOriginCacheVo; -import com.alist.api.modules.cors.vo.CorsOriginVo; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -@Mapper -public interface CorsAllowMapper { - List selectCorsAllowedCacheList(); - - List selectCorsAllowedList(CorsOriginSearchDto corsOriginSearchDto); - - int selectCorsAllowedCount(CorsOriginSearchDto corsOriginSearchDto); - - int selectCorsAllowedOriginCount(String allowedOrigin); - - int insertCorsAllowedOrigin(CorsOriginAddDto corsOriginAddDto); - - int deleteCorsAllowedOrigin(CorsOriginDeleteDto corsOriginDeleteDto); -} diff --git a/src/main/java/com/alist/api/modules/cors/mapper/CorsMapper.java b/src/main/java/com/alist/api/modules/cors/mapper/CorsMapper.java new file mode 100644 index 0000000..afbb061 --- /dev/null +++ b/src/main/java/com/alist/api/modules/cors/mapper/CorsMapper.java @@ -0,0 +1,25 @@ +package com.alist.api.modules.cors.mapper; + +import com.alist.api.modules.cors.dto.CorsAddDto; +import com.alist.api.modules.cors.dto.CorsDeleteDto; +import com.alist.api.modules.cors.dto.CorsListDto; +import com.alist.api.modules.cors.vo.CorsCacheVo; +import com.alist.api.modules.cors.vo.CorsVo; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface CorsMapper { + List selectCorsCacheList(); + + List selectCorsList(CorsListDto corsListDto); + + int selectCorsListCount(CorsListDto corsListDto); + + int selectCorsCount(String allowedOrigin); + + int insertCorsAdd(CorsAddDto corsAddDto); + + int updateCorsDelete(CorsDeleteDto corsDeleteDto); +} diff --git a/src/main/java/com/alist/api/modules/cors/service/CorsAllowService.java b/src/main/java/com/alist/api/modules/cors/service/CorsAllowService.java deleted file mode 100644 index 3475fa4..0000000 --- a/src/main/java/com/alist/api/modules/cors/service/CorsAllowService.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.alist.api.modules.cors.service; - -import com.alist.api.modules.cors.dto.CorsOriginAddDto; -import com.alist.api.modules.cors.dto.CorsOriginDeleteDto; -import com.alist.api.modules.cors.dto.CorsOriginSearchDto; -import com.alist.api.modules.cors.mapper.CorsAllowMapper; -import com.alist.api.modules.cors.vo.CorsOriginAddVo; -import com.alist.api.modules.cors.vo.CorsOriginDeleteVo; -import com.alist.api.modules.cors.vo.CorsOriginListVo; -import com.alist.api.modules.cors.vo.CorsOriginVo; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; - -@Service -public class CorsAllowService { - private final CorsAllowMapper corsAllowMapper; - - public CorsAllowService(CorsAllowMapper corsAllowMapper) { - this.corsAllowMapper = corsAllowMapper; - } - - @Transactional(readOnly = true) - public CorsOriginListVo selectCorsAllowedList(CorsOriginSearchDto corsOriginSearchDto) { - int totalCount = corsAllowMapper.selectCorsAllowedCount(corsOriginSearchDto); - List corsOriginList = corsAllowMapper.selectCorsAllowedList(corsOriginSearchDto); - - CorsOriginListVo result = new CorsOriginListVo(); - result.setCorsOriginList(corsOriginList); - result.setPaging(corsOriginSearchDto, totalCount); - - return result; - } - - @Transactional - public CorsOriginAddVo insertCorsAllowedOrigin(CorsOriginAddDto corsOriginAddDto) { - int duplicateCount = corsAllowMapper.selectCorsAllowedOriginCount(corsOriginAddDto.getAllowedOrigin()); - - CorsOriginAddVo result = new CorsOriginAddVo(); - if (duplicateCount > 0) { - result.setCorsOriginAdded(false); - return result; - } - - int insertCount = corsAllowMapper.insertCorsAllowedOrigin(corsOriginAddDto); - result.setCorsOriginAdded(insertCount > 0); - return result; - } - - @Transactional - public CorsOriginDeleteVo deleteCorsAllowedOrigin(CorsOriginDeleteDto corsOriginDeleteDto) { - int updateCount = corsAllowMapper.deleteCorsAllowedOrigin(corsOriginDeleteDto); - - CorsOriginDeleteVo result = new CorsOriginDeleteVo(); - result.setCorsOriginDeleted(updateCount > 0); - return result; - } -} diff --git a/src/main/java/com/alist/api/modules/cors/service/CorsService.java b/src/main/java/com/alist/api/modules/cors/service/CorsService.java new file mode 100644 index 0000000..7fc86e1 --- /dev/null +++ b/src/main/java/com/alist/api/modules/cors/service/CorsService.java @@ -0,0 +1,62 @@ +package com.alist.api.modules.cors.service; + +import com.alist.api.modules.cors.dto.CorsAddDto; +import com.alist.api.modules.cors.dto.CorsDeleteDto; +import com.alist.api.modules.cors.dto.CorsListDto; +import com.alist.api.modules.cors.mapper.CorsMapper; +import com.alist.api.modules.cors.vo.CorsAddVo; +import com.alist.api.modules.cors.vo.CorsDeleteVo; +import com.alist.api.modules.cors.vo.CorsListVo; +import com.alist.api.modules.cors.vo.CorsVo; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +public class CorsService { + private final CorsMapper corsMapper; + + public CorsService(CorsMapper corsMapper) { + this.corsMapper = corsMapper; + } + + @Transactional(readOnly = true) + public CorsListVo selectCorsList(CorsListDto corsListDto) { + int totalCount = corsMapper.selectCorsListCount(corsListDto); + List corsList = corsMapper.selectCorsList(corsListDto); + + CorsListVo corsListVo = new CorsListVo(); + corsListVo.setCorsList(corsList); + corsListVo.setPaging(corsListDto, totalCount); + + return corsListVo; + } + + @Transactional + public CorsAddVo insertCorsAdd(CorsAddDto corsAddDto) { + int duplicateCount = corsMapper.selectCorsCount(corsAddDto.getAllowedOrigin()); + + CorsAddVo corsAddVo = new CorsAddVo(); + + if (duplicateCount > 0) { + corsAddVo.setProcessed(false); + return corsAddVo; + } + + int insertCount = corsMapper.insertCorsAdd(corsAddDto); + corsAddVo.setProcessed(insertCount > 0); + + return corsAddVo; + } + + @Transactional + public CorsDeleteVo updateCorsDelete(CorsDeleteDto corsDeleteDto) { + int updateCount = corsMapper.updateCorsDelete(corsDeleteDto); + + CorsDeleteVo corsDeleteVo = new CorsDeleteVo(); + corsDeleteVo.setProcessed(updateCount > 0); + + return corsDeleteVo; + } +} diff --git a/src/main/java/com/alist/api/modules/cors/vo/CorsOriginAddVo.java b/src/main/java/com/alist/api/modules/cors/vo/CorsAddVo.java similarity index 81% rename from src/main/java/com/alist/api/modules/cors/vo/CorsOriginAddVo.java rename to src/main/java/com/alist/api/modules/cors/vo/CorsAddVo.java index f28bbd9..944e99e 100644 --- a/src/main/java/com/alist/api/modules/cors/vo/CorsOriginAddVo.java +++ b/src/main/java/com/alist/api/modules/cors/vo/CorsAddVo.java @@ -7,7 +7,7 @@ import lombok.Setter; @Schema(description = "CORS 허용 도메인 추가 응답") @Getter @Setter -public class CorsOriginAddVo { +public class CorsAddVo { @Schema(description = "CORS 허용 도메인 추가 여부", example = "true") - private boolean corsOriginAdded; + private boolean processed; } diff --git a/src/main/java/com/alist/api/modules/cors/vo/CorsOriginCacheVo.java b/src/main/java/com/alist/api/modules/cors/vo/CorsCacheVo.java similarity index 91% rename from src/main/java/com/alist/api/modules/cors/vo/CorsOriginCacheVo.java rename to src/main/java/com/alist/api/modules/cors/vo/CorsCacheVo.java index b33bb8b..e4e48d2 100644 --- a/src/main/java/com/alist/api/modules/cors/vo/CorsOriginCacheVo.java +++ b/src/main/java/com/alist/api/modules/cors/vo/CorsCacheVo.java @@ -7,7 +7,7 @@ import lombok.Setter; @Schema(description = "CORS 허용 도메인 캐시 항목") @Getter @Setter -public class CorsOriginCacheVo { +public class CorsCacheVo { @Schema(description = "CORS 허용 도메인", example = "https://admin.alist.co.kr") private String allowedOrigin; } diff --git a/src/main/java/com/alist/api/modules/cors/vo/CorsOriginDeleteVo.java b/src/main/java/com/alist/api/modules/cors/vo/CorsDeleteVo.java similarity index 80% rename from src/main/java/com/alist/api/modules/cors/vo/CorsOriginDeleteVo.java rename to src/main/java/com/alist/api/modules/cors/vo/CorsDeleteVo.java index 78c8dfb..245cfcb 100644 --- a/src/main/java/com/alist/api/modules/cors/vo/CorsOriginDeleteVo.java +++ b/src/main/java/com/alist/api/modules/cors/vo/CorsDeleteVo.java @@ -7,7 +7,7 @@ import lombok.Setter; @Schema(description = "CORS 허용 도메인 삭제 응답") @Getter @Setter -public class CorsOriginDeleteVo { +public class CorsDeleteVo { @Schema(description = "CORS 허용 도메인 삭제 여부", example = "true") - private boolean corsOriginDeleted; + private boolean processed; } diff --git a/src/main/java/com/alist/api/modules/cors/vo/CorsOriginListVo.java b/src/main/java/com/alist/api/modules/cors/vo/CorsListVo.java similarity index 77% rename from src/main/java/com/alist/api/modules/cors/vo/CorsOriginListVo.java rename to src/main/java/com/alist/api/modules/cors/vo/CorsListVo.java index 4f96f80..2f12402 100644 --- a/src/main/java/com/alist/api/modules/cors/vo/CorsOriginListVo.java +++ b/src/main/java/com/alist/api/modules/cors/vo/CorsListVo.java @@ -10,7 +10,7 @@ import java.util.List; @Schema(description = "CORS 허용 도메인 목록 조회 응답") @Getter @Setter -public class CorsOriginListVo extends PageResponse { +public class CorsListVo extends PageResponse { @Schema(description = "CORS 허용 도메인 목록") - private List corsOriginList; + private List corsList; } diff --git a/src/main/java/com/alist/api/modules/cors/vo/CorsOriginVo.java b/src/main/java/com/alist/api/modules/cors/vo/CorsVo.java similarity index 93% rename from src/main/java/com/alist/api/modules/cors/vo/CorsOriginVo.java rename to src/main/java/com/alist/api/modules/cors/vo/CorsVo.java index 1130997..73177a3 100644 --- a/src/main/java/com/alist/api/modules/cors/vo/CorsOriginVo.java +++ b/src/main/java/com/alist/api/modules/cors/vo/CorsVo.java @@ -7,7 +7,7 @@ import lombok.Setter; @Schema(description = "CORS 허용 도메인 목록 항목") @Getter @Setter -public class CorsOriginVo { +public class CorsVo { @Schema(description = "CORS 허용 도메인 PK", example = "1") private Integer corsIdx; diff --git a/src/main/resources/mapper/cors/CorsAllowMapper.xml b/src/main/resources/mapper/cors/CorsMapper.xml similarity index 55% rename from src/main/resources/mapper/cors/CorsAllowMapper.xml rename to src/main/resources/mapper/cors/CorsMapper.xml index 6a31def..6549372 100644 --- a/src/main/resources/mapper/cors/CorsAllowMapper.xml +++ b/src/main/resources/mapper/cors/CorsMapper.xml @@ -1,8 +1,8 @@ - - + + FROM ALISTLMS.test_cors_allowed_list WHERE del_yn = 1 AND allowed_origin IS NOT NULL @@ -11,24 +11,24 @@ - + /*CorsMapper.selectCorsList*/ SELECT cors_idx , allowed_origin - + ORDER BY cors_idx DESC LIMIT #{limit} OFFSET #{offset} - + /*CorsMapper.selectCorsListCount*/ SELECT COUNT(*) - + - + /*CorsMapper.selectCorsCacheList*/ SELECT allowed_origin FROM ALISTLMS.test_cors_allowed_list WHERE del_yn = 1 @@ -36,16 +36,16 @@ ORDER BY cors_idx - + /*CorsMapper.selectCorsCount*/ SELECT COUNT(1) FROM ALISTLMS.test_cors_allowed_list WHERE del_yn = 1 AND allowed_origin = #{allowedOrigin} - - /* CorsAllowMapper.insertCorsAllowedOrigin */ + + /*CorsMapper.insertCorsAdd*/ INSERT INTO ALISTLMS.test_cors_allowed_list ( allowed_origin , del_yn @@ -55,8 +55,8 @@ ) - - /* CorsAllowMapper.deleteCorsAllowedOrigin */ + + /*CorsMapper.updateCorsDelete*/ UPDATE ALISTLMS.test_cors_allowed_list SET del_yn = 0 WHERE cors_idx = #{corsIdx}