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 @@ -2,7 +2,13 @@

import com.jolupbisang.demo.application.meeting.command.dto.MeetingCreationReq;
import com.jolupbisang.demo.application.meeting.command.dto.MeetingCreationRes;
import com.jolupbisang.demo.domain.meeting.model.*;
import com.jolupbisang.demo.domain.meeting.model.ActualProgressTime;
import com.jolupbisang.demo.domain.meeting.model.AgendaDetail;
import com.jolupbisang.demo.domain.meeting.model.Meeting;
import com.jolupbisang.demo.domain.meeting.model.MeetingRole;
import com.jolupbisang.demo.domain.meeting.model.ParticipantDetail;
import com.jolupbisang.demo.domain.meeting.model.RestTime;
import com.jolupbisang.demo.domain.meeting.model.ScheduledTime;
import com.jolupbisang.demo.domain.user.User;
import com.jolupbisang.demo.global.exception.NotFoundException;
import com.jolupbisang.demo.infrastructure.meeting.MeetingRepository;
Expand Down Expand Up @@ -49,7 +55,8 @@ private Meeting createMeeting(User host, List<User> invitedUsers, MeetingCreatio
actualProgressTime,
restTime,
participantDetails,
agendaDetails
agendaDetails,
req.teams()
);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.jolupbisang.demo.application.meeting.command;

import com.jolupbisang.demo.application.meeting.command.dto.TeamTagAdditionReq;
import com.jolupbisang.demo.application.meeting.command.dto.TeamTagAdditionRes;
import com.jolupbisang.demo.domain.meeting.model.Meeting;
import com.jolupbisang.demo.domain.team.model.Team;
import com.jolupbisang.demo.global.exception.NotFoundException;
import com.jolupbisang.demo.infrastructure.meeting.MeetingRepository;
import com.jolupbisang.demo.infrastructure.team.TeamRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
public class TeamTagAdditionService {

private final MeetingRepository meetingRepository;
private final TeamRepository teamRepository;

@Transactional
public TeamTagAdditionRes addTeamTag(Long meetingId, Long accessUserId, TeamTagAdditionReq request) {
Meeting meeting = meetingRepository.findByIdWithTeamTagsAndParticipants(meetingId)
.orElseThrow(() -> new NotFoundException("meetingId: %d", meetingId));

meeting.validateHostAuthority(accessUserId);

Team team = teamRepository.findById(request.teamId())
.orElseThrow(() -> new NotFoundException("teamId: %d", request.teamId()));

team.validateViewAuthority(accessUserId);

meeting.addTeamTag(request.teamId());

return new TeamTagAdditionRes(meeting.getId());
}
}

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

