Skip to content

Commit 1af4a24

Browse files
Merge pull request #156 from prgrms-web-devcourse-final-project/develop
chore: develop → main 브랜치 머지
2 parents 9041021 + 7fe7981 commit 1af4a24

19 files changed

+220
-29
lines changed
Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,24 @@
11
package grep.neogul_coder.domain.buddy.controller;
22

33
import grep.neogul_coder.domain.buddy.controller.dto.response.BuddyEnergyResponse;
4+
import grep.neogul_coder.domain.buddy.enums.BuddyEnergyReason;
5+
import grep.neogul_coder.domain.buddy.service.BuddyEnergyService;
46
import grep.neogul_coder.global.response.ApiResponse;
7+
import lombok.RequiredArgsConstructor;
58
import org.springframework.web.bind.annotation.*;
69

10+
@RequiredArgsConstructor
711
@RestController
812
@RequestMapping("/api/buddy-energy")
913
public class BuddyEnergyController implements BuddyEnergySpecification {
1014

15+
private final BuddyEnergyService buddyEnergyService;
16+
1117
@GetMapping("/{userId}")
1218
public ApiResponse<BuddyEnergyResponse> get(@PathVariable("userId") Long userId) {
13-
return ApiResponse.success(new BuddyEnergyResponse());
19+
return ApiResponse.success(buddyEnergyService.getBuddyEnergy(userId));
1420
}
21+
22+
23+
1524
}

src/main/java/grep/neogul_coder/domain/buddy/controller/dto/response/BuddyEnergyResponse.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package grep.neogul_coder.domain.buddy.controller.dto.response;
22

3+
import grep.neogul_coder.domain.buddy.entity.BuddyEnergy;
34
import io.swagger.v3.oas.annotations.media.Schema;
45
import lombok.Builder;
56
import lombok.Getter;
@@ -14,5 +15,18 @@ public class BuddyEnergyResponse {
1415
@Schema(description = "현재 버디에너지 수치", example = "61")
1516
private int level;
1617

18+
@Builder
19+
protected BuddyEnergyResponse(Long userId, int level) {
20+
this.userId = userId;
21+
this.level = level;
22+
}
23+
24+
public static BuddyEnergyResponse from(BuddyEnergy energy) {
25+
return BuddyEnergyResponse.builder()
26+
.userId(energy.getUserId())
27+
.level(energy.getLevel())
28+
.build();
29+
}
30+
1731

1832
}

src/main/java/grep/neogul_coder/domain/buddy/entity/BuddyEnergy.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package grep.neogul_coder.domain.buddy.entity;
22

3+
import grep.neogul_coder.domain.buddy.enums.BuddyEnergyReason;
4+
import grep.neogul_coder.domain.review.ReviewType;
35
import jakarta.persistence.Column;
46
import jakarta.persistence.Entity;
57
import jakarta.persistence.GeneratedValue;
@@ -20,4 +22,30 @@ public class BuddyEnergy {
2022

2123
private int level;
2224

25+
protected BuddyEnergy() {
26+
27+
}
28+
29+
30+
private BuddyEnergy(Long userId, int level) {
31+
this.userId = userId;
32+
this.level = level;
33+
}
34+
35+
public static BuddyEnergy createDefault(Long userId) {
36+
return new BuddyEnergy(userId, BuddyEnergyReason.SIGN_UP.getPoint());
37+
}
38+
39+
public void updateLevel(int newLevel) {
40+
this.level = newLevel;
41+
}
42+
43+
// 리뷰 타입 기반 에너지 변경 //
44+
public void updateEnergy(ReviewType reviewType) {
45+
if (reviewType == ReviewType.GOOD || reviewType == ReviewType.EXCELLENT) {
46+
this.level += 1;
47+
} else if (reviewType == ReviewType.BAD) {
48+
this.level -= 1;
49+
}
50+
}
2351
}

