Skip to content

Commit a437eef

Browse files
committed
Merge branch 'dev' into feature/sprint1-leftovers-us02-03-04-08
origin/dev 동료(서현) PR #31 (feat(session): 면접 세션 도메인 + Core/AI 메시지 DTO) 흡수. 충돌 해결 원칙: 내 풀스택 동작 코드 유지, 동료의 좋은 부분만 흡수. - DTO 4개 (GenerateQuestionsPayload, GenerateFollowupPayload, QuestionsCallbackPayload, QuestionsCallbackEnvelope): 동료 것은 미사용 데드코드 (Service 없음). 내 풀스택 동작 코드 채택. - InterviewSession: 내 `start/end/interrupt/cancel/updateTitleAndMemo` 유지, 동료의 `isMaxReached()` 흡수. - InterviewMessage: 내 `interviewer(no parent) / followup(with parent) / interviewee(with parent + idempotencyKey)` 시그니처 유지, 동료의 null/blank/sequence 검증 로직을 단일 생성자에 흡수. - InterviewMessageRepository: 내 메서드 + 동료의 `findMaxSequenceBySessionId` 흡수. - InterviewSessionRepository, SessionContextRepository: 내 메서드 유지 (동료 메서드는 미사용 + 필드명 부정확). - 동료의 도메인 테스트 3개 (InterviewSessionTest, InterviewMessageTest, QuestionsCallbackPayloadTest): 시그니처·스키마가 내 코드와 호환 불가, 내 SessionServiceTest/InterviewMessageServiceTest/QuestionsCallbackServiceTest 가 같은 영역을 서비스 레이어에서 커버하므로 제거.
2 parents beee46f + 6411e5e commit a437eef

3 files changed

Lines changed: 28 additions & 4 deletions

File tree

backend/src/main/java/com/stackup/stackup/session/domain/InterviewMessage.java

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -67,27 +67,40 @@ public class InterviewMessage extends BaseTimeEntity {
6767

6868
private InterviewMessage(InterviewSession session, Integer sequenceNumber, MessageRole role,
6969
String content, InterviewMessage parentMessage,
70-
String idempotencyKey) {
70+
MessageStatus initialStatus, String idempotencyKey) {
71+
if (session == null) {
72+
throw new IllegalArgumentException("session must not be null");
73+
}
74+
if (content == null || content.isBlank()) {
75+
throw new IllegalArgumentException("content must not be null or blank");
76+
}
77+
if (sequenceNumber == null || sequenceNumber < 1) {
78+
throw new IllegalArgumentException("sequence must be >= 1");
79+
}
7180
this.session = session;
7281
this.sequenceNumber = sequenceNumber;
7382
this.role = role;
7483
this.content = content;
7584
this.parentMessage = parentMessage;
85+
this.status = initialStatus;
7686
this.idempotencyKey = idempotencyKey;
7787
}
7888

7989
public static InterviewMessage interviewer(InterviewSession session, int seq, String content) {
80-
return new InterviewMessage(session, seq, MessageRole.INTERVIEWER, content, null, null);
90+
return new InterviewMessage(session, seq, MessageRole.INTERVIEWER, content, null,
91+
MessageStatus.CREATED, null);
8192
}
8293

8394
public static InterviewMessage followup(InterviewSession session, int seq, String content,
8495
InterviewMessage parent) {
85-
return new InterviewMessage(session, seq, MessageRole.INTERVIEWER, content, parent, null);
96+
return new InterviewMessage(session, seq, MessageRole.INTERVIEWER, content, parent,
97+
MessageStatus.CREATED, null);
8698
}
8799

88100
public static InterviewMessage interviewee(InterviewSession session, int seq, String content,
89101
InterviewMessage parent, String idempotencyKey) {
90-
return new InterviewMessage(session, seq, MessageRole.INTERVIEWEE, content, parent, idempotencyKey);
102+
return new InterviewMessage(session, seq, MessageRole.INTERVIEWEE, content, parent,
103+
MessageStatus.COMPLETED, idempotencyKey);
91104
}
92105

93106
public void markStatus(MessageStatus newStatus) {

backend/src/main/java/com/stackup/stackup/session/domain/InterviewMessageRepository.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import java.util.List;
44
import java.util.Optional;
55
import org.springframework.data.jpa.repository.JpaRepository;
6+
import org.springframework.data.jpa.repository.Query;
7+
import org.springframework.data.repository.query.Param;
68

79
public interface InterviewMessageRepository extends JpaRepository<InterviewMessage, Long> {
810

@@ -13,4 +15,7 @@ public interface InterviewMessageRepository extends JpaRepository<InterviewMessa
1315
long countBySession_Id(Long sessionId);
1416

1517
Optional<InterviewMessage> findBySession_IdAndIdempotencyKey(Long sessionId, String idempotencyKey);
18+
19+
@Query("select coalesce(max(m.sequenceNumber), 0) from InterviewMessage m where m.session.id = :sessionId")
20+
int findMaxSequenceBySessionId(@Param("sessionId") Long sessionId);
1621
}

backend/src/main/java/com/stackup/stackup/session/domain/InterviewSession.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,12 @@ public void incrementQuestionCount() {
144144
totalQuestionCount++;
145145
}
146146

147+
public boolean isMaxReached() {
148+
return totalQuestionCount != null
149+
&& maxQuestions != null
150+
&& totalQuestionCount >= maxQuestions;
151+
}
152+
147153
public void updateTitleAndMemo(String title, String memo) {
148154
if (title != null && !title.isBlank()) {
149155
this.title = title;

0 commit comments

Comments
 (0)