/* * 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 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); } }