diff --git a/src/main/java/com/univ/sohwakhaeng/auth/api/dto/TokenDto.java b/src/main/java/com/univ/sohwakhaeng/auth/api/dto/TokenDto.java index 47aa350..9838ca7 100644 --- a/src/main/java/com/univ/sohwakhaeng/auth/api/dto/TokenDto.java +++ b/src/main/java/com/univ/sohwakhaeng/auth/api/dto/TokenDto.java @@ -1,6 +1,15 @@ package com.univ.sohwakhaeng.auth.api.dto; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; @Builder -public record TokenDto(String grantType, String accessToken) {} \ No newline at end of file +@Schema(description = "토큰 DTO") +public record TokenDto( + + @Schema(description = "토큰의 인증 타입", example = "Bearer") + String grantType, + + @Schema(description = "인증을 위한 액세스 토큰", example = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...") + String accessToken +) {} diff --git a/src/main/java/com/univ/sohwakhaeng/cart/api/dto/CartRequestDto.java b/src/main/java/com/univ/sohwakhaeng/cart/api/dto/CartRequestDto.java index ee21f47..4ae079d 100644 --- a/src/main/java/com/univ/sohwakhaeng/cart/api/dto/CartRequestDto.java +++ b/src/main/java/com/univ/sohwakhaeng/cart/api/dto/CartRequestDto.java @@ -2,15 +2,30 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.univ.sohwakhaeng.item.api.dto.ItemRequestDto; +import io.swagger.v3.oas.annotations.media.Schema; + import java.util.List; +@Schema(description = "장바구니 요청 DTO") public record CartRequestDto( + + @Schema(description = "기업의 ID", example = "1") @JsonProperty("enterpriseId") Long enterpriseId, + @Schema(description = "장바구니에 담긴 상품 목록", example = """ + [ + { + "productId": 1, + "quantity": 3 + }, + { + "productId": 2, + "quantity": 2 + } + ] + """) @JsonProperty("items") List products ) { - } - diff --git a/src/main/java/com/univ/sohwakhaeng/cart/api/dto/CartResponseDto.java b/src/main/java/com/univ/sohwakhaeng/cart/api/dto/CartResponseDto.java index f7a8760..d3a7240 100644 --- a/src/main/java/com/univ/sohwakhaeng/cart/api/dto/CartResponseDto.java +++ b/src/main/java/com/univ/sohwakhaeng/cart/api/dto/CartResponseDto.java @@ -4,20 +4,56 @@ import com.univ.sohwakhaeng.cart.Cart; import com.univ.sohwakhaeng.enterprise.api.dto.EnterpriseOverviewDto; import com.univ.sohwakhaeng.item.api.dto.ItemRequestDto; +import com.univ.sohwakhaeng.item.api.dto.ItemResponseDto; +import com.univ.sohwakhaeng.product.Product; import java.util.List; +import java.util.function.Function; +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(description = "장바구니 응답 DTO") public record CartResponseDto( + + @Schema(description = "기업 개요 정보", example = """ + { + "enterprise_id": 1, + "enterprise_image_url": "https://example.com/enterprise-image.jpg", + "enterprise_name": "초록믿음강진", + "category": "AGRICULTURAL_PRODUCTS" + } + """) @JsonProperty("enterprise") EnterpriseOverviewDto enterpriseOverviewDto, + @Schema(description = "장바구니에 담긴 상품 목록", example = """ + [ + { + "product_id": 1, + "product_name": "유기농 쌀", + "unit": "1kg", + "imageUrl": "https://example.com/product-image.jpg", + "quantity": 3 + }, + { + "product_id": 2, + "product_name": "감자", + "unit": "1kg", + "imageUrl": "https://example.com/product-image2.jpg", + "quantity": 2 + } + ] + """) @JsonProperty("items") - List itemRequestDtoList + List itemRequestDtoList ) { - public static CartResponseDto fromEntity(Cart cart) { + public static CartResponseDto fromEntity(Cart cart, String enterpriseImageUrl, Function getProductImageUrlFunction) { return new CartResponseDto( - EnterpriseOverviewDto.fromEntity(cart.getEnterprise()), + EnterpriseOverviewDto.fromEntity(cart.getEnterprise(), enterpriseImageUrl), cart.getItems().stream() - .map(ItemRequestDto::fromEntity) + .map(item -> { + String productImageUrl = getProductImageUrlFunction.apply(item.getProduct()); + return ItemResponseDto.fromEntity(item, productImageUrl); + }) .toList() ); } diff --git a/src/main/java/com/univ/sohwakhaeng/cart/service/CartService.java b/src/main/java/com/univ/sohwakhaeng/cart/service/CartService.java index e141969..ae28375 100644 --- a/src/main/java/com/univ/sohwakhaeng/cart/service/CartService.java +++ b/src/main/java/com/univ/sohwakhaeng/cart/service/CartService.java @@ -10,8 +10,11 @@ import com.univ.sohwakhaeng.item.Item; import com.univ.sohwakhaeng.item.api.dto.ItemRequestDto; import com.univ.sohwakhaeng.item.service.ItemService; +import com.univ.sohwakhaeng.product.Product; +import com.univ.sohwakhaeng.product.service.ProductService; import com.univ.sohwakhaeng.user.User; import java.util.List; +import java.util.function.Function; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -24,6 +27,7 @@ public class CartService { private final CartRepository cartRepository; private final EnterpriseService enterpriseService; private final ItemService itemService; + private final ProductService productService; @Transactional public Long saveCart(CartRequestDto requestDto, User user) throws EnterpriseNotFoundException { @@ -40,7 +44,11 @@ public Long saveCart(CartRequestDto requestDto, User user) throws EnterpriseNotF public List getMyCarts(User user) { List carts = getAllCartByUserId(user.getId()); return carts.stream() - .map(CartResponseDto::fromEntity) + .map(cart -> { + String enterpriseImageUrl = enterpriseService.getEnterpriseImageUrl(cart.getEnterprise().getName()); + Function getProductImageUrlFunction = product -> productService.getProductImageUrl(product.getName()); + return CartResponseDto.fromEntity(cart, enterpriseImageUrl, getProductImageUrlFunction); + }) .collect(Collectors.toList()); } diff --git a/src/main/java/com/univ/sohwakhaeng/contract/api/dto/ContractDetailDto.java b/src/main/java/com/univ/sohwakhaeng/contract/api/dto/ContractDetailDto.java index a6bbfff..919fc12 100644 --- a/src/main/java/com/univ/sohwakhaeng/contract/api/dto/ContractDetailDto.java +++ b/src/main/java/com/univ/sohwakhaeng/contract/api/dto/ContractDetailDto.java @@ -5,20 +5,52 @@ import java.util.List; +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(description = "계약 상세 정보 DTO") @Builder public record ContractDetailDto( + + @Schema(description = "기업 ID", example = "1") @JsonProperty long enterpriseId, + + @Schema(description = "기업 프로필 이미지 URL", example = "https://example.com/profile-image.jpg") @JsonProperty String profileImgUrl, + + @Schema(description = "기업 이름", example = "초록믿음강진") @JsonProperty String enterpriseName, + + @Schema(description = "기업 카테고리", example = "AGRICULTURAL_PRODUCTS") @JsonProperty String category, + + @Schema(description = "정기 배송 정보", example = "주간 배송 가능") @JsonProperty - String reqularDelivery, + String regularDelivery, + + @Schema(description = "계약 요청 기간", example = "3개월") @JsonProperty String requestTerm, + + @Schema(description = "계약 제품 목록", example = """ + [ + { + "productId": 1, + "productName": "유기농 쌀", + "unit": "1kg", + "price": 5000 + }, + { + "productId": 2, + "productName": "감자", + "unit": "2kg", + "price": 4000 + } + ] + """) @JsonProperty List products ) { diff --git a/src/main/java/com/univ/sohwakhaeng/contract/api/dto/ContractProducsResDto.java b/src/main/java/com/univ/sohwakhaeng/contract/api/dto/ContractProducsResDto.java index 75356e7..0c776df 100644 --- a/src/main/java/com/univ/sohwakhaeng/contract/api/dto/ContractProducsResDto.java +++ b/src/main/java/com/univ/sohwakhaeng/contract/api/dto/ContractProducsResDto.java @@ -2,11 +2,17 @@ import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Builder; +import io.swagger.v3.oas.annotations.media.Schema; @Builder +@Schema(description = "계약 상품 응답 DTO") public record ContractProducsResDto( + + @Schema(description = "상품 이름", example = "유기농 쌀") @JsonProperty String name, + + @Schema(description = "상품 수량", example = "10") @JsonProperty int quantity ) { diff --git a/src/main/java/com/univ/sohwakhaeng/contract/api/dto/ContractReqDto.java b/src/main/java/com/univ/sohwakhaeng/contract/api/dto/ContractReqDto.java index 167e0e7..6e2c66d 100644 --- a/src/main/java/com/univ/sohwakhaeng/contract/api/dto/ContractReqDto.java +++ b/src/main/java/com/univ/sohwakhaeng/contract/api/dto/ContractReqDto.java @@ -2,13 +2,47 @@ import java.util.List; +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(description = "계약 요청 DTO") public record ContractReqDto( + + @Schema(description = "계약할 기업의 ID", example = "1") long enterpriseId, + + @Schema(description = "주당 배송 빈도", example = "2") int deliveryWeek, + + @Schema(description = "선호하는 배송 요일", example = "Monday") String deliveryDay, + + @Schema(description = "배송 수령 방법", example = "Home Delivery") String takeMethod, + + @Schema(description = "계약 요청 기간", example = "6개월") String requestedTerm, + + @Schema(description = "계약 총 가격", example = "150000") long totalPrice, + + @Schema(description = "계약에 포함된 제품 목록", example = """ + [ + { + "productId": 1, + "productName": "유기농 쌀", + "unit": "1kg", + "price": 5000, + "quantity": 10 + }, + { + "productId": 2, + "productName": "감자", + "unit": "2kg", + "price": 4000, + "quantity": 5 + } + ] + """) List products ) { -} \ No newline at end of file +} diff --git a/src/main/java/com/univ/sohwakhaeng/contract/api/dto/ContractsInfoDto.java b/src/main/java/com/univ/sohwakhaeng/contract/api/dto/ContractsInfoDto.java index 90815e4..3905a82 100644 --- a/src/main/java/com/univ/sohwakhaeng/contract/api/dto/ContractsInfoDto.java +++ b/src/main/java/com/univ/sohwakhaeng/contract/api/dto/ContractsInfoDto.java @@ -3,17 +3,30 @@ import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Builder; +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(description = "계약 정보 DTO") @Builder public record ContractsInfoDto( + + @Schema(description = "계약과 연관된 기업 ID", example = "1") @JsonProperty long enterpriseId, + + @Schema(description = "계약 ID", example = "101") @JsonProperty long contractId, + + @Schema(description = "기업 프로필 이미지 URL", example = "https://example.com/profile-image.jpg") @JsonProperty String profileImage, + + @Schema(description = "기업 이름", example = "초록믿음강진") @JsonProperty String enterpriseName, + + @Schema(description = "기업 카테고리", example = "AGRICULTURAL_PRODUCTS") @JsonProperty String category ) { -} \ No newline at end of file +} diff --git a/src/main/java/com/univ/sohwakhaeng/contract/api/dto/ProductDto.java b/src/main/java/com/univ/sohwakhaeng/contract/api/dto/ProductDto.java index 9c56f94..6451736 100644 --- a/src/main/java/com/univ/sohwakhaeng/contract/api/dto/ProductDto.java +++ b/src/main/java/com/univ/sohwakhaeng/contract/api/dto/ProductDto.java @@ -1,7 +1,16 @@ package com.univ.sohwakhaeng.contract.api.dto; +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(description = "제품 DTO") public record ProductDto( + + @Schema(description = "제품의 ID", example = "1") long productId, + + @Schema(description = "제품 이름", example = "유기농 쌀") String productName, + + @Schema(description = "제품 수량", example = "10") int quantity -) {} \ No newline at end of file +) {} diff --git a/src/main/java/com/univ/sohwakhaeng/contract/service/ContractService.java b/src/main/java/com/univ/sohwakhaeng/contract/service/ContractService.java index 8fe9142..90f3e16 100644 --- a/src/main/java/com/univ/sohwakhaeng/contract/service/ContractService.java +++ b/src/main/java/com/univ/sohwakhaeng/contract/service/ContractService.java @@ -12,6 +12,7 @@ import com.univ.sohwakhaeng.contract.domain.repository.ContractRepository; import com.univ.sohwakhaeng.enterprise.Enterprise; import com.univ.sohwakhaeng.enterprise.repository.EnterpriseRepository; +import com.univ.sohwakhaeng.enterprise.service.EnterpriseService; import com.univ.sohwakhaeng.global.common.dto.PagedResponseDto; import com.univ.sohwakhaeng.product.Product; import com.univ.sohwakhaeng.product.repository.ProductRepository; @@ -26,6 +27,7 @@ @RequiredArgsConstructor public class ContractService { + private final EnterpriseService enterpriseService; private final ContractRepository contractRepository; private final ContractProductsRepository contractProductsRepository; private final EnterpriseRepository enterpriseRepository; @@ -79,12 +81,14 @@ private Page getPagedContractsByUser(Pageable pageable, User user) { } private ContractsInfoDto convertToDtoFromContract(Contract contract) { + String enterpriseImageUrl = enterpriseService.getEnterpriseImageUrl(contract.getEnterprise().getName()); + return ContractsInfoDto.builder() .contractId(contract.getId()) .enterpriseId(contract.getEnterprise().getId()) .enterpriseName(contract.getEnterprise().getName()) .category(contract.getEnterprise().getCategory().toString()) - .profileImage(contract.getEnterprise().getImageUrl()) + .profileImage(enterpriseImageUrl) .build(); } @@ -93,11 +97,13 @@ private ContractsInfoDto convertToDtoFromContract(Contract contract) { public ContractDetailDto getContractDetail(long contractId) { Contract contract = contractRepository.findById(contractId) .orElseThrow(() -> new IllegalArgumentException("해당 계약이 존재하지 않습니다.")); + + String enterpriseImageUrl = enterpriseService.getEnterpriseImageUrl(contract.getEnterprise().getName()); return ContractDetailDto.builder() .enterpriseId(contract.getEnterprise().getId()) .requestTerm(contract.getRequestedTerm()) - .reqularDelivery(contract.getDeliveryWeek() + " " + contract.getDeliveryDay()) - .profileImgUrl(contract.getEnterprise().getImageUrl()) + .regularDelivery(contract.getDeliveryWeek() + " " + contract.getDeliveryDay()) + .profileImgUrl(enterpriseImageUrl) .enterpriseName(contract.getEnterprise().getName()) .products(contract.getContractProducts().stream().map(this::convertToDtoFromContractProducts).toList()) .category(contract.getEnterprise().getCategory().toString()) diff --git a/src/main/java/com/univ/sohwakhaeng/enterprise/Enterprise.java b/src/main/java/com/univ/sohwakhaeng/enterprise/Enterprise.java index 9043c45..23bcd68 100644 --- a/src/main/java/com/univ/sohwakhaeng/enterprise/Enterprise.java +++ b/src/main/java/com/univ/sohwakhaeng/enterprise/Enterprise.java @@ -27,9 +27,6 @@ public class Enterprise { @Column(name = "enterprise_id") private Long id; - @Column(name = "enterprise_imageUrl") - private String imageUrl; - @Column(name = "enterprise_name") private String name; diff --git a/src/main/java/com/univ/sohwakhaeng/enterprise/api/dto/EnterpriseDetailDto.java b/src/main/java/com/univ/sohwakhaeng/enterprise/api/dto/EnterpriseDetailDto.java index c2a66bd..386f882 100644 --- a/src/main/java/com/univ/sohwakhaeng/enterprise/api/dto/EnterpriseDetailDto.java +++ b/src/main/java/com/univ/sohwakhaeng/enterprise/api/dto/EnterpriseDetailDto.java @@ -3,45 +3,78 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.univ.sohwakhaeng.enterprise.Category; import com.univ.sohwakhaeng.enterprise.Enterprise; +import com.univ.sohwakhaeng.product.Product; import com.univ.sohwakhaeng.product.api.dto.ProductResponseDto; import java.util.List; +import java.util.function.Function; +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(description = "기업 상세 정보 DTO") public record EnterpriseDetailDto( + + @Schema(description = "기업의 ID", example = "1") @JsonProperty("enterprise_id") Long id, + @Schema(description = "기업 이미지 URL", example = "https://example.com/enterprise-image.jpg") @JsonProperty("enterprise_image_url") String imageUrl, + @Schema(description = "기업 이름", example = "초록믿음강진") @JsonProperty("enterprise_name") String name, + @Schema(description = "기업 카테고리", example = "AGRICULTURAL_PRODUCTS") @JsonProperty("category") Category category, + @Schema(description = "기업 설명", example = "강진군에서 운영하는 직거래 지원센터로, 지역 농어업인이 직접 생산한 신선한 농수특산물을 판매합니다.") @JsonProperty("description") String description, + @Schema(description = "기업 평점", example = "4.5") @JsonProperty("star") Double star, + @Schema(description = "기업 위치의 위도", example = "34.6400") @JsonProperty("latitude") Double latitude, + @Schema(description = "기업 위치의 경도", example = "126.7700") @JsonProperty("longitude") Double longitude, + @Schema(description = "기업 주소", example = "전라남도 강진군 강진읍 오감길 2") @JsonProperty("address") String address, + @Schema(description = "기업이 판매하는 제품 목록", example = """ + [ + { + "product_id": 1, + "product_name": "유기농 쌀", + "unit": "1kg", + "image_url": "https://example.com/product-image1.jpg", + "price": 5000 + }, + { + "product_id": 2, + "product_name": "감자", + "unit": "1kg", + "image_url": "https://example.com/product-image2.jpg", + "price": 3000 + } + ] + """) @JsonProperty("products") List products ) { - public static EnterpriseDetailDto fromEntity(Enterprise enterprise) { + public static EnterpriseDetailDto fromEntity(Enterprise enterprise, String imageUrl, Function getProductImageUrl) { return new EnterpriseDetailDto( enterprise.getId(), - enterprise.getImageUrl(), + imageUrl, enterprise.getName(), enterprise.getCategory(), enterprise.getDescription(), @@ -50,10 +83,12 @@ public static EnterpriseDetailDto fromEntity(Enterprise enterprise) { enterprise.getLongitude(), enterprise.getAddress(), enterprise.getProducts().stream() - .map(ProductResponseDto::fromEntity) + .map(product -> { + String productImageUrl = getProductImageUrl.apply(product); + return ProductResponseDto.fromEntity(product, productImageUrl); + }) .toList() ); } } - diff --git a/src/main/java/com/univ/sohwakhaeng/enterprise/api/dto/EnterpriseOverviewDto.java b/src/main/java/com/univ/sohwakhaeng/enterprise/api/dto/EnterpriseOverviewDto.java index f61e830..8a9876a 100644 --- a/src/main/java/com/univ/sohwakhaeng/enterprise/api/dto/EnterpriseOverviewDto.java +++ b/src/main/java/com/univ/sohwakhaeng/enterprise/api/dto/EnterpriseOverviewDto.java @@ -1,27 +1,34 @@ package com.univ.sohwakhaeng.enterprise.api.dto; +import io.swagger.v3.oas.annotations.media.Schema; import com.fasterxml.jackson.annotation.JsonProperty; import com.univ.sohwakhaeng.enterprise.Category; import com.univ.sohwakhaeng.enterprise.Enterprise; +@Schema(description = "기업 요약 정보 DTO") public record EnterpriseOverviewDto( + + @Schema(description = "기업의 ID", example = "1") @JsonProperty("enterprise_id") Long id, + @Schema(description = "기업 이미지 URL", example = "https://example.com/enterprise-image.jpg") @JsonProperty("enterprise_image_url") String imageUrl, + @Schema(description = "기업 이름", example = "초록믿음강진") @JsonProperty("enterprise_name") String name, + @Schema(description = "기업 카테고리", example = "AGRICULTURAL_PRODUCTS") @JsonProperty("category") Category category ) { - public static EnterpriseOverviewDto fromEntity(Enterprise enterprise) { + public static EnterpriseOverviewDto fromEntity(Enterprise enterprise, String imageUrl) { return new EnterpriseOverviewDto( enterprise.getId(), - enterprise.getImageUrl(), + imageUrl, enterprise.getName(), enterprise.getCategory() ); diff --git a/src/main/java/com/univ/sohwakhaeng/enterprise/service/EnterpriseService.java b/src/main/java/com/univ/sohwakhaeng/enterprise/service/EnterpriseService.java index 11bfcd0..26795fb 100644 --- a/src/main/java/com/univ/sohwakhaeng/enterprise/service/EnterpriseService.java +++ b/src/main/java/com/univ/sohwakhaeng/enterprise/service/EnterpriseService.java @@ -1,5 +1,6 @@ package com.univ.sohwakhaeng.enterprise.service; +import com.amazonaws.services.s3.AmazonS3Client; import com.univ.sohwakhaeng.enterprise.Category; import com.univ.sohwakhaeng.enterprise.Enterprise; import com.univ.sohwakhaeng.enterprise.api.dto.EnterpriseDetailDto; @@ -7,7 +8,11 @@ import com.univ.sohwakhaeng.enterprise.exception.EnterpriseNotFoundException; import com.univ.sohwakhaeng.enterprise.repository.EnterpriseRepository; import com.univ.sohwakhaeng.global.common.dto.PagedResponseDto; +import com.univ.sohwakhaeng.product.Product; +import com.univ.sohwakhaeng.product.service.ProductService; +import java.util.function.Function; import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; @@ -20,18 +25,25 @@ public class EnterpriseService { private final EnterpriseRepository enterpriseRepository; + private final ProductService productService; + private final AmazonS3Client amazonS3Client; + @Value("${cloud.aws.s3.bucket}") + private String awsBucket; @Transactional(readOnly = true) public EnterpriseDetailDto getEnterpriseDetails(Long enterpriseId) throws EnterpriseNotFoundException { Enterprise enterprise = findEnterpriseEntityById(enterpriseId); - return EnterpriseDetailDto.fromEntity(enterprise); + Function getProductImageUrl = product -> productService.getProductImageUrl(product.getName()); + return EnterpriseDetailDto.fromEntity(enterprise, getEnterpriseImageUrl(enterprise.getName()), getProductImageUrl); } @Transactional(readOnly = true) public PagedResponseDto getEnterprisesByCategory(Category category, Pageable pageable) { Page enterprises = getPagedEnterprisesByCategory(category, pageable); - Page enterpriseOverviewDtos = enterprises.map(EnterpriseOverviewDto::fromEntity); - return new PagedResponseDto<>(enterpriseOverviewDtos); + Page enterpriseOverviewDtos = enterprises.map(enterprise -> { + String imageUrl = getEnterpriseImageUrl(enterprise.getName()); + return EnterpriseOverviewDto.fromEntity(enterprise, imageUrl); + }); return new PagedResponseDto<>(enterpriseOverviewDtos); } @Transactional(readOnly = true) @@ -48,4 +60,8 @@ private Page getPagedEnterprisesByCategory(Category category, Pageab return enterpriseRepository.getPagedEnterprisesByCategory(category, pageable); } + public String getEnterpriseImageUrl(String enterpriseName) { + return amazonS3Client.getUrl(awsBucket, enterpriseName).toString(); + } + } diff --git a/src/main/java/com/univ/sohwakhaeng/item/api/dto/ItemRequestDto.java b/src/main/java/com/univ/sohwakhaeng/item/api/dto/ItemRequestDto.java index e1dc13f..7c8ac8e 100644 --- a/src/main/java/com/univ/sohwakhaeng/item/api/dto/ItemRequestDto.java +++ b/src/main/java/com/univ/sohwakhaeng/item/api/dto/ItemRequestDto.java @@ -2,21 +2,22 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.univ.sohwakhaeng.item.Item; +import io.swagger.v3.oas.annotations.media.Schema; +@Schema(description = "상품 요청 DTO") public record ItemRequestDto( + + @Schema(description = "상품 ID", example = "1") @JsonProperty("product_id") Long productId, - @JsonProperty("product_name") - String productName, - + @Schema(description = "상품 수량", example = "5") @JsonProperty("quantity") int quantity ) { public static ItemRequestDto fromEntity(Item item) { return new ItemRequestDto( item.getProduct().getId(), - item.getProduct().getName(), item.getQuantity() ); } diff --git a/src/main/java/com/univ/sohwakhaeng/item/api/dto/ItemResponseDto.java b/src/main/java/com/univ/sohwakhaeng/item/api/dto/ItemResponseDto.java new file mode 100644 index 0000000..b9e705d --- /dev/null +++ b/src/main/java/com/univ/sohwakhaeng/item/api/dto/ItemResponseDto.java @@ -0,0 +1,39 @@ +package com.univ.sohwakhaeng.item.api.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.univ.sohwakhaeng.item.Item; +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(description = "Item Response DTO") +public record ItemResponseDto( + + @Schema(description = "상품의 ID", example = "1") + @JsonProperty("product_id") + Long productId, + + @Schema(description = "상품의 이름", example = "유기농 쌀") + @JsonProperty("product_name") + String productName, + + @Schema(description = "상품의 단위", example = "1kg") + @JsonProperty("unit") + String unit, + + @Schema(description = "상품 이미지 URL", example = "https://example.com/product-image.jpg") + @JsonProperty("imageUrl") + String imageUrl, + + @Schema(description = "상품의 수량", example = "10") + @JsonProperty("quantity") + int quantity +) { + public static ItemResponseDto fromEntity(Item item, String itemImageUrl) { + return new ItemResponseDto( + item.getProduct().getId(), + item.getProduct().getName(), + item.getProduct().getUnit(), + itemImageUrl, + item.getQuantity() + ); + } +} diff --git a/src/main/java/com/univ/sohwakhaeng/product/api/dto/ProductResponseDto.java b/src/main/java/com/univ/sohwakhaeng/product/api/dto/ProductResponseDto.java index 22fb127..83178c0 100644 --- a/src/main/java/com/univ/sohwakhaeng/product/api/dto/ProductResponseDto.java +++ b/src/main/java/com/univ/sohwakhaeng/product/api/dto/ProductResponseDto.java @@ -2,30 +2,43 @@ import com.univ.sohwakhaeng.product.Product; import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.v3.oas.annotations.media.Schema; +@Schema(description = "Product Response DTO") public record ProductResponseDto( + + @Schema(description = "상품의 ID", example = "1") @JsonProperty("product_id") Long id, + @Schema(description = "기업의 ID", example = "101") @JsonProperty("enterprise_id") Long enterpriseId, + @Schema(description = "상품의 이름", example = "유기농 쌀") @JsonProperty("product_name") String name, + @Schema(description = "상품의 단위", example = "1kg") @JsonProperty("unit") String unit, + @Schema(description = "상품 이미지 URL", example = "https://example.com/product-image.jpg") + @JsonProperty("imageUrl") + String imageUrl, + + @Schema(description = "상품의 가격", example = "5000") @JsonProperty("product_price") Integer price ) { - public static ProductResponseDto fromEntity(Product product) { + public static ProductResponseDto fromEntity(Product product, String imageUrl) { return new ProductResponseDto( product.getId(), product.getEnterprise() != null ? product.getEnterprise().getId() : null, product.getName(), product.getUnit(), + imageUrl, product.getPrice() ); } diff --git a/src/main/java/com/univ/sohwakhaeng/product/service/ProductService.java b/src/main/java/com/univ/sohwakhaeng/product/service/ProductService.java index a7dc503..1adffb2 100644 --- a/src/main/java/com/univ/sohwakhaeng/product/service/ProductService.java +++ b/src/main/java/com/univ/sohwakhaeng/product/service/ProductService.java @@ -1,9 +1,11 @@ package com.univ.sohwakhaeng.product.service; +import com.amazonaws.services.s3.AmazonS3Client; import com.univ.sohwakhaeng.product.Product; import com.univ.sohwakhaeng.product.exception.ProductNotFoundException; import com.univ.sohwakhaeng.product.repository.ProductRepository; import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -14,6 +16,9 @@ public class ProductService { private final ProductRepository productRepository; + private final AmazonS3Client amazonS3Client; + @Value("${cloud.aws.s3.bucket}") + private String awsBucket; @Transactional(readOnly = true) public Product getProductById(Long id) throws ProductNotFoundException { @@ -25,4 +30,8 @@ private Product findProductById(Long id) throws ProductNotFoundException { .orElseThrow(() -> new ProductNotFoundException(PRODUCT_NOT_FOUND.getMessage())); } + public String getProductImageUrl(String productName) { + return amazonS3Client.getUrl(awsBucket, productName).toString(); + } + } diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index 49dd900..e60bca3 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -55,10 +55,14 @@ cloud: static: ${AWS_REGION} stack: auto: false + server: ssl: + enabled: true key-store: ${KEY_STORE} - key-store-password: ${KEY_STORE_PASSWORD} - key-store-type: pkcs12 + key-store-password: "" + key-store-type: PEM key-alias: tomcat - enabled: true \ No newline at end of file + key-password: "" + +