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 @@ -9,6 +9,7 @@ public record AnalysisResponse(
Long mockApplyId,
Long analysisId,
MockApplyStatus status,
int sequence,
int score,
int jobFit,
int impact,
Expand All @@ -19,12 +20,14 @@ public record AnalysisResponse(
public static AnalysisResponse of(
Analysis analysis,
MockApplyStatus status,
int sequence,
List<AnalysisQuestionResponse> questions
) {
return new AnalysisResponse(
analysis.getMockApply().getId(),
analysis.getId(),
status,
sequence,
analysis.getScore(),
analysis.getJobFit(),
analysis.getImpact(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
public record QuestionAnswerResponse(
Long mockApplyId,
MockApplyStatus status,
int sequence,
List<QuestionResponse> questions
) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,12 @@ private AnalysisResponse toResponse(
))
.toList();

return AnalysisResponse.of(analysis, mockApply.getStatus(), questionResponses);
return AnalysisResponse.of(
analysis,
mockApply.getStatus(),
mockApplyRepository.calculateSequence(mockApply),
questionResponses
);
}

private MockApply getOwnedMockApply(User user, Long mockApplyId) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,7 @@ public QuestionAnswerResponse saveAnswers(
return new QuestionAnswerResponse(
mockApply.getId(),
mockApply.getStatus(),
mockApplyRepository.calculateSequence(mockApply),
questions.stream().map(QuestionResponse::from).toList()
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,14 @@ public interface MockApplyRepository extends JpaRepository<MockApply, Long> {
List<MockApply> findAllByJobPostingId(Long jobPostingId);
long countByUserIdAndJobPostingId(Long userId, Long jobPostingId);

default int calculateSequence(MockApply mockApply) {
return Math.toIntExact(countSequenceByUserIdAndJobPostingId(
mockApply.getUser().getId(),
mockApply.getJobPosting().getId(),
mockApply.getId()
));
}

@Query("""
select ma
from MockApply ma
Expand All @@ -29,15 +37,11 @@ select count(ma)
from MockApply ma
where ma.user.id = :userId
and ma.jobPosting.id = :jobPostingId
and (
ma.createdAt < :createdAt
or (ma.createdAt = :createdAt and ma.id <= :mockApplyId)
)
and ma.id <= :mockApplyId
""")
long countSequenceByUserIdAndJobPostingId(
@Param("userId") Long userId,
@Param("jobPostingId") Long jobPostingId,
@Param("createdAt") java.time.LocalDateTime createdAt,
@Param("mockApplyId") Long mockApplyId
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -108,14 +108,7 @@ public MockApplySequenceResponse getMockApplySequence(User user, Long mockApplyI
int totalCount = Math.toIntExact(
mockApplyRepository.countByUserIdAndJobPostingId(validatedUser.getId(), jobPostingId)
);
int sequence = Math.toIntExact(
mockApplyRepository.countSequenceByUserIdAndJobPostingId(
validatedUser.getId(),
jobPostingId,
mockApply.getCreatedAt(),
mockApply.getId()
)
);
int sequence = mockApplyRepository.calculateSequence(mockApply);

if (sequence < 1 || sequence > totalCount) {
throw new GeneralException(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,7 @@ void analyzeSavesAnalysis() {
AnalysisResponse response = analysisService.analyze(user, mockApply.getId());

assertThat(response.status()).isEqualTo(MockApplyStatus.COMPLETED);
assertThat(response.sequence()).isEqualTo(1);
assertThat(response.score()).isEqualTo(100);
assertThat(response.jobFit()).isEqualTo(82);
assertThat(response.impact()).isEqualTo(71);
Expand All @@ -131,6 +132,35 @@ void analyzeSavesAnalysis() {
)).hasSize(1);
}

@Test
@DisplayName("분석 응답은 같은 공고 기준 현재 지원 순번을 반환한다")
void analyzeReturnsSequence() {
User user = saveUser("analysis-sequence@example.com");
JobPosting jobPosting = saveJobPosting(user);
mockApplyRepository.save(MockApply.create(user, jobPosting, ApplyType.ACTUAL));
MockApply secondMockApply = mockApplyRepository.save(MockApply.create(user, jobPosting, ApplyType.ACTUAL));
Question question = saveQuestion(secondMockApply, "재지원 분석 문항입니다.", "Spring Boot API를 개발했습니다.");
when(analysisAiClient.analyze(any(), any())).thenReturn(new AnalysisLlmResponse(
80,
81,
82,
83,
"재지원 분석입니다.",
List.of(new AnalysisLlmResponse.QuestionAnalysisItem(
question.getId(),
"Spring Boot API를 개발했습니다.",
"mentioned",
"성과 지표가 부족합니다.",
"Spring Boot API를 개발해 응답 시간을 개선했습니다."
))
));

AnalysisResponse response = analysisService.analyze(user, secondMockApply.getId());

assertThat(response.mockApplyId()).isEqualTo(secondMockApply.getId());
assertThat(response.sequence()).isEqualTo(2);
}

@Test
@DisplayName("LLM 분석 실패 시 크레딧 차감과 분석 저장을 롤백한다")
void analyzeRollsBackCreditWhenLlmFails() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -299,12 +299,33 @@ void saveAnswers() {
)));

assertThat(response.questions()).hasSize(1);
assertThat(response.sequence()).isEqualTo(1);
assertThat(response.questions().get(0).content()).isEqualTo("지원 동기를 작성해주세요.");
assertThat(response.questions().get(0).answer()).isEqualTo("저는 백엔드 개발 경험을 바탕으로 지원했습니다.");
assertThat(questionRepository.findById(questionId).orElseThrow().getAnswer())
.isEqualTo("저는 백엔드 개발 경험을 바탕으로 지원했습니다.");
}

@Test
@DisplayName("답변 저장 응답은 같은 공고 기준 현재 지원 순번을 반환한다")
void saveAnswersReturnsSequence() {
User user = saveUser("answer-sequence@example.com");
JobPosting jobPosting = saveJobPosting();
mockApplyRepository.save(MockApply.create(user, jobPosting, ApplyType.ACTUAL));
MockApply secondMockApply = mockApplyRepository.save(MockApply.create(user, jobPosting, ApplyType.ACTUAL));
QuestionSelectionResponse selected = questionService.saveSelectedQuestions(user, secondMockApply.getId(), new QuestionSelectionSaveRequest(List.of(
new QuestionSelectionSaveRequest.QuestionItem("재지원 답변 문항입니다.", 700, false)
)));
Long questionId = selected.questions().get(0).questionId();

QuestionAnswerResponse response = questionService.saveAnswers(user, secondMockApply.getId(), new QuestionAnswerSaveRequest(List.of(
new QuestionAnswerSaveRequest.AnswerItem(questionId, "두 번째 지원 답변입니다.")
)));

assertThat(response.mockApplyId()).isEqualTo(secondMockApply.getId());
assertThat(response.sequence()).isEqualTo(2);
}

@Test
@DisplayName("해당 지원서에 속하지 않은 문항은 답변 저장에 사용할 수 없다")
void saveAnswersThrowsWhenQuestionDoesNotBelongToMockApply() {
Expand Down
Loading