Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import org.ject.support.admin.member.dto.request.CreateMemberSupportersRequest;
import org.ject.support.admin.member.dto.request.DeleteMembersRequest;
import org.ject.support.admin.member.dto.request.MemberSupportersListRequest;
import org.ject.support.admin.member.dto.request.UpdateMemberSupportersRequest;
import org.ject.support.admin.member.dto.response.MemberSupportersDetailResponse;
import org.ject.support.admin.member.dto.response.MemberSupportersListResponse;
import org.ject.support.common.response.CursorPageResponse;
Expand All @@ -23,17 +24,23 @@ public interface AdminMemberSupportersApiSpec {
)
void createAdminMemberSupporters(@RequestBody @Valid CreateMemberSupportersRequest request);

@Operation(
summary = "운영 서포터즈 구성원 상세 조회",
description = "운영 서포터즈 구성원을 상세 조회합니다."
)
MemberSupportersDetailResponse getAdminMemberSupportersDetail(@PathVariable Long memberActivityId);

@Operation(
summary = "운영 서포터즈 구성원 목록 조회",
description = "운영 서포터즈 구성원 목록을 조회합니다."
)
CursorPageResponse<MemberSupportersListResponse> getAdminMemberSupportersList(@ModelAttribute MemberSupportersListRequest request);

@Operation(
summary = "운영 서포터즈 구성원 상세 조회",
description = "운영 서포터즈 구성원을 상세 조회합니다."
summary = "운영 서포터즈 구성원 수정",
description = "전달한 활동 ID에 해당하는 운영 서포터즈 구성원의 입력된 정보만 수정합니다."
)
MemberSupportersDetailResponse getAdminMemberSupportersDetail(@PathVariable Long memberActivityId);
void editAdminMemberSupporters(@PathVariable Long memberActivityId, @RequestBody @Valid UpdateMemberSupportersRequest request);

