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?
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>