Skip to content

Commit 20120de

Browse files
committed
fix: 공감 매장 공감하기 트랜젝션 오류 처리
1 parent ad8809f commit 20120de

7 files changed

Lines changed: 58 additions & 18 deletions

File tree

src/main/java/com/appcenter/marketplace/domain/cheer/controller/CheerController.java

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.appcenter.marketplace.domain.cheer.controller;
22

3+
import com.appcenter.marketplace.domain.cheer.dto.CheerCountRes;
34
import com.appcenter.marketplace.domain.cheer.service.CheerService;
45
import com.appcenter.marketplace.global.common.CommonResponse;
56
import io.swagger.v3.oas.annotations.Operation;
@@ -20,15 +21,23 @@ public class CheerController {
2021

2122
private final CheerService cheerService;
2223

23-
@Operation(summary = "공감탭 매장 공감하기", description = "임시 매장을 공감합니다. <br>" +
24-
"공감권은 매일 1개씩 충전됩니다. 따라서, 1개의 매장을 공감하게 되면, 더이상 공감할 수 없습니다.( 에러 처리 (409) : 공감권이 소진되었습니다)")
24+
@Operation(summary = "공감탭 매장 공감하기",
25+
description = "임시 매장을 공감합니다. <br><br>" +
26+
"**공감권 정책** <br>" +
27+
"- 공감권은 매일 3개씩 충전됩니다. (개발 상태 : 10개) <br>" +
28+
"- 3개의 매장을 공감하게 되면, 더이상 공감할 수 없습니다. <br><br>" +
29+
"**성공 응답 (200 OK)** <br>" +
30+
"- 공감 완료 후 해당 매장의 총 공감 수(cheerCount)를 반환합니다. <br><br>" +
31+
"**에러 응답** <br>" +
32+
"- 409 Conflict: 이미 공감한 매장입니다. <br>" +
33+
"- 409 Conflict: 공감권이 소진되었습니다. <br>" +
34+
"- 404 Not Found: 존재하지 않는 매장입니다.")
2535
@PostMapping
26-
public ResponseEntity<CommonResponse<Object>> createCheer(
36+
public ResponseEntity<CommonResponse<CheerCountRes>> createCheer(
2737
@AuthenticationPrincipal UserDetails userDetails,
2838
@RequestParam Long tempMarketId
2939
){
3040
Long memberId = Long.parseLong(userDetails.getUsername());
31-
cheerService.cheerTempMarket(memberId, tempMarketId);
32-
return ResponseEntity.ok(CommonResponse.from(CHEER_SUCCESS.getMessage()));
41+
return ResponseEntity.ok(CommonResponse.from(CHEER_SUCCESS.getMessage(), cheerService.cheerTempMarket(memberId, tempMarketId)));
3342
}
3443
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.appcenter.marketplace.domain.cheer.dto;
2+
3+
import com.appcenter.marketplace.domain.tempMarket.TempMarket;
4+
import lombok.Builder;
5+
import lombok.Getter;
6+
7+
@Getter
8+
public class CheerCountRes {
9+
private final Integer cheerCount;
10+
11+
@Builder
12+
private CheerCountRes(Integer cheerCount) {
13+
this.cheerCount = cheerCount;
14+
}
15+
16+
public static CheerCountRes toDto(TempMarket tempMarket) {
17+
return CheerCountRes.builder()
18+
.cheerCount(tempMarket.getCheerCount())
19+
.build();
20+
}
21+
}
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.appcenter.marketplace.domain.cheer.service;
22

3+
import com.appcenter.marketplace.domain.cheer.dto.CheerCountRes;
4+
35
public interface CheerService {
4-
void cheerTempMarket(Long memberId, Long marketId);
6+
CheerCountRes cheerTempMarket(Long memberId, Long marketId);
57
}

src/main/java/com/appcenter/marketplace/domain/cheer/service/impl/CheerServiceImpl.java

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.appcenter.marketplace.domain.cheer.Cheer;
44
import com.appcenter.marketplace.domain.cheer.CheerRepository;
5+
import com.appcenter.marketplace.domain.cheer.dto.CheerCountRes;
56
import com.appcenter.marketplace.domain.cheer.service.CheerService;
67
import com.appcenter.marketplace.domain.member.Member;
78
import com.appcenter.marketplace.domain.member.repository.MemberRepository;
@@ -26,26 +27,32 @@ public class CheerServiceImpl implements CheerService {
2627

2728
@Override
2829
@Transactional
29-
public void cheerTempMarket(Long memberId, Long marketId) {
30+
public CheerCountRes cheerTempMarket(Long memberId, Long marketId) {
3031
TempMarket tempMarket = tempMarketRepository.findById(marketId).orElseThrow(()-> new CustomException(MARKET_NOT_EXIST));
3132
Member member = memberRepository.findById(memberId).orElseThrow(()-> new CustomException(MEMBER_NOT_EXIST));
3233

34+
// 1. 공감권 체크
3335
if(member.getCheerTicket() == 0){
3436
throw new CustomException(TICKET_SOLD_OUT);
3537
}
3638

39+
// 2. 이미 공감했는지 체크
3740
Optional<Cheer> isCheer = cheerRepository.findByMemberIdAndTempMarketId(memberId, marketId);
41+
if(isCheer.isPresent()){
42+
throw new CustomException(ALREADY_CHEERED);
43+
}
3844

39-
if(!isCheer.isPresent()){
40-
Cheer cheer = Cheer.builder()
41-
.member(member)
42-
.tempMarket(tempMarket)
43-
.build();
45+
// 3. 공감 처리
46+
Cheer cheer = Cheer.builder()
47+
.member(member)
48+
.tempMarket(tempMarket)
49+
.build();
4450

45-
cheerRepository.save(cheer);
51+
cheerRepository.save(cheer);
4652

47-
tempMarket.increaseCheerCount();
48-
member.reduceTicket();
49-
}
53+
tempMarket.increaseCheerCount();
54+
member.reduceTicket();
55+
56+
return CheerCountRes.toDto(tempMarket);
5057
}
5158
}

src/main/java/com/appcenter/marketplace/domain/member/dto/req/MemberLoginReq.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public class MemberLoginReq {
2020
public Member toEntity(Long studentId) {
2121
return Member.builder()
2222
.id(studentId)
23-
.cheerTicket(1000) // 1로 수정 예정
23+
.cheerTicket(3) // 3으로 최종 수정.
2424
.role(Role.ROLE_USER)
2525
.build();
2626
}

src/main/java/com/appcenter/marketplace/domain/member/repository/MemberRepositoryImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public class MemberRepositoryImpl implements MemberRepositoryCustom {
2020
public long resetCheerTickets() {
2121
return jpaQueryFactory
2222
.update(member)
23-
.set(member.cheerTicket, 1000) //1로 수정 예정
23+
.set(member.cheerTicket, 10) // 공감권 10개로 수정
2424
.execute();
2525
}
2626

src/main/java/com/appcenter/marketplace/global/common/StatusCode.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ public enum StatusCode {
9292
COUPON_ALREADY_USED(CONFLICT, "쿠폰이 이미 사용되었습니댜."),
9393
COUPON_SOLD_OUT(CONFLICT, "쿠폰이 모두 소진되었습니다."),
9494
TICKET_SOLD_OUT(CONFLICT, "공감권이 소진되었습니다."),
95+
ALREADY_CHEERED(CONFLICT, "이미 공감한 매장입니다."),
9596
/* 503 UNAVAILABLE : 서비스 이용 불가 */
9697
FCM_UNAVAILABLE(SERVICE_UNAVAILABLE, "알림 기능을 이용할 수 없습니다.");
9798

0 commit comments

Comments
 (0)