Skip to content

Commit

Permalink
Merge pull request #28 from potenday-project/develop
Browse files Browse the repository at this point in the history
API 연동 미완
  • Loading branch information
HwangHoYoon authored Dec 15, 2023
2 parents 7981057 + 8d6dda9 commit b11f0cd
Show file tree
Hide file tree
Showing 11 changed files with 238 additions and 33 deletions.
3 changes: 3 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,9 @@ dependencies {
implementation group: 'commons-io', name: 'commons-io', version: '2.15.1'
implementation group: 'commons-fileupload', name: 'commons-fileupload', version: '1.5'

//PDF
implementation group: 'org.apache.pdfbox', name: 'pdfbox', version: '3.0.0'

}


Expand Down
45 changes: 45 additions & 0 deletions src/main/generated/com/chwipoClova/common/entity/QApiLog.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package com.chwipoClova.common.entity;

import static com.querydsl.core.types.PathMetadataFactory.*;

import com.querydsl.core.types.dsl.*;

import com.querydsl.core.types.PathMetadata;
import javax.annotation.processing.Generated;
import com.querydsl.core.types.Path;


/**
* QApiLog is a Querydsl query type for ApiLog
*/
@Generated("com.querydsl.codegen.DefaultEntitySerializer")
public class QApiLog extends EntityPathBase<ApiLog> {

private static final long serialVersionUID = -525634126L;

public static final QApiLog apiLog = new QApiLog("apiLog");

public final NumberPath<Long> apiLogId = createNumber("apiLogId", Long.class);

public final StringPath apiUrl = createString("apiUrl");

public final StringPath message = createString("message");

public final DateTimePath<java.util.Date> regDate = createDateTime("regDate", java.util.Date.class);

public final NumberPath<Long> userId = createNumber("userId", Long.class);

public QApiLog(String variable) {
super(ApiLog.class, forVariable(variable));
}

public QApiLog(Path<? extends ApiLog> path) {
super(path.getType(), path.getMetadata());
}

public QApiLog(PathMetadata metadata) {
super(ApiLog.class, metadata);
}

}

