Skip to content

Commit 336e628

Browse files
authored
feat: 화상 면접 조회 기능 구현
feat: 화상 면접 조회 기능 구현
2 parents e1a0ea2 + 795efb3 commit 336e628

7 files changed

Lines changed: 251 additions & 91 deletions

File tree

src/main/java/io/wisoft/prepair/prepair_api/interview/answer/service/AnalysisCompletionService.java

Lines changed: 15 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,17 @@
1111
import io.wisoft.prepair.prepair_api.interview.answer.entity.InterviewFeedback;
1212
import io.wisoft.prepair.prepair_api.interview.answer.repository.AnswerRepository;
1313
import io.wisoft.prepair.prepair_api.interview.answer.repository.FeedbackRepository;
14-
import io.wisoft.prepair.prepair_api.interview.question.entity.InterviewQuestion;
15-
import io.wisoft.prepair.prepair_api.interview.question.repository.QuestionRepository;
14+
import io.wisoft.prepair.prepair_api.interview.session.dto.response.SessionDetailResponse;
1615
import io.wisoft.prepair.prepair_api.interview.session.entity.InterviewSession;
1716
import io.wisoft.prepair.prepair_api.interview.session.notifier.SessionCompletionNotifier;
18-
import io.wisoft.prepair.prepair_api.interview.session.service.SessionPersistenceService;
17+
import io.wisoft.prepair.prepair_api.interview.session.service.SessionService;
1918
import lombok.RequiredArgsConstructor;
2019
import lombok.extern.slf4j.Slf4j;
2120
import org.springframework.stereotype.Service;
2221

2322
import java.util.ArrayList;
2423
import java.util.List;
25-
import java.util.Map;
2624
import java.util.UUID;
27-
import java.util.stream.Collectors;
2825

