Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

104
Vistas
¿Cómo puedo convertir esta función si anidada en una programación de estilo funcional con Ramda en Javascript?

Estaba mirando el código en Prisma para el middleware de eliminación suave:

 prisma.$use(async (params, next) => { // Check incoming query type if (params.model == 'Post') { if (params.action == 'delete') { // Delete queries // Change action to an update params.action = 'update' params.args['data'] = { deleted: true } } if (params.action == 'deleteMany') { // Delete many queries params.action = 'updateMany' if (params.args.data != undefined) { params.args.data['deleted'] = true } else { params.args['data'] = { deleted: true } } } } return next(params) })

Los pasos que toma son: Verificar si Publicar -> si es 'eliminar' o 'eliminar Muchos', luego cambiar la acción a 'actualizar' y establecer eliminado en verdadero.

Los if anidados no parecen ideales y parecía que esto sería más limpio usando un estilo funcional, así que usé Ramda para intentar hacerlo funcional:

 const model = lensProp('model') const action = lensProp('action') const argsData = compose(lensProp('args'), lensProp('data')) const cView = curry(view) const modelView = cView(model) const actionView = cView(action) const _shouldBeModified = (models, actions, p) => and( includes(modelView(p), models), includes(actionView(p), actions) ) const shouldBeModified = curry(_shouldBeModified) const timeElapsed = Date.now(); const today = new Date(timeElapsed); const softDelete = (models, actions, params) => ifElse( shouldBeModified(models, actions), pipe( set(argsData, { deleted: true, deletedAt: today.toISOString()}), set(action, 'update') ), identity )(params)

Entonces puedo llamarlo así:

 softDelete(['Post'],['delete', 'deleteMany'],params) /* returns: {"action": "update", "args": {"data": {"deleted": true, "deletedAt": "2022-04-17T19:49:00.294Z"}}, "model": "Post"} */

Dicho todo esto, soy nuevo en Ramda y parece que mi enfoque es complicado, ¿alguien puede ayudarme a solucionar esto?

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Puede usar R.when con R.where para verificar si los params deben actualizarse. Si es así, use R.evolve para actualizarlos.

Pase un objeto de actions , en lugar de una matriz, para que el código pueda asignar la update / updateMany acuerdo con la acción original.

 const { curry, when, where, includes, __, keys, evolve, prop, mergeDeepLeft } = R const actionsMap = { delete: 'update', deleteMany: 'updateMany' }; const softDelete = curry((models, actions, params) => when( where({ model: includes(__, models), action: includes(__, keys(actions)) }), evolve({ action: prop(__, actions), args: mergeDeepLeft({ data: { deleted: true, deletedAt: new Date().toISOString() }}) }) )(params)) const params = {"action": "deleteMany", "args": { data: { something: 5 } }, "model": "Post"} const result = softDelete(['Post'], actionsMap, params) console.log(result)
 <script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.28.0/ramda.min.js" integrity="sha512-t0vPcE8ynwIFovsylwUuLPIbdhDj6fav2prN9fEu/VYBupsmrmk9x43Hvnt+Mgn2h5YPSJOk7PMo9zIeGedD1A==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda