Skip to content

Commit 584f125

Browse files
authored
Merge pull request #63 from JA-yeong-eop-JA-moeu-JA/dev
🚀 deploy: dev -> main 병합
2 parents c5cdb64 + eb697af commit 584f125

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+1075
-28
lines changed

build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@ dependencies {
5353
annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta"
5454
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
5555
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
56+
57+
// S3
58+
implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'
5659
}
5760

5861
tasks.named('test') {
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package com.jajaja.domain.delivery.controller;
2+
3+
import com.jajaja.domain.delivery.dto.DeliveryRequestDto;
4+
import com.jajaja.domain.delivery.dto.DeliveryResponseDto;
5+
import com.jajaja.domain.delivery.service.DeliveryCommandService;
6+
import com.jajaja.domain.delivery.service.DeliveryQueryService;
7+
import com.jajaja.global.apiPayload.ApiResponse;
8+
import com.jajaja.global.config.security.annotation.Auth;
9+
import io.swagger.v3.oas.annotations.Operation;
10+
import jakarta.validation.Valid;
11+
import lombok.RequiredArgsConstructor;
12+
import org.springframework.web.bind.annotation.*;
13+
14+
import java.util.List;
15+
16+
@RestController
17+
@RequiredArgsConstructor
18+
@RequestMapping("/api/addresses")
19+
public class DeliveryController {
20+
21+
private final DeliveryQueryService deliveryQueryService;
22+
private final DeliveryCommandService deliveryCommandService;
23+
24+
@Operation(
25+
summary = "배송지 목록 조회 API | by 엠마/신윤지",
26+
description = "배송지 목록을 조회합니다.")
27+
@GetMapping
28+
public ApiResponse<List<DeliveryResponseDto>> getDeliveriesByMemberId(@Auth Long memberId) {
29+
return ApiResponse.onSuccess(deliveryQueryService.getDeliveriesByMemberId(memberId));
30+
}
31+
32+
@Operation(
33+
summary = "배송지 추가 API | by 엠마/신윤지",
34+
description = "배송지를 새로 추가합니다."
35+
)
36+
@PostMapping
37+
public ApiResponse<String> addDeliveryAddress(@Auth Long memberId, @Valid DeliveryRequestDto request) {
38+
deliveryCommandService.addDeliveryAddress(memberId, request);
39+
return ApiResponse.onSuccess("성공적으로 배송지를 추가하였습니다.");
40+
}
41+
42+
@Operation(
43+
summary = "배송지 수정 API | by 엠마/신윤지",
44+
description = "기존에 저장되어 있던 배송지를 수정합니다."
45+
)
46+
@PatchMapping("/{deliveryId}")
47+
public ApiResponse<String> updateDeliveryAddress(@Auth Long memberId, @RequestParam Long deliveryId, @Valid DeliveryRequestDto request) {
48+
deliveryCommandService.updateDeliveryAddress(memberId, deliveryId, request);
49+
return ApiResponse.onSuccess("성공적으로 배송지를 수정하였습니다.");
50+
}
51+
52+
@Operation(
53+
summary = "배송지 삭제 API | by 엠마/신윤지",
54+
description = "기존에 저장되어 있던 배송지를 삭제합니다."
55+
)
56+
@DeleteMapping("/{deliveryId}")
57+
public ApiResponse<String> deleteDeliveryAddress(@Auth Long memberId, @RequestParam Long deliveryId) {
58+
deliveryCommandService.deleteDeliveryAddress(memberId, deliveryId);
59+
return ApiResponse.onSuccess("성공적으로 배송지를 삭제하였습니다.");
60+
}
61+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.jajaja.domain.delivery.dto;
2+
3+
import jakarta.validation.constraints.NotBlank;
4+
import jakarta.validation.constraints.NotNull;
5+
import jakarta.validation.constraints.Size;
6+
7+
public record DeliveryRequestDto(
8+
@NotBlank(message = "이름은 필수입니다.")
9+
@Size(max = 10)
10+
String name,
11+
12+
@NotBlank(message = "전화번호는 필수입니다.")
13+
@Size(min = 13, max = 13)
14+
String phone,
15+
16+
@NotBlank(message = "주소는 필수입니다.")
17+
String address,
18+
19+
String addressDetail,
20+
21+
@NotBlank(message = "우편번호는 필수입니다.")
22+
@Size(min = 5, max = 5)
23+
String zipcode,
24+
25+
String buildingPassword,
26+
27+
@NotNull(message = "기본 배송지 여부는 필수입니다.")
28+
Boolean isDefault
29+
) {
30+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.jajaja.domain.delivery.dto;
2+
3+
import com.jajaja.domain.delivery.entity.Delivery;
4+
import lombok.Builder;
5+
6+
@Builder
7+
public record DeliveryResponseDto(
8+
Long id,
9+
String name,
10+
String phone,
11+
String address,
12+
String addressDetail,
13+
String zipcode,
14+
String buildingPassword,
15+
Boolean isDefault
16+
) {
17+
public static DeliveryResponseDto of(Delivery delivery) {
18+
return DeliveryResponseDto.builder()
19+
.id(delivery.getId())
20+
.name(delivery.getName())
21+
.phone(delivery.getPhone())
22+
.address(delivery.getAddress())
23+
.addressDetail(delivery.getAddressDetail())
24+
.zipcode(delivery.getZipcode())
25+
.buildingPassword(delivery.getBuildingPassword())
26+
.isDefault(delivery.getIsDefault())
27+
.build();
28+
}
29+
}

src/main/java/com/jajaja/domain/delivery/entity/Delivery.java

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public class Delivery extends BaseEntity {
3636
private String zipcode;
3737

3838
@Column(length = 255)
39-
private String doorPassword;
39+
private String buildingPassword;
4040

4141
@Column(nullable = false)
4242
private Boolean isDefault;
@@ -47,4 +47,31 @@ public class Delivery extends BaseEntity {
4747

4848
@OneToMany(mappedBy = "delivery")
4949
private List<Order> orders = new ArrayList<>();
50+
51+
public static Delivery create(String name, String phone, String address, String addressDetail, String zipcode, String buildingPassword, Boolean isDefault, Member member) {
52+
return Delivery.builder()
53+
.name(name)
54+
.phone(phone)
55+
.address(address)
56+
.addressDetail(addressDetail)
57+
.zipcode(zipcode)
58+
.buildingPassword(buildingPassword)
59+
.isDefault(isDefault)
60+
.member(member)
61+
.build();
62+
}
63+
64+
public void update(String name, String phone, String address, String addressDetail, String zipcode, String buildingPassword, Boolean isDefault) {
65+
this.name = name;
66+
this.phone = phone;
67+
this.address = address;
68+
this.addressDetail = addressDetail;
69+
this.zipcode = zipcode;
70+
this.buildingPassword = buildingPassword;
71+
this.isDefault = isDefault;
72+
}
73+
74+
public void removeDefault() {
75+
this.isDefault = false;
76+
}
5077
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.jajaja.domain.delivery.repository;
2+
3+
import com.jajaja.domain.delivery.entity.Delivery;
4+
import com.jajaja.domain.member.entity.Member;
5+
import org.springframework.data.jpa.repository.JpaRepository;
6+
import org.springframework.stereotype.Repository;
7+
8+
import java.util.List;
9+
import java.util.Optional;
10+
11+
@Repository
12+
public interface DeliveryRepository extends JpaRepository<Delivery, Long> {
13+
List<Delivery> findAllByMember(Member member);
14+
Optional<Delivery> findByMemberAndIsDefaultIsTrue(Member member);
15+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.jajaja.domain.delivery.service;
2+
3+
import com.jajaja.domain.delivery.dto.DeliveryRequestDto;
4+
5+
public interface DeliveryCommandService {
6+
void addDeliveryAddress(Long memberId, DeliveryRequestDto request);
7+
void deleteDeliveryAddress(Long memberId, Long deliveryId);
8+
void updateDeliveryAddress(Long memberId, Long deliveryId, DeliveryRequestDto request);
9+
}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package com.jajaja.domain.delivery.service;
2+
3+
import com.jajaja.domain.delivery.dto.DeliveryRequestDto;
4+
import com.jajaja.domain.delivery.entity.Delivery;
5+
import com.jajaja.domain.delivery.repository.DeliveryRepository;
6+
import com.jajaja.domain.member.entity.Member;
7+
import com.jajaja.domain.member.repository.MemberRepository;
8+
import com.jajaja.global.apiPayload.code.status.ErrorStatus;
9+
import com.jajaja.global.apiPayload.exception.handler.DeliveryHandler;
10+
import lombok.RequiredArgsConstructor;
11+
import org.springframework.stereotype.Service;
12+
import org.springframework.transaction.annotation.Transactional;
13+
14+
@Service
15+
@RequiredArgsConstructor
16+
@Transactional
17+
public class DeliveryCommandServiceImpl implements DeliveryCommandService{
18+
19+
private final DeliveryRepository deliveryRepository;
20+
private final MemberRepository memberRepository;
21+
22+
@Override
23+
public void addDeliveryAddress(Long memberId, DeliveryRequestDto request) {
24+
Member member = memberRepository.findById(memberId).orElseThrow(
25+
() -> new DeliveryHandler(ErrorStatus.MEMBER_NOT_FOUND)
26+
);
27+
28+
if(request.isDefault()) {
29+
updateDefaultAddress(member);
30+
}
31+
32+
deliveryRepository.save(Delivery.create(
33+
request.name(),
34+
request.phone(),
35+
request.address(),
36+
request.addressDetail(),
37+
request.zipcode(),
38+
request.buildingPassword(),
39+
request.isDefault(),
40+
member
41+
));
42+
}
43+
44+
@Override
45+
public void deleteDeliveryAddress(Long memberId, Long deliveryId) {
46+
Member member = memberRepository.findById(memberId).orElseThrow( () -> new DeliveryHandler(ErrorStatus.MEMBER_NOT_FOUND));
47+
deliveryRepository.delete(getOwnDelivery(member, deliveryId));
48+
}
49+
50+
@Override
51+
public void updateDeliveryAddress(Long memberId, Long deliveryId, DeliveryRequestDto request) {
52+
Member member = memberRepository.findById(memberId).orElseThrow( () -> new DeliveryHandler(ErrorStatus.MEMBER_NOT_FOUND));
53+
Delivery delivery = getOwnDelivery(member, deliveryId);
54+
55+
if(request.isDefault()) {
56+
updateDefaultAddress(member);
57+
}
58+
delivery.update(
59+
request.name(),
60+
request.phone(),
61+
request.address(),
62+
request.addressDetail(),
63+
request.zipcode(),
64+
request.buildingPassword(),
65+
request.isDefault()
66+
);
67+
}
68+
69+
private void updateDefaultAddress(Member member) {
70+
deliveryRepository.findByMemberAndIsDefaultIsTrue(member)
71+
.ifPresent(Delivery::removeDefault);
72+
}
73+
74+
/**
75+
* 멤버 아이디와 배송지 아이디를 기반으로 중복되는 에러 처리를 메소드로 분리하였습니다.
76+
* @param member 멤버 엔티티
77+
* @param deliveryId 배송지 아이디
78+
*/
79+
private Delivery getOwnDelivery(Member member, Long deliveryId) {
80+
Delivery delivery = deliveryRepository.findById(deliveryId).orElseThrow(() -> new DeliveryHandler(ErrorStatus.DELIVERY_NOT_FOUND));
81+
82+
// 배송지 데이터베이스에 저장된 멤버와 현재 로그인 된 멤버가 다를 경우
83+
if(delivery.getMember() != member) {
84+
throw new DeliveryHandler(ErrorStatus.DELIVERY_MEMBER_NOT_MATCH);
85+
}
86+
87+
return delivery;
88+
}
89+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.jajaja.domain.delivery.service;
2+
3+
import com.jajaja.domain.delivery.dto.DeliveryResponseDto;
4+
5+
import java.util.List;
6+
7+
public interface DeliveryQueryService {
8+
List<DeliveryResponseDto> getDeliveriesByMemberId(Long memberId);
9+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.jajaja.domain.delivery.service;
2+
3+
import com.jajaja.domain.delivery.dto.DeliveryResponseDto;
4+
import com.jajaja.domain.delivery.repository.DeliveryRepository;
5+
import com.jajaja.domain.member.entity.Member;
6+
import com.jajaja.domain.member.repository.MemberRepository;
7+
import com.jajaja.global.apiPayload.code.status.ErrorStatus;
8+
import com.jajaja.global.apiPayload.exception.handler.DeliveryHandler;
9+
import lombok.RequiredArgsConstructor;
10+
import org.springframework.stereotype.Service;
11+
import org.springframework.transaction.annotation.Transactional;
12+
13+
import java.util.List;
14+
import java.util.stream.Collectors;
15+
16+
@Service
17+
@RequiredArgsConstructor
18+
@Transactional(readOnly = true)
19+
public class DeliveryQueryServiceImpl implements DeliveryQueryService {
20+
21+
private final DeliveryRepository deliveryRepository;
22+
private final MemberRepository memberRepository;
23+
24+
@Override
25+
public List<DeliveryResponseDto> getDeliveriesByMemberId(Long memberId) {
26+
Member member = memberRepository.findById(memberId).orElseThrow(
27+
() -> new DeliveryHandler(ErrorStatus.MEMBER_NOT_FOUND)
28+
);
29+
30+
return deliveryRepository.findAllByMember(member).stream()
31+
.map(DeliveryResponseDto::of)
32+
.collect(Collectors.toList());
33+
}
34+
}

0 commit comments

Comments
 (0)