8
8
validateMessage ,
9
9
validateTransaction ,
10
10
Policy ,
11
- Address ,
12
11
UAddress ,
13
- PLACEHOLDER_ACCOUNT_ADDRESS ,
14
12
Tx ,
15
13
UUID ,
16
14
asUUID ,
@@ -31,10 +29,9 @@ import { ShapeFunc } from '~/core/database';
31
29
import {
32
30
policyStateAsPolicy ,
33
31
PolicyShape ,
34
- policyInputAsStateShape ,
32
+ inputAsPolicyState ,
35
33
selectPolicy ,
36
34
latestPolicy2 ,
37
- inputAsPolicy ,
38
35
} from './policies.util' ;
39
36
import { NameTaken , PolicyEvent , Policy as PolicyModel , ValidationError } from './policies.model' ;
40
37
import { TX_SHAPE , transactionAsTx , ProposalTxShape } from '../transactions/transactions.util' ;
@@ -119,16 +116,25 @@ export class PoliciesService {
119
116
const currentPolicies = await this . db . exec ( existingPolicies , { account, policyKeys } ) ;
120
117
const changedPolicies = policiesWithKeys
121
118
. map ( ( input ) => {
122
- const policy = inputAsPolicy ( input . key , input ) ;
123
- const existing = currentPolicies . find ( ( p ) => p . key === policy . key ) ;
124
- return (
125
- ( ! existing || encodePolicy ( policy ) !== encodePolicy ( policyStateAsPolicy ( existing ) ) ) && {
126
- input,
127
- policy,
128
- }
129
- ) ;
119
+ // Merge exisiting policy state (draft or latest) with input
120
+ const existing = currentPolicies . find ( ( p ) => p . key === input . key ) ;
121
+ const policyState = inputAsPolicyState ( input . key , input , existing ) ;
122
+ const policy = policyStateAsPolicy ( policyState ) ;
123
+
124
+ // Ignore unchanged policies
125
+ if ( existing && encodePolicy ( policy ) === encodePolicy ( policyStateAsPolicy ( existing ) ) )
126
+ return ;
127
+
128
+ return {
129
+ policy,
130
+ state : {
131
+ name : 'Policy ' + input . key ,
132
+ ...policyState ,
133
+ } ,
134
+ } ;
130
135
} )
131
136
. filter ( Boolean ) ;
137
+ if ( ! changedPolicies . length ) return [ ] ;
132
138
133
139
// Propose transaction with policy inserts
134
140
const transaction = ! isInitialization
@@ -151,15 +157,16 @@ export class PoliciesService {
151
157
await this . db . exec ( insertPolicies , {
152
158
account,
153
159
transaction,
154
- policies : changedPolicies . map ( ( { input } ) => ( {
160
+ policies : changedPolicies . map ( ( { state } ) => ( {
155
161
...( isInitialization && { activationBlock : 0n } ) ,
156
- ...policyInputAsStateShape ( input . key , input ) ,
157
- name : input . name || 'Policy ' + input . key ,
162
+ ...state ,
158
163
} ) ) ,
159
164
} )
160
165
) . map ( ( p ) => ( { ...p , id : asUUID ( p . id ) , key : asPolicyKey ( p . key ) } ) ) ;
161
166
162
- const approvers = new Set ( changedPolicies . flatMap ( ( { input } ) => input . approvers ) ) ;
167
+ const approvers = new Set (
168
+ changedPolicies . flatMap ( ( { state } ) => state . approvers . map ( ( a ) => asAddress ( a . address ) ) ) ,
169
+ ) ;
163
170
this . userAccounts . invalidateApproversCache ( ...approvers ) ;
164
171
165
172
newPolicies . forEach ( ( { id } ) =>
0 commit comments