Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import jakarta.servlet.http.HttpServletRequest;
import lombok.AllArgsConstructor;
import moadong.club.payload.request.ClubCreateRequest;
import moadong.club.payload.request.ClubDescriptionUpdateRequest;
import moadong.club.payload.request.ClubRecruitmentInfoUpdateRequest;
import moadong.club.payload.request.ClubInfoRequest;
import moadong.club.payload.response.ClubDetailedResponse;
import moadong.club.service.ClubMetricService;
Expand All @@ -33,8 +33,7 @@ public class ClubProfileController {
+ "category는 분류(취미교양 등), division은 분과(중동 등)입니다.")
@PreAuthorize("isAuthenticated()")
@SecurityRequirement(name = "BearerAuth")
public ResponseEntity<?> createClub(@CurrentUser CustomUserDetails user,
@RequestBody ClubCreateRequest request) {
public ResponseEntity<?> createClub(@RequestBody ClubCreateRequest request) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

createClub에는 @currentuser가 제거되고 updateClubInfo에는 추가된 이유가 있을까요?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

createClub에서 user를 사용할 필요가 없다고 생각해서 제거했습니다. 클럽을 만들 때, 지금 접속한 유저의 정보는 필요하지 않기 때문입니다.
updateClubInfo에 생긴 이유는 자기가 소유한 클럽만 update할 수 있도록 제한을 두었습니다.

String clubId = clubProfileService.createClub(request);
return Response.ok("success create club", "clubId : " + clubId);
}
Expand All @@ -60,18 +59,21 @@ public ResponseEntity<?> getClubDetail(
+ "introduction은 24글자 이내로 입력해야 합니다.")
@PreAuthorize("isAuthenticated()") // 인증 필요
@SecurityRequirement(name = "BearerAuth")
public ResponseEntity<?> updateClubInfo(@RequestBody @Validated ClubInfoRequest request) {
clubProfileService.updateClubInfo(request);
public ResponseEntity<?> updateClubInfo(
@CurrentUser CustomUserDetails user,
@RequestBody @Validated ClubInfoRequest request) {
clubProfileService.updateClubInfo(request, user);
return Response.ok("success update club");
}

@PutMapping("/description")
@Operation(summary = "클럽 모집정보 수정", description = "클럽의 모집정보 내용을 수정합니다.")
@PreAuthorize("isAuthenticated()")
@SecurityRequirement(name = "BearerAuth")
public ResponseEntity<?> updateClubDescription(
@RequestBody ClubDescriptionUpdateRequest request) {
clubProfileService.updateClubDescription(request);
public ResponseEntity<?> updateClubRecruitmentInfo(
@CurrentUser CustomUserDetails user,
@RequestBody ClubRecruitmentInfoUpdateRequest request) {
clubProfileService.updateClubRecruitmentInfo(request, user);
return Response.ok("success update club");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
import lombok.AllArgsConstructor;
import moadong.club.payload.response.ClubSearchResponse;
import moadong.club.service.ClubSearchService;
import moadong.global.exception.ErrorCode;
import moadong.global.exception.RestApiException;
import moadong.global.payload.Response;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
Expand All @@ -29,15 +31,19 @@ public class ClubSearchController {
public ResponseEntity<?> searchClubsByKeyword(
@RequestParam(value = "keyword", required = false, defaultValue = "") String keyword,
@RequestParam(value = "recruitmentStatus", required = false, defaultValue = "all") String recruitmentStatus,
@RequestParam(value = "category", required = false, defaultValue = "all") String category,
@RequestParam(value = "division", required = false, defaultValue = "all") String division
@RequestParam(value = "division", required = false, defaultValue = "all") String division,
@RequestParam(value = "category", required = false, defaultValue = "all") String category
) {
ClubSearchResponse clubSearchResponse = clubSearchService.searchClubsByKeyword(
keyword,
recruitmentStatus,
division,
category
);
return Response.ok(clubSearchResponse);
try {
ClubSearchResponse clubSearchResponse = clubSearchService.searchClubsByKeyword(
keyword,
recruitmentStatus,
division,
category
);
return Response.ok(clubSearchResponse);
} catch (Exception e) {
throw new RestApiException(ErrorCode.CLUB_SEARCH_FAILED);
}
}
}
4 changes: 2 additions & 2 deletions backend/src/main/java/moadong/club/entity/Club.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import lombok.Builder;
import lombok.Getter;
import moadong.club.enums.ClubState;
import moadong.club.payload.request.ClubDescriptionUpdateRequest;
import moadong.club.payload.request.ClubRecruitmentInfoUpdateRequest;
import moadong.club.payload.request.ClubInfoRequest;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;
Expand Down Expand Up @@ -77,7 +77,7 @@ public void update(ClubInfoRequest request) {
this.clubRecruitmentInformation.update(request);
}

public void update(ClubDescriptionUpdateRequest request) {
public void update(ClubRecruitmentInfoUpdateRequest request) {
clubRecruitmentInformation.updateDescription(request);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,11 @@
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import moadong.club.enums.RecruitmentStatus;
import moadong.club.payload.request.ClubDescriptionUpdateRequest;
import moadong.club.enums.ClubRecruitmentStatus;
import moadong.club.payload.request.ClubRecruitmentInfoUpdateRequest;
import moadong.club.payload.request.ClubInfoRequest;
import moadong.global.RegexConstants;
import org.checkerframework.common.aliasing.qual.Unique;
import org.springframework.data.mongodb.core.mapping.Document;

@AllArgsConstructor
@Getter
Expand Down Expand Up @@ -57,7 +56,7 @@ public class ClubRecruitmentInformation {

@Enumerated(EnumType.STRING)
@NotNull
private RecruitmentStatus recruitmentStatus;
private ClubRecruitmentStatus clubRecruitmentStatus;

private String recruitmentForm;

Expand All @@ -66,11 +65,11 @@ public ClubRecruitmentInformation updateLogo(String logo) {
return this;
}

public void updateRecruitmentStatus(RecruitmentStatus status) {
this.recruitmentStatus = status;
public void updateRecruitmentStatus(ClubRecruitmentStatus status) {
this.clubRecruitmentStatus = status;
}

public void updateDescription(ClubDescriptionUpdateRequest request) {
public void updateDescription(ClubRecruitmentInfoUpdateRequest request) {
this.description = request.description();
this.recruitmentStart = request.recruitmentStart();
this.recruitmentEnd = request.recruitmentEnd();
Expand Down
19 changes: 9 additions & 10 deletions backend/src/main/java/moadong/club/enums/ClubCategory.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
package moadong.club.enums;

import lombok.Getter;

import java.util.Arrays;

@Getter
public enum ClubCategory {
//봉사,종교,취미교양,학술,운동,공연
봉사(0),
Expand All @@ -16,17 +21,11 @@ public enum ClubCategory {
this.priority = priority;
}

public int getPriority() {
return priority;
}

public static ClubCategory fromString(String category) {
for (ClubCategory c : values()) {
if (c.name().equals(category)) {
return c;
}
}
return null;
return Arrays.stream(values())
.filter(rs -> rs.name().equalsIgnoreCase(category))
.findFirst()
.orElse(null);
}
public static int getPriorityFromString(String category) {
ClubCategory c = fromString(category);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
package moadong.club.enums;

import lombok.Getter;

import java.util.Arrays;

public enum RecruitmentStatus {
@Getter
public enum ClubRecruitmentStatus {
ALWAYS("상시모집", 1),
OPEN("모집중", 2),
CLOSED("모집마감", 3),
Expand All @@ -12,27 +15,19 @@ public enum RecruitmentStatus {
private final String description;
private final int priority;

RecruitmentStatus(String description, int priority) {
ClubRecruitmentStatus(String description, int priority) {
this.description = description;
this.priority = priority;
}

public String getDescription() {
return description;
}

public int getPriority() {
return priority;
}

public static RecruitmentStatus fromString(String status) {
public static ClubRecruitmentStatus fromString(String status) {
return Arrays.stream(values())
.filter(rs -> rs.name().equalsIgnoreCase(status))
.findFirst()
.orElse(null);
}
public static int getPriorityFromString(String status) {
RecruitmentStatus rs = fromString(status);
ClubRecruitmentStatus rs = fromString(status);
return (rs != null) ? rs.getPriority() : Integer.MAX_VALUE;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,8 @@ public static ClubDetailedResult of(Club club) {
.presidentPhoneNumber(clubRecruitmentInformation.getPresidentTelephoneNumber() == null ? "" : clubRecruitmentInformation.getPresidentTelephoneNumber())
.recruitmentPeriod(period)
.recruitmentTarget(clubRecruitmentInformation.getRecruitmentTarget() == null ? "" : clubRecruitmentInformation.getRecruitmentTarget())
.recruitmentStatus(clubRecruitmentInformation.getRecruitmentStatus() == null
? "" : clubRecruitmentInformation.getRecruitmentStatus().getDescription())
.recruitmentStatus(clubRecruitmentInformation.getClubRecruitmentStatus() == null
? "" : clubRecruitmentInformation.getClubRecruitmentStatus().getDescription())
.recruitmentForm(clubRecruitmentInformation.getRecruitmentForm() == null ? "" : clubRecruitmentInformation.getRecruitmentForm())
.build();
}
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package moadong.club.payload.request;

import java.time.LocalDateTime;

public record ClubRecruitmentInfoUpdateRequest(
String id,
LocalDateTime recruitmentStart,
LocalDateTime recruitmentEnd,
String recruitmentTarget,
String description
) {

}
27 changes: 18 additions & 9 deletions backend/src/main/java/moadong/club/service/ClubProfileService.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,14 @@
import moadong.club.entity.Club;
import moadong.club.payload.dto.ClubDetailedResult;
import moadong.club.payload.request.ClubCreateRequest;
import moadong.club.payload.request.ClubDescriptionUpdateRequest;
import moadong.club.payload.request.ClubRecruitmentInfoUpdateRequest;
import moadong.club.payload.request.ClubInfoRequest;
import moadong.club.payload.response.ClubDetailedResponse;
import moadong.club.repository.ClubRepository;
import moadong.global.exception.ErrorCode;
import moadong.global.exception.RestApiException;
import moadong.global.util.ObjectIdConverter;
import moadong.user.payload.CustomUserDetails;
import org.bson.types.ObjectId;
import org.springframework.stereotype.Service;

Expand All @@ -31,18 +33,16 @@ public String createClub(ClubCreateRequest request) {
return club.getId();
}

public void updateClubInfo(ClubInfoRequest request) {
Club club = clubRepository.findById(request.id())
.orElseThrow(() -> new RestApiException(ErrorCode.CLUB_NOT_FOUND));
public void updateClubInfo(ClubInfoRequest request, CustomUserDetails user) {
Club club = validateClubUpdateRequest(request.id(), user);

club.update(request);
clubRepository.save(club);

}

public void updateClubDescription(ClubDescriptionUpdateRequest request) {
Club club = clubRepository.findById(request.id())
.orElseThrow(() -> new RestApiException(ErrorCode.CLUB_NOT_FOUND));
public void updateClubRecruitmentInfo(ClubRecruitmentInfoUpdateRequest request, CustomUserDetails user) {
Club club = validateClubUpdateRequest(request.id(), user);

club.update(request);
clubRepository.save(club);

Expand All @@ -54,7 +54,7 @@ public void updateClubDescription(ClubDescriptionUpdateRequest request) {
}

public ClubDetailedResponse getClubDetail(String clubId) {
ObjectId objectId = new ObjectId(clubId);
ObjectId objectId = ObjectIdConverter.convertString(clubId);
Club club = clubRepository.findClubById(objectId)
.orElseThrow(() -> new RestApiException(ErrorCode.CLUB_NOT_FOUND));

Expand All @@ -63,4 +63,13 @@ public ClubDetailedResponse getClubDetail(String clubId) {
);
return new ClubDetailedResponse(clubDetailedResult);
}

private Club validateClubUpdateRequest(String clubId, CustomUserDetails user){
Club club = clubRepository.findById(clubId)
.orElseThrow(() -> new RestApiException(ErrorCode.CLUB_NOT_FOUND));
if (!user.getId().equals(club.getUserId())){
throw new RestApiException(ErrorCode.USER_UNAUTHORIZED);
}
return club;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import lombok.AllArgsConstructor;
import moadong.club.enums.ClubCategory;
import moadong.club.enums.RecruitmentStatus;
import moadong.club.enums.ClubRecruitmentStatus;
import moadong.club.payload.dto.ClubSearchResult;
import moadong.club.payload.response.ClubSearchResponse;
import moadong.club.repository.ClubSearchRepository;
Expand Down Expand Up @@ -34,7 +34,7 @@ public ClubSearchResponse searchClubsByKeyword(String keyword,
.sorted(
//
Comparator
.comparingInt((ClubSearchResult club) -> RecruitmentStatus.getPriorityFromString(club.recruitmentStatus()))
.comparingInt((ClubSearchResult club) -> ClubRecruitmentStatus.getPriorityFromString(club.recruitmentStatus()))
.thenComparingInt((ClubSearchResult club) -> ClubCategory.getPriorityFromString(club.category()))
.thenComparing(ClubSearchResult::name)
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,11 @@
import java.util.concurrent.ScheduledFuture;
import lombok.RequiredArgsConstructor;
import moadong.club.entity.Club;
import moadong.club.entity.ClubRecruitmentInformation;
import moadong.club.enums.RecruitmentStatus;
import moadong.club.enums.ClubRecruitmentStatus;
import moadong.club.repository.ClubRepository;
import moadong.global.exception.ErrorCode;
import moadong.global.exception.RestApiException;
import moadong.global.util.ObjectIdConverter;
import org.bson.types.ObjectId;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.stereotype.Component;
Expand All @@ -33,12 +33,12 @@ public void scheduleRecruitment(String clubId, LocalDateTime startDate,

// 모집 시작 스케줄링
ScheduledFuture<?> startFuture = taskScheduler.schedule(
() -> updateRecruitmentStatus(clubId, RecruitmentStatus.OPEN),
() -> updateRecruitmentStatus(clubId, ClubRecruitmentStatus.OPEN),
Date.from(startDate.atZone(ZoneId.systemDefault()).toInstant()));

// 모집 종료 스케줄링
ScheduledFuture<?> endFuture = taskScheduler.schedule(
() -> updateRecruitmentStatus(clubId, RecruitmentStatus.CLOSED),
() -> updateRecruitmentStatus(clubId, ClubRecruitmentStatus.CLOSED),
Date.from(endDate.atZone(ZoneId.systemDefault()).toInstant()));

scheduledTasks.put(clubId, startFuture);
Expand All @@ -53,8 +53,8 @@ public void cancelScheduledTask(String clubId) {
}

@Transactional
public void updateRecruitmentStatus(String clubId, RecruitmentStatus status) {
ObjectId objectId = new ObjectId(clubId);
public void updateRecruitmentStatus(String clubId, ClubRecruitmentStatus status) {
ObjectId objectId = ObjectIdConverter.convertString(clubId);
Club club = clubRepository.findClubById(objectId)
.orElseThrow(() -> new RestApiException(ErrorCode.CLUB_NOT_FOUND));

Expand Down
Loading