Skip to content

Commit 0d9ff6f

Browse files
authored
Merge pull request #452 from Juinjang/feature/add-split
feat : 임장 생성 ( INIT ) 구현 완료 및 컨트롤러 테스트 구현
2 parents fd62157 + 04ff81f commit 0d9ff6f

8 files changed

Lines changed: 199 additions & 18 deletions

File tree

build.gradle

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

9494
// Apple
9595
implementation 'com.apple.itunes.storekit:app-store-server-library:3.4.0'
96+
testImplementation 'org.springframework.security:spring-security-test'
9697
}
9798

9899
tasks.named('test') {

src/main/java/umc/th/juinjang/api/limjang/controller/NoteControllerV2.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import lombok.RequiredArgsConstructor;
1616
import umc.th.juinjang.api.dto.ApiResponse;
1717
import umc.th.juinjang.api.limjang.controller.parameter.LimjangSortOptions;
18+
import umc.th.juinjang.api.limjang.controller.request.NoteInitRequest;
1819
import umc.th.juinjang.api.limjang.controller.request.NotePatchRequest;
1920
import umc.th.juinjang.api.limjang.controller.request.NotePostRequest;
2021
import umc.th.juinjang.api.limjang.service.NoteCommandServiceV2;
@@ -42,6 +43,13 @@ public ApiResponse<NotePostResponse> createNote(@RequestBody @Valid NotePostRequ
4243
return ApiResponse.of(SuccessStatus._CREATED, noteCommandService.createNote(request, member));
4344
}
4445

46+
@Operation(summary = "임장 생성 API INIT V2 - 간편한 임장 생성")
47+
@PostMapping("/notes/init")
48+
public ApiResponse<NotePostResponse> initNote(@RequestBody @Valid NoteInitRequest request,
49+
@AuthenticationPrincipal Member member) {
50+
return ApiResponse.of(SuccessStatus._CREATED, noteCommandService.initNote(request, member));
51+
}
52+
4553
@Operation(summary = "마이 노트 조회 API V2")
4654
@GetMapping("/notes")
4755
public ApiResponse<UserNotesGetResponse> findUsersNotes(
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package umc.th.juinjang.api.limjang.controller.request;
2+
3+
import jakarta.validation.constraints.NotBlank;
4+
import jakarta.validation.constraints.NotNull;
5+
import jakarta.validation.constraints.Pattern;
6+
import umc.th.juinjang.domain.limjang.model.Limjang;
7+
import umc.th.juinjang.domain.limjang.model.LimjangPrice;
8+
import umc.th.juinjang.domain.limjang.model.LimjangPriceType;
9+
import umc.th.juinjang.domain.limjang.model.LimjangPropertyType;
10+
import umc.th.juinjang.domain.limjang.model.LimjangPurpose;
11+
import umc.th.juinjang.domain.limjang.repository.NotePriceFactory;
12+
import umc.th.juinjang.domain.member.model.Member;
13+
14+
public record NoteInitRequest(
15+
@NotNull
16+
LimjangPurpose purposeType,
17+
@NotNull
18+
LimjangPropertyType propertyType,
19+
@NotNull
20+
LimjangPriceType priceType,
21+
@NotBlank
22+
@Pattern(regexp = "^[0-9]+$", message = "가격은 숫자만 입력해야 합니다.")
23+
String price,
24+
@Pattern(regexp = "^[0-9]+$", message = "가격은 숫자만 입력해야 합니다.")
25+
String monthlyRent
26+
) {
27+
public Limjang toEntity(Member member) {
28+
LimjangPrice limjangPrice = NotePriceFactory.create(purposeType, priceType, price, monthlyRent);
29+
30+
return Limjang.initNote(member, limjangPrice, purposeType, propertyType, priceType);
31+
}
32+
}

src/main/java/umc/th/juinjang/api/limjang/service/NoteCommandServiceV2.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@
33
import org.springframework.stereotype.Service;
44
import org.springframework.transaction.annotation.Transactional;
55

6+
import jakarta.validation.Valid;
67
import lombok.RequiredArgsConstructor;
8+
import umc.th.juinjang.api.address.service.AddressUpdater;
9+
import umc.th.juinjang.api.limjang.controller.request.NoteInitRequest;
710
import umc.th.juinjang.api.limjang.controller.request.NotePatchRequest;
811
import umc.th.juinjang.api.limjang.controller.request.NotePostRequest;
9-
import umc.th.juinjang.api.address.service.AddressUpdater;
1012
import umc.th.juinjang.api.limjang.service.response.NotePostResponse;
1113
import umc.th.juinjang.common.code.status.ErrorStatus;
1214
import umc.th.juinjang.common.exception.handler.LimjangHandler;
@@ -60,4 +62,14 @@ private void validatePriceType(LimjangPurpose purposeType, LimjangPriceType pric
6062
throw new LimjangHandler(ErrorStatus.LIMJANG_POST_TYPE_ERROR);
6163
}
6264
}
65+
66+
public NotePostResponse initNote(@Valid NoteInitRequest request, Member member) {
67+
Limjang note = request.toEntity(member);
68+
validatePriceType(request.purposeType(), request.priceType());
69+
70+
notePriceUpdater.save(note.getLimjangPrice());
71+
Limjang savedNote = noteUpdater.save(note);
72+
73+
return NotePostResponse.of(savedNote.getLimjangId());
74+
}
6375
}

