This repository has been archived by the owner on Feb 1, 2024. It is now read-only.
/
participant_service.js
104 lines (89 loc) · 4.03 KB
/
participant_service.js
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/**
* Copyright 2016 Intel Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ------------------------------------------------------------------------------
*/
"use strict";
var _ = require('underscore');
require('../../sawtooth/mixins');
var r = require('rethinkdb');
var block = require('../../sawtooth/model/block');
var transaction = require('../../sawtooth/model/transaction');
var exchangeService = require('./exchange_service');
var {UpdateTypes} = require('../constants');
var {TransactionStatuses} = require('../../sawtooth/constants');
var logger = require('../../sawtooth/logger').getRESTLogger();
const {mergeAssetSettings} = require('./service_common');
let _mergeParticipant = (block) => (p) => ({
holdings: block.filter({ creator: p('id'), 'object-type': 'Holding' })
.merge(mergeAssetSettings(block)).coerceTo('array'),
accounts: block.filter({ creator: p('id'), 'object-type': 'Account'})
.coerceTo('array'),
});
module.exports = {
getByAddress: (address) =>
block.current().findFirst({address: address})
.then(participant => {
if(participant) {
return participant;
}
return transaction.findExact(
r.and(r.row('Updates').nth(0)('UpdateType').eq(UpdateTypes.REGISTER_PARTICIPANT),
r.row('Status').eq(TransactionStatuses.PENDING),
r.row('address').eq(address)),
{asArray: true})
.then(txns => _.map(txns, (t) => ({
id: t.id,
displayName: t.Updates[0].Name,
name: t.Updates[0].Name,
description: t.Updates[0].Description,
pending: true
})))
.then(_.first);
}),
participant: (id) =>
block.current().advancedQuery(block =>
block.get(id)
.do(p =>
r.branch(p,
p.merge(_mergeParticipant(block)),
null)))
.then(party => {
if (!party) {
return undefined;
}
var accountsPromise;
if(_.isEmpty(party.accounts)) {
accountsPromise = transaction.findExact(
r.and(r.row('Updates').nth(0)('UpdateType').eq(UpdateTypes.REGISTER_ACCOUNT),
r.row.hasFields('creator'),
r.row('creator').eq(id)),
{asArray: true})
.then(txns => _.map(txns, t => ({
id: t.id,
name: t.Updates[0].Name,
description: t.Updates[0].Description,
pending: true
})));
} else {
accountsPromise = Promise.resolve(party.accounts);
}
return accountsPromise.then(accounts => {
party.account = _.first(accounts);
return _.omit(party, 'address', 'accounts');
});
}),
getUsersNameAndIds: () =>
block.current().projection({'object-type': 'Participant'}, ['name'], true)
};