import { Application } from '@feathersjs/express'; import { HookContext } from '@feathersjs/feathers'; import service from 'feathers-mongoose'; import { populate, alterItems, getItems } from 'feathers-hooks-common'; import Model from '../models/transfer/transfer.model'; import formatDate from '../hooks/formatDate'; const transfers = service({ Model }); const populateSchema = { include: [ { service: 'contractors', nameAs: 'contractor', parentField: 'contractorId', childField: '_id' } ] }; const addFields = (item: any) => { const { operation, contractor, amount } = item; const op = operation === 'in' ? 'приход' : 'расход'; const name = `Перевод: ${op} $${amount} от ${contractor.name}`; return { ...item, name }; }; const applyTransfer = async (context: HookContext): Promise => { const { contractorId, amount, operation, _id } = getItems(context); let inc; // After Create / Delete if (context.method === 'create') inc = amount; if (context.method === 'remove') inc = -amount; // Before Patch / Update else if (['patch', 'update'].includes(context.method)) { const oldTransfer = await context.service.get(_id); inc = amount ? (amount - oldTransfer.amount) : 0; }; if (inc) await context.app.service('contractors').patch(contractorId, { $inc: { debt: inc * (operation === 'in' ? -1 : 1) } }); return context; }; export default (app: Application): void => { app.use('/transfers', transfers); app.service('transfers').hooks({ after: { all: [ populate({ schema: populateSchema }), alterItems(addFields), formatDate(), ], create: applyTransfer, remove: applyTransfer, }, before: { patch: applyTransfer, update: applyTransfer, } }) };