Skip to content

Commit

Permalink
Merge pull request #41 from dnd-side-project/Refactor/#40
Browse files Browse the repository at this point in the history
Refactor/#40
  • Loading branch information
chaewon-io authored Aug 12, 2024
2 parents f153604 + 0250b2a commit 0eff6a3
Show file tree
Hide file tree
Showing 19 changed files with 131 additions and 7,394 deletions.
2 changes: 2 additions & 0 deletions src/docs/asciidoc/meeting/create-meeting.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ include::{snippets}/meeting-controller-test/create-meeting_validation_error/http
include::{snippets}/meeting-controller-test/create-meeting_bad_request_start-date/http-response.adoc[]
===== c. 종료일은 시작일 이내로 설정 시 예외가 발생합니다.
include::{snippets}/meeting-controller-test/create-meeting_bad_request_end-date/http-response.adoc[]
===== d. 종료일은 시작일로부터 7일 초과하여 설정 시 예외가 발생합니다.
include::{snippets}/meeting-controller-test/create-meeting_bad_request_end-date_eight-days-later/http-response.adoc[]

==== 참고
==== 모임 상태 설명
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,10 @@ public record CreateMeetingEntityDto(
String thumbnailUrl,
String symbolColor,
String password,
String leaderAuthKey,
String meetingLink
String meetingLink,
String leaderAuthKey
) {
public static CreateMeetingEntityDto of(CreateMeetingRequestDto requestDto, String thumbnailUrl, String meetingLink) {
public static CreateMeetingEntityDto of(CreateMeetingRequestDto requestDto, String thumbnailUrl, String meetingLink, String leaderAuthKey) {
return new CreateMeetingEntityDto(
requestDto.name(),
requestDto.startDate(),
Expand All @@ -22,9 +22,8 @@ public static CreateMeetingEntityDto of(CreateMeetingRequestDto requestDto, Stri
thumbnailUrl,
requestDto.symbolColor(),
requestDto.password(),
requestDto.leaderAuthKey(),
meetingLink
meetingLink,
leaderAuthKey
);
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,24 @@
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import org.springframework.web.multipart.MultipartFile;

import java.time.LocalDateTime;
import java.util.Optional;

public record CreateMeetingRequestDto(

@NotBlank(message = "모임명은 필수 입력값입니다.")
@Size(min = 3, max = 15, message = "모임명은 3자 이상 15자 이하이어야 합니다.")
String name,

@NotBlank(message = "모임 설명은 필수 입력값입니다.")
@Size(min = 8, max = 150, message = "모임 설명은 8자 이상 150자 이내여야 합니다.")
String description,

@NotNull(message = "시작일은 필수 입력값입니다.")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss")
LocalDateTime startDate,

@NotNull(message = "종료일은 필수 입력값입니다.")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss")
LocalDateTime endDate,

Expand All @@ -28,9 +30,5 @@ public record CreateMeetingRequestDto(

@NotBlank(message = "비밀번호는 필수 입력값입니다.")
@Size(max = 4, message = "비밀번호는 4글자 이내여야 합니다.")
String password,

@NotBlank(message = "모임장 비밀번호는 필수 입력값입니다.")
@Size(max = 4, message = "모임장 비밀번호는 4글자 이내여야 합니다.")
String leaderAuthKey
String password
) { }
Original file line number Diff line number Diff line change
@@ -1,5 +1,21 @@
package com.dnd.snappy.domain.meeting.dto.response;

import com.dnd.snappy.domain.meeting.entity.Meeting;

import java.time.LocalDateTime;

public record CreateMeetingResponseDto(
String meetingLink
) {}
String meetingLink,
String leaderAuthKey,
String password,
LocalDateTime startDate,
LocalDateTime endDate
) {
public CreateMeetingResponseDto(Meeting meeting) {
this(meeting.getMeetingLink(),
meeting.getLeaderAuthKey(),
meeting.getPassword(),
meeting.getStartDate(),
meeting.getEndDate());
}
}
12 changes: 5 additions & 7 deletions src/main/java/com/dnd/snappy/domain/meeting/entity/Meeting.java
Original file line number Diff line number Diff line change
Expand Up @@ -48,13 +48,12 @@ public class Meeting extends BaseEntity {
private String meetingLink;

public static Meeting create(CreateMeetingEntityDto dto) {
LocalDateTime endDate = dto.endDate() != null ? dto.endDate() : dto.startDate().plusDays(1);
validateStartAndEndDates(dto.startDate(), dto.endDate());

return Meeting.builder()
.name(dto.name())
.startDate(dto.startDate())
.endDate(endDate)
.endDate(dto.endDate())
.description(dto.description())
.thumbnailUrl(dto.thumbnailUrl())
.symbolColor(dto.symbolColor())
Expand All @@ -66,15 +65,14 @@ public static Meeting create(CreateMeetingEntityDto dto) {

private static void validateStartAndEndDates(LocalDateTime startDate, LocalDateTime endDate) {
LocalDateTime now = LocalDateTime.now();
LocalDateTime tenDaysLater = now.plusDays(10);

Optional.ofNullable(startDate)
.filter(date -> !date.isBefore(now) && !date.isAfter(tenDaysLater))
.filter(date -> !date.isBefore(now) && !date.isAfter(now.plusDays(10)))
.orElseThrow(() -> new BusinessException(CommonErrorCode.BAD_REQUEST, "시작일은 현재 시간 이후부터 10일 이내여야 합니다."));

if (endDate != null && !endDate.isAfter(startDate)) {
throw new BusinessException(CommonErrorCode.BAD_REQUEST, "종료일은 시작일 이후여야 합니다.");
}
Optional.ofNullable(endDate)
.filter(date -> date.isAfter(startDate) && !date.isAfter(startDate.plusDays(7)))
.orElseThrow(() -> new BusinessException(CommonErrorCode.BAD_REQUEST, "종료일은 시작일 이후여야 하며, 시작일로부터 최대 7일까지만 입력 가능합니다."));
}

public MeetingLinkStatus getMeetingLinkStatus() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,7 @@ public enum MeetingErrorCode implements ErrorCodeInterface {
MEETING_NOT_FOUND(HttpStatus.NOT_FOUND, "MEETING_NOT_FOUND", "요청된 모임을 찾을 수 없습니다."),
MEETING_INVALIDATE_PASSWORD(HttpStatus.BAD_REQUEST, "MEETING_INVALIDATE_PASSWORD", "모임의 비밀번호가 유효하지 않습니다."),
MEETING_JOIN_DENIED(HttpStatus.FORBIDDEN, "MEETING_JOIN_DENIED", "이미 끝난 모임에는 참여할 수 없습니다."),
DUPLICATION_MEETING_LINK(HttpStatus.CONFLICT, "DUPLICATION_MEETING_LINK", "모임 링크가 중복되었습니다."),
;
DUPLICATION_MEETING_LINK(HttpStatus.CONFLICT, "DUPLICATION_MEETING_LINK", "모임 링크가 중복되었습니다.");

private final HttpStatus status;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,6 @@ public interface MeetingRepository extends JpaRepository<Meeting, Long> {
Optional<Meeting> findByMeetingLink(String meetingLink);

boolean existsByMeetingLink(String meetingLink);

boolean existsByLeaderAuthKey(String leaderAuthKey);
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import java.util.Random;
import java.util.UUID;

@Service
Expand Down Expand Up @@ -53,25 +54,27 @@ public void validateMeetingLeaderAuthKey(Long meetingId, String password, String
}
}

@Transactional(readOnly = true)
public ShareMeetingLinkResponseDto getShareableMeetingLink(Long meetingId) {
Meeting meeting = findByMeetingIdOrThrow(meetingId);
String meetingLink = meeting.getMeetingLink();
return new ShareMeetingLinkResponseDto(meetingLink);
}

@Transactional
public CreateMeetingResponseDto createMeeting(CreateMeetingRequestDto requestDto, MultipartFile thumbnail) {
String meetingLinkUuid = generateMeetingLink();
String thumbnailUrl = getThumbnailUrl(thumbnail);

checkMeetingLinkDuplication(meetingLinkUuid);

String thumbnailUrl = getThumbnailUrl(thumbnail);
String leaderAuthKey = generateLeaderAuthKey();

CreateMeetingEntityDto dto = CreateMeetingEntityDto.of(requestDto, thumbnailUrl, meetingLinkUuid);
CreateMeetingEntityDto dto = CreateMeetingEntityDto.of(requestDto, thumbnailUrl, meetingLinkUuid, leaderAuthKey);
Meeting meeting = Meeting.create(dto);

meetingRepository.save(meeting);
return new CreateMeetingResponseDto(meetingLinkUuid);
}

@Transactional(readOnly = true)
public ShareMeetingLinkResponseDto getShareableMeetingLink(Long meetingId) {
Meeting meeting = findByMeetingIdOrThrow(meetingId);
String meetingLink = meeting.getMeetingLink();
return new ShareMeetingLinkResponseDto(meetingLink);
return new CreateMeetingResponseDto(meeting);
}

private Meeting findByMeetingLinkOrThrow(String meetingLink) {
Expand All @@ -91,8 +94,7 @@ private void checkMeetingLinkDuplication(String meetingLink) {
}

private String generateMeetingLink() {
String uuid = UUID.randomUUID().toString();
return uuid.replace("-", "").substring(0, 7);
return UUID.randomUUID().toString().replace("-", "").substring(0, 7);
}

private String getThumbnailUrl(MultipartFile thumbnail) {
Expand All @@ -101,4 +103,8 @@ private String getThumbnailUrl(MultipartFile thumbnail) {
}
return DEFAULT_THUMBNAIL_URL;
}

private static String generateLeaderAuthKey() {
return String.format("%04d", new Random().nextInt(10000));
}
}
Loading

0 comments on commit 0eff6a3

Please sign in to comment.