Original file line number Diff line number Diff line change
Expand Up @@ -57,15 +57,11 @@ public SecurityFilterChain securityFilterChain(final @NotNull HttpSecurity http
.authorizeHttpRequests(authorize ->
authorize
//.requestMatchers("/**").permitAll().anyRequest().authenticated()
.requestMatchers("/interview/**", "/resume/**", "/"
.requestMatchers("/"
,"/user/getKakaoUrl","/user/kakaoLogin","/user/kakaoCallback","/user/logout"
).permitAll().anyRequest().authenticated()


//.requestMatchers(HttpMethod.OPTIONS, "/**").permitAll()



)
.addFilterBefore(new JwtAuthFilter(jwtUtil), UsernamePasswordAuthenticationFilter.class)
.exceptionHandling((exception)-> exception.authenticationEntryPoint(new JwtAuthenticationEntryPoint()))
Expand Down
51 changes: 51 additions & 0 deletions src/main/java/com/chwipoClova/common/entity/ApiLog.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package com.chwipoClova.common.entity;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.persistence.*;
import lombok.*;
import org.hibernate.annotations.DynamicInsert;

import java.util.Date;

@Entity(name = "ApiLog")
@Table(name = "ApiLog")
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties()
@DynamicInsert
@Builder
@Getter
@ToString
@AllArgsConstructor
@NoArgsConstructor
@Schema(description = "API 로그 VO")
public class ApiLog {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "apiLogId")
@Schema(description = "API LOG ID")
private Long apiLogId;

@Column(name = "userId")
@Schema(description = "유저 ID")
private Long userId;

@Column(name = "apiUrl")
@Schema(description = "api 호출 URL")
private String apiUrl;

@Column(name = "message")
@Schema(description = "결과 메세지")
private String message;

@Column(name = "regDate")
@Schema(description = "등록일")
private Date regDate;

@PrePersist
public void prePersist() {
this.regDate = new Date(); // 현재 날짜와 시간으로 등록일 설정
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ public enum ExceptionCode {

FILE_SIZE("852", "파일 업로드 최대 크기는 50M 입니다."),

FILE_PDF_PAGE_OVER("853", "PDF 최대 장수를 넘었습니다."),

RESUME_NULL("860", "이력서 정보가 올바르지 않습니다."),

RESUME_LIST_OVER("861", "이력서 최대 개수를 초과하였습니다."),
Expand All @@ -37,6 +39,8 @@ public enum ExceptionCode {

RECRUIT_CONTENT_NULL("870", "채용공고 정보가 올바르지 않습니다."),

RECRUIT_TITLE_NULL("871", "채용공고 기업명이 없습니다."),

INTERVIEW_NULL("880", "면접 정보가 올바르지 않습니다."),

INTERVIEW_LIST_OVER("881", "면접 최대 개수를 초과하였습니다."),
Expand All @@ -61,7 +65,9 @@ public enum ExceptionCode {

API_RESUME_SUMMARY_NULL("984", "이력서 요약 결과가 비어있습니다."),

API_TOKEN_COUNT_FAIL("985", "토큰 계산기 호출 실패")
API_TOKEN_COUNT_FAIL("985", "토큰 계산기 호출 실패"),

API_QA_NULL("986", "질문 API 결과가 비어있습니다.")

;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.chwipoClova.common.repository;

import com.chwipoClova.common.dto.Token;
import com.chwipoClova.common.entity.ApiLog;
import org.springframework.data.jpa.repository.JpaRepository;

public interface ApiLogRepository extends JpaRepository<ApiLog, Long> {
}
33 changes: 31 additions & 2 deletions src/main/java/com/chwipoClova/common/utils/ApiUtils.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package com.chwipoClova.common.utils;

import com.chwipoClova.common.dto.UserDetailsImpl;
import com.chwipoClova.common.entity.ApiLog;
import com.chwipoClova.common.exception.CommonException;
import com.chwipoClova.common.exception.ExceptionCode;
import com.chwipoClova.common.repository.ApiLogRepository;
import com.chwipoClova.resume.response.ApiRes;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
Expand All @@ -13,7 +16,10 @@
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.http.*;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
Expand All @@ -34,6 +40,8 @@ public class ApiUtils {

private final RestTemplate restTemplate;

private final ApiLogRepository apiLogRepository;

@Value("${api.url.base}")
private String apiBaseUrl;

Expand All @@ -49,7 +57,6 @@ public class ApiUtils {
@Value("${api.url.recruit}")
private String recruit;


@Value("${api.url.question}")
private String question;

Expand All @@ -62,24 +69,47 @@ public class ApiUtils {
@Value("${api.url.best}")
private String best;

@Transactional
public String callApi(URI apiUrl, HttpEntity<?> entity) {
String resultData = null;
String resultMessage = null;
Long userId = null;
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication.getPrincipal() instanceof UserDetailsImpl) {
userId = ((UserDetailsImpl) authentication.getPrincipal()).getUser().getUserId();
}
try {
ResponseEntity<String> responseAsString = restTemplate.exchange(apiUrl, HttpMethod.POST, entity, String.class);
if (responseAsString == null) {
resultMessage = "API 결과 NULL";
log.info("API 결과 NULL");
} else {
if (responseAsString.getStatusCode() == HttpStatus.OK) {
resultMessage = "API 성공";
log.info("API 성공");
resultData = responseAsString.getBody();
} else {
resultMessage = "API 통신 결과 실패 HttpStatus" + responseAsString.getStatusCode();
log.error("API 통신 결과 실패 HttpStatus : {} ", responseAsString.getStatusCode());
}
}
} catch (Exception e) {
resultMessage = "callApi 실패 error " + e.getMessage();
log.error("callApi 실패 error : {}", e.getMessage());
}

if (resultData == null) {
resultMessage = ExceptionCode.API_NULL.getMessage();
}

// API 로그 적재
ApiLog apiLog = ApiLog.builder()
.userId(userId)
.apiUrl(apiUrl.toString())
.message(resultMessage)
.build();
apiLogRepository.save(apiLog);

if (resultData == null) {
throw new CommonException(ExceptionCode.API_NULL.getMessage(), ExceptionCode.API_NULL.getCode());
}
Expand Down Expand Up @@ -176,7 +206,6 @@ public String question(String recruitSummary, String resumeSummary) {
body.add("recruit_summary", recruitSummary);
body.add("resume_summary", resumeSummary);


HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(body, httpHeaders);
URI apiUrl = UriComponentsBuilder
.fromHttpUrl(apiBaseUrl + question)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,6 @@ public InterviewInsertRes insertInterview(InterviewInsertReq interviewInsertReq,
.build();
Interview interviewRst = interviewRepository.save(interview);

// TODO 이력서 요약과 채용공고 요약을 이용해서 질문, AI 답변 생성
List<QaQuestionInsertRes> questionData = qaService.insertQa(interviewRst);

return InterviewInsertRes.builder()
Expand Down Expand Up @@ -216,12 +215,12 @@ public void downloadInterview(Long userId, Long interviewId, HttpServletResponse

stringBuilder.append("면접 관의 속마음");
stringBuilder.append("\n");
stringBuilder.append(feedback);
stringBuilder.append(feedback == null ? "" : feedback);

stringBuilder.append("\n");
stringBuilder.append("\n");

stringBuilder.append("티키타카의 피드백");
stringBuilder.append("티키타카 피드백");

stringBuilder.append("\n");
stringBuilder.append("\n");
Expand All @@ -233,6 +232,9 @@ public void downloadInterview(Long userId, Long interviewId, HttpServletResponse
stringBuilder.append(qaListForFeedbackRes.getQuestion());
stringBuilder.append("\n");

stringBuilder.append(qaListForFeedbackRes.getAnswer());
stringBuilder.append("\n");

stringBuilder.append(qaListForFeedbackRes.getBestAnswer());
stringBuilder.append("\n");
});
Expand Down
54 changes: 41 additions & 13 deletions src/main/java/com/chwipoClova/qa/service/QaService.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import com.chwipoClova.common.exception.ExceptionCode;
import com.chwipoClova.common.response.CommonResponse;
import com.chwipoClova.common.response.MessageCode;
import com.chwipoClova.common.utils.ApiUtils;
import com.chwipoClova.feedback.request.FeedbackInsertReq;
import com.chwipoClova.feedback.service.FeedbackService;
import com.chwipoClova.interview.entity.Interview;
Expand Down Expand Up @@ -50,6 +51,8 @@ public class QaService {

private final UserRepository userRepository;

private final ApiUtils apiUtils;

@Transactional
public List<QaQuestionInsertRes> insertQaQuestionList(List<QaQuestionInsertReq> qaQuestionInsertReqList) throws IOException {
List<Qa> qaList = new ArrayList<>();
Expand Down Expand Up @@ -120,6 +123,14 @@ public CommonResponse insertAnswer(QaAnswerInsertReq qaAnswerInsertReq) throws I
// 마지막 답변이 있을 경우 면접 완료 처리 및 피드백 생성
Boolean lastCk = lastCkAtomic.get();
if (lastCk) {
// 면접관의 속마음
//apiUtils.feel();

// 키워드


// 모범답안

// 피드백 요청 및 등록
feedbackService.insertFeedback(feedbackInsertListReq);

Expand Down Expand Up @@ -244,22 +255,39 @@ public void generateQa(QaGenerateReq qaGenerateReq) throws IOException {
}

public List<QaQuestionInsertRes> insertQa(Interview interviewRst) throws IOException {
String time = LocalDateTime.now().format(DateTimeFormatter.ISO_TIME);
String q1 = "질문1입니다." + time;
String recruitSummary = interviewRst.getRecruitSummary();
String resumeSummary = interviewRst.getResumeSummary();

String q2 = "질문2입니다." + time;
String apiQaRst = apiUtils.question(recruitSummary, resumeSummary);

// 질문 답변 저장
List<QaQuestionInsertReq> qaQuestionInsertReqList = new ArrayList<>();
QaQuestionInsertReq qaQuestionInsertReq1 = new QaQuestionInsertReq();
qaQuestionInsertReq1.setInterview(interviewRst);
qaQuestionInsertReq1.setQuestion(q1);
qaQuestionInsertReqList.add(qaQuestionInsertReq1);

QaQuestionInsertReq qaQuestionInsertReq2 = new QaQuestionInsertReq();
qaQuestionInsertReq2.setInterview(interviewRst);
qaQuestionInsertReq2.setQuestion(q2);
qaQuestionInsertReqList.add(qaQuestionInsertReq2);
getApiQaList(apiQaRst).stream().forEach(apiQa -> {
QaQuestionInsertReq qaQuestionInsertReq = new QaQuestionInsertReq();
qaQuestionInsertReq.setInterview(interviewRst);
qaQuestionInsertReq.setQuestion(apiQa);
qaQuestionInsertReqList.add(qaQuestionInsertReq);
});
return insertQaQuestionList(qaQuestionInsertReqList);
}

private List<String> getApiQaList(String apiQaRst) {
// 현재 사용하지 않는 --- 제거 및 줄바꿈 분리
String[] splitSummaryList = apiQaRst.split("\n");

List<String> apiQaList = new ArrayList<>();
for (String splitSummary : splitSummaryList) {
if (splitSummary.indexOf(".") != -1) {
String num = splitSummary.substring(0, splitSummary.indexOf("."));
if (org.apache.commons.lang3.StringUtils.isNumeric(num)) {
apiQaList.add(splitSummary.trim());
}
}
}

if (apiQaList.size() == 0) {
throw new CommonException(ExceptionCode.API_QA_NULL.getMessage(), ExceptionCode.API_QA_NULL.getCode());
}

return apiQaList;
}
}
Loading

0 comments on commit b11f0cd

Please sign in to comment.