Skip to content

Commit 2e5a9a5

Browse files
authored
Merge pull request #93 from sylee6529/round3
[volume-3] 커머스 상품/좋아요/주문 구현
2 parents aa14b83 + b1e87dd commit 2e5a9a5

File tree

98 files changed

+4591
-173
lines changed

Some content is hidden

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

98 files changed

+4591
-173
lines changed

.github/workflows/main.yml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
name: PR Agent
2+
on:
3+
pull_request:
4+
types: [opened, synchronize]
5+
jobs:
6+
pr_agent_job:
7+
runs-on: ubuntu-latest
8+
steps:
9+
- name: PR Agent action step
10+
uses: Codium-ai/pr-agent@main
11+
env:
12+
OPENAI_KEY: ${{ secrets.OPENAI_KEY }}
13+
GITHUB_TOKEN: ${{ secrets.G_TOKEN }}

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,6 @@ out/
3838

3939
### Kotlin ###
4040
.kotlin
41+
42+
.java-version
43+
CLAUDE.md

.java-version

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
21.0.9

apps/commerce-api/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ dependencies {
88

99
// web
1010
implementation("org.springframework.boot:spring-boot-starter-web")
11+
implementation("org.springframework.boot:spring-boot-starter-security")
1112
implementation("org.springframework.boot:spring-boot-starter-actuator")
1213
implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:${project.properties["springDocOpenApiVersion"]}")
1314

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.loopers.application.like;
2+
3+
import com.loopers.domain.like.service.LikeService;
4+
import lombok.RequiredArgsConstructor;
5+
import org.springframework.stereotype.Component;
6+
import org.springframework.transaction.annotation.Transactional;
7+
8+
@RequiredArgsConstructor
9+
@Component
10+
@Transactional
11+
public class LikeFacade {
12+
13+
private final LikeService likeService;
14+
15+
public void likeProduct(String memberId, Long productId) {
16+
likeService.like(memberId, productId);
17+
}
18+
19+
public void unlikeProduct(String memberId, Long productId) {
20+
likeService.unlike(memberId, productId);
21+
}
22+
}

apps/commerce-api/src/main/java/com/loopers/application/members/MemberFacade.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package com.loopers.application.members;
22

3-
import com.loopers.domain.members.Gender;
4-
import com.loopers.domain.members.MemberModel;
5-
import com.loopers.domain.members.MemberService;
6-
import com.loopers.domain.points.PointService;
3+
import com.loopers.domain.members.Member;
4+
import com.loopers.domain.members.enums.Gender;
5+
import com.loopers.domain.members.service.MemberService;
6+
import com.loopers.domain.points.service.PointService;
77
import com.loopers.support.error.CoreException;
88
import com.loopers.support.error.ErrorType;
99
import lombok.RequiredArgsConstructor;
@@ -18,13 +18,13 @@ public class MemberFacade {
1818

1919
@Transactional
2020
public MemberInfo registerMember(String memberId, String email, String password, String birthDate, Gender gender) {
21-
MemberModel member = memberService.registerMember(memberId, email, password, birthDate, gender);
21+
Member member = memberService.registerMember(memberId, email, password, birthDate, gender);
2222
pointService.initializeMemberPoints(memberId);
2323
return MemberInfo.from(member);
2424
}
2525

2626
public MemberInfo getMemberByMemberId(String memberId) {
27-
MemberModel member = memberService.getMemberByMemberId(memberId);
27+
Member member = memberService.getMemberByMemberId(memberId);
2828
if (member == null) {
2929
throw new CoreException(
3030
ErrorType.NOT_FOUND,

apps/commerce-api/src/main/java/com/loopers/application/members/MemberInfo.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.loopers.application.members;
22

3-
import com.loopers.domain.members.Gender;
4-
import com.loopers.domain.members.MemberModel;
3+
import com.loopers.domain.members.Member;
4+
import com.loopers.domain.members.enums.Gender;
55

66
import java.time.LocalDate;
77

@@ -12,7 +12,7 @@ public record MemberInfo(
1212
LocalDate birthDate,
1313
Gender gender
1414
) {
15-
public static MemberInfo from(MemberModel model) {
15+
public static MemberInfo from(Member model) {
1616
return new MemberInfo(
1717
model.getId(),
1818
model.getMemberId(),
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.loopers.application.order;
2+
3+
import lombok.Builder;
4+
import lombok.Getter;
5+
6+
import java.util.List;
7+
8+
@Getter
9+
@Builder
10+
public class OrderCommand {
11+
12+
private final String memberId;
13+
private final List<OrderLineCommand> orderLines;
14+
15+
public static OrderCommand of(String memberId, List<OrderLineCommand> orderLines) {
16+
return OrderCommand.builder()
17+
.memberId(memberId)
18+
.orderLines(orderLines)
19+
.build();
20+
}
21+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.loopers.application.order;
2+
3+
import com.loopers.domain.order.Order;
4+
import com.loopers.domain.order.command.OrderLineCommand;
5+
import com.loopers.domain.order.command.OrderPlacementCommand;
6+
import com.loopers.domain.order.service.OrderPlacementService;
7+
import lombok.RequiredArgsConstructor;
8+
import org.springframework.stereotype.Component;
9+
import org.springframework.transaction.annotation.Transactional;
10+
11+
import java.util.List;
12+
13+
@RequiredArgsConstructor
14+
@Component
15+
@Transactional
16+
public class OrderFacade {
17+
18+
private final OrderPlacementService orderPlacementService;
19+
20+
public OrderInfo placeOrder(OrderCommand command) {
21+
List<OrderLineCommand> domainOrderLines = command.getOrderLines().stream()
22+
.map(line -> OrderLineCommand.of(line.getProductId(), line.getQuantity()))
23+
.toList();
24+
25+
OrderPlacementCommand domainCommand = OrderPlacementCommand.of(
26+
command.getMemberId(),
27+
domainOrderLines
28+
);
29+
30+
Order order = orderPlacementService.placeOrder(domainCommand);
31+
return OrderInfo.from(order);
32+
}
33+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package com.loopers.application.order;
2+
3+
import com.loopers.domain.common.vo.Money;
4+
import com.loopers.domain.order.Order;
5+
import com.loopers.domain.order.OrderItem;
6+
import lombok.Builder;
7+
import lombok.Getter;
8+
9+
import java.time.ZonedDateTime;
10+
import java.util.List;
11+
12+
@Getter
13+
@Builder
14+
public class OrderInfo {
15+
16+
private final Long id;
17+
private final String memberId;
18+
private final Money totalPrice;
19+
private final List<OrderItemInfo> items;
20+
private final ZonedDateTime orderedAt;
21+
22+
public static OrderInfo from(Order order) {
23+
List<OrderItemInfo> itemInfos = order.getItems().stream()
24+
.map(OrderItemInfo::from)
25+
.toList();
26+
27+
return OrderInfo.builder()
28+
.id(order.getId())
29+
.memberId(order.getMemberId())
30+
.totalPrice(order.getTotalPrice())
31+
.items(itemInfos)
32+
.orderedAt(order.getCreatedAt())
33+
.build();
34+
}
35+
36+
@Getter
37+
@Builder
38+
public static class OrderItemInfo {
39+
40+
private final Long productId;
41+
private final int quantity;
42+
private final Money unitPrice;
43+
private final Money totalPrice;
44+
45+
public static OrderItemInfo from(OrderItem orderItem) {
46+
return OrderItemInfo.builder()
47+
.productId(orderItem.getProductId())
48+
.quantity(orderItem.getQuantity())
49+
.unitPrice(orderItem.getUnitPrice())
50+
.totalPrice(orderItem.getTotalPrice())
51+
.build();
52+
}
53+
}
54+
}

0 commit comments

Comments
 (0)