2926
@Slf4j
3027
@Service
@@ -33,10 +30,9 @@ public class AnalysisCompletionService {
3330

3431
private final AnswerRepository answerRepository;
3532
private final FeedbackRepository feedbackRepository;
36-
private final QuestionRepository questionRepository;
3733
private final FeedbackGenerator feedbackGenerator;
3834
private final AnswerPersistenceService answerPersistenceService;
39-
private final SessionPersistenceService sessionPersistenceService;
35+
private final SessionService sessionService;
4036
private final SessionCompletionNotifier completionNotifier;
4137

4238
public void processAnalysisCompletion(UUID answerId) {
@@ -91,7 +87,7 @@ public void failSession(UUID answerId, String message) {
9187
return;
9288
}
9389

94-
sessionPersistenceService.saveFailedSession(session.getId());
90+
sessionService.saveFailedSession(session.getId());
9591
completionNotifier.notifyFailure(session.getId(), message);
9692
}
9793

@@ -127,7 +123,7 @@ private void completeSession(
127123
FinalFeedbackData data,
128124
FinalFeedbackResult finalResult
129125
) {
130-
sessionPersistenceService.saveCompletedSession(sessionId, data.finalScore(), finalResult.finalFeedback());
126+
sessionService.saveCompletedSession(sessionId, data.finalScore(), finalResult.finalFeedback());
131127

132128
FinalFeedbackResponse response = new FinalFeedbackResponse(
133129
sessionId,
@@ -142,60 +138,29 @@ private void completeSession(
142138
}
143139

144140
private FinalFeedbackData buildFinalData(UUID sessionId) {
145-
List<InterviewQuestion> questions = questionRepository.findByInterviewSessionId(sessionId);
146-
Map<UUID, InterviewAnswer> answerMap = getAnswerMap(sessionId);
147-
Map<UUID, List<InterviewFeedback>> feedbackMap = getFeedbackMap(sessionId);
141+
List<SessionDetailResponse.QuestionFeedback> aggregated = sessionService.buildQuestionFeedbacks(sessionId);
148142

149143
List<FinalFeedbackResponse.QuestionFeedback> questionFeedbacks = new ArrayList<>();
150144
int totalScore = 0;
151145

152-
for (InterviewQuestion question : questions) {
153-
InterviewAnswer answer = answerMap.get(question.getId());
154-
if (answer == null) continue;
155-
156-
List<InterviewFeedback> answerFeedbacks = feedbackMap.getOrDefault(answer.getId(), List.of());
157-
InterviewFeedback combined = findOptionalFeedback(answerFeedbacks, FeedbackType.COMBINED);
158-
159-
if (combined == null) continue;
146+
for (SessionDetailResponse.QuestionFeedback qf : aggregated) {
147+
if (qf.combinedScore() == null) continue;
160148

161149
questionFeedbacks.add(new FinalFeedbackResponse.QuestionFeedback(
162-
question.getId(),
163-
question.getQuestion(),
164-
combined.getScore(),
165-
combined.getFeedback(),
166-
getFeedbackText(answerFeedbacks, FeedbackType.STT),
167-
getFeedbackText(answerFeedbacks, FeedbackType.VIDEO)
150+
qf.questionId(),
151+
qf.question(),
152+
qf.combinedScore(),
153+
qf.combinedFeedback(),
154+
qf.sttFeedback(),
155+
qf.videoFeedback()
168156
));
169-
170-
totalScore += combined.getScore();
157+
totalScore += qf.combinedScore();
171158
}
172159

173160
int finalScore = calculateAverageScore(totalScore, questionFeedbacks.size());
174161
return new FinalFeedbackData(questionFeedbacks, finalScore);
175162
}
176163

177-
private Map<UUID, InterviewAnswer> getAnswerMap(UUID sessionId) {
178-
return answerRepository.findBySessionId(sessionId).stream()
179-
.collect(Collectors.toMap(a -> a.getInterviewQuestion().getId(), a -> a));
180-
}
181-
182-
private Map<UUID, List<InterviewFeedback>> getFeedbackMap(UUID sessionId) {
183-
return feedbackRepository.findAllBySessionId(sessionId).stream()
184-
.collect(Collectors.groupingBy(f -> f.getInterviewAnswer().getId()));
185-
}
186-
187-
private InterviewFeedback findOptionalFeedback(List<InterviewFeedback> feedbacks, FeedbackType type) {
188-
return feedbacks.stream()
189-
.filter(f -> f.getFeedbackType() == type)
190-
.findFirst()
191-
.orElse(null);
192-
}
193-
194-
private String getFeedbackText(List<InterviewFeedback> feedbacks, FeedbackType type) {
195-
InterviewFeedback feedback = findOptionalFeedback(feedbacks, type);
196-
return feedback == null ? null : feedback.getFeedback();
197-
}
198-
199164
private int calculateAverageScore(int totalScore, int count) {
200165
if (count == 0) {
201166
return 0;
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package io.wisoft.prepair.prepair_api.interview.session.controller;
2+
3+
import io.wisoft.prepair.prepair_api.common.response.ApiResponse;
4+
import io.wisoft.prepair.prepair_api.interview.session.dto.response.SessionDetailResponse;
5+
import io.wisoft.prepair.prepair_api.interview.session.dto.response.SessionResponse;
6+
import io.wisoft.prepair.prepair_api.interview.session.service.SessionService;
7+
import lombok.RequiredArgsConstructor;
8+
import org.springframework.web.bind.annotation.GetMapping;
9+
import org.springframework.web.bind.annotation.PathVariable;
10+
import org.springframework.web.bind.annotation.RequestHeader;
11+
import org.springframework.web.bind.annotation.RequestMapping;
12+
import org.springframework.web.bind.annotation.RestController;
13+
14+
import java.util.List;
15+
import java.util.UUID;
16+
17+
@RestController
18+
@RequiredArgsConstructor
19+
@RequestMapping("/api/interviews/sessions")
20+
public class SessionController {
21+
22+
private final SessionService sessionService;
23+
24+
@GetMapping
25+
public ApiResponse<List<SessionResponse>> getSessions(
26+
@RequestHeader("X-User-Id") UUID memberId
27+
) {
28+
List<SessionResponse> data = sessionService.getSessionsByMember(memberId);
29+
return ApiResponse.ok(data, "세션 목록을 조회했습니다.");
30+
}
31+
32+
@GetMapping("/{sessionId}")
33+
public ApiResponse<SessionDetailResponse> getSession(
34+
@PathVariable UUID sessionId,
35+
@RequestHeader("X-User-Id") UUID memberId
36+
) {
37+
SessionDetailResponse data = sessionService.getSessionDetail(sessionId, memberId);
38+
return ApiResponse.ok(data, "세션 결과를 조회했습니다.");
39+
}
40+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package io.wisoft.prepair.prepair_api.interview.session.dto.response;
2+
3+
import io.wisoft.prepair.prepair_api.interview.session.entity.SessionStatus;
4+
5+
import java.util.List;
6+
import java.util.UUID;
7+
8+
public record SessionDetailResponse(
9+
UUID sessionId,
10+
SessionStatus status,
11+
Integer finalScore,
12+
String finalFeedback,
13+
List<QuestionFeedback> questions
14+
) {
15+
public record QuestionFeedback(
16+
UUID questionId,
17+
String question,
18+
String mediaUrl,
19+
Integer combinedScore,
20+
String combinedFeedback,
21+
String sttFeedback,
22+
String videoFeedback
23+
) {
24+
}
25+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package io.wisoft.prepair.prepair_api.interview.session.dto.response;
2+
3+
import io.wisoft.prepair.prepair_api.interview.session.entity.InterviewSession;
4+
import io.wisoft.prepair.prepair_api.interview.session.entity.SessionStatus;
5+
6+
import java.time.LocalDateTime;
7+
import java.util.UUID;
8+
9+
public record SessionResponse(
10+
UUID sessionId,
11+
SessionStatus status,
12+
Integer finalScore,
13+
int totalQuestionCount,
14+
LocalDateTime createdAt
15+
) {
16+
public static SessionResponse from(InterviewSession session) {
17+
return new SessionResponse(
18+
session.getId(),
19+
session.getStatus(),
20+
session.getFinalScore(),
21+
session.getTotalQuestionCount(),
22+
session.getCreatedAt()
23+
);
24+
}
25+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package io.wisoft.prepair.prepair_api.interview.session.repository;
22

33
import io.wisoft.prepair.prepair_api.interview.session.entity.InterviewSession;
4+
import java.util.List;
45
import java.util.UUID;
56
import org.springframework.data.jpa.repository.JpaRepository;
67

78
public interface SessionRepository extends JpaRepository<InterviewSession, UUID> {
9+
List<InterviewSession> findByMemberIdOrderByCreatedAtDesc(UUID memberId);
810
}

src/main/java/io/wisoft/prepair/prepair_api/interview/session/service/SessionPersistenceService.java

Lines changed: 0 additions & 41 deletions
This file was deleted.

0 commit comments

Comments
 (0)