src/main/java/umc/th/juinjang/domain/limjang/model/Limjang.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package umc.th.juinjang.domain.limjang.model;
22

3+
import java.time.LocalDateTime;
4+
import java.time.format.DateTimeFormatter;
35
import java.util.ArrayList;
46
import java.util.List;
57

@@ -180,6 +182,21 @@ public static Limjang create(Member member, LimjangPrice price, LimjangPurpose p
180182
.build();
181183
}
182184

185+
public static Limjang initNote(Member member, LimjangPrice price, LimjangPurpose purpose,
186+
LimjangPropertyType propertyType, LimjangPriceType priceType) {
187+
String nickname = LocalDateTime.now()
188+
.format(DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm")) + " 매물노트";
189+
190+
return Limjang.builder()
191+
.memberId(member)
192+
.limjangPrice(price)
193+
.priceType(priceType)
194+
.purpose(purpose)
195+
.propertyType(propertyType)
196+
.nickname(nickname)
197+
.build();
198+
}
199+
183200
public void updateNote(String nickname, LimjangPriceType limjangPriceType, String floor, int pyong) {
184201
this.nickname = nickname;
185202
this.priceType = limjangPriceType;
Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,31 @@
11
package umc.th.juinjang.domain.limjang.model;
22

33
import java.util.Arrays;
4+
45
import umc.th.juinjang.common.code.status.ErrorStatus;
56
import umc.th.juinjang.common.exception.handler.LimjangHandler;
67

78
public enum LimjangPurpose {
89

9-
INVESTMENT(0), // 투자 목적
10-
RESIDENTIAL_PURPOSE(1); // 거주 목적
10+
INVESTMENT(0), // 투자 목적
11+
RESIDENTIAL_PURPOSE(1); // 거주 목적, 직접 입주
1112

12-
private final int value;
13+
private final int value;
1314

14-
LimjangPurpose(int value) {
15-
this.value = value;
16-
}
15+
LimjangPurpose(int value) {
16+
this.value = value;
17+
}
1718

18-
// 숫자 리턴
19-
public int getValue() {
20-
return value;
21-
}
19+
// 숫자 리턴
20+
public int getValue() {
21+
return value;
22+
}
2223

23-
public static LimjangPurpose find(int inputValue) {
24-
return Arrays.stream(LimjangPurpose.values())
25-
.filter(it -> it.value == inputValue)
26-
.findAny()
27-
.orElseThrow(() -> new LimjangHandler(ErrorStatus.LIMJANG_POST_TYPE_ERROR));
28-
}
24+
public static LimjangPurpose find(int inputValue) {
25+
return Arrays.stream(LimjangPurpose.values())
26+
.filter(it -> it.value == inputValue)
27+
.findAny()
28+
.orElseThrow(() -> new LimjangHandler(ErrorStatus.LIMJANG_POST_TYPE_ERROR));
29+
}
2930

3031
}

src/test/java/umc/th/juinjang/api/ControllerTestSupport.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77

88
import com.fasterxml.jackson.databind.ObjectMapper;
99

10+
import umc.th.juinjang.api.limjang.controller.NoteControllerV2;
11+
import umc.th.juinjang.api.limjang.service.NoteCommandServiceV2;
12+
import umc.th.juinjang.api.limjang.service.NoteQueryServiceV2;
1013
import umc.th.juinjang.api.pencil.controller.PencilController;
1114
import umc.th.juinjang.api.pencil.service.PencilCommandService;
1215
import umc.th.juinjang.api.pencil.service.PencilQueryService;
@@ -15,7 +18,8 @@
1518

1619
@WebMvcTest(controllers = {
1720
PencilController.class,
18-
PencilAccountController.class
21+
PencilAccountController.class,
22+
NoteControllerV2.class
1923
})
2024
public abstract class ControllerTestSupport {
2125

@@ -33,4 +37,10 @@ public abstract class ControllerTestSupport {
3337

3438
@MockBean
3539
protected PencilCommandService pencilCommandService;
40+
41+
@MockBean
42+
protected NoteCommandServiceV2 noteCommandServiceV2;
43+
44+
@MockBean
45+
protected NoteQueryServiceV2 noteQueryServiceV2;
3646
}
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
package umc.th.juinjang.api.limjang.service;
2+
3+
import static org.assertj.core.api.Assertions.*;
4+
5+
import org.junit.jupiter.api.Test;
6+
import org.springframework.beans.factory.annotation.Autowired;
7+
8+
import umc.th.juinjang.api.IntegrationTestSupport;
9+
import umc.th.juinjang.api.limjang.controller.request.NoteInitRequest;
10+
import umc.th.juinjang.api.limjang.service.response.NotePostResponse;
11+
import umc.th.juinjang.domain.limjang.model.Limjang;
12+
import umc.th.juinjang.domain.limjang.model.LimjangPriceType;
13+
import umc.th.juinjang.domain.limjang.model.LimjangPropertyType;
14+
import umc.th.juinjang.domain.limjang.model.LimjangPurpose;
15+
import umc.th.juinjang.domain.limjang.repository.LimjangRepository;
16+
import umc.th.juinjang.domain.member.model.Member;
17+
import umc.th.juinjang.domain.member.repository.MemberRepository;
18+
19+
class NoteCommandServiceV2Test extends IntegrationTestSupport {
20+
21+
Member firstMember;
22+
Member secondMember;
23+
Member thirdMember;
24+
25+
@Autowired
26+
private MemberRepository memberRepository;
27+
28+
@Autowired
29+
private NoteCommandServiceV2 noteCommandServiceV2;
30+
31+
@Autowired
32+
private LimjangRepository limjangRepository;
33+
34+
private void flushAndTestUsers() {
35+
memberRepository.deleteAll();
36+
37+
// 첫 번째 멤버 (Apple)
38+
firstMember = Member.createAppleMember(
39+
"first@apple.com",
40+
"apple_sub_001",
41+
"첫번째유저",
42+
"1.0.0"
43+
);
44+
memberRepository.save(firstMember);
45+
46+
// 두 번째 멤버 (Kakao)
47+
secondMember = Member.createKakaoMember(
48+
"second@kakao.com",
49+
12345L,
50+
"두번째유저",
51+
"1.0.0"
52+
);
53+
memberRepository.save(secondMember);
54+
55+
// 세 번째 멤버 (Apple)
56+
thirdMember = Member.createAppleMember(
57+
"third@apple.com",
58+
"apple_sub_002",
59+
"세번째유저",
60+
"1.0.0"
61+
);
62+
memberRepository.save(thirdMember);
63+
64+
memberRepository.flush();
65+
}
66+
67+
@Test
68+
void initNote() {
69+
flushAndTestUsers();
70+
71+
NoteInitRequest request = new NoteInitRequest(
72+
LimjangPurpose.RESIDENTIAL_PURPOSE,
73+
LimjangPropertyType.APARTMENT,
74+
LimjangPriceType.MONTHLY_RENT,
75+
"50000",
76+
"4000"
77+
);
78+
NotePostResponse response = noteCommandServiceV2.initNote(request, firstMember);
79+
Long createNoteId = response.noteId();
80+
81+
Limjang note = limjangRepository.findById(createNoteId).orElseThrow();
82+
assertThat(note).extracting(
83+
"memberId.memberId",
84+
"purpose",
85+
"propertyType",
86+
"priceType",
87+
"deleted",
88+
"recordCount"
89+
).containsExactly(
90+
firstMember.getMemberId(),
91+
LimjangPurpose.RESIDENTIAL_PURPOSE,
92+
LimjangPropertyType.APARTMENT,
93+
LimjangPriceType.MONTHLY_RENT,
94+
false,
95+
0
96+
);
97+
assertThat(note).extracting("limjangPrice").isNotNull();
98+
assertThat(note).extracting("nickname").satisfies(n -> assertThat((String)n).endsWith(" 매물노트"));
99+
}
100+
}

0 commit comments

Comments
 (0)