From b79982bb96e75adfd60d9282152d98f57556a7c2 Mon Sep 17 00:00:00 2001 From: baekjaehyuk Date: Wed, 21 May 2025 18:41:20 +0900 Subject: [PATCH 1/6] =?UTF-8?q?TB-33/feat:=20=EC=98=81=EC=88=98=EC=A6=9D?= =?UTF-8?q?=20=EC=82=AD=EC=A0=9C=20API=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/exception/ErrorCode.java | 1 + .../in/web/DeleteReceiptController.java | 31 +++++++++++++++++++ .../adapter/in/web/api/DeleteReceiptApi.java | 20 ++++++++++++ .../adapter/out/ReceiptRepositoryAdapter.java | 18 ++++++++++- .../port/in/DeleteReceiptUseCase.java | 9 ++++++ .../port/out/DeleteReceiptPort.java | 10 ++++++ .../service/DeleteReceiptService.java | 22 +++++++++++++ 7 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/ClubAccount_BE/receipt/adapter/in/web/DeleteReceiptController.java create mode 100644 src/main/java/com/ClubAccount_BE/receipt/adapter/in/web/api/DeleteReceiptApi.java create mode 100644 src/main/java/com/ClubAccount_BE/receipt/application/port/in/DeleteReceiptUseCase.java create mode 100644 src/main/java/com/ClubAccount_BE/receipt/application/port/out/DeleteReceiptPort.java create mode 100644 src/main/java/com/ClubAccount_BE/receipt/application/service/DeleteReceiptService.java diff --git a/src/main/java/com/ClubAccount_BE/core/exception/ErrorCode.java b/src/main/java/com/ClubAccount_BE/core/exception/ErrorCode.java index 30ea401..39a2932 100644 --- a/src/main/java/com/ClubAccount_BE/core/exception/ErrorCode.java +++ b/src/main/java/com/ClubAccount_BE/core/exception/ErrorCode.java @@ -27,6 +27,7 @@ public enum ErrorCode { // 영수증 관련 에러 코드 RECEIPT_INVALID_START_DATE("2001", "시작일은 종료일보다 빠르거나 같아야 합니다.", HttpStatus.BAD_REQUEST), RECEIPT_NOT_FOUND("2002", "해당 영수증을 찾을 수 없습니다.", HttpStatus.NOT_FOUND), + RECEIPT_NOT_DELETE("2003", "요청한 영수증을 삭제할 수 없습니다.", HttpStatus.FORBIDDEN), // S3 관련 에러 코드 S3_UPLOAD_FAIL("3001", "S3에 이미지 업로드 에러입니다.", HttpStatus.INTERNAL_SERVER_ERROR); diff --git a/src/main/java/com/ClubAccount_BE/receipt/adapter/in/web/DeleteReceiptController.java b/src/main/java/com/ClubAccount_BE/receipt/adapter/in/web/DeleteReceiptController.java new file mode 100644 index 0000000..998b533 --- /dev/null +++ b/src/main/java/com/ClubAccount_BE/receipt/adapter/in/web/DeleteReceiptController.java @@ -0,0 +1,31 @@ +package com.ClubAccount_BE.receipt.adapter.in.web; + +import com.ClubAccount_BE.core.meta.LoginUser; +import com.ClubAccount_BE.receipt.adapter.in.web.api.DeleteReceiptApi; +import com.ClubAccount_BE.receipt.application.port.in.DeleteReceiptUseCase; +import com.ClubAccount_BE.user.domain.User; +import jakarta.validation.constraints.NotEmpty; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/v1/receipts") +public class DeleteReceiptController implements DeleteReceiptApi { + + private final DeleteReceiptUseCase deleteReceiptUseCase; + + @DeleteMapping("/receipts") + public ResponseEntity deleteReceiptList( + @LoginUser User user, + @NotEmpty @RequestParam List receiptIds + ) { + deleteReceiptUseCase.deleteReceiptList(user, receiptIds); + return ResponseEntity.noContent().build(); + } +} diff --git a/src/main/java/com/ClubAccount_BE/receipt/adapter/in/web/api/DeleteReceiptApi.java b/src/main/java/com/ClubAccount_BE/receipt/adapter/in/web/api/DeleteReceiptApi.java new file mode 100644 index 0000000..6fc03e0 --- /dev/null +++ b/src/main/java/com/ClubAccount_BE/receipt/adapter/in/web/api/DeleteReceiptApi.java @@ -0,0 +1,20 @@ +package com.ClubAccount_BE.receipt.adapter.in.web.api; + +import com.ClubAccount_BE.core.meta.LoginUser; +import com.ClubAccount_BE.user.domain.User; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.constraints.NotEmpty; +import java.util.List; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestParam; + +@Tag(name = "Delete Receipt", description = "영수증 삭제 API") +public interface DeleteReceiptApi { + + @Operation(summary = "영수증 삭제", description = "등록된 영수증 정보를 삭제한다.") + ResponseEntity deleteReceiptList( + @LoginUser User user, + @NotEmpty @RequestParam List receiptIds + ); +} diff --git a/src/main/java/com/ClubAccount_BE/receipt/adapter/out/ReceiptRepositoryAdapter.java b/src/main/java/com/ClubAccount_BE/receipt/adapter/out/ReceiptRepositoryAdapter.java index 90727f5..f6d4757 100644 --- a/src/main/java/com/ClubAccount_BE/receipt/adapter/out/ReceiptRepositoryAdapter.java +++ b/src/main/java/com/ClubAccount_BE/receipt/adapter/out/ReceiptRepositoryAdapter.java @@ -1,11 +1,13 @@ package com.ClubAccount_BE.receipt.adapter.out; +import static com.ClubAccount_BE.core.exception.ErrorCode.RECEIPT_NOT_DELETE; import static com.ClubAccount_BE.core.exception.ErrorCode.RECEIPT_NOT_FOUND; import com.ClubAccount_BE.core.exception.ApiException; import com.ClubAccount_BE.receipt.adapter.out.persistence.entity.ReceiptEntity; import com.ClubAccount_BE.receipt.adapter.out.persistence.repository.ReceiptRepository; import com.ClubAccount_BE.receipt.application.port.out.CreateReceiptPort; +import com.ClubAccount_BE.receipt.application.port.out.DeleteReceiptPort; import com.ClubAccount_BE.receipt.application.port.out.FindReceiptPort; import com.ClubAccount_BE.receipt.application.port.out.UpdateReceiptPort; import com.ClubAccount_BE.receipt.domain.Receipt; @@ -23,7 +25,7 @@ @Component @RequiredArgsConstructor public class ReceiptRepositoryAdapter - implements CreateReceiptPort, FindReceiptPort, UpdateReceiptPort { + implements CreateReceiptPort, FindReceiptPort, UpdateReceiptPort, DeleteReceiptPort { private final ReceiptRepository receiptRepository; @@ -91,4 +93,18 @@ public Long updateReceipt( .forEach(receiptEntity::addReceiptItem); return receiptEntity.getId(); } + + @Override + public void deleteReceiptList(User user, List receiptIds) { + List receipts = receiptRepository.findAllById(receiptIds); + + boolean hasInvalidOwner = receipts.stream() + .anyMatch(receipt -> !receipt.getUser().getId().equals(user.getId())); + + if (hasInvalidOwner || receipts.size() != receiptIds.size()) { + throw new ApiException(RECEIPT_NOT_DELETE); + } + + receiptRepository.deleteAll(receipts); + } } diff --git a/src/main/java/com/ClubAccount_BE/receipt/application/port/in/DeleteReceiptUseCase.java b/src/main/java/com/ClubAccount_BE/receipt/application/port/in/DeleteReceiptUseCase.java new file mode 100644 index 0000000..77b4e5c --- /dev/null +++ b/src/main/java/com/ClubAccount_BE/receipt/application/port/in/DeleteReceiptUseCase.java @@ -0,0 +1,9 @@ +package com.ClubAccount_BE.receipt.application.port.in; + +import com.ClubAccount_BE.user.domain.User; +import java.util.List; + +public interface DeleteReceiptUseCase { + + void deleteReceiptList(User user, List receiptIds); +} diff --git a/src/main/java/com/ClubAccount_BE/receipt/application/port/out/DeleteReceiptPort.java b/src/main/java/com/ClubAccount_BE/receipt/application/port/out/DeleteReceiptPort.java new file mode 100644 index 0000000..0008224 --- /dev/null +++ b/src/main/java/com/ClubAccount_BE/receipt/application/port/out/DeleteReceiptPort.java @@ -0,0 +1,10 @@ +package com.ClubAccount_BE.receipt.application.port.out; + +import com.ClubAccount_BE.user.domain.User; +import java.util.List; + +public interface DeleteReceiptPort { + + void deleteReceiptList(User user, List receiptIds); + +} diff --git a/src/main/java/com/ClubAccount_BE/receipt/application/service/DeleteReceiptService.java b/src/main/java/com/ClubAccount_BE/receipt/application/service/DeleteReceiptService.java new file mode 100644 index 0000000..669c16f --- /dev/null +++ b/src/main/java/com/ClubAccount_BE/receipt/application/service/DeleteReceiptService.java @@ -0,0 +1,22 @@ +package com.ClubAccount_BE.receipt.application.service; + +import com.ClubAccount_BE.receipt.application.port.in.DeleteReceiptUseCase; +import com.ClubAccount_BE.receipt.application.port.out.DeleteReceiptPort; +import com.ClubAccount_BE.user.domain.User; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +@Transactional +public class DeleteReceiptService implements DeleteReceiptUseCase { + + private final DeleteReceiptPort deleteReceiptPort; + + @Override + public void deleteReceiptList(User user, List receiptIds) { + deleteReceiptPort.deleteReceiptList(user, receiptIds); + } +} From 53e733ba5bb32349c9a59e8d2d7bd3965ce1a27a Mon Sep 17 00:00:00 2001 From: baekjaehyuk Date: Wed, 21 May 2025 18:42:00 +0900 Subject: [PATCH 2/6] =?UTF-8?q?TB-33/chore:=20Swagger=20=EB=AC=B8=EC=84=9C?= =?UTF-8?q?=EC=97=90=EC=84=9C=20@LoginUser=20=ED=8C=8C=EB=9D=BC=EB=AF=B8?= =?UTF-8?q?=ED=84=B0=20=EC=88=A8=EA=B9=80=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/ClubAccount_BE/core/meta/LoginUser.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/ClubAccount_BE/core/meta/LoginUser.java b/src/main/java/com/ClubAccount_BE/core/meta/LoginUser.java index b89d097..e6a8a30 100644 --- a/src/main/java/com/ClubAccount_BE/core/meta/LoginUser.java +++ b/src/main/java/com/ClubAccount_BE/core/meta/LoginUser.java @@ -1,5 +1,6 @@ package com.ClubAccount_BE.core.meta; +import io.swagger.v3.oas.annotations.Parameter; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; @@ -9,6 +10,7 @@ @Target({ElementType.PARAMETER, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented +@Parameter(hidden = true) public @interface LoginUser { } From 2470e9804e43266a1842d4c1b5db5813cd606fd4 Mon Sep 17 00:00:00 2001 From: baekjaehyuk Date: Wed, 21 May 2025 19:28:49 +0900 Subject: [PATCH 3/6] =?UTF-8?q?TB-33/feat:=20=EC=98=81=EC=88=98=EC=A6=9D?= =?UTF-8?q?=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20S3=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../in/web/DeleteReceiptController.java | 2 +- .../adapter/in/web/api/DeleteReceiptApi.java | 2 +- .../out/ReceiptImageRepositoryAdapter.java | 24 +++++++++++++++++-- .../adapter/out/ReceiptRepositoryAdapter.java | 3 ++- .../port/out/DeleteReceiptImagePort.java | 8 +++++++ .../port/out/DeleteReceiptPort.java | 3 ++- .../service/DeleteReceiptService.java | 9 ++++++- .../receipt/domain/service/ReceiptEditor.java | 11 +++++++++ 8 files changed, 55 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/ClubAccount_BE/receipt/application/port/out/DeleteReceiptImagePort.java diff --git a/src/main/java/com/ClubAccount_BE/receipt/adapter/in/web/DeleteReceiptController.java b/src/main/java/com/ClubAccount_BE/receipt/adapter/in/web/DeleteReceiptController.java index 998b533..198c8a2 100644 --- a/src/main/java/com/ClubAccount_BE/receipt/adapter/in/web/DeleteReceiptController.java +++ b/src/main/java/com/ClubAccount_BE/receipt/adapter/in/web/DeleteReceiptController.java @@ -23,7 +23,7 @@ public class DeleteReceiptController implements DeleteReceiptApi { @DeleteMapping("/receipts") public ResponseEntity deleteReceiptList( @LoginUser User user, - @NotEmpty @RequestParam List receiptIds + @RequestParam @NotEmpty List receiptIds ) { deleteReceiptUseCase.deleteReceiptList(user, receiptIds); return ResponseEntity.noContent().build(); diff --git a/src/main/java/com/ClubAccount_BE/receipt/adapter/in/web/api/DeleteReceiptApi.java b/src/main/java/com/ClubAccount_BE/receipt/adapter/in/web/api/DeleteReceiptApi.java index 6fc03e0..b008cf1 100644 --- a/src/main/java/com/ClubAccount_BE/receipt/adapter/in/web/api/DeleteReceiptApi.java +++ b/src/main/java/com/ClubAccount_BE/receipt/adapter/in/web/api/DeleteReceiptApi.java @@ -15,6 +15,6 @@ public interface DeleteReceiptApi { @Operation(summary = "영수증 삭제", description = "등록된 영수증 정보를 삭제한다.") ResponseEntity deleteReceiptList( @LoginUser User user, - @NotEmpty @RequestParam List receiptIds + @RequestParam @NotEmpty List receiptIds ); } diff --git a/src/main/java/com/ClubAccount_BE/receipt/adapter/out/ReceiptImageRepositoryAdapter.java b/src/main/java/com/ClubAccount_BE/receipt/adapter/out/ReceiptImageRepositoryAdapter.java index 88a0d81..86b843a 100644 --- a/src/main/java/com/ClubAccount_BE/receipt/adapter/out/ReceiptImageRepositoryAdapter.java +++ b/src/main/java/com/ClubAccount_BE/receipt/adapter/out/ReceiptImageRepositoryAdapter.java @@ -1,12 +1,14 @@ package com.ClubAccount_BE.receipt.adapter.out; - import static com.ClubAccount_BE.core.constant.CommonConstant.IMAGE_KEY_DELIMITER; import static com.ClubAccount_BE.core.exception.ErrorCode.S3_UPLOAD_FAIL; import com.ClubAccount_BE.core.exception.ApiException; +import com.ClubAccount_BE.receipt.application.port.out.DeleteReceiptImagePort; import com.ClubAccount_BE.receipt.application.port.out.UploadReceiptPort; import java.io.IOException; +import java.net.URI; +import java.util.List; import java.util.UUID; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; @@ -14,11 +16,12 @@ import org.springframework.web.multipart.MultipartFile; import software.amazon.awssdk.core.sync.RequestBody; import software.amazon.awssdk.services.s3.S3Client; +import software.amazon.awssdk.services.s3.model.DeleteObjectRequest; import software.amazon.awssdk.services.s3.model.PutObjectRequest; @Component @RequiredArgsConstructor -public class ReceiptImageRepositoryAdapter implements UploadReceiptPort { +public class ReceiptImageRepositoryAdapter implements UploadReceiptPort, DeleteReceiptImagePort { private final S3Client amazonS3; @@ -48,6 +51,19 @@ public String uploadReceipt(MultipartFile image) { return getImageUrl(imageName); } + // TODO: S3에서 이미지 삭제 로직 비동기 처리 + @Override + public void deleteImages(List receiptImage) { + receiptImage.forEach(url -> { + String key = extractKey(url); + DeleteObjectRequest request = DeleteObjectRequest.builder() + .bucket(bucket) + .key(key) + .build(); + amazonS3.deleteObject(request); + }); + } + private String createImageName(String originalFilename) { return UUID.randomUUID() + IMAGE_KEY_DELIMITER + originalFilename; } @@ -57,4 +73,8 @@ private String getImageUrl(String fileName) { .getUrl(builder -> builder.bucket(bucket).key(fileName)) .toExternalForm(); } + + private String extractKey(String url) { + return URI.create(url).getPath().substring(1); + } } diff --git a/src/main/java/com/ClubAccount_BE/receipt/adapter/out/ReceiptRepositoryAdapter.java b/src/main/java/com/ClubAccount_BE/receipt/adapter/out/ReceiptRepositoryAdapter.java index f6d4757..d18201b 100644 --- a/src/main/java/com/ClubAccount_BE/receipt/adapter/out/ReceiptRepositoryAdapter.java +++ b/src/main/java/com/ClubAccount_BE/receipt/adapter/out/ReceiptRepositoryAdapter.java @@ -95,7 +95,7 @@ public Long updateReceipt( } @Override - public void deleteReceiptList(User user, List receiptIds) { + public List deleteReceiptList(User user, List receiptIds) { List receipts = receiptRepository.findAllById(receiptIds); boolean hasInvalidOwner = receipts.stream() @@ -106,5 +106,6 @@ public void deleteReceiptList(User user, List receiptIds) { } receiptRepository.deleteAll(receipts); + return receipts.stream().map(ReceiptMapper::toDomain).toList(); } } diff --git a/src/main/java/com/ClubAccount_BE/receipt/application/port/out/DeleteReceiptImagePort.java b/src/main/java/com/ClubAccount_BE/receipt/application/port/out/DeleteReceiptImagePort.java new file mode 100644 index 0000000..6ef64e5 --- /dev/null +++ b/src/main/java/com/ClubAccount_BE/receipt/application/port/out/DeleteReceiptImagePort.java @@ -0,0 +1,8 @@ +package com.ClubAccount_BE.receipt.application.port.out; + +import java.util.List; + +public interface DeleteReceiptImagePort { + + void deleteImages(List receiptImage); +} diff --git a/src/main/java/com/ClubAccount_BE/receipt/application/port/out/DeleteReceiptPort.java b/src/main/java/com/ClubAccount_BE/receipt/application/port/out/DeleteReceiptPort.java index 0008224..0b9971e 100644 --- a/src/main/java/com/ClubAccount_BE/receipt/application/port/out/DeleteReceiptPort.java +++ b/src/main/java/com/ClubAccount_BE/receipt/application/port/out/DeleteReceiptPort.java @@ -1,10 +1,11 @@ package com.ClubAccount_BE.receipt.application.port.out; +import com.ClubAccount_BE.receipt.domain.Receipt; import com.ClubAccount_BE.user.domain.User; import java.util.List; public interface DeleteReceiptPort { - void deleteReceiptList(User user, List receiptIds); + List deleteReceiptList(User user, List receiptIds); } diff --git a/src/main/java/com/ClubAccount_BE/receipt/application/service/DeleteReceiptService.java b/src/main/java/com/ClubAccount_BE/receipt/application/service/DeleteReceiptService.java index 669c16f..9ebefee 100644 --- a/src/main/java/com/ClubAccount_BE/receipt/application/service/DeleteReceiptService.java +++ b/src/main/java/com/ClubAccount_BE/receipt/application/service/DeleteReceiptService.java @@ -1,7 +1,10 @@ package com.ClubAccount_BE.receipt.application.service; import com.ClubAccount_BE.receipt.application.port.in.DeleteReceiptUseCase; +import com.ClubAccount_BE.receipt.application.port.out.DeleteReceiptImagePort; import com.ClubAccount_BE.receipt.application.port.out.DeleteReceiptPort; +import com.ClubAccount_BE.receipt.domain.Receipt; +import com.ClubAccount_BE.receipt.domain.service.ReceiptEditor; import com.ClubAccount_BE.user.domain.User; import java.util.List; import lombok.RequiredArgsConstructor; @@ -14,9 +17,13 @@ public class DeleteReceiptService implements DeleteReceiptUseCase { private final DeleteReceiptPort deleteReceiptPort; + private final DeleteReceiptImagePort deleteReceiptImagePort; + private final ReceiptEditor receiptEditor; @Override public void deleteReceiptList(User user, List receiptIds) { - deleteReceiptPort.deleteReceiptList(user, receiptIds); + List receiptList = deleteReceiptPort.deleteReceiptList(user, receiptIds); + List receiptImage = receiptEditor.deleteReceiptImage(receiptList); + deleteReceiptImagePort.deleteImages(receiptImage); } } diff --git a/src/main/java/com/ClubAccount_BE/receipt/domain/service/ReceiptEditor.java b/src/main/java/com/ClubAccount_BE/receipt/domain/service/ReceiptEditor.java index 8972398..330261a 100644 --- a/src/main/java/com/ClubAccount_BE/receipt/domain/service/ReceiptEditor.java +++ b/src/main/java/com/ClubAccount_BE/receipt/domain/service/ReceiptEditor.java @@ -1,5 +1,6 @@ package com.ClubAccount_BE.receipt.domain.service; +import static com.ClubAccount_BE.core.constant.CommonConstant.DEFAULT_IMAGE; import static com.ClubAccount_BE.receipt.domain.type.ReceiptCategory.GROUP_DINING; import static com.ClubAccount_BE.receipt.domain.type.ReceiptCategory.OTHER; import static com.ClubAccount_BE.receipt.domain.type.ReceiptCategory.SUBSCRIPTION; @@ -72,4 +73,14 @@ public List calculateMonthlyExpense( monthlyExpense.getOrDefault(month, BigDecimal.ZERO))) .collect(Collectors.toList()); } + + /** + * 영수증 이미지 삭제 시 필요한 URL 리스트 생성 + */ + public List deleteReceiptImage(List receiptList) { + return receiptList.stream() + .map(Receipt::getReceiptImageUrl) + .filter(url -> url != null && !url.equals(DEFAULT_IMAGE)) + .toList(); + } } From 2acc6d1d579ed096caa264c2c986dac1ce482fda Mon Sep 17 00:00:00 2001 From: baekjaehyuk Date: Wed, 21 May 2025 19:31:14 +0900 Subject: [PATCH 4/6] =?UTF-8?q?TB-33/refactor:=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../receipt/adapter/out/ReceiptImageRepositoryAdapter.java | 4 ++-- .../{UploadReceiptPort.java => UploadReceiptImagePort.java} | 2 +- .../receipt/application/service/CreateReceiptService.java | 6 +++--- .../application/service/CreateReceiptServiceTest.java | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) rename src/main/java/com/ClubAccount_BE/receipt/application/port/out/{UploadReceiptPort.java => UploadReceiptImagePort.java} (79%) diff --git a/src/main/java/com/ClubAccount_BE/receipt/adapter/out/ReceiptImageRepositoryAdapter.java b/src/main/java/com/ClubAccount_BE/receipt/adapter/out/ReceiptImageRepositoryAdapter.java index 86b843a..3afcb62 100644 --- a/src/main/java/com/ClubAccount_BE/receipt/adapter/out/ReceiptImageRepositoryAdapter.java +++ b/src/main/java/com/ClubAccount_BE/receipt/adapter/out/ReceiptImageRepositoryAdapter.java @@ -5,7 +5,7 @@ import com.ClubAccount_BE.core.exception.ApiException; import com.ClubAccount_BE.receipt.application.port.out.DeleteReceiptImagePort; -import com.ClubAccount_BE.receipt.application.port.out.UploadReceiptPort; +import com.ClubAccount_BE.receipt.application.port.out.UploadReceiptImagePort; import java.io.IOException; import java.net.URI; import java.util.List; @@ -21,7 +21,7 @@ @Component @RequiredArgsConstructor -public class ReceiptImageRepositoryAdapter implements UploadReceiptPort, DeleteReceiptImagePort { +public class ReceiptImageRepositoryAdapter implements UploadReceiptImagePort, DeleteReceiptImagePort { private final S3Client amazonS3; diff --git a/src/main/java/com/ClubAccount_BE/receipt/application/port/out/UploadReceiptPort.java b/src/main/java/com/ClubAccount_BE/receipt/application/port/out/UploadReceiptImagePort.java similarity index 79% rename from src/main/java/com/ClubAccount_BE/receipt/application/port/out/UploadReceiptPort.java rename to src/main/java/com/ClubAccount_BE/receipt/application/port/out/UploadReceiptImagePort.java index 7bbf214..b9eadae 100644 --- a/src/main/java/com/ClubAccount_BE/receipt/application/port/out/UploadReceiptPort.java +++ b/src/main/java/com/ClubAccount_BE/receipt/application/port/out/UploadReceiptImagePort.java @@ -2,7 +2,7 @@ import org.springframework.web.multipart.MultipartFile; -public interface UploadReceiptPort { +public interface UploadReceiptImagePort { String uploadReceipt(MultipartFile image); } diff --git a/src/main/java/com/ClubAccount_BE/receipt/application/service/CreateReceiptService.java b/src/main/java/com/ClubAccount_BE/receipt/application/service/CreateReceiptService.java index 826e905..e6e29bd 100644 --- a/src/main/java/com/ClubAccount_BE/receipt/application/service/CreateReceiptService.java +++ b/src/main/java/com/ClubAccount_BE/receipt/application/service/CreateReceiptService.java @@ -5,7 +5,7 @@ import com.ClubAccount_BE.receipt.adapter.in.web.dto.request.ReceiptRequest; import com.ClubAccount_BE.receipt.application.port.in.CreateReceiptUseCase; import com.ClubAccount_BE.receipt.application.port.out.CreateReceiptPort; -import com.ClubAccount_BE.receipt.application.port.out.UploadReceiptPort; +import com.ClubAccount_BE.receipt.application.port.out.UploadReceiptImagePort; import com.ClubAccount_BE.receipt.domain.Receipt; import com.ClubAccount_BE.receipt.domain.ReceiptItem; import com.ClubAccount_BE.receipt.domain.service.ReceiptEditor; @@ -23,7 +23,7 @@ public class CreateReceiptService implements CreateReceiptUseCase { private final CreateReceiptPort createReceiptPort; - private final UploadReceiptPort uploadReceiptPort; + private final UploadReceiptImagePort uploadReceiptImagePort; private final ReceiptEditor receiptEditor; private final ReceiptItemEditor receiptItemEditor; @@ -40,7 +40,7 @@ public Long createReceipt( receiptRequest.date(), receiptRequest.amount(), receiptRequest.etc(), - image == null ? DEFAULT_IMAGE : uploadReceiptPort.uploadReceipt(image) + image == null ? DEFAULT_IMAGE : uploadReceiptImagePort.uploadReceipt(image) ); List receiptItems = receiptItemEditor.toReceiptItems(receiptRequest, receipt); boolean isAmountMatched = receiptEditor.checkAmountMatch(receipt, receiptItems); diff --git a/src/test/java/com/ClubAccount_BE/receipt/application/service/CreateReceiptServiceTest.java b/src/test/java/com/ClubAccount_BE/receipt/application/service/CreateReceiptServiceTest.java index 08adb00..4258503 100644 --- a/src/test/java/com/ClubAccount_BE/receipt/application/service/CreateReceiptServiceTest.java +++ b/src/test/java/com/ClubAccount_BE/receipt/application/service/CreateReceiptServiceTest.java @@ -1,7 +1,7 @@ package com.ClubAccount_BE.receipt.application.service; import com.ClubAccount_BE.receipt.application.port.out.CreateReceiptPort; -import com.ClubAccount_BE.receipt.application.port.out.UploadReceiptPort; +import com.ClubAccount_BE.receipt.application.port.out.UploadReceiptImagePort; import com.ClubAccount_BE.user.domain.User; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.extension.ExtendWith; @@ -16,7 +16,7 @@ class CreateReceiptServiceTest { private CreateReceiptPort createReceiptPort; @Mock - private UploadReceiptPort uploadReceiptPort; + private UploadReceiptImagePort uploadReceiptImagePort; @InjectMocks private CreateReceiptService createReceiptService; From fe77dee802b0d92ea539cc845b017114428ebfee Mon Sep 17 00:00:00 2001 From: baekjaehyuk Date: Wed, 21 May 2025 19:43:00 +0900 Subject: [PATCH 5/6] =?UTF-8?q?TB-33/refactor:=20=EC=97=94=EB=93=9C?= =?UTF-8?q?=ED=8F=AC=EC=9D=B8=ED=8A=B8=20=EA=B2=BD=EB=A1=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../receipt/adapter/in/web/CreateReceiptController.java | 2 +- .../receipt/adapter/in/web/DeleteReceiptController.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/ClubAccount_BE/receipt/adapter/in/web/CreateReceiptController.java b/src/main/java/com/ClubAccount_BE/receipt/adapter/in/web/CreateReceiptController.java index 0a813d2..16201b2 100644 --- a/src/main/java/com/ClubAccount_BE/receipt/adapter/in/web/CreateReceiptController.java +++ b/src/main/java/com/ClubAccount_BE/receipt/adapter/in/web/CreateReceiptController.java @@ -20,7 +20,7 @@ public class CreateReceiptController implements CreateReceiptApi { private final CreateReceiptUseCase createReceiptUseCase; - @PostMapping("/create") + @PostMapping public Long createReceipt( @LoginUser User user, @RequestPart(value = "image", required = false) MultipartFile image, diff --git a/src/main/java/com/ClubAccount_BE/receipt/adapter/in/web/DeleteReceiptController.java b/src/main/java/com/ClubAccount_BE/receipt/adapter/in/web/DeleteReceiptController.java index 198c8a2..c674d8f 100644 --- a/src/main/java/com/ClubAccount_BE/receipt/adapter/in/web/DeleteReceiptController.java +++ b/src/main/java/com/ClubAccount_BE/receipt/adapter/in/web/DeleteReceiptController.java @@ -20,7 +20,7 @@ public class DeleteReceiptController implements DeleteReceiptApi { private final DeleteReceiptUseCase deleteReceiptUseCase; - @DeleteMapping("/receipts") + @DeleteMapping public ResponseEntity deleteReceiptList( @LoginUser User user, @RequestParam @NotEmpty List receiptIds From f39aeaf99912422e5c65371b8eab6c944a8c5312 Mon Sep 17 00:00:00 2001 From: baekjaehyuk Date: Wed, 21 May 2025 23:33:59 +0900 Subject: [PATCH 6/6] =?UTF-8?q?TB-33/chore:=20=EA=B3=B5=EB=B0=B1=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../receipt/application/port/out/DeleteReceiptPort.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/ClubAccount_BE/receipt/application/port/out/DeleteReceiptPort.java b/src/main/java/com/ClubAccount_BE/receipt/application/port/out/DeleteReceiptPort.java index 0b9971e..4b0448d 100644 --- a/src/main/java/com/ClubAccount_BE/receipt/application/port/out/DeleteReceiptPort.java +++ b/src/main/java/com/ClubAccount_BE/receipt/application/port/out/DeleteReceiptPort.java @@ -7,5 +7,4 @@ public interface DeleteReceiptPort { List deleteReceiptList(User user, List receiptIds); - }