@Operation(
summary = "운영 서포터즈 구성원 삭제",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import org.ject.support.admin.member.dto.request.CreateMemberSupportersRequest;
import org.ject.support.admin.member.dto.request.DeleteMembersRequest;
import org.ject.support.admin.member.dto.request.MemberSupportersListRequest;
import org.ject.support.admin.member.dto.request.UpdateMemberSupportersRequest;
import org.ject.support.admin.member.dto.response.MemberSupportersDetailResponse;
import org.ject.support.admin.member.dto.response.MemberSupportersListResponse;
import org.ject.support.admin.member.service.AdminMemberSupportersUseCase;
Expand All @@ -12,6 +13,7 @@
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
Expand All @@ -35,6 +37,12 @@ public void createAdminMemberSupporters(
adminMemberSupportersUseCase.createMemberSupporters(request);
}

@Override
@GetMapping("/{memberActivityId}")
public MemberSupportersDetailResponse getAdminMemberSupportersDetail(@PathVariable Long memberActivityId) {
return adminMemberSupportersUseCase.getMemberSupportersDetail(memberActivityId);
}

@Override
@GetMapping
public CursorPageResponse<MemberSupportersListResponse> getAdminMemberSupportersList(
Expand All @@ -43,9 +51,9 @@ public CursorPageResponse<MemberSupportersListResponse> getAdminMemberSupporters
}

@Override
@GetMapping("/{memberActivityId}")
public MemberSupportersDetailResponse getAdminMemberSupportersDetail(@PathVariable Long memberActivityId) {
return adminMemberSupportersUseCase.getMemberSupportersDetail(memberActivityId);
@PatchMapping("/{memberActivityId}")
public void editAdminMemberSupporters(@PathVariable Long memberActivityId, @RequestBody @Valid UpdateMemberSupportersRequest request) {
adminMemberSupportersUseCase.editMemberSupporters(memberActivityId, request);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import java.util.List;

import org.ject.support.admin.member.dto.request.UpdateMemberMakersRequest;
import org.ject.support.admin.member.dto.request.UpdateMemberSupportersRequest;
import org.ject.support.domain.member.Region;

public record EditMemberCommand(
Expand All @@ -21,4 +22,14 @@ public static EditMemberCommand from(UpdateMemberMakersRequest request) {
request.interestedDomains()
);
}

public static EditMemberCommand from(UpdateMemberSupportersRequest request) {
return new EditMemberCommand(
request.name(),
request.email(),
request.phoneNumber(),
null,
null
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package org.ject.support.admin.member.dto.command;

import java.time.LocalDate;

import org.ject.support.admin.member.dto.request.UpdateMemberSupportersRequest;
import org.ject.support.domain.member.JobFamily;
import org.ject.support.domain.recruit.domain.RecruitTypeDetail;

public record EditMemberSupportersActivityCommand(
JobFamily jobFamily,
RecruitTypeDetail recruitTypeDetail,
LocalDate startDate,
LocalDate endDate,
String memo
) {
public static EditMemberSupportersActivityCommand from(UpdateMemberSupportersRequest request) {
return new EditMemberSupportersActivityCommand(
request.jobFamily(),
request.recruitTypeDetail(),
request.startDate(),
request.endDate(),
request.memo()
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package org.ject.support.admin.member.dto.request;

import java.time.LocalDate;

import org.ject.support.domain.member.ActivityStatus;
import org.ject.support.domain.member.JobFamily;
import org.ject.support.domain.recruit.domain.RecruitTypeDetail;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.Pattern;
import jakarta.validation.constraints.Size;

@Schema(description = "운영 서포터즈 구성원 수정 요청. 전달하지 않은 항목은 기존 값 유지")
public record UpdateMemberSupportersRequest(

@Schema(description = "이름", example = "김젝트", maxLength = 20, nullable = true)
@Size(max = 20, message = "이름은 20자 이하로 입력해주세요.")
@Pattern(regexp = "^[^\\s]+$", message = "이름은 공백없이 입력해주세요")
String name,

@Schema(description = "전화번호", example = "01012345678", nullable = true)
@Pattern(regexp = "^010\\d{8}$", message = "010으로 시작하는 11자리 숫자를 입력해주세요.")
String phoneNumber,

@Schema(description = "이메일", example = "supporter@ject.kr", maxLength = 30, nullable = true)
@Email(message = "올바른 이메일 형식이 아닙니다.")
@Size(max = 30, message = "이메일은 30자 이하로 입력해주세요.")
String email,

@Schema(description = "직군", example = "OPS", allowableValues = {"OPS", "INFRA", "BX", "ER"}, nullable = true)
JobFamily jobFamily,

@Schema(description = "모집 단위", example = "REGULAR", allowableValues = {"REGULAR", "NEW", "REFILL"}, nullable = true)
RecruitTypeDetail recruitTypeDetail,

@Schema(description = "활동 상태", example = "ACTIVE", allowableValues = {"ACTIVE", "ENDED", "DROPOUT"}, nullable = true)
ActivityStatus activityStatus,

@Schema(description = "활동 시작일", example = "2026-01-01", nullable = true)
LocalDate startDate,

@Schema(description = "활동 종료일", example = "2026-12-31", nullable = true)
LocalDate endDate,

@Schema(description = "활동 증명서 번호", example = "JECT-SUPPORTERS-001", maxLength = 20, nullable = true)
@Size(max = 20, message = "활동 증명서 번호는 20자 이하로 입력해주세요.")
String activityCertNumber,

@Schema(description = "비고", example = "차기 활동 참여 희망", maxLength = 100, nullable = true)
@Size(max = 100, message = "비고는 100자 이하로 입력해주세요.")
String memo
) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import org.ject.support.domain.member.MemberType;
import org.ject.support.admin.member.dto.command.EditMemberActivityCommand;
import org.ject.support.admin.member.dto.command.EditMemberMakersCommand;
import org.ject.support.admin.member.dto.command.EditMemberSupportersActivityCommand;
import org.ject.support.domain.member.entity.MemberActivity;
import org.ject.support.domain.member.exception.MemberErrorCode;
import org.ject.support.domain.member.exception.MemberException;
Expand Down Expand Up @@ -144,6 +145,12 @@ public MemberActivity getMemberMakersActivity(Long memberActivityId) {
.orElseThrow(() -> new MemberException(NOT_FOUND_MEMBER_MAKERS_ACTIVITY));
}

// 운영 서포터즈 구성원 활동 조회
public MemberActivity getMemberSupportersActivity(Long memberActivityId) {
return memberActivityRepository.findByIdAndMemberType(memberActivityId, MemberType.SUPPORTERS)
.orElseThrow(() -> new MemberException(NOT_FOUND_MEMBER_SUPPORTERS_ACTIVITY));
}

// 메이커스팀 구성원 상세 조회
public MemberMakersDetailProjection getMemberMakersDetail(Long memberActivityId) {
return memberActivityRepository.findMemberMakersDetail(memberActivityId)
Expand Down Expand Up @@ -171,19 +178,38 @@ public Long editMemberMakersActivity(Long memberActivityId, EditMemberActivityCo
makersCommand.activityCertNumber()
);
if (activityStatus != null) {
editMakersActivityStatus(memberActivity, activityStatus);
editActivityStatus(memberActivity, activityStatus);
}
return memberActivity.getMemberId();
}

// 운영 서포터즈 구성원 활동정보 편집
public Long editMemberSupportersActivity(Long memberActivityId, EditMemberSupportersActivityCommand activityCommand,
String activityCertNumber, ActivityStatus activityStatus) {
MemberActivity memberActivity = getMemberSupportersActivity(memberActivityId);
memberActivity.editSupportersActivity(
activityCommand.jobFamily(),
activityCommand.recruitTypeDetail(),
activityCommand.startDate(),
activityCommand.endDate(),
activityCommand.memo(),
activityCertNumber
);
if (activityStatus != null) {
editActivityStatus(memberActivity, activityStatus);
}
return memberActivity.getMemberId();
}

public void editMakersActivityStatus(MemberActivity memberActivity, ActivityStatus activityStatus) {
// 구성원 유형별 활동 상태 편집
private void editActivityStatus(MemberActivity memberActivity, ActivityStatus activityStatus) {
if (memberActivity.isSameActivityStatus(activityStatus)) {
return;
}

switch (activityStatus) {
case ACTIVE -> {
validateDuplicateActiveMakersActivity(memberActivity.getMemberId());
validateDuplicateActiveActivity(memberActivity);
memberActivity.activate();
}
case ENDED -> memberActivity.end();
Expand All @@ -192,6 +218,15 @@ public void editMakersActivityStatus(MemberActivity memberActivity, ActivityStat
}
}

// 구성원 유형별 활성 활동 중복 검증
private void validateDuplicateActiveActivity(MemberActivity memberActivity) {
switch (memberActivity.getMemberType()) {
case MAKERS -> validateDuplicateActiveMakersActivity(memberActivity.getMemberId());
case SUPPORTERS -> validateDuplicateActiveSupportersActivity(memberActivity.getMemberId());
Comment thread
kangkings marked this conversation as resolved.
default -> throw new MemberException(INVALID_MEMBER_TYPE);
}
}

// 구성원 유형에 맞는 활동 단건 삭제
public Long deleteMemberActivity(Long memberActivityId, MemberType memberType) {
MemberActivity memberActivity = memberActivityRepository.findByIdAndMemberType(memberActivityId, memberType)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,12 @@

import org.ject.support.admin.member.dto.projection.MemberSupportersDetailProjection;
import org.ject.support.admin.member.dto.projection.MemberSupportersListProjection;
import org.ject.support.admin.member.dto.command.EditMemberCommand;
import org.ject.support.admin.member.dto.command.EditMemberSupportersActivityCommand;
import org.ject.support.admin.member.dto.request.CreateMemberSupportersRequest;
import org.ject.support.admin.member.dto.request.DeleteMembersRequest;
import org.ject.support.admin.member.dto.request.MemberSupportersListRequest;
import org.ject.support.admin.member.dto.request.UpdateMemberSupportersRequest;
import org.ject.support.admin.member.dto.response.MemberSupportersDetailResponse;
import org.ject.support.admin.member.dto.response.MemberSupportersListResponse;
import org.ject.support.admin.member.dto.result.MemberPageResult;
Expand Down Expand Up @@ -55,6 +58,18 @@ public MemberSupportersDetailResponse getMemberSupportersDetail(Long memberActiv
return MemberSupportersDetailResponse.from(projection);
}

// 운영 서포터즈 구성원 정보 편집
@Transactional
public void editMemberSupporters(Long memberActivityId, UpdateMemberSupportersRequest request) {
Long memberId = adminMemberActivityService.editMemberSupportersActivity(
Comment thread
kangkings marked this conversation as resolved.
memberActivityId,
EditMemberSupportersActivityCommand.from(request),
request.activityCertNumber(),
request.activityStatus()
);
adminMemberService.editMember(memberId, EditMemberCommand.from(request));
}

// 운영 서포터즈 구성원 단건 삭제
@Transactional
public void deleteMemberSupporters(Long memberActivityId) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -228,6 +228,24 @@ public void editMakersActivity(JobFamily jobFamily, CareerDetails careerDetails,
careerLevel, skills, company, expertTopics, activityCertNumber);
}

// 운영 서포터즈 구성원 활동정보 편집
public void editSupportersActivity(JobFamily jobFamily, RecruitTypeDetail recruitTypeDetail,
LocalDate startDate, LocalDate endDate, String memo, String activityCertNumber) {
if (jobFamily != null) {
validateJobFamily(memberType, jobFamily);
}
LocalDate nextStartDate = startDate != null ? startDate : this.startDate;
LocalDate nextEndDate = endDate != null ? endDate : this.endDate;
validateActivityPeriod(nextStartDate, nextEndDate);

if (jobFamily != null) this.jobFamily = jobFamily;
if (recruitTypeDetail != null) this.recruitTypeDetail = recruitTypeDetail;
if (startDate != null) this.startDate = startDate;
if (endDate != null) this.endDate = endDate;
if (memo != null) this.memo = memo;
memberSupporters.edit(activityCertNumber);
}

public void activate() {
changeActivityStatus(ActivityStatus.ACTIVE);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,4 +39,9 @@ public static MemberSupporters create(MemberActivity memberActivity, String acti
.activityCertNumber(activityCertNumber)
.build();
}

// 전달된 운영 서포터즈 구성원 상세정보 편집
public void edit(String activityCertNumber) {
if (activityCertNumber != null) this.activityCertNumber = activityCertNumber;
}
}
Loading
Loading