Skip to content

Commit d8c50d2

Browse files
authored
v2.4.0 (#831)
2 parents b99bf85 + 26ec006 commit d8c50d2

File tree

119 files changed

+1819
-662
lines changed

Some content is hidden

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

119 files changed

+1819
-662
lines changed

docker-compose.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ services:
1414
redis:
1515
image: "redis:alpine"
1616
container_name: redis
17+
restart: always
1718
ports:
1819
- "6379:6379"
1920
environment:

src/main/java/com/gdschongik/gdsc/domain/common/vo/Money.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
@NoArgsConstructor(access = AccessLevel.PROTECTED)
1818
public final class Money {
1919

20+
public static final Money ZERO = Money.from(BigDecimal.ZERO);
21+
2022
private BigDecimal amount;
2123

2224
@Override
@@ -34,8 +36,6 @@ private Money(BigDecimal amount) {
3436
this.amount = amount;
3537
}
3638

37-
public static final Money ZERO = Money.from(BigDecimal.ZERO);
38-
3939
public static Money from(BigDecimal amount) {
4040
validateAmountNotNull(amount);
4141

Original file line numberDiff line numberDiff line change
@@ -1,20 +1,22 @@
1-
package com.gdschongik.gdsc.domain.recruitment.domain.vo;
1+
package com.gdschongik.gdsc.domain.common.vo;
22

33
import static com.gdschongik.gdsc.global.exception.ErrorCode.*;
44

55
import com.gdschongik.gdsc.global.exception.CustomException;
66
import jakarta.persistence.Embeddable;
77
import java.time.LocalDateTime;
8-
import java.util.Objects;
98
import lombok.AccessLevel;
109
import lombok.Builder;
10+
import lombok.EqualsAndHashCode;
1111
import lombok.Getter;
1212
import lombok.NoArgsConstructor;
1313

1414
@Getter
1515
@Embeddable
16+
@EqualsAndHashCode
1617
@NoArgsConstructor(access = AccessLevel.PROTECTED)
17-
public class Period {
18+
public final class Period {
19+
1820
private LocalDateTime startDate;
1921

2022
private LocalDateTime endDate;
@@ -25,7 +27,7 @@ private Period(final LocalDateTime startDate, final LocalDateTime endDate) {
2527
this.endDate = endDate;
2628
}
2729

28-
public static Period createPeriod(LocalDateTime startDate, LocalDateTime endDate) {
30+
public static Period of(LocalDateTime startDate, LocalDateTime endDate) {
2931
validatePeriod(startDate, endDate);
3032
return Period.builder().startDate(startDate).endDate(endDate).build();
3133
}
@@ -37,6 +39,7 @@ private static void validatePeriod(LocalDateTime startDate, LocalDateTime endDat
3739
}
3840

3941
public boolean isOpen() {
42+
// TODO: now를 내부에서 선언하지 않고 파라미터로 받아서 테스트 가능하도록 변경
4043
LocalDateTime now = LocalDateTime.now();
4144
return (now.isAfter(startDate) || now.isEqual(startDate)) && (now.isBefore(endDate) || now.isEqual(startDate));
4245
}
@@ -46,17 +49,4 @@ public void validatePeriodOverlap(LocalDateTime startDate, LocalDateTime endDate
4649
throw new CustomException(PERIOD_OVERLAP);
4750
}
4851
}
49-
50-
@Override
51-
public boolean equals(Object o) {
52-
if (this == o) return true;
53-
if (o == null || getClass() != o.getClass()) return false;
54-
Period that = (Period) o;
55-
return startDate == that.startDate && endDate == that.endDate;
56-
}
57-
58-
@Override
59-
public int hashCode() {
60-
return Objects.hash(startDate, endDate);
61-
}
6252
}

src/main/java/com/gdschongik/gdsc/domain/coupon/application/CouponService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public class CouponService {
3737

3838
@Transactional
3939
public void createCoupon(CouponCreateRequest request) {
40-
Coupon coupon = Coupon.createCoupon(request.name(), Money.from(request.discountAmount()));
40+
Coupon coupon = Coupon.create(request.name(), Money.from(request.discountAmount()));
4141
couponRepository.save(coupon);
4242
log.info("[CouponService] 쿠폰 생성: name={}, discountAmount={}", request.name(), request.discountAmount());
4343
}
@@ -59,7 +59,7 @@ public void createIssuedCoupon(CouponIssueRequest request) {
5959
List<Member> members = memberRepository.findAllById(request.memberIds());
6060

6161
List<IssuedCoupon> issuedCoupons = members.stream()
62-
.map(member -> IssuedCoupon.issue(coupon, member))
62+
.map(member -> IssuedCoupon.create(coupon, member))
6363
.toList();
6464

6565
issuedCouponRepository.saveAll(issuedCoupons);

src/main/java/com/gdschongik/gdsc/domain/coupon/domain/Coupon.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ private Coupon(String name, Money discountAmount) {
3737
this.discountAmount = discountAmount;
3838
}
3939

40-
public static Coupon createCoupon(String name, Money discountAmount) {
40+
public static Coupon create(String name, Money discountAmount) {
4141
validateDiscountAmountPositive(discountAmount);
4242
return Coupon.builder().name(name).discountAmount(discountAmount).build();
4343
}

src/main/java/com/gdschongik/gdsc/domain/coupon/domain/IssuedCoupon.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import lombok.Builder;
2020
import lombok.Getter;
2121
import lombok.NoArgsConstructor;
22+
import lombok.NonNull;
2223
import org.hibernate.annotations.Comment;
2324

2425
@Entity
@@ -51,7 +52,7 @@ private IssuedCoupon(Coupon coupon, Member member, Boolean hasRevoked) {
5152
this.hasRevoked = hasRevoked;
5253
}
5354

54-
public static IssuedCoupon issue(Coupon coupon, Member member) {
55+
public static IssuedCoupon create(Coupon coupon, Member member) {
5556
return IssuedCoupon.builder()
5657
.coupon(coupon)
5758
.member(member)
@@ -83,9 +84,9 @@ private void validateRevokable() {
8384

8485
// 상태 변경 로직
8586

86-
public void use() {
87+
public void use(@NonNull LocalDateTime now) {
8788
validateUsable();
88-
usedAt = LocalDateTime.now();
89+
usedAt = now;
8990
}
9091

9192
public void revoke() {

src/main/java/com/gdschongik/gdsc/domain/discord/application/listener/PingpongListener.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public void onMessageReceived(MessageReceivedEvent event) {
2020
User author = event.getAuthor();
2121
TextChannel channel = event.getChannel().asTextChannel();
2222
Message message = event.getMessage();
23-
String content = message.getContentRaw(); // get only textual content of message
23+
String content = message.getContentRaw();
2424

2525
log.info("Message of {} in {}: {}", author.getName(), channel.getName(), message.getContentDisplay());
2626

src/main/java/com/gdschongik/gdsc/domain/member/api/AdminMemberController.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import io.swagger.v3.oas.annotations.Operation;
99
import io.swagger.v3.oas.annotations.tags.Tag;
1010
import jakarta.validation.Valid;
11-
import java.io.IOException;
1211
import lombok.RequiredArgsConstructor;
1312
import org.springdoc.core.annotations.ParameterObject;
1413
import org.springframework.data.domain.Page;
@@ -51,7 +50,7 @@ public ResponseEntity<Void> updateMember(
5150

5251
@Operation(summary = "회원 정보 엑셀 다운로드", description = "회원 정보를 엑셀로 다운로드합니다.")
5352
@GetMapping("/excel")
54-
public ResponseEntity<byte[]> createWorkbook() throws IOException {
53+
public ResponseEntity<byte[]> createWorkbook() {
5554
byte[] response = adminMemberService.createExcel();
5655
ContentDisposition contentDisposition =
5756
ContentDisposition.builder("attachment").filename("members.xls").build();

src/main/java/com/gdschongik/gdsc/domain/member/api/OnboardingMemberController.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,6 @@ public ResponseEntity<MemberUnivStatusResponse> checkUnivVerification() {
3838
return ResponseEntity.ok().body(response);
3939
}
4040

41-
@Operation(summary = "GDSC Bevy 연동하기", description = "GDSC Bevy 가입 상태를 업데이트합니다.")
42-
@PostMapping("/me/link-bevy")
43-
public ResponseEntity<Void> linkBevy() {
44-
onboardingMemberService.verifyBevyStatus();
45-
return ResponseEntity.ok().build();
46-
}
47-
4841
@Operation(summary = "기본 회원정보 작성", description = "기본 회원정보를 작성합니다.")
4942
@PostMapping("/me/basic-info")
5043
public ResponseEntity<Void> updateBasicMemberInfo(@Valid @RequestBody BasicMemberInfoRequest request) {

src/main/java/com/gdschongik/gdsc/domain/member/application/AdminMemberService.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
import com.gdschongik.gdsc.global.util.EnvironmentUtil;
1919
import com.gdschongik.gdsc.global.util.ExcelUtil;
2020
import com.gdschongik.gdsc.global.util.MemberUtil;
21-
import java.io.IOException;
21+
import java.time.LocalDateTime;
2222
import java.util.List;
2323
import lombok.RequiredArgsConstructor;
2424
import lombok.extern.slf4j.Slf4j;
@@ -66,16 +66,17 @@ public void updateMember(Long memberId, MemberUpdateRequest request) {
6666
request.nickname());
6767
}
6868

69-
public byte[] createExcel() throws IOException {
69+
public byte[] createExcel() {
7070
return excelUtil.createMemberExcel();
7171
}
7272

7373
@Transactional
7474
public void demoteAllRegularMembersToAssociate(MemberDemoteRequest request) {
7575
List<RecruitmentRound> recruitmentRounds = recruitmentRoundRepository.findAllByAcademicYearAndSemesterType(
7676
request.academicYear(), request.semesterType());
77+
LocalDateTime now = LocalDateTime.now();
7778

78-
memberValidator.validateMemberDemote(recruitmentRounds);
79+
memberValidator.validateMemberDemote(recruitmentRounds, now);
7980

8081
List<Member> regularMembers = memberRepository.findAllByRole(MemberRole.REGULAR);
8182

src/main/java/com/gdschongik/gdsc/domain/member/application/OnboardingMemberService.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,6 @@ public MemberUnivStatusResponse checkUnivVerificationStatus() {
4949
return MemberUnivStatusResponse.from(currentMember);
5050
}
5151

52-
@Transactional
53-
public void verifyBevyStatus() {
54-
Member currentMember = memberUtil.getCurrentMember();
55-
currentMember.verifyBevy();
56-
memberRepository.save(currentMember);
57-
}
58-
5952
@Transactional
6053
public void updateBasicMemberInfo(BasicMemberInfoRequest request) {
6154
Member currentMember = memberUtil.getCurrentMember();

src/main/java/com/gdschongik/gdsc/domain/member/application/TestMemberService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public void createTestMember(String githubHandle) {
3131
throw new CustomException(INTERNAL_SERVER_ERROR);
3232
}
3333

34-
Member guestMember = Member.createGuestMember(githubOauthId);
34+
Member guestMember = Member.createGuest(githubOauthId);
3535
memberRepository.save(guestMember);
3636
}
3737

src/main/java/com/gdschongik/gdsc/domain/member/domain/AssociateRequirement.java

Lines changed: 2 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -26,29 +26,21 @@ public class AssociateRequirement {
2626
@Enumerated(EnumType.STRING)
2727
private RequirementStatus discordStatus;
2828

29-
@Enumerated(EnumType.STRING)
30-
private RequirementStatus bevyStatus;
31-
3229
@Enumerated(EnumType.STRING)
3330
private RequirementStatus infoStatus;
3431

3532
@Builder(access = AccessLevel.PRIVATE)
3633
private AssociateRequirement(
37-
RequirementStatus univStatus,
38-
RequirementStatus discordStatus,
39-
RequirementStatus bevyStatus,
40-
RequirementStatus infoStatus) {
34+
RequirementStatus univStatus, RequirementStatus discordStatus, RequirementStatus infoStatus) {
4135
this.univStatus = univStatus;
4236
this.discordStatus = discordStatus;
43-
this.bevyStatus = bevyStatus;
4437
this.infoStatus = infoStatus;
4538
}
4639

47-
public static AssociateRequirement createRequirement() {
40+
public static AssociateRequirement unsatisfied() {
4841
return AssociateRequirement.builder()
4942
.univStatus(UNSATISFIED)
5043
.discordStatus(UNSATISFIED)
51-
.bevyStatus(UNSATISFIED)
5244
.infoStatus(UNSATISFIED)
5345
.build();
5446
}
@@ -63,10 +55,6 @@ public void verifyDiscord() {
6355
discordStatus = SATISFIED;
6456
}
6557

66-
public void verifyBevy() {
67-
bevyStatus = SATISFIED;
68-
}
69-
7058
public void verifyInfo() {
7159
infoStatus = SATISFIED;
7260
}
@@ -81,10 +69,6 @@ private boolean isDiscordSatisfied() {
8169
return discordStatus == SATISFIED;
8270
}
8371

84-
private boolean isBevySatisfied() {
85-
return bevyStatus == SATISFIED;
86-
}
87-
8872
private boolean isInfoSatisfied() {
8973
return infoStatus == SATISFIED;
9074
}
@@ -100,10 +84,6 @@ public void validateAllSatisfied() {
10084
throw new CustomException(DISCORD_NOT_SATISFIED);
10185
}
10286

103-
if (!isBevySatisfied()) {
104-
throw new CustomException(BEVY_NOT_SATISFIED);
105-
}
106-
10787
if (!isInfoSatisfied()) {
10888
throw new CustomException(BASIC_INFO_NOT_SATISFIED);
10989
}
@@ -119,7 +99,6 @@ public void checkVerifiableUniv() {
11999
* 모든 준회원 조건을 강등합니다.
120100
*/
121101
public void demoteAssociateRequirement() {
122-
bevyStatus = UNSATISFIED;
123102
discordStatus = UNSATISFIED;
124103
infoStatus = UNSATISFIED;
125104
univStatus = UNSATISFIED;

src/main/java/com/gdschongik/gdsc/domain/member/domain/Member.java

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,8 @@ private Member(
106106
this.associateRequirement = associateRequirement;
107107
}
108108

109-
public static Member createGuestMember(String oauthId) {
110-
AssociateRequirement associateRequirement = AssociateRequirement.createRequirement();
109+
public static Member createGuest(String oauthId) {
110+
AssociateRequirement associateRequirement = AssociateRequirement.unsatisfied();
111111
return Member.builder()
112112
.oauthId(oauthId)
113113
.role(GUEST)
@@ -210,25 +210,12 @@ public void verifyDiscord(String discordUsername, String nickname) {
210210
registerEvent(new MemberAssociateEvent(this.id));
211211
}
212212

213-
/**
214-
* Bevy 서버와의 연동을 진행합니다.
215-
* Bevy 인증상태를 인증 처리합니다.
216-
*/
217-
public void verifyBevy() {
218-
validateStatusUpdatable();
219-
220-
associateRequirement.verifyBevy();
221-
222-
registerEvent(new MemberAssociateEvent(id));
223-
}
224-
225213
/**
226214
* 게스트에서 준회원으로 승급합니다.
227215
* 본 로직은 승급조건 충족 이벤트로 트리거됩니다. 다음 조건을 모두 충족하면 승급됩니다.
228216
* 조건 1 : 기본 회원정보 작성
229217
* 조건 2 : 재학생 인증
230218
* 조건 3 : 디스코드 인증
231-
* 조건 4 : Bevy 인증
232219
*/
233220
public void advanceToAssociate() {
234221
validateStatusUpdatable();
@@ -293,8 +280,8 @@ public void assignToMentor() {
293280

294281
// 기타 상태 변경 로직
295282

296-
public void updateLastLoginAt() {
297-
this.lastLoginAt = LocalDateTime.now();
283+
public void updateLastLoginAt(LocalDateTime now) {
284+
this.lastLoginAt = now;
298285
}
299286

300287
public void updateDiscordId(String discordId) {

src/main/java/com/gdschongik/gdsc/domain/member/domain/MemberValidator.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,20 @@
55
import com.gdschongik.gdsc.domain.recruitment.domain.RecruitmentRound;
66
import com.gdschongik.gdsc.global.annotation.DomainService;
77
import com.gdschongik.gdsc.global.exception.CustomException;
8+
import java.time.LocalDateTime;
89
import java.util.List;
910

1011
@DomainService
1112
public class MemberValidator {
1213

13-
public void validateMemberDemote(List<RecruitmentRound> recruitmentRounds) {
14+
public void validateMemberDemote(List<RecruitmentRound> recruitmentRounds, LocalDateTime now) {
1415

1516
// 해당 학기에 모집회차가 존재하는지 검증
1617
if (recruitmentRounds.isEmpty()) {
1718
throw new CustomException(RECRUITMENT_ROUND_NOT_FOUND);
1819
}
1920

2021
// 해당 학기의 모든 모집회차가 아직 시작되지 않았는지 검증
21-
recruitmentRounds.forEach(RecruitmentRound::validatePeriodNotStarted);
22+
recruitmentRounds.forEach(recruitmentRound -> recruitmentRound.validatePeriodNotStarted(now));
2223
}
2324
}

src/main/java/com/gdschongik/gdsc/domain/member/dto/MemberFullDto.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,11 @@ public record MemberAssociateRequirementDto(
5757
UnivVerificationStatus univStatus,
5858
@Schema(description = "디스코드 인증상태", implementation = RequirementStatus.class)
5959
RequirementStatus discordStatus,
60-
@Schema(description = "bevy 인증상태", implementation = RequirementStatus.class) RequirementStatus bevyStatus,
6160
@Schema(description = "회원정보 입력상태", implementation = RequirementStatus.class) RequirementStatus infoStatus) {
6261
public static MemberAssociateRequirementDto of(Member member, UnivVerificationStatus univVerificationStatus) {
6362
return new MemberAssociateRequirementDto(
6463
univVerificationStatus,
6564
member.getAssociateRequirement().getDiscordStatus(),
66-
member.getAssociateRequirement().getBevyStatus(),
6765
member.getAssociateRequirement().getInfoStatus());
6866
}
6967
}

0 commit comments

Comments
 (0)