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
@@ -0,0 +1,26 @@
package com.jolupbisang.demo.application.meetingFolder.command;

import com.jolupbisang.demo.application.meetingFolder.command.dto.MeetingFolderCreationReq;
import com.jolupbisang.demo.application.meetingFolder.command.dto.MeetingFolderCreationRes;
import com.jolupbisang.demo.domain.meetingFolder.model.MeetingFolder;
import com.jolupbisang.demo.infrastructure.meetingFolder.MeetingFolderRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
public class MeetingFolderCreationService {

private final MeetingFolderRepository meetingFolderRepository;

@Transactional
public MeetingFolderCreationRes create(Long userId, MeetingFolderCreationReq req) {
MeetingFolder meetingFolder = new MeetingFolder(userId, req.name(), null);
meetingFolderRepository.save(meetingFolder);

return MeetingFolderCreationRes.of(meetingFolder.getId());
}
}


Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.jolupbisang.demo.application.meetingFolder.command;

import com.jolupbisang.demo.application.meetingFolder.command.dto.MeetingFolderDeletionReq;
import com.jolupbisang.demo.application.meetingFolder.command.dto.MeetingFolderDeletionRes;
import com.jolupbisang.demo.domain.meetingFolder.model.MeetingFolder;
import com.jolupbisang.demo.infrastructure.meetingFolder.MeetingFolderRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;

