[api] CorsController.java 이쪽 컨벤션 맞춰 변경
This commit is contained in:
+16
-14
@@ -1,9 +1,8 @@
|
|||||||
package com.alist.api.config.cache;
|
package com.alist.api.config.cache;
|
||||||
|
|
||||||
import com.alist.api.modules.cors.mapper.CorsAllowMapper;
|
import com.alist.api.modules.cors.mapper.CorsMapper;
|
||||||
import com.alist.api.modules.cors.vo.CorsOriginCacheVo;
|
import com.alist.api.modules.cors.vo.CorsCacheVo;
|
||||||
import jakarta.annotation.PostConstruct;
|
import jakarta.annotation.PostConstruct;
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
@@ -14,13 +13,16 @@ import java.util.stream.Collectors;
|
|||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@Component
|
@Component
|
||||||
@RequiredArgsConstructor
|
public class CorsCache {
|
||||||
public class CorsAllowedOriginsCache {
|
|
||||||
|
|
||||||
private final CorsAllowMapper corsAllowMapper;
|
private final CorsMapper corsMapper;
|
||||||
|
|
||||||
// Thread-safe List (volatile로 가시성 보장)
|
// Thread-safe List (volatile로 가시성 보장)
|
||||||
private volatile List<String> allowedOrigins = new ArrayList<>();
|
private volatile List<String> corsOriginList = new ArrayList<>();
|
||||||
|
|
||||||
|
public CorsCache(CorsMapper corsMapper) {
|
||||||
|
this.corsMapper = corsMapper;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 서버 시작 시 DB에서 전체 CORS 목록 로딩
|
* 서버 시작 시 DB에서 전체 CORS 목록 로딩
|
||||||
@@ -28,7 +30,7 @@ public class CorsAllowedOriginsCache {
|
|||||||
@PostConstruct
|
@PostConstruct
|
||||||
public void loadFromDatabase() {
|
public void loadFromDatabase() {
|
||||||
refresh();
|
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() {
|
public synchronized void refresh() {
|
||||||
try {
|
try {
|
||||||
List<String> origins = corsAllowMapper.selectCorsAllowedCacheList()
|
List<String> corsOriginList = corsMapper.selectCorsCacheList()
|
||||||
.stream()
|
.stream()
|
||||||
.filter(Objects::nonNull)
|
.filter(Objects::nonNull)
|
||||||
.map(CorsOriginCacheVo::getAllowedOrigin)
|
.map(CorsCacheVo::getAllowedOrigin)
|
||||||
.filter(Objects::nonNull)
|
.filter(Objects::nonNull)
|
||||||
.map(String::trim)
|
.map(String::trim)
|
||||||
.filter(origin -> !origin.isEmpty())
|
.filter(origin -> !origin.isEmpty())
|
||||||
.distinct()
|
.distinct()
|
||||||
.collect(Collectors.toList());
|
.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) {
|
} catch (Exception e) {
|
||||||
log.error("Failed to refresh CORS cache", e);
|
log.error("Failed to refresh CORS cache", e);
|
||||||
@@ -60,7 +62,7 @@ public class CorsAllowedOriginsCache {
|
|||||||
* @return 허용 도메인 리스트
|
* @return 허용 도메인 리스트
|
||||||
*/
|
*/
|
||||||
public List<String> getAllowedOrigins() {
|
public List<String> getAllowedOrigins() {
|
||||||
return new ArrayList<>(allowedOrigins);
|
return new ArrayList<>(corsOriginList);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -68,6 +70,6 @@ public class CorsAllowedOriginsCache {
|
|||||||
* @return 캐시 상태 정보
|
* @return 캐시 상태 정보
|
||||||
*/
|
*/
|
||||||
public List<String> getCacheStatus() {
|
public List<String> getCacheStatus() {
|
||||||
return new ArrayList<>(allowedOrigins);
|
return new ArrayList<>(corsOriginList);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
package com.alist.api.config.filter;
|
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.FilterChain;
|
||||||
import jakarta.servlet.ServletException;
|
import jakarta.servlet.ServletException;
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
@@ -21,7 +21,7 @@ import java.util.List;
|
|||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public class DynamicCorsFilter extends OncePerRequestFilter {
|
public class DynamicCorsFilter extends OncePerRequestFilter {
|
||||||
|
|
||||||
private final CorsAllowedOriginsCache corsCache;
|
private final CorsCache corsCache;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
|
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
|
||||||
|
|||||||
@@ -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<ApiResponse<CorsOriginListVo>> 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<ApiResponse<CorsOriginAddVo>> 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<ApiResponse<List<String>>> reloadCors() {
|
|
||||||
corsCache.refresh();
|
|
||||||
List<String> cacheStatus = corsCache.getCacheStatus();
|
|
||||||
return ApiResponse.entity(cacheStatus, ApiResponseCode.CODE_200);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Operation(
|
|
||||||
summary = "CORS 허용 도메인 삭제",
|
|
||||||
description = "CORS 허용 도메인 PK 기준으로 삭제 처리합니다. 실제 삭제가 아닌 del_yn 변경 방식입니다."
|
|
||||||
)
|
|
||||||
@PatchMapping("/delete")
|
|
||||||
public ResponseEntity<ApiResponse<CorsOriginDeleteVo>> 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 허용 도메인 삭제");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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<ApiResponse<CorsListVo>> 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<ApiResponse<CorsAddVo>> 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<ApiResponse<CorsDeleteVo>> 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<ApiResponse<List<String>>> corsReload() {
|
||||||
|
corsCache.refresh();
|
||||||
|
List<String> cacheStatus = corsCache.getCacheStatus();
|
||||||
|
return ApiResponse.entity(cacheStatus, ApiResponseCode.CODE_200);
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
-1
@@ -5,6 +5,6 @@ import lombok.Setter;
|
|||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
public class CorsOriginAddDto {
|
public class CorsAddDto {
|
||||||
private String allowedOrigin;
|
private String allowedOrigin;
|
||||||
}
|
}
|
||||||
+1
-1
@@ -5,6 +5,6 @@ import lombok.Setter;
|
|||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
public class CorsOriginDeleteDto {
|
public class CorsDeleteDto {
|
||||||
private Integer corsIdx;
|
private Integer corsIdx;
|
||||||
}
|
}
|
||||||
+1
-1
@@ -6,6 +6,6 @@ import lombok.Setter;
|
|||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
public class CorsOriginSearchDto extends PageRequest {
|
public class CorsListDto extends PageRequest {
|
||||||
private String keyword;
|
private String keyword;
|
||||||
}
|
}
|
||||||
+8
-8
@@ -1,6 +1,6 @@
|
|||||||
package com.alist.api.modules.cors.form;
|
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 io.swagger.v3.oas.annotations.media.Schema;
|
||||||
import jakarta.validation.constraints.NotBlank;
|
import jakarta.validation.constraints.NotBlank;
|
||||||
import jakarta.validation.constraints.Pattern;
|
import jakarta.validation.constraints.Pattern;
|
||||||
@@ -10,19 +10,19 @@ import lombok.Setter;
|
|||||||
@Schema(description = "CORS 허용 도메인 추가 요청 폼")
|
@Schema(description = "CORS 허용 도메인 추가 요청 폼")
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
public class CorsOriginAddForm {
|
public class CorsAddForm {
|
||||||
|
|
||||||
@Schema(description = "CORS 허용 도메인", example = "https://admin.alist.co.kr", requiredMode = Schema.RequiredMode.REQUIRED)
|
@Schema(description = "CORS 허용 도메인", example = "https://admin.alist.co.kr", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
@NotBlank(message = "CORS 허용 도메인은 필수입니다.")
|
@NotBlank(message = "CORS 허용 도메인은 필수입니다.")
|
||||||
@Pattern(
|
@Pattern(
|
||||||
regexp = "^(\\*|https?://[A-Za-z0-9.-]+(:[0-9]{1,5})?)$",
|
regexp = "^(\\*|https?://[A-Za-z0-9.-]+(:[0-9]{1,5})?)$"
|
||||||
message = "CORS 허용 도메인은 http(s)://domain 또는 * 형식이어야 합니다."
|
, message = "CORS 허용 도메인은 http(s)://domain 또는 * 형식이어야 합니다."
|
||||||
)
|
)
|
||||||
private String allowedOrigin;
|
private String allowedOrigin;
|
||||||
|
|
||||||
public CorsOriginAddDto toCorsOriginAddDto() {
|
public CorsAddDto toDto() {
|
||||||
CorsOriginAddDto corsOriginAddDto = new CorsOriginAddDto();
|
CorsAddDto corsAddDto = new CorsAddDto();
|
||||||
corsOriginAddDto.setAllowedOrigin(allowedOrigin == null ? null : allowedOrigin.trim());
|
corsAddDto.setAllowedOrigin(allowedOrigin == null ? null : allowedOrigin.trim());
|
||||||
return corsOriginAddDto;
|
return corsAddDto;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+6
-6
@@ -1,6 +1,6 @@
|
|||||||
package com.alist.api.modules.cors.form;
|
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 io.swagger.v3.oas.annotations.media.Schema;
|
||||||
import jakarta.validation.constraints.NotNull;
|
import jakarta.validation.constraints.NotNull;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
@@ -9,15 +9,15 @@ import lombok.Setter;
|
|||||||
@Schema(description = "CORS 허용 도메인 삭제 요청 폼")
|
@Schema(description = "CORS 허용 도메인 삭제 요청 폼")
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
public class CorsOriginDeleteForm {
|
public class CorsDeleteForm {
|
||||||
|
|
||||||
@Schema(description = "CORS 허용 도메인 PK", example = "1", requiredMode = Schema.RequiredMode.REQUIRED)
|
@Schema(description = "CORS 허용 도메인 PK", example = "1", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
@NotNull(message = "CORS 허용 도메인 PK는 필수입니다.")
|
@NotNull(message = "CORS 허용 도메인 PK는 필수입니다.")
|
||||||
private Integer corsIdx;
|
private Integer corsIdx;
|
||||||
|
|
||||||
public CorsOriginDeleteDto toCorsOriginDeleteDto() {
|
public CorsDeleteDto toDto() {
|
||||||
CorsOriginDeleteDto corsOriginDeleteDto = new CorsOriginDeleteDto();
|
CorsDeleteDto corsDeleteDto = new CorsDeleteDto();
|
||||||
corsOriginDeleteDto.setCorsIdx(corsIdx);
|
corsDeleteDto.setCorsIdx(corsIdx);
|
||||||
return corsOriginDeleteDto;
|
return corsDeleteDto;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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<CorsOriginCacheVo> selectCorsAllowedCacheList();
|
|
||||||
|
|
||||||
List<CorsOriginVo> selectCorsAllowedList(CorsOriginSearchDto corsOriginSearchDto);
|
|
||||||
|
|
||||||
int selectCorsAllowedCount(CorsOriginSearchDto corsOriginSearchDto);
|
|
||||||
|
|
||||||
int selectCorsAllowedOriginCount(String allowedOrigin);
|
|
||||||
|
|
||||||
int insertCorsAllowedOrigin(CorsOriginAddDto corsOriginAddDto);
|
|
||||||
|
|
||||||
int deleteCorsAllowedOrigin(CorsOriginDeleteDto corsOriginDeleteDto);
|
|
||||||
}
|
|
||||||
@@ -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<CorsCacheVo> selectCorsCacheList();
|
||||||
|
|
||||||
|
List<CorsVo> selectCorsList(CorsListDto corsListDto);
|
||||||
|
|
||||||
|
int selectCorsListCount(CorsListDto corsListDto);
|
||||||
|
|
||||||
|
int selectCorsCount(String allowedOrigin);
|
||||||
|
|
||||||
|
int insertCorsAdd(CorsAddDto corsAddDto);
|
||||||
|
|
||||||
|
int updateCorsDelete(CorsDeleteDto corsDeleteDto);
|
||||||
|
}
|
||||||
@@ -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<CorsOriginVo> 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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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<CorsVo> 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
+2
-2
@@ -7,7 +7,7 @@ import lombok.Setter;
|
|||||||
@Schema(description = "CORS 허용 도메인 추가 응답")
|
@Schema(description = "CORS 허용 도메인 추가 응답")
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
public class CorsOriginAddVo {
|
public class CorsAddVo {
|
||||||
@Schema(description = "CORS 허용 도메인 추가 여부", example = "true")
|
@Schema(description = "CORS 허용 도메인 추가 여부", example = "true")
|
||||||
private boolean corsOriginAdded;
|
private boolean processed;
|
||||||
}
|
}
|
||||||
+1
-1
@@ -7,7 +7,7 @@ import lombok.Setter;
|
|||||||
@Schema(description = "CORS 허용 도메인 캐시 항목")
|
@Schema(description = "CORS 허용 도메인 캐시 항목")
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
public class CorsOriginCacheVo {
|
public class CorsCacheVo {
|
||||||
@Schema(description = "CORS 허용 도메인", example = "https://admin.alist.co.kr")
|
@Schema(description = "CORS 허용 도메인", example = "https://admin.alist.co.kr")
|
||||||
private String allowedOrigin;
|
private String allowedOrigin;
|
||||||
}
|
}
|
||||||
+2
-2
@@ -7,7 +7,7 @@ import lombok.Setter;
|
|||||||
@Schema(description = "CORS 허용 도메인 삭제 응답")
|
@Schema(description = "CORS 허용 도메인 삭제 응답")
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
public class CorsOriginDeleteVo {
|
public class CorsDeleteVo {
|
||||||
@Schema(description = "CORS 허용 도메인 삭제 여부", example = "true")
|
@Schema(description = "CORS 허용 도메인 삭제 여부", example = "true")
|
||||||
private boolean corsOriginDeleted;
|
private boolean processed;
|
||||||
}
|
}
|
||||||
+2
-2
@@ -10,7 +10,7 @@ import java.util.List;
|
|||||||
@Schema(description = "CORS 허용 도메인 목록 조회 응답")
|
@Schema(description = "CORS 허용 도메인 목록 조회 응답")
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
public class CorsOriginListVo extends PageResponse {
|
public class CorsListVo extends PageResponse {
|
||||||
@Schema(description = "CORS 허용 도메인 목록")
|
@Schema(description = "CORS 허용 도메인 목록")
|
||||||
private List<CorsOriginVo> corsOriginList;
|
private List<CorsVo> corsList;
|
||||||
}
|
}
|
||||||
+1
-1
@@ -7,7 +7,7 @@ import lombok.Setter;
|
|||||||
@Schema(description = "CORS 허용 도메인 목록 항목")
|
@Schema(description = "CORS 허용 도메인 목록 항목")
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
public class CorsOriginVo {
|
public class CorsVo {
|
||||||
@Schema(description = "CORS 허용 도메인 PK", example = "1")
|
@Schema(description = "CORS 허용 도메인 PK", example = "1")
|
||||||
private Integer corsIdx;
|
private Integer corsIdx;
|
||||||
|
|
||||||
+16
-16
@@ -1,8 +1,8 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?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">
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
|
|
||||||
<mapper namespace="com.alist.api.modules.cors.mapper.CorsAllowMapper">
|
<mapper namespace="com.alist.api.modules.cors.mapper.CorsMapper">
|
||||||
<sql id="corsAllowedWhere">
|
<sql id="corsWhere">
|
||||||
FROM ALISTLMS.test_cors_allowed_list
|
FROM ALISTLMS.test_cors_allowed_list
|
||||||
WHERE del_yn = 1
|
WHERE del_yn = 1
|
||||||
AND allowed_origin IS NOT NULL
|
AND allowed_origin IS NOT NULL
|
||||||
@@ -11,24 +11,24 @@
|
|||||||
</if>
|
</if>
|
||||||
</sql>
|
</sql>
|
||||||
|
|
||||||
<select id="selectCorsAllowedList" resultType="com.alist.api.modules.cors.vo.CorsOriginVo">
|
<select id="selectCorsList" resultType="com.alist.api.modules.cors.vo.CorsVo">
|
||||||
/* CorsMapper.selectCorsAllowedList */
|
/*CorsMapper.selectCorsList*/
|
||||||
SELECT cors_idx
|
SELECT cors_idx
|
||||||
, allowed_origin
|
, allowed_origin
|
||||||
<include refid="corsAllowedWhere"/>
|
<include refid="corsWhere"/>
|
||||||
ORDER BY cors_idx DESC
|
ORDER BY cors_idx DESC
|
||||||
LIMIT #{limit}
|
LIMIT #{limit}
|
||||||
OFFSET #{offset}
|
OFFSET #{offset}
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<select id="selectCorsAllowedCount" resultType="int">
|
<select id="selectCorsListCount" resultType="int">
|
||||||
/* CorsAllowMapper.selectCorsAllowedCount */
|
/*CorsMapper.selectCorsListCount*/
|
||||||
SELECT COUNT(*)
|
SELECT COUNT(*)
|
||||||
<include refid="corsAllowedWhere"/>
|
<include refid="corsWhere"/>
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<select id="selectCorsAllowedCacheList" resultType="com.alist.api.modules.cors.vo.CorsOriginCacheVo">
|
<select id="selectCorsCacheList" resultType="com.alist.api.modules.cors.vo.CorsCacheVo">
|
||||||
/* CorsAllowMapper.selectCorsAllowedCacheList */
|
/*CorsMapper.selectCorsCacheList*/
|
||||||
SELECT allowed_origin
|
SELECT allowed_origin
|
||||||
FROM ALISTLMS.test_cors_allowed_list
|
FROM ALISTLMS.test_cors_allowed_list
|
||||||
WHERE del_yn = 1
|
WHERE del_yn = 1
|
||||||
@@ -36,16 +36,16 @@
|
|||||||
ORDER BY cors_idx
|
ORDER BY cors_idx
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<select id="selectCorsAllowedOriginCount" parameterType="string" resultType="int">
|
<select id="selectCorsCount" parameterType="string" resultType="int">
|
||||||
/* CorsAllowMapper.selectCorsAllowedOriginCount */
|
/*CorsMapper.selectCorsCount*/
|
||||||
SELECT COUNT(1)
|
SELECT COUNT(1)
|
||||||
FROM ALISTLMS.test_cors_allowed_list
|
FROM ALISTLMS.test_cors_allowed_list
|
||||||
WHERE del_yn = 1
|
WHERE del_yn = 1
|
||||||
AND allowed_origin = #{allowedOrigin}
|
AND allowed_origin = #{allowedOrigin}
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<insert id="insertCorsAllowedOrigin" parameterType="com.alist.api.modules.cors.dto.CorsOriginAddDto">
|
<insert id="insertCorsAdd" parameterType="com.alist.api.modules.cors.dto.CorsAddDto">
|
||||||
/* CorsAllowMapper.insertCorsAllowedOrigin */
|
/*CorsMapper.insertCorsAdd*/
|
||||||
INSERT INTO ALISTLMS.test_cors_allowed_list (
|
INSERT INTO ALISTLMS.test_cors_allowed_list (
|
||||||
allowed_origin
|
allowed_origin
|
||||||
, del_yn
|
, del_yn
|
||||||
@@ -55,8 +55,8 @@
|
|||||||
)
|
)
|
||||||
</insert>
|
</insert>
|
||||||
|
|
||||||
<update id="deleteCorsAllowedOrigin">
|
<update id="updateCorsDelete">
|
||||||
/* CorsAllowMapper.deleteCorsAllowedOrigin */
|
/*CorsMapper.updateCorsDelete*/
|
||||||
UPDATE ALISTLMS.test_cors_allowed_list
|
UPDATE ALISTLMS.test_cors_allowed_list
|
||||||
SET del_yn = 0
|
SET del_yn = 0
|
||||||
WHERE cors_idx = #{corsIdx}
|
WHERE cors_idx = #{corsIdx}
|
||||||
Reference in New Issue
Block a user