import com.jolupbisang.demo.application.meeting.command.dto.TeamTagRemovalReq;
import com.jolupbisang.demo.application.meeting.command.dto.TeamTagRemovalRes;
import com.jolupbisang.demo.domain.meeting.model.Meeting;
import com.jolupbisang.demo.domain.team.model.Team;
import com.jolupbisang.demo.global.exception.NotFoundException;
import com.jolupbisang.demo.infrastructure.meeting.MeetingRepository;
import com.jolupbisang.demo.infrastructure.team.TeamRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
public class TeamTagRemovalService {

private final MeetingRepository meetingRepository;
private final TeamRepository teamRepository;

@Transactional
public TeamTagRemovalRes removeTeamTag(Long meetingId, Long accessUserId, TeamTagRemovalReq request) {
Meeting meeting = meetingRepository.findByIdWithTeamTagsAndParticipants(meetingId)
.orElseThrow(() -> new NotFoundException("meetingId: %d", meetingId));

meeting.validateHostAuthority(accessUserId);

Team team = teamRepository.findById(request.teamId())
.orElseThrow(() -> new NotFoundException("teamId: %d", request.teamId()));

team.validateViewAuthority(accessUserId);

meeting.removeTeamTag(request.teamId());

return new TeamTagRemovalRes(meeting.getId());
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,10 @@ public record MeetingCreationReq(

@Schema(description = "회의 안건 목록")
@NotNull(message = "회의 안건 목록은 필수입니다.")
List<@NotBlank(message = "회의 안건은 1글자 이상이어야 합니다.") String> agendas
List<@NotBlank(message = "회의 안건은 1글자 이상이어야 합니다.") String> agendas,

@Schema(description = "팀 ID 목록", example = "[1, 2, 3]")
@NotNull(message = "팀 목록은 필수입니다.")
List<Long> teams
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.jolupbisang.demo.application.meeting.command.dto;

import jakarta.validation.constraints.NotNull;

public record TeamTagAdditionReq(
@NotNull(message = "팀 ID는 필수입니다.")
Long teamId
) {
}

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

public record TeamTagAdditionRes(
long meetingId
) {
}

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

import jakarta.validation.constraints.NotNull;

public record TeamTagRemovalReq(
@NotNull(message = "팀 ID는 필수입니다.")
Long teamId
) {
}

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

public record TeamTagRemovalRes(
long meetingId
) {
}

Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@
import com.jolupbisang.demo.application.meeting.query.dto.ParticipantInfoRes;
import com.jolupbisang.demo.domain.meeting.model.Meeting;
import com.jolupbisang.demo.domain.meeting.model.Participant;
import com.jolupbisang.demo.domain.team.model.Team;
import com.jolupbisang.demo.domain.user.User;
import com.jolupbisang.demo.global.exception.NotFoundException;
import com.jolupbisang.demo.infrastructure.meeting.MeetingRepository;
import com.jolupbisang.demo.infrastructure.team.TeamRepository;
import com.jolupbisang.demo.infrastructure.user.UserRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
Expand All @@ -23,6 +25,7 @@ public class MeetingDetailQueryService {

private final MeetingRepository meetingRepository;
private final UserRepository userRepository;
private final TeamRepository teamRepository;

private static final String NOT_FOUND_USER_EMAIL = "알 수 없음";

Expand All @@ -35,9 +38,10 @@ public MeetingDetailRes getMeetingDetail(long meetingId, long accessUserId) {

List<ParticipantInfoRes> participantInfos = getParticipantInfoRes(meeting);
List<AgendaInfoRes> agendaInfoRes = getAgendaInfoRes(meeting);
List<String> teamNames = getTeamNames(meeting);
boolean isHost = meeting.isHost(accessUserId);

return MeetingDetailRes.from(meeting, participantInfos, agendaInfoRes, isHost);
return MeetingDetailRes.from(meeting, participantInfos, agendaInfoRes, teamNames, isHost);
}

private List<ParticipantInfoRes> getParticipantInfoRes(Meeting meeting) {
Expand Down Expand Up @@ -69,4 +73,19 @@ private List<AgendaInfoRes> getAgendaInfoRes(Meeting meeting) {
.map(agenda -> new AgendaInfoRes(agenda.getId(), agenda.getContent(), agenda.getIsCompleted()))
.collect(Collectors.toList());
}

private List<String> getTeamNames(Meeting meeting) {
List<Long> teamIds = meeting.getTeamTags().stream()
.map(teamTag -> teamTag.getTeamId())
.toList();

if (teamIds.isEmpty()) {
return List.of();
}

List<Team> teams = teamRepository.findAllById(teamIds);
return teams.stream()
.map(team -> team.getTeamName().getName())
.toList();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,11 @@ public record MeetingDetailRes(
String meetingStatus,
List<ParticipantInfoRes> participants,
List<AgendaInfoRes> agendas,
List<String> teamNames,
boolean isHost
) {

public static MeetingDetailRes from(Meeting meeting, List<ParticipantInfoRes> participantInfos, List<AgendaInfoRes> agendas, boolean isHost) {
public static MeetingDetailRes from(Meeting meeting, List<ParticipantInfoRes> participantInfos, List<AgendaInfoRes> agendas, List<String> teamNames, boolean isHost) {
return new MeetingDetailRes(
meeting.getId(),
meeting.getTitle(),
Expand All @@ -35,6 +36,7 @@ public static MeetingDetailRes from(Meeting meeting, List<ParticipantInfoRes> pa
meeting.getMeetingStatus().name(),
participantInfos,
agendas,
teamNames,
isHost
);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,26 +1,35 @@
package com.jolupbisang.demo.application.team.query;

import com.jolupbisang.demo.application.team.query.dto.TeamListRes;
import com.jolupbisang.demo.domain.meeting.model.Meeting;
import com.jolupbisang.demo.domain.team.model.Team;
import com.jolupbisang.demo.infrastructure.meeting.MeetingRepository;
import com.jolupbisang.demo.infrastructure.team.TeamRepository;
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 TeamListQueryService {

private final TeamRepository teamRepository;
private final MeetingRepository meetingRepository;

@Transactional(readOnly = true)
public List<TeamListRes> getTeamsByUserId(Long userId) {
List<Team> teams = teamRepository.findByMembersUserId(userId);
LocalDateTime now = LocalDateTime.now();

return teams.stream()
.map(TeamListRes::fromEntity)
.map(team -> {
Meeting closestMeeting = meetingRepository.findClosestMeetingByTeamId(team.getId(), now)
.orElse(null);
return TeamListRes.fromEntity(team, closestMeeting);
})
.toList();
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,33 @@
package com.jolupbisang.demo.application.team.query.dto;

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

import java.time.LocalDateTime;

public record TeamListRes(
Long teamId,
String teamName
String teamName,
String meetingName,
LocalDateTime scheduledStartTime,
LocalDateTime scheduledEndTime
) {
public static TeamListRes fromEntity(Team team) {
public static TeamListRes fromEntity(Team team, Meeting closestMeeting) {
if (closestMeeting != null) {
return new TeamListRes(
team.getId(),
team.getTeamName().getName(),
closestMeeting.getTitle(),
closestMeeting.getScheduledTime().getScheduledStartTime(),
closestMeeting.getScheduledTime().getScheduledEndTime()
);
}
return new TeamListRes(
team.getId(),
team.getTeamName().getName()
team.getTeamName().getName(),
null,
null,
null
);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,8 @@ public enum MeetingDomainErrorCode implements ErrorCode {
INVALID_TOTAL_PARTICIPATION_CHUNK("MD-0024", HttpStatus.BAD_REQUEST, "참여 청크는 0보다 크거나 같아야합니다."),
NON_EXISTING_AGENDA("MD-0025", HttpStatus.NOT_FOUND, "없는 아젠다 입니다."),
NOT_PARTICIPANT("MD-0026", HttpStatus.UNAUTHORIZED, "회의 참여자만 가능합니다."),
NEGATIVE_USER_ID("MD-0027", HttpStatus.BAD_REQUEST, "사용자 Id는 0보다 크거나 같아야합니다.");
NEGATIVE_USER_ID("MD-0027", HttpStatus.BAD_REQUEST, "사용자 id는 0보다 크거나 같아야합니다."),
NULL_TEAM("MD-0028", HttpStatus.BAD_REQUEST, "팀은 필수입니다.");

private final String code;
private final HttpStatus status;
Expand Down
Loading
Loading