Skip to content

Commit ae4f50c

Browse files
committed
Merge branch 'main' of https://github.com/skill-boost/back
2 parents 5e89c06 + fd42caf commit ae4f50c

16 files changed

+882
-0
lines changed
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package com.example.skillboost.interview.controller;
2+
3+
import com.example.skillboost.interview.dto.InterviewFeedbackRequest;
4+
import com.example.skillboost.interview.dto.InterviewFeedbackResponse;
5+
import com.example.skillboost.interview.dto.InterviewStartRequest;
6+
import com.example.skillboost.interview.dto.InterviewStartResponse;
7+
import com.example.skillboost.interview.service.InterviewFeedbackService;
8+
import com.example.skillboost.interview.service.InterviewService;
9+
import com.example.skillboost.interview.service.SpeechToTextService;
10+
import lombok.RequiredArgsConstructor;
11+
import org.springframework.context.annotation.Profile;
12+
import org.springframework.http.ResponseEntity;
13+
import org.springframework.web.bind.annotation.*;
14+
import org.springframework.web.multipart.MultipartFile;
15+
16+
import java.util.Map;
17+
18+
@Profile({"local", "prod"})
19+
@RestController
20+
@RequestMapping("/api/interview")
21+
@RequiredArgsConstructor
22+
public class InterviewController {
23+
24+
private final InterviewService interviewService;
25+
private final InterviewFeedbackService feedbackService;
26+
private final SpeechToTextService speechToTextService;
27+
28+
// 1) 면접 시작 + 질문 생성
29+
@PostMapping("/start")
30+
public ResponseEntity<InterviewStartResponse> start(@RequestBody InterviewStartRequest request) {
31+
InterviewStartResponse response = interviewService.startInterview(request);
32+
return ResponseEntity.ok(response);
33+
}
34+
35+
// 2) (텍스트 기반) 전체 답변 평가
36+
@PostMapping("/feedback")
37+
public ResponseEntity<InterviewFeedbackResponse> feedback(
38+
@RequestBody InterviewFeedbackRequest request
39+
) {
40+
InterviewFeedbackResponse response = feedbackService.createFeedback(request);
41+
return ResponseEntity.ok(response);
42+
}
43+
44+
// 3) 🔊 음성 → 텍스트(STT)만 담당
45+
@PostMapping("/stt")
46+
public ResponseEntity<Map<String, String>> stt(
47+
@RequestPart("audio") MultipartFile audioFile
48+
) {
49+
String text = speechToTextService.transcribe(audioFile);
50+
return ResponseEntity.ok(Map.of("text", text));
51+
}
52+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.example.skillboost.interview.dto;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Getter;
6+
import lombok.NoArgsConstructor;
7+
8+
@Getter
9+
@NoArgsConstructor
10+
@AllArgsConstructor
11+
@Builder
12+
public class InterviewAnswerDto {
13+
14+
// 어떤 질문에 대한 답변인지 구분용
15+
private Long questionId;
16+
17+
// 질문 타입 (기술 / 인성)
18+
private QuestionType type;
19+
20+
// 실제 질문 텍스트
21+
private String question;
22+
23+
// STT로 변환된 지원자의 답변 텍스트
24+
private String answerText;
25+
26+
// 답변에 사용된 시간(초) - 지금은 0으로 둬도 되고, 나중에 프론트에서 계산해서 넣어도 됨
27+
private int durationSec;
28+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.example.skillboost.interview.dto;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Getter;
6+
import lombok.NoArgsConstructor;
7+
8+
import java.util.List;
9+
10+
@Getter
11+
@NoArgsConstructor
12+
@AllArgsConstructor
13+
@Builder
14+
public class InterviewFeedbackRequest {
15+
16+
// 선택적이지만 있으면 리포팅/로깅에 도움 됨
17+
private String sessionId;
18+
19+
// AI 평가용 전체 질문/답변 리스트
20+
private List<InterviewAnswerDto> answers;
21+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.example.skillboost.interview.dto;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Getter;
5+
import lombok.NoArgsConstructor;
6+
7+
import java.util.List;
8+
9+
@Getter
10+
@NoArgsConstructor // ← 필요시를 대비한 기본 생성자
11+
@AllArgsConstructor
12+
public class InterviewFeedbackResponse {
13+
14+
// 전체 점수 (0 ~ 100)
15+
private int overallScore;
16+
17+
// 전체 답변에 대한 요약 한 문단
18+
private String summary;
19+
20+
// 각 질문별 점수 + 피드백 리스트
21+
private List<QuestionFeedbackDto> details;
22+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.example.skillboost.interview.dto;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Getter;
6+
import lombok.NoArgsConstructor;
7+
8+
@Getter
9+
@NoArgsConstructor
10+
@AllArgsConstructor
11+
@Builder
12+
public class InterviewQuestionDto {
13+
14+
// 세션 내 질문 번호 (1 ~ 5)
15+
private Long id;
16+
17+
// TECH / BEHAV
18+
private QuestionType type;
19+
20+
// 질문 텍스트
21+
private String text;
22+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.example.skillboost.interview.dto;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Getter;
5+
import lombok.NoArgsConstructor;
6+
7+
@Getter
8+
@NoArgsConstructor // JSON 역직렬화용 필수
9+
@AllArgsConstructor // 생성자 자동 생성
10+
public class InterviewStartRequest {
11+
12+
// GitHub 레포 주소
13+
private String repoUrl;
14+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.example.skillboost.interview.dto;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Getter;
6+
import lombok.NoArgsConstructor;
7+
8+
import java.util.List;
9+
10+
@Getter
11+
@NoArgsConstructor // JSON 역직렬화 대비용
12+
@AllArgsConstructor
13+
@Builder // startInterview()에서 builder로 만들기 좋아짐
14+
public class InterviewStartResponse {
15+
16+
// 세션 고유 ID (STT / 답변 제출 시 반드시 필요)
17+
private String sessionId;
18+
19+
// 질문당 제한 시간(초) - 기본 60초
20+
private int durationSec;
21+
22+
// AI 생성 기술 질문 + 인성 질문 총 5개
23+
private List<InterviewQuestionDto> questions;
24+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// src/main/java/com/example/skillboost/interview/dto/QuestionFeedbackDto.java
2+
package com.example.skillboost.interview.dto;
3+
4+
import lombok.AllArgsConstructor;
5+
import lombok.Getter;
6+
import lombok.NoArgsConstructor;
7+
8+
@Getter
9+
@NoArgsConstructor
10+
@AllArgsConstructor
11+
public class QuestionFeedbackDto {
12+
13+
private Long questionId;
14+
private String questionText; // ✅ 질문 내용 추가
15+
private int score;
16+
private String feedback;
17+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.example.skillboost.interview.dto;
2+
3+
public enum QuestionType {
4+
TECH, // 기술 질문
5+
BEHAV // 인성 질문
6+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.example.skillboost.interview.model;
2+
3+
import com.example.skillboost.interview.dto.InterviewQuestionDto;
4+
import lombok.AllArgsConstructor;
5+
import lombok.Builder;
6+
import lombok.Getter;
7+
import lombok.NoArgsConstructor;
8+
9+
import java.io.Serializable;
10+
import java.time.LocalDateTime;
11+
import java.util.List;
12+
13+
@Getter
14+
@NoArgsConstructor // 세션 저장 시 역직렬화 대비
15+
@AllArgsConstructor
16+
@Builder
17+
public class InterviewSession implements Serializable {
18+
19+
private String sessionId; // 세션 고유 ID
20+
private String repoUrl; // 레포 주소
21+
private LocalDateTime createdAt; // 세션 생성 시간
22+
private List<InterviewQuestionDto> questions; // 질문 리스트
23+
24+
public static InterviewSession create(String sessionId, String repoUrl, List<InterviewQuestionDto> questions) {
25+
return InterviewSession.builder()
26+
.sessionId(sessionId)
27+
.repoUrl(repoUrl)
28+
.questions(questions)
29+
.createdAt(LocalDateTime.now())
30+
.build();
31+
}
32+
}

0 commit comments

Comments
 (0)