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 @@ -11,20 +11,17 @@
import io.wisoft.prepair.prepair_api.interview.answer.entity.InterviewFeedback;
import io.wisoft.prepair.prepair_api.interview.answer.repository.AnswerRepository;
import io.wisoft.prepair.prepair_api.interview.answer.repository.FeedbackRepository;
import io.wisoft.prepair.prepair_api.interview.question.entity.InterviewQuestion;
import io.wisoft.prepair.prepair_api.interview.question.repository.QuestionRepository;
import io.wisoft.prepair.prepair_api.interview.session.dto.response.SessionDetailResponse;
import io.wisoft.prepair.prepair_api.interview.session.entity.InterviewSession;
import io.wisoft.prepair.prepair_api.interview.session.notifier.SessionCompletionNotifier;
import io.wisoft.prepair.prepair_api.interview.session.service.SessionPersistenceService;
import io.wisoft.prepair.prepair_api.interview.session.service.SessionService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.stream.Collectors;

@Slf4j
@Service
Expand All @@ -33,10 +30,9 @@ public class AnalysisCompletionService {

private final AnswerRepository answerRepository;
private final FeedbackRepository feedbackRepository;
private final QuestionRepository questionRepository;
private final FeedbackGenerator feedbackGenerator;
private final AnswerPersistenceService answerPersistenceService;
private final SessionPersistenceService sessionPersistenceService;
private final SessionService sessionService;
private final SessionCompletionNotifier completionNotifier;

public void processAnalysisCompletion(UUID answerId) {
Expand Down Expand Up @@ -91,7 +87,7 @@ public void failSession(UUID answerId, String message) {
return;
}

sessionPersistenceService.saveFailedSession(session.getId());
sessionService.saveFailedSession(session.getId());
completionNotifier.notifyFailure(session.getId(), message);
}

Expand Down Expand Up @@ -127,7 +123,7 @@ private void completeSession(
FinalFeedbackData data,
FinalFeedbackResult finalResult
) {
sessionPersistenceService.saveCompletedSession(sessionId, data.finalScore(), finalResult.finalFeedback());
sessionService.saveCompletedSession(sessionId, data.finalScore(), finalResult.finalFeedback());

FinalFeedbackResponse response = new FinalFeedbackResponse(
sessionId,
Expand All @@ -142,60 +138,29 @@ private void completeSession(
}

private FinalFeedbackData buildFinalData(UUID sessionId) {
List<InterviewQuestion> questions = questionRepository.findByInterviewSessionId(sessionId);
Map<UUID, InterviewAnswer> answerMap = getAnswerMap(sessionId);
Map<UUID, List<InterviewFeedback>> feedbackMap = getFeedbackMap(sessionId);
List<SessionDetailResponse.QuestionFeedback> aggregated = sessionService.buildQuestionFeedbacks(sessionId);

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

for (InterviewQuestion question : questions) {
InterviewAnswer answer = answerMap.get(question.getId());
if (answer == null) continue;

List<InterviewFeedback> answerFeedbacks = feedbackMap.getOrDefault(answer.getId(), List.of());
InterviewFeedback combined = findOptionalFeedback(answerFeedbacks, FeedbackType.COMBINED);

if (combined == null) continue;
for (SessionDetailResponse.QuestionFeedback qf : aggregated) {
if (qf.combinedScore() == null) continue;

questionFeedbacks.add(new FinalFeedbackResponse.QuestionFeedback(
question.getId(),
question.getQuestion(),
combined.getScore(),
combined.getFeedback(),
getFeedbackText(answerFeedbacks, FeedbackType.STT),
getFeedbackText(answerFeedbacks, FeedbackType.VIDEO)
qf.questionId(),
qf.question(),
qf.combinedScore(),
qf.combinedFeedback(),
qf.sttFeedback(),
qf.videoFeedback()
));

totalScore += combined.getScore();
totalScore += qf.combinedScore();
}

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

private Map<UUID, InterviewAnswer> getAnswerMap(UUID sessionId) {
return answerRepository.findBySessionId(sessionId).stream()
.collect(Collectors.toMap(a -> a.getInterviewQuestion().getId(), a -> a));
}

private Map<UUID, List<InterviewFeedback>> getFeedbackMap(UUID sessionId) {
return feedbackRepository.findAllBySessionId(sessionId).stream()
.collect(Collectors.groupingBy(f -> f.getInterviewAnswer().getId()));
}

private InterviewFeedback findOptionalFeedback(List<InterviewFeedback> feedbacks, FeedbackType type) {
return feedbacks.stream()
.filter(f -> f.getFeedbackType() == type)
.findFirst()
.orElse(null);
}

private String getFeedbackText(List<InterviewFeedback> feedbacks, FeedbackType type) {
InterviewFeedback feedback = findOptionalFeedback(feedbacks, type);
return feedback == null ? null : feedback.getFeedback();
}

private int calculateAverageScore(int totalScore, int count) {
if (count == 0) {
return 0;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package io.wisoft.prepair.prepair_api.interview.session.controller;

import io.wisoft.prepair.prepair_api.common.response.ApiResponse;
import io.wisoft.prepair.prepair_api.interview.session.dto.response.SessionDetailResponse;
import io.wisoft.prepair.prepair_api.interview.session.dto.response.SessionResponse;
import io.wisoft.prepair.prepair_api.interview.session.service.SessionService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.UUID;

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/interviews/sessions")
public class SessionController {

private final SessionService sessionService;

@GetMapping
public ApiResponse<List<SessionResponse>> getSessions(
@RequestHeader("X-User-Id") UUID memberId
) {
List<SessionResponse> data = sessionService.getSessionsByMember(memberId);
return ApiResponse.ok(data, "세션 목록을 조회했습니다.");
}

@GetMapping("/{sessionId}")
public ApiResponse<SessionDetailResponse> getSession(
@PathVariable UUID sessionId,
@RequestHeader("X-User-Id") UUID memberId
) {
SessionDetailResponse data = sessionService.getSessionDetail(sessionId, memberId);
return ApiResponse.ok(data, "세션 결과를 조회했습니다.");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package io.wisoft.prepair.prepair_api.interview.session.dto.response;

import io.wisoft.prepair.prepair_api.interview.session.entity.SessionStatus;

import java.util.List;
import java.util.UUID;

public record SessionDetailResponse(
UUID sessionId,
SessionStatus status,
Integer finalScore,
String finalFeedback,
List<QuestionFeedback> questions
) {
public record QuestionFeedback(
UUID questionId,
String question,
String mediaUrl,
Integer combinedScore,
String combinedFeedback,
String sttFeedback,
String videoFeedback
) {
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package io.wisoft.prepair.prepair_api.interview.session.dto.response;

import io.wisoft.prepair.prepair_api.interview.session.entity.InterviewSession;
import io.wisoft.prepair.prepair_api.interview.session.entity.SessionStatus;

import java.time.LocalDateTime;
import java.util.UUID;

public record SessionResponse(
UUID sessionId,
SessionStatus status,
Integer finalScore,
int totalQuestionCount,
LocalDateTime createdAt
) {
public static SessionResponse from(InterviewSession session) {
return new SessionResponse(
session.getId(),
session.getStatus(),
session.getFinalScore(),
session.getTotalQuestionCount(),
session.getCreatedAt()
);
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package io.wisoft.prepair.prepair_api.interview.session.repository;

import io.wisoft.prepair.prepair_api.interview.session.entity.InterviewSession;
import java.util.List;
import java.util.UUID;
import org.springframework.data.jpa.repository.JpaRepository;

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

This file was deleted.

Loading
Loading