Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[FEAT] 모임 지원자 상태 변경 API 마이그레이션 #320

Merged
merged 5 commits into from
Aug 22, 2024
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 @@ -28,6 +28,7 @@ public enum ErrorStatus {
NOT_ACTIVE_GENERATION("활동 기수가 아닙니다."),
NOT_TARGET_PART("지원 가능한 파트가 아닙니다."),
NOT_FOUND_APPLY("신청상태가 아닌 모임입니다."),
ALREADY_PROCESSED_APPLY("이미 해당 상태로 처리된 신청 정보입니다."),

/**
* 401 UNAUTHORIZED
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package org.sopt.makers.crew.main.entity.apply;

import static jakarta.persistence.GenerationType.IDENTITY;
import static org.sopt.makers.crew.main.common.exception.ErrorStatus.*;

import jakarta.persistence.Column;
import jakarta.persistence.Convert;
Expand All @@ -17,6 +18,8 @@
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import org.sopt.makers.crew.main.common.exception.BadRequestException;
import org.sopt.makers.crew.main.entity.apply.enums.ApplyStatusConverter;
import org.sopt.makers.crew.main.entity.apply.enums.ApplyTypeConverter;
import org.sopt.makers.crew.main.entity.apply.enums.EnApplyStatus;
Expand Down Expand Up @@ -109,4 +112,10 @@ public Apply(EnApplyType type, Meeting meeting, Integer meetingId, User user, In
public void updateApplyStatus(EnApplyStatus status) {
this.status = status;
}

public void validateDuplicateUpdateApplyStatus(EnApplyStatus updatedApplyStatus){
if(updatedApplyStatus.equals(this.getStatus())){
throw new BadRequestException(ALREADY_PROCESSED_APPLY.getErrorCode());
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,15 +27,14 @@

import org.hibernate.annotations.Parameter;
import org.hibernate.annotations.Type;
import org.sopt.makers.crew.main.common.exception.BadRequestException;
import org.sopt.makers.crew.main.common.exception.ForbiddenException;
import org.sopt.makers.crew.main.entity.apply.Apply;
import org.sopt.makers.crew.main.entity.meeting.converter.MeetingCategoryConverter;
import org.sopt.makers.crew.main.entity.meeting.enums.EnMeetingStatus;
import org.sopt.makers.crew.main.entity.meeting.enums.MeetingCategory;
import org.sopt.makers.crew.main.entity.meeting.enums.MeetingJoinablePart;
import org.sopt.makers.crew.main.entity.meeting.vo.ImageUrlVO;
import org.sopt.makers.crew.main.entity.user.User;
import org.sopt.makers.crew.main.meeting.v2.dto.request.MeetingV2CreateMeetingBodyDto;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

@Entity
Expand Down Expand Up @@ -80,7 +79,6 @@ public class Meeting {
*/
@Column(name = "imageURL", columnDefinition = "jsonb")
@Type(JsonBinaryType.class)
//@JdbcTypeCode(SqlTypes.JSON)
private List<ImageUrlVO> imageURL;

/**
Expand Down Expand Up @@ -231,6 +229,12 @@ public Boolean checkMeetingLeader(Integer userId) {
return this.userId.equals(userId);
}

public void validateCapacity(int approvedCount) {
if (approvedCount >= this.capacity) {
throw new BadRequestException(FULL_MEETING_CAPACITY.getErrorCode());
}
}

public void updateMeeting(Meeting updateMeeting) {

this.title = updateMeeting.getTitle();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import org.sopt.makers.crew.main.meeting.v2.dto.query.MeetingGetAppliesQueryDto;
import org.sopt.makers.crew.main.meeting.v2.dto.query.MeetingV2GetAllMeetingByOrgUserQueryDto;
import org.sopt.makers.crew.main.meeting.v2.dto.query.MeetingV2GetAllMeetingQueryDto;
import org.sopt.makers.crew.main.meeting.v2.dto.request.ApplyV2UpdateStatusBodyDto;
import org.sopt.makers.crew.main.meeting.v2.dto.request.MeetingV2ApplyMeetingDto;
import org.sopt.makers.crew.main.meeting.v2.dto.request.MeetingV2CreateMeetingBodyDto;
import org.sopt.makers.crew.main.meeting.v2.dto.response.MeetingGetApplyListResponseDto;
Expand Down Expand Up @@ -106,8 +107,11 @@ ResponseEntity<TempResponseDto<MeetingV2GetAllMeetingDto>> getMeetingsTemp(@Mode
Principal principal);

@Operation(summary = "모임 삭제", description = "모임 삭제합니다.")
ResponseEntity<Void> deleteMeeting(@PathVariable("meetingId") Integer meetingId, Principal principal);
ResponseEntity<Void> deleteMeeting(@PathVariable Integer meetingId, Principal principal);

@Operation(summary = "모임 수정", description = "모임 내용을 수정합니다.")
ResponseEntity<Void> updateMeeting(@PathVariable Integer meetingId, @RequestBody @Valid MeetingV2CreateMeetingBodyDto requestBody ,Principal principal);

@Operation(summary = "모임 지원자 상태 변경", description = "모임 지원자의 지원 상태를 변경합니다.")
ResponseEntity<Void> updateApplyStatus(@PathVariable Integer meetingId, @RequestBody @Valid ApplyV2UpdateStatusBodyDto requestBody ,Principal principal);
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import org.sopt.makers.crew.main.meeting.v2.dto.query.MeetingGetAppliesQueryDto;
import org.sopt.makers.crew.main.meeting.v2.dto.query.MeetingV2GetAllMeetingByOrgUserQueryDto;
import org.sopt.makers.crew.main.meeting.v2.dto.query.MeetingV2GetAllMeetingQueryDto;
import org.sopt.makers.crew.main.meeting.v2.dto.request.ApplyV2UpdateStatusBodyDto;
import org.sopt.makers.crew.main.meeting.v2.dto.request.MeetingV2ApplyMeetingDto;
import org.sopt.makers.crew.main.meeting.v2.dto.request.MeetingV2CreateMeetingBodyDto;
import org.sopt.makers.crew.main.meeting.v2.dto.response.MeetingGetApplyListResponseDto;
Expand Down Expand Up @@ -119,7 +120,7 @@ public ResponseEntity<TempResponseDto<MeetingV2GetAllMeetingDto>> getMeetingsTem

@Override
@DeleteMapping("/{meetingId}")
public ResponseEntity<Void> deleteMeeting(@PathVariable("meetingId") Integer meetingId, Principal principal) {
public ResponseEntity<Void> deleteMeeting(@PathVariable Integer meetingId, Principal principal) {
Integer userId = UserUtil.getUserId(principal);
meetingV2Service.deleteMeeting(meetingId, userId);

Expand All @@ -138,4 +139,17 @@ public ResponseEntity<Void> updateMeeting(

return ResponseEntity.ok().build();
}

@Override
@PutMapping("/{meetingId}/apply/status")
public ResponseEntity<Void> updateApplyStatus(
@PathVariable Integer meetingId,
@RequestBody @Valid ApplyV2UpdateStatusBodyDto requestBody,
Principal principal) {

Integer userId = UserUtil.getUserId(principal);
meetingV2Service.updateApplyStatus(meetingId, requestBody, userId);

return ResponseEntity.ok().build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package org.sopt.makers.crew.main.meeting.v2.dto.request;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
@Schema(description = "모임 지원자 상태 변경 request body dto")
public class ApplyV2UpdateStatusBodyDto {
@Schema(example = "1", description = "신청/지원 id")
@NotNull
private final Integer applyId;

@Schema(example = "0", description = "0: 대기, 1: 승인, 2: 거절")
@NotNull
private final Integer status;

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import org.sopt.makers.crew.main.meeting.v2.dto.query.MeetingGetAppliesQueryDto;
import org.sopt.makers.crew.main.meeting.v2.dto.query.MeetingV2GetAllMeetingByOrgUserQueryDto;
import org.sopt.makers.crew.main.meeting.v2.dto.query.MeetingV2GetAllMeetingQueryDto;
import org.sopt.makers.crew.main.meeting.v2.dto.request.ApplyV2UpdateStatusBodyDto;
import org.sopt.makers.crew.main.meeting.v2.dto.request.MeetingV2ApplyMeetingDto;
import org.sopt.makers.crew.main.meeting.v2.dto.request.MeetingV2CreateMeetingBodyDto;
import org.sopt.makers.crew.main.meeting.v2.dto.response.MeetingGetApplyListResponseDto;
Expand Down Expand Up @@ -34,4 +35,6 @@ MeetingGetApplyListResponseDto findApplyList(MeetingGetAppliesQueryDto queryComm
void deleteMeeting(Integer meetingId, Integer userId);

void updateMeeting(Integer meetingId, MeetingV2CreateMeetingBodyDto requestBody, Integer userId);

void updateApplyStatus(Integer meetingId, ApplyV2UpdateStatusBodyDto requestBody, Integer userId);
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,7 @@
package org.sopt.makers.crew.main.meeting.v2.service;

import static org.sopt.makers.crew.main.common.constant.CrewConst.ACTIVE_GENERATION;
import static org.sopt.makers.crew.main.common.exception.ErrorStatus.ALREADY_APPLIED_MEETING;
import static org.sopt.makers.crew.main.common.exception.ErrorStatus.FULL_MEETING_CAPACITY;
import static org.sopt.makers.crew.main.common.exception.ErrorStatus.MISSING_GENERATION_PART;
import static org.sopt.makers.crew.main.common.exception.ErrorStatus.NOT_ACTIVE_GENERATION;
import static org.sopt.makers.crew.main.common.exception.ErrorStatus.NOT_FOUND_APPLY;
import static org.sopt.makers.crew.main.common.exception.ErrorStatus.NOT_IN_APPLY_PERIOD;
import static org.sopt.makers.crew.main.common.exception.ErrorStatus.NOT_TARGET_PART;
import static org.sopt.makers.crew.main.common.exception.ErrorStatus.VALIDATION_EXCEPTION;
import static org.sopt.makers.crew.main.common.exception.ErrorStatus.*;

import java.time.LocalDateTime;
import java.util.ArrayList;
Expand Down Expand Up @@ -49,6 +42,7 @@
import org.sopt.makers.crew.main.meeting.v2.dto.query.MeetingGetAppliesQueryDto;
import org.sopt.makers.crew.main.meeting.v2.dto.query.MeetingV2GetAllMeetingByOrgUserQueryDto;
import org.sopt.makers.crew.main.meeting.v2.dto.query.MeetingV2GetAllMeetingQueryDto;
import org.sopt.makers.crew.main.meeting.v2.dto.request.ApplyV2UpdateStatusBodyDto;
import org.sopt.makers.crew.main.meeting.v2.dto.request.MeetingV2ApplyMeetingDto;
import org.sopt.makers.crew.main.meeting.v2.dto.request.MeetingV2CreateMeetingBodyDto;
import org.sopt.makers.crew.main.meeting.v2.dto.response.ApplyInfoDto;
Expand Down Expand Up @@ -279,6 +273,27 @@ public void updateMeeting(Integer meetingId, MeetingV2CreateMeetingBodyDto reque
meeting.updateMeeting(updatedMeeting);
}

@Override
@Transactional
public void updateApplyStatus(Integer meetingId, ApplyV2UpdateStatusBodyDto requestBody, Integer userId) {
Meeting meeting = meetingRepository.findByIdOrThrow(meetingId);
meeting.validateMeetingCreator(userId);

Apply apply = applyRepository.findByIdOrThrow(requestBody.getApplyId());
EnApplyStatus updatedApplyStatus = EnApplyStatus.ofValue(requestBody.getStatus());
apply.validateDuplicateUpdateApplyStatus(updatedApplyStatus);

if (updatedApplyStatus.equals(EnApplyStatus.APPROVE)) {
List<Apply> applies = applyRepository.findAllByMeetingIdAndStatus(meetingId,
EnApplyStatus.APPROVE);

meeting.validateCapacity(applies.size());
}

apply.updateApplyStatus(updatedApplyStatus);

}

private Boolean checkActivityStatus(Meeting meeting) {
LocalDateTime now = LocalDateTime.now();
LocalDateTime mStartDate = meeting.getMStartDate();
Expand Down Expand Up @@ -312,9 +327,7 @@ private void validateMeetingCapacity(Meeting meeting, List<Apply> applies) {
.filter(apply -> EnApplyStatus.APPROVE.equals(apply.getStatus()))
.toList();

if (approvedApplies.size() >= meeting.getCapacity()) {
throw new BadRequestException(FULL_MEETING_CAPACITY.getErrorCode());
}
meeting.validateCapacity(approvedApplies.size());
}

private void validateUserAlreadyApplied(Integer userId, List<Apply> applies) {
Expand Down
1 change: 1 addition & 0 deletions server/src/meeting/v0/meeting-v0.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ export class MeetingV0Controller {
@ApiOperation({
summary: '모임 지원자 상태 변경',
description: '모임 지원자 상태 변경',
deprecated: true,
})
@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'))
Expand Down
Loading