Skip to content

Commit 60058a3

Browse files
authored
Merge pull request #536 from samwel141/master
feat(transfer): Add prioritization for pending receiver actions in transfer filtering
2 parents 9a0b6da + e5d66bc commit 60058a3

File tree

4 files changed

+106
-2
lines changed

4 files changed

+106
-2
lines changed

server/models/Transfer.js

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ class Transfer {
6969
after,
7070
sort_by,
7171
order,
72+
prioritize_pending_receiver_action_for_wallet_id,
7273
}) {
7374
const filter = {
7475
and: [],
@@ -101,7 +102,19 @@ class Transfer {
101102
if (after) {
102103
filter.and.push({ after: { 'transfer.created_at': after } });
103104
}
104-
return this.getByFilter(filter, { offset, limit, sort_by, order });
105+
const limitOptions = {
106+
offset,
107+
limit,
108+
sort_by,
109+
order,
110+
};
111+
112+
if (prioritize_pending_receiver_action_for_wallet_id !== undefined) {
113+
limitOptions.prioritize_pending_receiver_action_for_wallet_id =
114+
prioritize_pending_receiver_action_for_wallet_id;
115+
}
116+
117+
return this.getByFilter(filter, limitOptions);
105118
}
106119

107120
/*

server/repositories/TransferRepository.js

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
const Joi = require('joi');
22
const BaseRepository = require('./BaseRepository');
33
const TransferEnum = require('../utils/transfer-enum');
4+
const TrustRelationshipEnums = require('../utils/trust-enums');
45

56
class TransferRepository extends BaseRepository {
67
constructor(session) {
@@ -131,6 +132,7 @@ class TransferRepository extends BaseRepository {
131132

132133
let order = 'desc';
133134
let column = 'transfer.created_at';
135+
let useDefaultPriorityOrdering = false;
134136

135137
if (limitOptions) {
136138
if (limitOptions.order) {
@@ -139,7 +141,59 @@ class TransferRepository extends BaseRepository {
139141
if (limitOptions.sort_by) {
140142
column = limitOptions.sort_by;
141143
}
144+
if (limitOptions.prioritize_pending_receiver_action_for_wallet_id) {
145+
useDefaultPriorityOrdering = true;
146+
}
142147
}
148+
149+
if (useDefaultPriorityOrdering) {
150+
const walletLoginId =
151+
limitOptions.prioritize_pending_receiver_action_for_wallet_id;
152+
153+
promise = promise.orderByRaw(
154+
`
155+
CASE
156+
WHEN transfer.state = ?
157+
AND (
158+
transfer.destination_wallet_id = ?
159+
OR EXISTS (
160+
SELECT 1
161+
FROM wallet_trust
162+
WHERE (
163+
wallet_trust.actor_wallet_id = ?
164+
AND wallet_trust.target_wallet_id = transfer.destination_wallet_id
165+
AND wallet_trust.request_type = ?
166+
AND wallet_trust.state = ?
167+
) OR (
168+
wallet_trust.target_wallet_id = ?
169+
AND wallet_trust.actor_wallet_id = transfer.destination_wallet_id
170+
AND wallet_trust.request_type = ?
171+
AND wallet_trust.state = ?
172+
)
173+
)
174+
) THEN 0
175+
WHEN transfer.state = ? THEN 1
176+
WHEN transfer.state = ? THEN 2
177+
WHEN transfer.state = ? THEN 3
178+
ELSE 4
179+
END ASC
180+
`,
181+
[
182+
TransferEnum.STATE.pending,
183+
walletLoginId,
184+
walletLoginId,
185+
TrustRelationshipEnums.ENTITY_TRUST_REQUEST_TYPE.manage,
186+
TrustRelationshipEnums.ENTITY_TRUST_STATE_TYPE.trusted,
187+
walletLoginId,
188+
TrustRelationshipEnums.ENTITY_TRUST_REQUEST_TYPE.yield,
189+
TrustRelationshipEnums.ENTITY_TRUST_STATE_TYPE.trusted,
190+
TransferEnum.STATE.pending,
191+
TransferEnum.STATE.completed,
192+
TransferEnum.STATE.cancelled,
193+
],
194+
);
195+
}
196+
143197
promise = promise.orderBy(column, order);
144198

145199
// get the total count (before applying limit and offset options)

server/services/TransferService.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@ class TransferService {
2727
order,
2828
} = query;
2929

30+
const effectiveSortBy = sort_by || 'created_at';
31+
const effectiveOrder = order || 'desc';
32+
const isDefaultSort =
33+
effectiveSortBy === 'created_at' && effectiveOrder === 'desc';
34+
3035
let walletId;
3136

3237
if (wallet) {
@@ -44,8 +49,10 @@ class TransferService {
4449
after,
4550
sort_by,
4651
order,
52+
prioritize_pending_receiver_action_for_wallet_id: isDefaultSort
53+
? walletLoginId
54+
: undefined,
4755
});
48-
4956
return { transfers, count };
5057
}
5158

server/services/TransferService.spec.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ describe('TransferService', () => {
169169
after: undefined,
170170
sort_by: undefined,
171171
order: undefined,
172+
prioritize_pending_receiver_action_for_wallet_id: 'walletLoginId',
172173
}),
173174
).eql(true);
174175
expect(walletGetByIdOrNameStub.notCalled).eql(true);
@@ -200,10 +201,39 @@ describe('TransferService', () => {
200201
after,
201202
sort_by: undefined,
202203
order: undefined,
204+
prioritize_pending_receiver_action_for_wallet_id: 'walletLoginId',
203205
}),
204206
).eql(true);
205207
expect(walletGetByIdOrNameStub.calledOnceWithExactly('wallet')).eql(true);
206208
});
209+
210+
it('getByFilter -- skips priority ordering for custom sorts', async () => {
211+
await transferService.getByFilter(
212+
{
213+
state: 'state',
214+
limit: 1,
215+
offset: 1,
216+
sort_by: 'state',
217+
order: 'asc',
218+
},
219+
'walletLoginId',
220+
);
221+
222+
expect(
223+
getTransfersStub.calledOnceWithExactly({
224+
state: 'state',
225+
limit: 1,
226+
offset: 1,
227+
walletLoginId: 'walletLoginId',
228+
walletId: undefined,
229+
before: undefined,
230+
after: undefined,
231+
sort_by: 'state',
232+
order: 'asc',
233+
prioritize_pending_receiver_action_for_wallet_id: undefined,
234+
}),
235+
).eql(true);
236+
});
207237
});
208238

209239
describe('acceptTransfer', () => {

0 commit comments

Comments
 (0)