1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
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<HookContext> => {
const { contractorId, accountId, 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) {
// TODO: start transaction
await context.app
.service('accounts')
.patch(accountId, {
$inc: {
balance: inc * sign
}
});
await context.app
.service('contractors')
.patch(contractorId, {
$inc: {
debt: inc * sign * (-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: [stashBefore(), applyTransfer],
update: [stashBefore(), applyTransfer],
}
})
};
|