Skip to content

Commit 5991936

Browse files
committed
feat(#197/recruit): 특정 멤버 입금 상태 변경 api 구현
1 parent 66a75a3 commit 5991936

File tree

5 files changed

+59
-3
lines changed

5 files changed

+59
-3
lines changed

src/main/java/inha/gdgoc/domain/recruit/controller/RecruitMemberController.java

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,36 @@
22

33
import static inha.gdgoc.domain.recruit.controller.message.RecruitMemberMessage.MEMBER_RETRIEVED_SUCCESS;
44
import static inha.gdgoc.domain.recruit.controller.message.RecruitMemberMessage.MEMBER_SAVE_SUCCESS;
5+
import static inha.gdgoc.domain.recruit.controller.message.RecruitMemberMessage.PAYMENT_MARKED_COMPLETE_SUCCESS;
6+
import static inha.gdgoc.domain.recruit.controller.message.RecruitMemberMessage.PAYMENT_MARKED_INCOMPLETE_SUCCESS;
57
import static inha.gdgoc.domain.recruit.controller.message.RecruitMemberMessage.PHONE_NUMBER_DUPLICATION_CHECK_SUCCESS;
68
import static inha.gdgoc.domain.recruit.controller.message.RecruitMemberMessage.STUDENT_ID_DUPLICATION_CHECK_SUCCESS;
79

810
import inha.gdgoc.domain.recruit.dto.request.ApplicationRequest;
11+
import inha.gdgoc.domain.recruit.dto.request.PaymentUpdateRequest;
912
import inha.gdgoc.domain.recruit.dto.response.CheckPhoneNumberResponse;
1013
import inha.gdgoc.domain.recruit.dto.response.CheckStudentIdResponse;
1114
import inha.gdgoc.domain.recruit.dto.response.SpecifiedMemberResponse;
1215
import inha.gdgoc.domain.recruit.service.RecruitMemberService;
1316
import inha.gdgoc.global.dto.response.ApiResponse;
1417
import io.swagger.v3.oas.annotations.Operation;
1518
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
19+
import io.swagger.v3.oas.annotations.tags.Tag;
1620
import jakarta.validation.constraints.NotBlank;
1721
import jakarta.validation.constraints.Pattern;
1822
import lombok.RequiredArgsConstructor;
1923
import org.springframework.http.ResponseEntity;
2024
import org.springframework.security.access.prepost.PreAuthorize;
2125
import org.springframework.web.bind.annotation.GetMapping;
26+
import org.springframework.web.bind.annotation.PatchMapping;
2227
import org.springframework.web.bind.annotation.PathVariable;
2328
import org.springframework.web.bind.annotation.PostMapping;
2429
import org.springframework.web.bind.annotation.RequestBody;
2530
import org.springframework.web.bind.annotation.RequestMapping;
2631
import org.springframework.web.bind.annotation.RequestParam;
2732
import org.springframework.web.bind.annotation.RestController;
2833

34+
@Tag(name = "Recruit - Members", description = "리크루팅 지원자 관리 API")
2935
@RequestMapping("/api/v1")
3036
@RequiredArgsConstructor
3137
@RestController
@@ -67,7 +73,7 @@ public ResponseEntity<ApiResponse<CheckPhoneNumberResponse, Void>> duplicatedPho
6773
return ResponseEntity.ok(ApiResponse.ok(PHONE_NUMBER_DUPLICATION_CHECK_SUCCESS, response));
6874
}
6975

