77 lines
3.5 KiB
Java
77 lines
3.5 KiB
Java
package com.example.mapper;
|
|
|
|
import com.example.dto.dialogflow.DetectIntentResponseDTO;
|
|
import com.example.dto.dialogflow.QueryResultDTO;
|
|
import com.google.cloud.dialogflow.cx.v3.QueryResult;
|
|
import com.google.cloud.dialogflow.cx.v3.ResponseMessage;
|
|
import com.google.cloud.dialogflow.cx.v3.DetectIntentResponse;
|
|
import com.example.util.ProtobufUtil;
|
|
|
|
import java.util.Collections;
|
|
import java.util.LinkedHashMap;
|
|
import java.util.Map;
|
|
import java.util.stream.Collectors;
|
|
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.springframework.stereotype.Component;
|
|
|
|
@Component
|
|
public class DialogflowResponseMapper {
|
|
|
|
private static final Logger logger = LoggerFactory.getLogger(DialogflowResponseMapper.class);
|
|
|
|
public DetectIntentResponseDTO mapFromDialogflowResponse(DetectIntentResponse response, String sessionId) {
|
|
|
|
logger.info("Starting mapping of Dialogflow DetectIntentResponse for session: {}", sessionId);
|
|
|
|
String responseId = response.getResponseId();
|
|
QueryResult dfQueryResult = response.getQueryResult();
|
|
logger.debug("Extracted QueryResult object for session: {}", sessionId);
|
|
|
|
StringBuilder responseTextBuilder = new StringBuilder();
|
|
if (dfQueryResult.getResponseMessagesList().isEmpty()) {
|
|
logger.debug("No response messages found in QueryResult for session: {}", sessionId);
|
|
}
|
|
|
|
for (ResponseMessage message : dfQueryResult.getResponseMessagesList()) {
|
|
if (message.hasText()) {
|
|
logger.debug("Processing text response message for session: {}", sessionId);
|
|
for (String text : message.getText().getTextList()) {
|
|
if (responseTextBuilder.length() > 0) {
|
|
responseTextBuilder.append(" ");
|
|
}
|
|
responseTextBuilder.append(text);
|
|
logger.debug("Appended text segment: '{}' to fulfillment text for session: {}", text, sessionId);
|
|
}
|
|
} else {
|
|
logger.debug("Skipping non-text response message type: {} for session: {}", message.getMessageCase(), sessionId);
|
|
}
|
|
}
|
|
|
|
String responseText = responseTextBuilder.toString().trim();
|
|
|
|
Map<String, Object> parameters = Collections.emptyMap();
|
|
if (dfQueryResult.hasParameters()) {
|
|
parameters = dfQueryResult.getParameters().getFieldsMap().entrySet().stream()
|
|
.collect(Collectors.toMap(
|
|
Map.Entry::getKey,
|
|
entry -> ProtobufUtil.convertProtobufValueToJavaObject(entry.getValue()),
|
|
(oldValue, newValue) -> oldValue, // In case of duplicate keys, keep the old value
|
|
LinkedHashMap::new // Preserve insertion order
|
|
));
|
|
logger.debug("Extracted parameters: {} for session: {}", parameters, sessionId);
|
|
} else {
|
|
logger.debug("No parameters found in QueryResult for session: {}. Using empty map.", sessionId);
|
|
}
|
|
|
|
QueryResultDTO ourQueryResult = new QueryResultDTO(responseText, parameters);
|
|
logger.debug("Internal QueryResult DTO created for session: {}. Details: {}", sessionId, ourQueryResult);
|
|
|
|
DetectIntentResponseDTO finalResponse = new DetectIntentResponseDTO(responseId, ourQueryResult);
|
|
logger.info("Finished mapping DialogflowDetectIntentResponse for session: {}. Full response ID: {}", sessionId, responseId);
|
|
return finalResponse;
|
|
}
|
|
|
|
}
|