85 lines
3.9 KiB
Java
85 lines
3.9 KiB
Java
/*
|
|
* Copyright 2025 Google. This software is provided as-is, without warranty or representation for any use or purpose.
|
|
* Your use of it is subject to your agreement with Google.
|
|
*/
|
|
|
|
package com.example.mapper.conversation;
|
|
|
|
import com.example.dto.dialogflow.base.DetectIntentRequestDTO;
|
|
import com.example.dto.dialogflow.conversation.ExternalConvRequestDTO;
|
|
import com.example.dto.dialogflow.conversation.QueryInputDTO;
|
|
import com.example.dto.dialogflow.conversation.QueryParamsDTO;
|
|
import com.example.dto.dialogflow.conversation.TextInputDTO;
|
|
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.springframework.stereotype.Component;
|
|
import java.util.HashMap;
|
|
import java.util.Map;
|
|
import java.util.Objects;
|
|
|
|
/**
|
|
* Spring component responsible for mapping a simplified, external API request
|
|
* into a structured `DetectIntentRequestDTO` for Dialogflow. It processes
|
|
* user messages and relevant context, such as phone numbers and channel information,
|
|
* and populates the `QueryInputDTO` and `QueryParamsDTO` fields required for
|
|
* a Dialogflow API call.
|
|
*/
|
|
@Component
|
|
public class ExternalConvRequestMapper {
|
|
|
|
private static final Logger logger = LoggerFactory.getLogger(ExternalConvRequestMapper.class);
|
|
private static final String DEFAULT_LANGUAGE_CODE = "es";
|
|
|
|
public DetectIntentRequestDTO mapExternalRequestToDetectIntentRequest(ExternalConvRequestDTO externalRequest) {
|
|
Objects.requireNonNull(externalRequest, "ExternalRequestDTO cannot be null for mapping.");
|
|
|
|
if (externalRequest.message() == null || externalRequest.message().isBlank()) {
|
|
throw new IllegalArgumentException("External request 'mensaje' (message) is required.");
|
|
}
|
|
TextInputDTO textInput = new TextInputDTO(externalRequest.message());
|
|
QueryInputDTO queryInputDTO = new QueryInputDTO(textInput,null,DEFAULT_LANGUAGE_CODE);
|
|
|
|
// 2. Map ALL relevant external fields into QueryParamsDTO.parameters
|
|
Map<String, Object> parameters = new HashMap<>();
|
|
|
|
String primaryPhoneNumber = null;
|
|
if (externalRequest.user() != null && externalRequest.user().telefono() != null
|
|
&& !externalRequest.user().telefono().isBlank()) {
|
|
primaryPhoneNumber = externalRequest.user().telefono();
|
|
parameters.put("telefono", primaryPhoneNumber);
|
|
}
|
|
|
|
if (primaryPhoneNumber == null || primaryPhoneNumber.isBlank()) {
|
|
throw new IllegalArgumentException(
|
|
"Phone number is required in the 'usuario' field for conversation management.");
|
|
}
|
|
|
|
String resolvedUserId = null;
|
|
// Derive from phone number if not provided by 'userId' parameter
|
|
resolvedUserId = "user_by_phone_" + primaryPhoneNumber.replaceAll("[^0-9]", "");
|
|
parameters.put("usuario_id", resolvedUserId); // Ensure derived ID is also in params
|
|
logger.warn("User ID not provided in external request. Using derived ID from phone number: {}", resolvedUserId);
|
|
|
|
|
|
if (externalRequest.channel() != null && !externalRequest.channel().isBlank()) {
|
|
parameters.put("canal", externalRequest.channel());
|
|
logger.debug("Mapped 'canal' from external request: {}", externalRequest.channel());
|
|
}
|
|
|
|
if (externalRequest.user() != null && externalRequest.user().nickname() != null
|
|
&& !externalRequest.user().nickname().isBlank()) {
|
|
parameters.put("nickname", externalRequest.user().nickname());
|
|
logger.debug("Mapped 'nickname' from external request: {}", externalRequest.user().nickname());
|
|
}
|
|
if (externalRequest.tipo() != null) {
|
|
parameters.put("tipo", externalRequest.tipo());
|
|
logger.debug("Mapped 'tipo' from external request: {}", externalRequest.tipo());
|
|
}
|
|
|
|
QueryParamsDTO queryParamsDTO = new QueryParamsDTO(parameters);
|
|
|
|
// 3. Construct the final DetectIntentRequestDTO
|
|
return new DetectIntentRequestDTO(queryInputDTO, queryParamsDTO);
|
|
}
|
|
} |