diff --git a/src/main/java/com/fisa/pg/controller/MerchantController.java b/src/main/java/com/fisa/pg/controller/MerchantController.java
index 92c6f8e..d656799 100644
--- a/src/main/java/com/fisa/pg/controller/MerchantController.java
+++ b/src/main/java/com/fisa/pg/controller/MerchantController.java
@@ -46,31 +46,25 @@ public class MerchantController {
* 만료일이 지정되지 않은 경우 기본값으로 1년 후로 설정됩니다.
*
*
- * @param requestDto API 키 생성 요청 정보 (이름, 만료일)
+ * @param dto API 키 생성 요청 정보 (이름, 만료일)
* @param merchant 현재 인증된 가맹점 정보
* @return 생성된 API 키 정보와 함께 201 Created 응답
* @throws jakarta.validation.ConstraintViolationException 요청 데이터 유효성 검증 실패 시
*/
@PostMapping("/api-keys")
- public ResponseEntity createApiKey(
- @Valid @RequestBody CreateApiKeyRequestDto requestDto,
+ public ResponseEntity> createApiKey(
+ @Valid @RequestBody CreateApiKeyRequestDto dto,
@AuthenticationPrincipal @NotNull Merchant merchant
) {
- log.info("API 키 생성 요청: 가맹점 ID={}, 키 이름={}", merchant.getId(), requestDto.getName());
+ log.info("API 키 생성 요청: 가맹점 ID={}, 키 이름={}", merchant.getId(), dto.getName());
- // 방어적 코딩: expiresAt이 null인 경우 기본값 설정 (필드에 @NotBlank 있지만 안전장치로 유지)
- LocalDateTime expiresAt = requestDto.getExpiresAt() != null
- ? requestDto.getExpiresAt()
- : LocalDateTime.now().plusYears(1);
-
- CreateApiKeyResponseDto responseDto = apiKeyService.issueApiKey(
- requestDto.getName(),
- merchant,
- expiresAt);
+ CreateApiKeyResponseDto data = apiKeyService.issueApiKey(dto, merchant);
log.info("API 키 생성 완료: 가맹점 ID={}", merchant.getId());
- return ResponseEntity.status(HttpStatus.CREATED).body(responseDto);
+ return ResponseEntity.
+ status(HttpStatus.CREATED)
+ .body(BaseResponse.onCreate("가맹점 API 키 생성 성공", data));
}
/**
@@ -85,7 +79,7 @@ public ResponseEntity createApiKey(
* @return 가맹점의 API 키 목록 페이지와 함께 200 OK 응답
*/
@GetMapping("/api-keys")
- public ResponseEntity> getApiKeys(
+ public ResponseEntity>> getApiKeys(
@AuthenticationPrincipal @NotNull Merchant merchant,
Pageable pageable
) {
@@ -93,11 +87,11 @@ public ResponseEntity> getApiKeys(
log.info("API 키 목록 조회 요청: 가맹점 ID={}, 페이지={}, 크기={}",
merchant.getId(), pageable.getPageNumber(), pageable.getPageSize());
- Page responsePage = apiKeyService.getMerchantApiKeys(merchant, pageable);
+ Page data = apiKeyService.getMerchantApiKeys(merchant, pageable);
log.info("API 키 목록 조회 완료: 가맹점 ID={}, 총 키 개수={}, 페이지 개수={}",
- merchant.getId(), responsePage.getTotalElements(), responsePage.getTotalPages());
- return ResponseEntity.ok(responsePage);
+ merchant.getId(), data.getTotalElements(), data.getTotalPages());
+ return ResponseEntity.ok(BaseResponse.onSuccess("가맹점 API 키 목록 조회 성공", data));
}
/**
diff --git a/src/main/java/com/fisa/pg/dto/request/CreateApiKeyRequestDto.java b/src/main/java/com/fisa/pg/dto/request/CreateApiKeyRequestDto.java
index aebffa0..8b98fdf 100644
--- a/src/main/java/com/fisa/pg/dto/request/CreateApiKeyRequestDto.java
+++ b/src/main/java/com/fisa/pg/dto/request/CreateApiKeyRequestDto.java
@@ -18,8 +18,7 @@ public class CreateApiKeyRequestDto {
@NotBlank(message = "이름은 필수입니다.")
private String name;
-
- @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
+ @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
private LocalDateTime expiresAt;
}
diff --git a/src/main/java/com/fisa/pg/service/ApiKeyService.java b/src/main/java/com/fisa/pg/service/ApiKeyService.java
index 18f0fc5..f8649c5 100644
--- a/src/main/java/com/fisa/pg/service/ApiKeyService.java
+++ b/src/main/java/com/fisa/pg/service/ApiKeyService.java
@@ -1,5 +1,6 @@
package com.fisa.pg.service;
+import com.fisa.pg.dto.request.CreateApiKeyRequestDto;
import com.fisa.pg.dto.response.ApiKeyResponseDto;
import com.fisa.pg.dto.response.CreateApiKeyResponseDto;
import com.fisa.pg.entity.auth.ApiKey;
@@ -44,31 +45,28 @@ public Page getApiKeyList(Pageable pageable) {
/**
* API 키 발급 메서드 (가맹점용)
*
- * @param keyName API 키 이름
+ * @param requestDto API 키 발급 요청 DTO
* @param merchant API 키를 발급받는 가맹점
- * @param expiresAt 만료일 (지정하지 않으면 기본값으로 1년 후 설정)
* @return 생성된 API 키 정보
*/
@PostAuthorize("hasRole('MERCHANT')")
@Transactional
- public CreateApiKeyResponseDto issueApiKey(String keyName, Merchant merchant, LocalDateTime expiresAt) {
+ public CreateApiKeyResponseDto issueApiKey(CreateApiKeyRequestDto requestDto, Merchant merchant) {
String accessKey = StringUtil.generateRandomString(20);
String secretKey = StringUtil.generateRandomString(40);
ApiKey apiKey = ApiKey.builder()
.merchant(merchant)
- .name(merchant.getName())
+ .name(requestDto.getName())
.accessKey(accessKey)
.secretKey(secretKey)
.issuedAt(LocalDateTime.now())
- .expiresAt(expiresAt)
+ .expiresAt(requestDto.getExpiresAt())
.isActive(true)
.build();
apiKeyRepository.save(apiKey);
- log.info("API 키 발급 완료: 가맹점={}, 키이름={}", merchant.getName(), keyName);
-
return CreateApiKeyResponseDto.from(apiKey);
}