Skip to content

Commit bb9c696

Browse files
authored
Merge pull request #192 from prgrms-web-devcourse-final-project/develop
2 parents a840e30 + bda9e28 commit bb9c696

File tree

16 files changed

+510
-13
lines changed

16 files changed

+510
-13
lines changed

back/src/main/java/com/back/domain/mentoring/mentoring/controller/MentoringController.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
import org.springframework.security.access.prepost.PreAuthorize;
1818
import org.springframework.web.bind.annotation.*;
1919

20+
import java.util.List;
21+
2022
@RestController
2123
@RequestMapping("/mentorings")
2224
@RequiredArgsConstructor
@@ -43,6 +45,20 @@ public RsData<MentoringPagingResponse> getMentorings(
4345
);
4446
}
4547

48+
@GetMapping("/my")
49+
@PreAuthorize("hasRole('MENTOR')")
50+
@Operation(summary = "나의 멘토링 목록 조회", description = "나의 멘토링 목록을 조회합니다. 로그인한 멘토만 접근할 수 있습니다.")
51+
public RsData<List<MentoringWithTagsDto>> getMyMentorings() {
52+
Mentor mentor = memberStorage.findMentorByMember(rq.getActor());
53+
List<MentoringWithTagsDto> resDto = mentoringService.getMyMentorings(mentor);
54+
55+
return new RsData<>(
56+
"200",
57+
"나의 멘토링 목록을 조회하였습니다.",
58+
resDto
59+
);
60+
}
61+
4662
@GetMapping("/{mentoringId}")
4763
@Operation(summary = "멘토링 상세 조회", description = "특정 멘토링을 상세 조회합니다.")
4864
public RsData<MentoringResponse> getMentoring(

back/src/main/java/com/back/domain/mentoring/mentoring/repository/MentoringRepository.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
public interface MentoringRepository extends JpaRepository<Mentoring, Long>, MentoringRepositoryCustom {
1010
List<Mentoring> findByMentorId(Long mentorId);
11+
List<Mentoring> findByMentorIdOrderByIdDesc(Long mentorId);
1112
Optional<Mentoring> findTopByOrderByIdDesc();
1213
boolean existsByMentorIdAndTitle(Long mentorId, String title);
1314
boolean existsByMentorIdAndTitleAndIdNot(Long mentorId, String title, Long MentoringId);

back/src/main/java/com/back/domain/mentoring/mentoring/service/MentoringService.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,14 @@ public Page<MentoringWithTagsDto> getMentorings(String keyword, int page, int si
3939
.map(MentoringWithTagsDto::from);
4040
}
4141

42+
@Transactional(readOnly = true)
43+
public List<MentoringWithTagsDto> getMyMentorings(Mentor mentor) {
44+
return mentoringRepository.findByMentorIdOrderByIdDesc(mentor.getId())
45+
.stream()
46+
.map(MentoringWithTagsDto::from)
47+
.toList();
48+
}
49+
4250
@Transactional(readOnly = true)
4351
public MentoringResponse getMentoring(Long mentoringId) {
4452
Mentoring mentoring = mentoringStorage.findMentoring(mentoringId);

back/src/main/java/com/back/domain/mentoring/session/controller/MentoringSessionController.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,10 @@ public class MentoringSessionController {
1919
private final MentoringSessionManager mentoringSessionManager;
2020
private final Rq rq;
2121

22-
@GetMapping("/{sessionId}/url")
22+
@GetMapping("/url")
2323
@Operation(summary = "세션참여 URL 발급", description = "세션 참여를 위한 URL을 발급합니다.")
24-
public RsData<GetSessionUrlResponse> getSessionUrl(@PathVariable Long sessionId) {
24+
public RsData<GetSessionUrlResponse> getSessionUrl(@RequestParam Long sessionId) {
25+
2526
GetSessionUrlResponse response = mentoringSessionManager.getSessionUrl(sessionId);
2627
return new RsData<>("200", "요청완료", response);
2728
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.back.domain.mentoring.session.controller;
2+
3+
import com.back.domain.mentoring.session.dto.WebRtcSignalingMessage;
4+
import lombok.RequiredArgsConstructor;
5+
import lombok.extern.slf4j.Slf4j;
6+
import org.springframework.messaging.handler.annotation.MessageMapping;
7+
import org.springframework.messaging.simp.SimpMessageSendingOperations;
8+
import org.springframework.stereotype.Controller;
9+
10+
import java.security.Principal;
11+
12+
@Slf4j
13+
@Controller
14+
@RequiredArgsConstructor
15+
public class WebRtcController {
16+
17+
private final SimpMessageSendingOperations messagingTemplate;
18+
19+
@MessageMapping("/signal")
20+
public void handleSignalingMessage(WebRtcSignalingMessage message, Principal principal) {
21+
String senderUsername = principal.getName();
22+
23+
WebRtcSignalingMessage finalMessage = new WebRtcSignalingMessage(message.type(), senderUsername, message.to(), message.sessionId(), message.payload());
24+
25+
log.debug("[Signal] type: {}, from: {}, to: {}, sessionId: {}",
26+
finalMessage.type(), finalMessage.from(), finalMessage.to(), finalMessage.sessionId());
27+
28+
// 'to' 필드가 있으면 특정 사용자에게, 없으면 세션 전체에 브로드캐스트
29+
if (finalMessage.to() != null && !finalMessage.to().isEmpty()) {
30+
String userSpecificTopic = "/topic/signal/user/" + finalMessage.to();
31+
messagingTemplate.convertAndSend(userSpecificTopic, finalMessage);
32+
} else {
33+
messagingTemplate.convertAndSend("/topic/signal/room/" + finalMessage.sessionId(), finalMessage);
34+
}
35+
}
36+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.back.domain.mentoring.session.dto;
2+
3+
public record WebRtcSignalingMessage(
4+
String type,
5+
String from,
6+
String to,
7+
String sessionId,
8+
Object payload
9+
) {
10+
}

back/src/main/java/com/back/domain/mentoring/session/entity/ChatMessage.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,39 @@ private ChatMessage(MentoringSession mentoringSession, Member sender, SenderRole
4646
}
4747

4848
public static ChatMessage create(MentoringSession mentoringSession, Member sender, SenderRole senderRole, String content, MessageType type) {
49+
if (mentoringSession == null) {
50+
throw new IllegalArgumentException("MentoringSession은 null일 수 없습니다.");
51+
}
52+
if (content == null || content.isBlank()) {
53+
throw new IllegalArgumentException("Content는 null이거나 비어 있을 수 없습니다.");
54+
}
55+
if (type == null) {
56+
throw new IllegalArgumentException("MessageType은 null일 수 없습니다.");
57+
}
58+
59+
if (type == MessageType.SYSTEM) {
60+
if (sender != null) {
61+
throw new IllegalArgumentException("시스템 메시지의 sender는 null이어야 합니다.");
62+
}
63+
if (senderRole != SenderRole.SYSTEM) {
64+
throw new IllegalArgumentException("시스템 메시지의 senderRole은 SYSTEM이어야 합니다.");
65+
}
66+
} else { // TEXT, IMAGE, FILE
67+
if (sender == null) {
68+
throw new IllegalArgumentException("일반 메시지의 sender는 null일 수 없습니다.");
69+
}
70+
if (senderRole != SenderRole.MENTOR && senderRole != SenderRole.MENTEE) {
71+
throw new IllegalArgumentException("일반 메시지의 senderRole은 MENTOR 또는 MENTEE여야 합니다.");
72+
}
73+
74+
boolean isParticipant = (mentoringSession.getReservation().getMentor().isMember(sender) ||
75+
mentoringSession.getReservation().getMentee().isMember(sender));
76+
77+
if (!isParticipant) {
78+
throw new IllegalArgumentException("메시지 발신자는 해당 멘토링 세션의 참여자가 아닙니다.");
79+
}
80+
}
81+
4982
return ChatMessage.builder()
5083
.mentoringSession(mentoringSession)
5184
.sender(sender)

back/src/main/java/com/back/domain/mentoring/session/entity/MentoringSession.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,6 @@ public class MentoringSession extends BaseEntity {
3434
@OneToMany(mappedBy = "mentoringSession", cascade = CascadeType.ALL)
3535
private List<ChatMessage> chatMessages = new ArrayList<>();
3636

37-
// 화면 공유, WebRTC 관련 필드 등 추가 가능
38-
3937
@Builder(access = AccessLevel.PRIVATE)
4038
private MentoringSession(Reservation reservation) {
4139
this.sessionUrl = java.util.UUID.randomUUID().toString();

back/src/main/java/com/back/domain/mentoring/slot/dto/request/MentorSlotRepetitionRequest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,14 @@ public record MentorSlotRepetitionRequest(
2323
@NotEmpty
2424
List<DayOfWeek> daysOfWeek,
2525

26-
@Schema(description = "시작 시간", example = "HH:mm:ss")
26+
@Schema(description = "시작 시간", example = "HH:mm")
2727
@NotNull
28-
@JsonFormat(pattern = "HH:mm:ss")
28+
@JsonFormat(pattern = "HH:mm")
2929
LocalTime startTime,
3030

31-
@Schema(description = "종료 시간", example = "HH:mm:ss")
31+
@Schema(description = "종료 시간", example = "HH:mm")
3232
@NotNull
33-
@JsonFormat(pattern = "HH:mm:ss")
33+
@JsonFormat(pattern = "HH:mm")
3434
LocalTime endTime
3535
){
3636
}

back/src/main/java/com/back/domain/mentoring/slot/dto/request/MentorSlotRequest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@ public record MentorSlotRequest(
1010
@NotNull
1111
Long mentorId,
1212

13-
@Schema(description = "시작 일시", example = "yyyy-MM-ddTHH:mm:ss")
13+
@Schema(description = "시작 일시", example = "yyyy-MM-ddTHH:mm")
1414
@NotNull
1515
LocalDateTime startDateTime,
1616

17-
@Schema(description = "종료 일시", example = "yyyy-MM-ddTHH:mm:ss")
17+
@Schema(description = "종료 일시", example = "yyyy-MM-ddTHH:mm")
1818
@NotNull
1919
LocalDateTime endDateTime
2020
) {

0 commit comments

Comments
 (0)