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 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; } }