70-
@Operation(summary = "특정 멤버 가입 신청서 조회", security = { @SecurityRequirement(name = "BearerAuth") })
76+
@Operation(summary = "특정 멤버 가입 신청서 조회", security = {@SecurityRequirement(name = "BearerAuth")})
7177
@PreAuthorize("hasRole('ADMIN')")
7278
@GetMapping("/recruit/members/{memberId}")
7379
public ResponseEntity<ApiResponse<SpecifiedMemberResponse, Void>> getSpecifiedMember(
@@ -80,7 +86,27 @@ public ResponseEntity<ApiResponse<SpecifiedMemberResponse, Void>> getSpecifiedMe
8086

8187
// TODO 전체 응답 조회 및 검색
8288

83-
// TODO 입금 완료
8489

85-
// TODO 입금 미완료
90+
@Operation(
91+
summary = "입금 상태 변경",
92+
description = "설정하려는 상태(NOT 현재 상태)를 body에 보내주세요. true=입금 완료, false=입금 미완료",
93+
security = { @SecurityRequirement(name = "BearerAuth") }
94+
)
95+
@PreAuthorize("hasRole('ADMIN')")
96+
@PatchMapping("/recruit/members/{memberId}/payment")
97+
public ResponseEntity<ApiResponse<Void, Void>> updatePayment(
98+
@PathVariable Long memberId,
99+
@RequestBody PaymentUpdateRequest paymentUpdateRequest
100+
) {
101+
recruitMemberService.updatePayment(memberId, paymentUpdateRequest.isPayed());
102+
103+
return ResponseEntity.ok(
104+
ApiResponse.ok(
105+
paymentUpdateRequest.isPayed()
106+
? PAYMENT_MARKED_COMPLETE_SUCCESS
107+
: PAYMENT_MARKED_INCOMPLETE_SUCCESS
108+
)
109+
);
110+
}
111+
86112
}

src/main/java/inha/gdgoc/domain/recruit/controller/message/RecruitMemberMessage.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,6 @@ public class RecruitMemberMessage {
55
public static final String STUDENT_ID_DUPLICATION_CHECK_SUCCESS = "성공적으로 학번 중복 조회를 완료했습니다.";
66
public static final String PHONE_NUMBER_DUPLICATION_CHECK_SUCCESS = "성공적으로 전화번호 중복 조회를 완료했습니다.";
77
public static final String MEMBER_RETRIEVED_SUCCESS = "성공적으로 특정 멤버의 지원서를 조회했습니다.";
8+
public static final String PAYMENT_MARKED_COMPLETE_SUCCESS = "성공적으로 입금 완료로 변경했습니다.";
9+
public static final String PAYMENT_MARKED_INCOMPLETE_SUCCESS = "성공적으로 입금 미완료로 변경했습니다.";
810
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package inha.gdgoc.domain.recruit.dto.request;
2+
3+
public record PaymentUpdateRequest(
4+
boolean isPayed
5+
) {
6+
7+
}

src/main/java/inha/gdgoc/domain/recruit/entity/RecruitMember.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,4 +81,12 @@ public class RecruitMember extends BaseEntity {
8181
@Builder.Default
8282
@OneToMany(mappedBy = "recruitMember", cascade = CascadeType.ALL, orphanRemoval = true)
8383
private List<Answer> answers = new ArrayList<>();
84+
85+
public void markPaid() {
86+
this.isPayed = Boolean.TRUE;
87+
}
88+
89+
public void markUnpaid() {
90+
this.isPayed = Boolean.FALSE;
91+
}
8492
}

src/main/java/inha/gdgoc/domain/recruit/service/RecruitMemberService.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,4 +67,17 @@ public SpecifiedMemberResponse findSpecifiedMember(Long id) {
6767

6868
return SpecifiedMemberResponse.from(member, answers, objectMapper);
6969
}
70+
71+
@Transactional
72+
public void updatePayment(Long memberId, boolean isPayed) {
73+
RecruitMember m = recruitMemberRepository.findById(memberId)
74+
.orElseThrow(() -> new IllegalArgumentException("RecruitMember not found: " + memberId));
75+
76+
// 멱등 처리: 이미 동일 상태면 스킵
77+
if (Boolean.TRUE.equals(m.getIsPayed()) == isPayed) return;
78+
79+
if (isPayed) m.markPaid();
80+
else m.markUnpaid();
81+
}
82+
7083
}

0 commit comments

Comments
 (0)