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
@@ -1,13 +1,17 @@
package com.phu.backend.controller.clova;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.phu.backend.dto.clova.reqeust.ClovaMessage;
import com.phu.backend.dto.clova.response.ClovaSpeechResponseList;
import com.phu.backend.dto.summarization.response.SummarizationResponse;
import com.phu.backend.service.clova.ClovaService;
import io.swagger.v3.oas.annotations.Operation;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import java.util.UUID;

@RestController
@RequiredArgsConstructor
Expand All @@ -21,9 +25,15 @@ public ResponseEntity<ClovaSpeechResponseList> uploadVoiceFile(@PathVariable(nam
return ResponseEntity.ok().body(clovaService.clovaSpeech(fileId, memberId));
}

@PostMapping("pt/clova/test")
@Operation(summary = "챗봇 테스팅", description = "테스트")
public ResponseEntity<?> test(@RequestBody ClovaMessage request) throws JsonProcessingException {
return ResponseEntity.ok(clovaService.test(request));
@GetMapping("pt/clova/summation/{voice-text-id}")
@Operation(summary = "장문요약", description = "분석한 텍스트를 요약해준다.")
public ResponseEntity<SummarizationResponse> summationTextFile(@PathVariable(name = "voice-text-id")UUID textId) throws JsonProcessingException {
return ResponseEntity.ok(clovaService.summationTextFile(textId));
}

@GetMapping("pt/clova/summation/get/{summarization-id}")
@Operation(summary = "요약된 텍스트 정보 조회", description = "요약된 텍스트 정보를 조회한다.")
public ResponseEntity<SummarizationResponse> getSummarization(@PathVariable(name = "summarization-id") Long summarizationId) {
return ResponseEntity.ok(clovaService.getSummarization(summarizationId));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.phu.backend.domain.summarization;

import com.phu.backend.domain.member.Member;
import com.phu.backend.global.BaseTimeEntity;
import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.UUID;

@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
public class Summarization extends BaseTimeEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "summarization_id")
private Long id;
@Lob
@Column(name = "summarization_texts", columnDefinition = "LONGTEXT")
private String summarizationTexts;
private UUID voiceTextId;
@ManyToOne(fetch = FetchType.LAZY)
private Member trainer;
@ManyToOne(fetch = FetchType.LAZY)
private Member member;

@Builder
public Summarization(String summarizationTexts, UUID voiceTextId, Member trainer, Member member) {
this.summarizationTexts = summarizationTexts;
this.voiceTextId = voiceTextId;
this.trainer = trainer;
this.member = member;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.phu.backend.dto.summarization.response;

import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

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

@NoArgsConstructor
@Getter
public class SummarizationResponse {
private Long summarizationId;
private Long trainerId;
private Long memberId;
private UUID voiceListId;
private String texts;
private LocalDateTime createAt;

@Builder
public SummarizationResponse(Long summarizationId, Long trainerId, Long memberId, UUID voiceListId, String texts, LocalDateTime createAt) {
this.summarizationId = summarizationId;
this.trainerId = trainerId;
this.memberId = memberId;
this.voiceListId = voiceListId;
this.texts = texts;
this.createAt = createAt;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.phu.backend.exception.summarization;

import com.phu.backend.exception.GlobalException;
import org.springframework.http.HttpStatus;

public class NotFoundSummarizationException extends GlobalException {
public static final String MESSAGE = "해당 회원에 대한 요약본을 찾을 수 없습니다.";
@Override
public String getStatusCode() {
return "SU001";
}
public NotFoundSummarizationException() {
super(MESSAGE, HttpStatus.NOT_ACCEPTABLE);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.phu.backend.repository.summarization;

import com.phu.backend.domain.summarization.Summarization;
import org.springframework.data.jpa.repository.JpaRepository;

public interface SummarizationRepository extends JpaRepository<Summarization, Long> {
}
84 changes: 61 additions & 23 deletions src/main/java/com/phu/backend/service/clova/ClovaService.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,21 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import com.phu.backend.domain.clovavoicetext.ClovaVoiceText;
import com.phu.backend.domain.member.Member;
import com.phu.backend.domain.summarization.Summarization;
import com.phu.backend.domain.voicefile.VoiceFile;
import com.phu.backend.dto.clova.reqeust.ClovaMessage;
import com.phu.backend.dto.clova.reqeust.ClovaSpeechRequest;
import com.phu.backend.dto.clova.reqeust.ClovaXRequestList;
import com.phu.backend.dto.clova.response.ClovaSpeechResponse;
import com.phu.backend.dto.clova.response.ClovaSpeechResponseList;
import com.phu.backend.dto.clova.reqeust.ClovaXRequest;
import com.phu.backend.dto.summarization.response.SummarizationResponse;
import com.phu.backend.exception.dailychart.NotFoundChartMemberException;
import com.phu.backend.exception.member.NotFoundMemberException;
import com.phu.backend.exception.summarization.NotFoundSummarizationException;
import com.phu.backend.exception.voicefile.NotFoundFileException;
import com.phu.backend.exception.voicefile.NotFoundVoiceDataException;
import com.phu.backend.repository.clovavoicetext.ClovaVoiceTextRepository;
import com.phu.backend.repository.member.MemberListRepository;
import com.phu.backend.repository.member.MemberRepository;
import com.phu.backend.repository.summarization.SummarizationRepository;
import com.phu.backend.repository.voicefile.VoiceFileRepository;
import com.phu.backend.service.member.MemberService;
import lombok.RequiredArgsConstructor;
Expand All @@ -31,6 +33,7 @@
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.UUID;

Expand All @@ -43,6 +46,7 @@ public class ClovaService {
private final RestTemplate restTemplate;
private final MemberRepository memberRepository;
private final ObjectMapper objectMapper;
private final SummarizationRepository summarizationRepository;
private final MemberListRepository memberListRepository;
private final ClovaVoiceTextRepository clovaVoiceTextRepository;
private final MemberService memberService;
Expand Down Expand Up @@ -151,38 +155,72 @@ private List<ClovaSpeechResponse> parseClovaSpeechResponse(String voiceResponse,
return responses;
}

public Object test(ClovaMessage request) throws JsonProcessingException {
List<ClovaXRequest> requestList = new ArrayList<>();
public SummarizationResponse summationTextFile(UUID textId) throws JsonProcessingException {
ClovaVoiceText clovaVoiceText = clovaVoiceTextRepository.findById(textId)
.orElseThrow(NotFoundVoiceDataException::new);

ClovaXRequest clovaXRequest = ClovaXRequest.builder()
.role("system")
.content(request.getContent())
.build();
requestList.add(clovaXRequest);
Member trainer = memberService.getMember();

ClovaXRequestList clovaXRequestList = ClovaXRequestList.builder()
.messages(requestList)
.build();
Long memberId = clovaVoiceText.getMemberId();
Member member = memberRepository.findById(memberId).orElseThrow(NotFoundMemberException::new);

RestTemplate restTemplate = new RestTemplate();
String url = apiUrl;
HttpHeaders headers = buildHeaders();
String body = objectMapper.writeValueAsString(clovaXRequestList);
HttpEntity<String> entity = new HttpEntity<>(body, headers);
// 추출한 텍스트 요약본
List<ClovaSpeechResponse> voiceList = clovaVoiceText.getVoiceList();

String[] textArray = voiceList.stream()
.map(response -> response.getSpeaker() + ": " + response.getText())
.toArray(String[]::new);

ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
HashMap<String, String[]> bodyMap = new HashMap<>();
bodyMap.put("texts", textArray);
String texts = objectMapper.writeValueAsString(bodyMap);
HttpHeaders headers = buildHeaders();
HttpEntity<String> entity = new HttpEntity<>(texts, headers);

log.info("body:", entity);
ResponseEntity<String> response = restTemplate.exchange(apiUrl, HttpMethod.POST, entity, String.class);

String responseBody = response.getBody();

JsonNode rootNode = objectMapper.readTree(responseBody);
String content = rootNode.path("result").path("message").path("content").asText();
String textData = rootNode
.path("result")
.path("text")
.asText();

Summarization summarization = Summarization.builder()
.member(member)
.voiceTextId(clovaVoiceText.getId())
.trainer(trainer)
.summarizationTexts(textData)
.build();

summarizationRepository.save(summarization);

return content;
return SummarizationResponse.builder()
.texts(summarization.getSummarizationTexts())
.summarizationId(summarization.getId())
.trainerId(trainer.getId())
.createAt(summarization.getCreatedAt())
.memberId(memberId)
.voiceListId(clovaVoiceText.getId())
.build();
}

public SummarizationResponse getSummarization(Long summarizationId) {
Summarization summarization = summarizationRepository.findById(summarizationId)
.orElseThrow(NotFoundSummarizationException::new);

return SummarizationResponse.builder()
.texts(summarization.getSummarizationTexts())
.summarizationId(summarization.getId())
.trainerId(summarization.getTrainer().getId())
.createAt(summarization.getCreatedAt())
.memberId(summarization.getMember().getId())
.voiceListId(summarization.getVoiceTextId())
.build();
}

public HttpHeaders buildHeaders() {
private HttpHeaders buildHeaders() {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("X-NCP-CLOVASTUDIO-API-KEY", apiKey);
Expand Down
Loading