import { Application } from '@feathersjs/express'; import { HookContext } from '@feathersjs/feathers'; import service from 'feathers-mongoose'; import { populate, alterItems, stashBefore, 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 } = getItems(context); // If amount is not supplied, do nothing if (!amount) return context; const inc = amount - (context.params.before?.amount || 0); const sign = (operation === 'in' ? -1 : 1) * (context.method === 'remove' ? -1 : 1); if (inc) await context.app.service('contractors').patch(contractorId, { $inc: { debt: inc * sign } }); 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: [stashBefore(), applyTransfer], update: [stashBefore(), applyTransfer], } }) };