@Service
@RequiredArgsConstructor
public class MeetingFolderDeletionService {

private final MeetingFolderRepository meetingFolderRepository;

@Transactional
public MeetingFolderDeletionRes delete(Long userId, MeetingFolderDeletionReq req) {
List<MeetingFolder> folders = meetingFolderRepository.findAllById(req.folderIds());

List<Long> successFolderIds = new ArrayList<>();
for (MeetingFolder folder : folders) {
folder.validateOwnerAuthority(userId);
meetingFolderRepository.delete(folder);
successFolderIds.add(folder.getId());
}

return MeetingFolderDeletionRes.of(successFolderIds);
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package com.jolupbisang.demo.application.meetingFolder.command;

import com.jolupbisang.demo.application.meetingFolder.command.dto.MeetingFolderUpdateReq;
import com.jolupbisang.demo.application.meetingFolder.command.dto.MeetingFolderUpdateRes;
import com.jolupbisang.demo.application.meetingFolder.exception.MeetingFolderApplicationErrorCode;
import com.jolupbisang.demo.domain.meeting.model.Meeting;
import com.jolupbisang.demo.domain.meetingFolder.model.MeetingFolder;
import com.jolupbisang.demo.global.exception.ApplicationException;
import com.jolupbisang.demo.infrastructure.meeting.MeetingRepository;
import com.jolupbisang.demo.infrastructure.meetingFolder.MeetingFolderRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;

@Service
@RequiredArgsConstructor
public class MeetingFolderUpdateService {

private final MeetingFolderRepository meetingFolderRepository;
private final MeetingRepository meetingRepository;

@Transactional
public MeetingFolderUpdateRes addMeetings(Long userId, Long folderId, MeetingFolderUpdateReq req) {
MeetingFolder folder = meetingFolderRepository.findById(folderId)
.orElseThrow(() -> new ApplicationException(MeetingFolderApplicationErrorCode.NOT_FOUND_FOLDER, "folderId: %d", folderId));

folder.validateOwnerAuthority(userId);

List<Meeting> meetings = meetingRepository.findByIdsWithParticipant(req.meetingIds());

if (meetings.size() != req.meetingIds().size()) {
throw new ApplicationException(MeetingFolderApplicationErrorCode.NOT_FOUND_MEETING);
}

List<Long> successMeetingIds = new ArrayList<>();
for (Meeting meeting : meetings) {
if (!meeting.isParticipant(userId)) {
throw new ApplicationException(MeetingFolderApplicationErrorCode.NOT_MEETING_PARTICIPANT, "meetingId: %d, userId: %d", meeting.getId(), userId);
}

if (!folder.hasMeeting(meeting.getId())) {
folder.addMeeting(meeting.getId());
successMeetingIds.add(meeting.getId());
}
}

return MeetingFolderUpdateRes.of(successMeetingIds);
}

@Transactional
public MeetingFolderUpdateRes removeMeetings(Long userId, Long folderId, MeetingFolderUpdateReq req) {
MeetingFolder folder = meetingFolderRepository.findByIdWithMeetings(folderId)
.orElseThrow(() -> new ApplicationException(MeetingFolderApplicationErrorCode.NOT_FOUND_FOLDER, "folderId: %d", folderId));

folder.validateOwnerAuthority(userId);

List<Long> successMeetingIds = new ArrayList<>();
for (Long meetingId : req.meetingIds()) {
if (folder.hasMeeting(meetingId)) {
folder.removeMeeting(meetingId);
successMeetingIds.add(meetingId);
}
}

return MeetingFolderUpdateRes.of(successMeetingIds);
}
}


Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.jolupbisang.demo.application.meetingFolder.command.dto;

import jakarta.validation.constraints.NotBlank;

public record MeetingFolderCreationReq(
@NotBlank(message = "폴더 이름은 필수입니다.")
String name
) {
}


Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.jolupbisang.demo.application.meetingFolder.command.dto;

public record MeetingFolderCreationRes(
Long folderId
) {
public static MeetingFolderCreationRes of(Long folderId) {
return new MeetingFolderCreationRes(folderId);
}
}


Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.jolupbisang.demo.application.meetingFolder.command.dto;

import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;

import java.util.List;

public record MeetingFolderDeletionReq(
@NotEmpty(message = "폴더 ID 목록은 필수입니다.")
@NotNull(message = "폴더 ID 목록은 필수입니다.")
List<Long> folderIds
) {
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.jolupbisang.demo.application.meetingFolder.command.dto;

import java.util.List;

public record MeetingFolderDeletionRes(
List<Long> successFolderIds
) {
public static MeetingFolderDeletionRes of(List<Long> successFolderIds) {
return new MeetingFolderDeletionRes(successFolderIds);
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.jolupbisang.demo.application.meetingFolder.command.dto;

import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;

import java.util.List;

public record MeetingFolderUpdateReq(
@NotEmpty(message = "회의 ID 목록은 필수입니다.")
@NotNull(message = "회의 ID 목록은 필수입니다.")
List<Long> meetingIds
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.jolupbisang.demo.application.meetingFolder.command.dto;

import java.util.List;

public record MeetingFolderUpdateRes(
List<Long> successMeetingIds
) {
public static MeetingFolderUpdateRes of(List<Long> successMeetingIds) {
return new MeetingFolderUpdateRes(successMeetingIds);
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.jolupbisang.demo.application.meetingFolder.exception;

import com.jolupbisang.demo.global.exception.ErrorCode;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;

@Getter
@RequiredArgsConstructor
public enum MeetingFolderApplicationErrorCode implements ErrorCode {
NOT_FOUND_FOLDER("MFA-0001", HttpStatus.NOT_FOUND, "존재하지 않는 폴더입니다."),
NOT_FOUND_MEETING("MFA-0002", HttpStatus.NOT_FOUND, "존재하지 않는 회의입니다."),
NOT_FOLDER_OWNER("MFA-0003", HttpStatus.FORBIDDEN, "폴더 소유자만 접근할 수 있습니다."),
NOT_MEETING_PARTICIPANT("MFA-0004", HttpStatus.FORBIDDEN, "회의 참여자만 폴더에 추가할 수 있습니다.");

private final String code;
private final HttpStatus status;
private final String message;
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package com.jolupbisang.demo.application.meetingFolder.query;

import com.jolupbisang.demo.application.meetingFolder.exception.MeetingFolderApplicationErrorCode;
import com.jolupbisang.demo.application.meetingFolder.query.dto.MeetingFolderDetailRes;
import com.jolupbisang.demo.domain.meeting.model.Meeting;
import com.jolupbisang.demo.domain.meetingFolder.model.MeetingFolder;
import com.jolupbisang.demo.global.exception.ApplicationException;
import com.jolupbisang.demo.infrastructure.meeting.MeetingRepository;
import com.jolupbisang.demo.infrastructure.meetingFolder.MeetingFolderRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
@RequiredArgsConstructor
public class MeetingFolderDetailQueryService {

private final MeetingFolderRepository meetingFolderRepository;
private final MeetingRepository meetingRepository;

@Transactional(readOnly = true)
public MeetingFolderDetailRes getFolderMeetings(Long userId, Long folderId) {
MeetingFolder folder = meetingFolderRepository.findByIdWithMeetings(folderId)
.orElseThrow(() -> new ApplicationException(MeetingFolderApplicationErrorCode.NOT_FOUND_FOLDER, "folderId: %d", folderId));

folder.validateOwnerAuthority(userId);

List<Long> meetingIds = folder.getMeetingIds();
if (meetingIds.isEmpty()) {
return MeetingFolderDetailRes.from(List.of());
}

List<Meeting> meetings = meetingRepository.findAllById(meetingIds);

List<MeetingFolderDetailRes.MeetingInfo> meetingInfos = meetings.stream()
.map(MeetingFolderDetailRes.MeetingInfo::fromEntity)
.toList();

return MeetingFolderDetailRes.from(meetingInfos);
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.jolupbisang.demo.application.meetingFolder.query;

import com.jolupbisang.demo.application.meetingFolder.query.dto.MeetingFolderListRes;
import com.jolupbisang.demo.domain.meeting.model.Meeting;
import com.jolupbisang.demo.domain.meetingFolder.model.MeetingFolder;
import com.jolupbisang.demo.infrastructure.meetingFolder.MeetingFolderRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.List;

@Service
@RequiredArgsConstructor
public class MeetingFolderListQueryService {

private final MeetingFolderRepository meetingFolderRepository;

@Transactional(readOnly = true)
public MeetingFolderListRes getFoldersByUserId(Long userId) {
List<MeetingFolder> folders = meetingFolderRepository.findByUserId(userId);
LocalDateTime now = LocalDateTime.now();

List<MeetingFolderListRes.MeetingFolderInfo> folderInfos = folders.stream()
.map(folder -> {
Meeting closestMeeting = meetingFolderRepository.findClosestMeetingByMeetingIds(folder.getMeetingIds(), now)
.orElse(null);
return MeetingFolderListRes.MeetingFolderInfo.fromEntity(folder, closestMeeting);
})
.toList();

return MeetingFolderListRes.from(folderInfos);
}
}


Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.jolupbisang.demo.application.meetingFolder.query.dto;

import com.jolupbisang.demo.domain.meeting.model.Meeting;

import java.time.LocalDateTime;
import java.util.List;

public record MeetingFolderDetailRes(
List<MeetingInfo> meetings
) {
public static MeetingFolderDetailRes from(List<MeetingInfo> meetingInfos) {
return new MeetingFolderDetailRes(meetingInfos);
}

public record MeetingInfo(
Long meetingId,
String title,
LocalDateTime scheduledStartTime
) {
public static MeetingInfo fromEntity(Meeting meeting) {
return new MeetingInfo(
meeting.getId(),
meeting.getTitle(),
meeting.getScheduledTime().getScheduledStartTime()
);
}
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package com.jolupbisang.demo.application.meetingFolder.query.dto;

import com.jolupbisang.demo.domain.meeting.model.Meeting;
import com.jolupbisang.demo.domain.meetingFolder.model.MeetingFolder;

import java.time.LocalDateTime;
import java.util.List;

public record MeetingFolderListRes(
List<MeetingFolderInfo> folders
) {
public static MeetingFolderListRes from(List<MeetingFolderInfo> folderInfos) {
return new MeetingFolderListRes(folderInfos);
}

public record MeetingFolderInfo(
Long folderId,
String folderName,
String meetingName,
LocalDateTime scheduledStartTime,
LocalDateTime scheduledEndTime
) {
public static MeetingFolderInfo fromEntity(MeetingFolder folder, Meeting closestMeeting) {
if (closestMeeting != null) {
return new MeetingFolderInfo(
folder.getId(),
folder.getName(),
closestMeeting.getTitle(),
closestMeeting.getScheduledTime().getScheduledStartTime(),
closestMeeting.getScheduledTime().getScheduledEndTime()
);
}
return new MeetingFolderInfo(
folder.getId(),
folder.getName(),
null,
null,
null
);
}
}
}


Loading
Loading