Actualmente estoy trabajando en una aplicación NestJS que se comunica con SAP (y algunas otras aplicaciones externas) y, lamentablemente, SAP requiere algunos campos con nombres muy específicos. Para ser precisos, en algunos casos, necesito enviarle más de 70 campos y, en otros casos, una solicitud puede devolver más de 280 campos.
Como no puedo modificar SAP, me veo obligado a trabajar con campos que van en contra de los patrones de nombres de mi aplicación (camelCase y readable), ya que SAP usa SCREAMING_SNAKE_CASE con abreviaturas, números e incluso algunas palabras que mezclan palabras en inglés y alemán.
Ahora, sé que hay algunos enfoques no tan prácticos para esto (como analizar cada campo individualmente), pero ¿hay alguno que me ahorre tiempo o al menos haga que todo sea más limpio sin tener que analizar los campos manualmente?
Editar: aquí hay un ejemplo de lo que SAP devuelve a mi aplicación
PLNT_FABRIZIEREN_C: '253D', MRKD_PRODUCTS: ['PRODUCT1', 'PRODUCT2'], NEUES_PRDKT: TRUE
Y el equivalente en mi aplicación:
factoryPlantCode: '253D', markedProducts: ['PRODUCT1', 'PRODUCT2'], isNewProduct: true
Necesito cambiar por completo el nombre de un campo cuando lo guardo en mi aplicación, por lo que sigo usando camelCase, pero lo devuelvo con el nombre que SAP conoce.
Puedes probar algo como esto. Todo lo que necesita hacer es agregar las claves de SAP en clave y establecer el valor como la clave que desea usar en su aplicación.
const mappings = { PLNT_FABRIZIEREN_C: "factoryPlantCode", MRKD_PRODUCTS: "markedProducts", NEUES_PRDKT: "isNewProduct" } const getFormattedVersion = (data) => { const returnData = {}; Object.keys(data).forEach(key => { returnData[mappings[key]] = data[key]; }) return returnData } const getSAPSupportedVersion = (data) =>{ const returnData = {}; Object.keys(data).forEach(key => { const mappingKeys = Object.keys(mappings) const mappingValues = Object.values(mappings) const mappedKey = mappingKeys[mappingValues.indexOf(key)]; returnData[mappedKey] = data[key]; }) return returnData } console.log( getFormattedVersion({ PLNT_FABRIZIEREN_C: '253D', MRKD_PRODUCTS: ['PRODUCT1', 'PRODUCT2'], NEUES_PRDKT: true }) ) console.log( getSAPSupportedVersion({ factoryPlantCode: "253D", isNewProduct: true, markedProducts: ["PRODUCT1", "PRODUCT2"] }) )
Gracias Sony Bamniya por responder a mi pregunta, pero pensé en otra forma de solucionar ese problema. Al usar el paquete class-transformer , pude cambiar el nombre de mis campos:
@Expose({ name: 'factoryPlantCode' }) PLNT_FABRIZIEREN_C: string @Expose({ name: 'markedProducts' }) MRKD_PRODUCTS: string; @Expose({ name: 'isNewProduct' }) NEUES_PRDKT: boolean;
Todavía tenía el problema con los campos SCREAMING_SNAKE_CASE
, pero eso fue fácil de arreglar: agregué un interceptor que analizó todos esos campos desde SCREAMING_SNAKE_CASE
a camelCase
usando lodash .camelCase y una iteración hecha a mano usando Object.entries(payload)
. También vale la pena mencionar que mi DTO tiene un constructor:
constructor(rawPayload) { Object.assign(this, rawPayload); }
Y después de llenar mi DTO, tuve que convertirlo en un objeto simple usando el método classToPlain()
del transformador de clase (pude volver a analizarlo en un DTO después de analizarlo en simple, pero no lo necesitaba). ¡Espero que esto ayude a alguien!