src/main/java/grep/neogul_coder/domain/buddy/entity/BuddyLog.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import jakarta.persistence.Id;
1313
import jakarta.persistence.JoinColumn;
1414
import jakarta.persistence.ManyToOne;
15+
import lombok.Builder;
1516

1617
@Entity
1718
public class BuddyLog {
@@ -27,4 +28,21 @@ public class BuddyLog {
2728
@JoinColumn(name = "buddy_energy_id")
2829
private BuddyEnergy buddyEnergy;
2930

31+
protected BuddyLog() {
32+
33+
}
34+
35+
@Builder
36+
private BuddyLog(BuddyEnergy buddyEnergy, BuddyEnergyReason reason) {
37+
this.buddyEnergy = buddyEnergy;
38+
this.reason = reason;
39+
}
40+
41+
public static BuddyLog of(BuddyEnergy energy, BuddyEnergyReason reason) {
42+
return BuddyLog.builder()
43+
.buddyEnergy(energy)
44+
.reason(reason)
45+
.build();
46+
}
47+
3048
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package grep.neogul_coder.domain.buddy.exception;
2+
3+
import grep.neogul_coder.global.exception.business.NotFoundException;
4+
import grep.neogul_coder.domain.buddy.exception.code.BuddyEnergyErrorCode;
5+
6+
public class BuddyEnergyNotFoundException extends NotFoundException {
7+
public BuddyEnergyNotFoundException(BuddyEnergyErrorCode errorCode) {
8+
super(errorCode);
9+
}
10+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package grep.neogul_coder.domain.buddy.exception.code;
2+
3+
import grep.neogul_coder.global.response.code.ErrorCode;
4+
import lombok.Getter;
5+
import org.springframework.http.HttpStatus;
6+
7+
@Getter
8+
public enum BuddyEnergyErrorCode implements ErrorCode {
9+
10+
BUDDY_ENERGY_NOT_FOUND("BE404", HttpStatus.NOT_FOUND, "해당 유저의 버디 에너지를 찾을 수 없습니다.");
11+
12+
private final String code;
13+
private final HttpStatus status;
14+
private final String message;
15+
16+
BuddyEnergyErrorCode(String code, HttpStatus status, String message) {
17+
this.code = code;
18+
this.status = status;
19+
this.message = message;
20+
}
21+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package grep.neogul_coder.domain.buddy.repository;
2+
3+
import grep.neogul_coder.domain.buddy.entity.BuddyLog;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
import org.springframework.stereotype.Repository;
6+
7+
import java.util.List;
8+
9+
@Repository
10+
public interface BuddyEnergyLogRepository extends JpaRepository<BuddyLog, Long> {
11+
12+
// 특정 유저의 에너지 변동 로그 조회
13+
// (BuddyEnergy -> UserId로 매핑 필요할 수 있음)
14+
List<BuddyLog> findByBuddyEnergy_BuddyEnergyId(Long buddyEnergyId);
15+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package grep.neogul_coder.domain.buddy.service;
2+
3+
import grep.neogul_coder.domain.buddy.entity.BuddyEnergy;
4+
import grep.neogul_coder.domain.buddy.entity.BuddyLog;
5+
import grep.neogul_coder.domain.buddy.enums.BuddyEnergyReason;
6+
import grep.neogul_coder.domain.buddy.exception.BuddyEnergyNotFoundException;
7+
import grep.neogul_coder.domain.buddy.exception.code.BuddyEnergyErrorCode;
8+
import grep.neogul_coder.domain.buddy.repository.BuddyEnergyLogRepository;
9+
import grep.neogul_coder.domain.buddy.repository.BuddyEnergyRepository;
10+
import grep.neogul_coder.domain.buddy.controller.dto.response.BuddyEnergyResponse;
11+
import grep.neogul_coder.domain.review.ReviewType;
12+
import jakarta.transaction.Transactional;
13+
import lombok.RequiredArgsConstructor;
14+
import org.springframework.stereotype.Service;
15+
16+
import static grep.neogul_coder.domain.buddy.exception.code.BuddyEnergyErrorCode.BUDDY_ENERGY_NOT_FOUND;
17+
18+
@Service
19+
@RequiredArgsConstructor
20+
public class BuddyEnergyService {
21+
22+
private final BuddyEnergyRepository buddyEnergyRepository;
23+
private final BuddyEnergyLogRepository buddyEnergyLogRepository;
24+
25+
// 현재 버디 에너지 조회
26+
@Transactional
27+
public BuddyEnergyResponse getBuddyEnergy(Long userId) {
28+
BuddyEnergy energy = buddyEnergyRepository.findByUserId(userId)
29+
.orElseThrow(() -> new BuddyEnergyNotFoundException(BUDDY_ENERGY_NOT_FOUND));
30+
return BuddyEnergyResponse.from(energy);
31+
}
32+
33+
// ReviewType 기반 업데이트 //
34+
@Transactional
35+
public BuddyEnergyResponse updateEnergyByReview(Long userId, ReviewType reviewType) {
36+
BuddyEnergy energy = buddyEnergyRepository.findByUserId(userId)
37+
.orElseThrow(() -> new BuddyEnergyNotFoundException(BUDDY_ENERGY_NOT_FOUND));
38+
39+
// ReviewType에 따른 에너지 증감
40+
energy.updateEnergy(reviewType);
41+
42+
buddyEnergyLogRepository.save(BuddyLog.of(energy, toBuddyEnergyReason(reviewType)));
43+
buddyEnergyRepository.save(energy);
44+
45+
return BuddyEnergyResponse.from(energy);
46+
}
47+
48+
// 회원가입 시 기본 에너지 생성
49+
@Transactional
50+
public BuddyEnergyResponse createDefaultEnergy(Long userId) {
51+
BuddyEnergy energy = BuddyEnergy.createDefault(userId);
52+
BuddyEnergy saved = buddyEnergyRepository.save(energy);
53+
54+
buddyEnergyLogRepository.save(BuddyLog.of(saved, BuddyEnergyReason.SIGN_UP));
55+
return BuddyEnergyResponse.from(saved);
56+
}
57+
58+
59+
// ReviewType → BuddyEnergyReason 매핑 메서드
60+
private BuddyEnergyReason toBuddyEnergyReason(ReviewType reviewType) {
61+
return switch (reviewType) {
62+
case GOOD, EXCELLENT -> BuddyEnergyReason.POSITIVE_REVIEW;
63+
case BAD -> BuddyEnergyReason.NEGATIVE_REVIEW;
64+
};
65+
}
66+
}

src/main/java/grep/neogul_coder/domain/calender/controller/PersonalCalendarController.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,11 @@ public class PersonalCalendarController implements PersonalCalendarSpecification
2020

2121
// 사용자 개인 일정 등록 API
2222
@PostMapping
23-
public ApiResponse<Void> create(
23+
public ApiResponse<Long> create(
2424
@PathVariable("userId") Long userId,
2525
@Valid @RequestBody PersonalCalendarRequest request) {
26-
personalCalendarService.create(userId, request);
27-
return ApiResponse.noContent();
26+
Long calendarId = personalCalendarService.create(userId, request);
27+
return ApiResponse.success(calendarId); // 생성된 일정 ID 반환
2828
}
2929

3030
// 사용자 개인 일정 전체 조회 API

src/main/java/grep/neogul_coder/domain/calender/controller/PersonalCalendarSpecification.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public interface PersonalCalendarSpecification {
2020
summary = "개인 일정 생성",
2121
description = "사용자의 개인 일정을 생성합니다.\n\n예: `/api/users/{userId}/calendar`"
2222
)
23-
ApiResponse<Void> create(
23+
ApiResponse<Long> create(
2424
@Parameter(name = "userId", description = "사용자 ID", required = true, in = ParameterIn.PATH)
2525
@PathVariable("userId") Long userId,
2626
@RequestBody PersonalCalendarRequest request

0 commit comments

Comments
 (0)