Skip to content

Commit

Permalink
feat(permissions): expose txGroupToTxTags from utils
Browse files Browse the repository at this point in the history
Also modified the PermissionsLike interface

BREAKING CHANGE:
- `PermissionsLike.transactions` no longer accepts `TxGroup` values, there is now a separate `transactionGroups?: TxGroup[]` property
- `Permissions.transactionGroups` can no longer be null
  • Loading branch information
monitz87 committed Feb 15, 2021
1 parent f9bb557 commit b2ee1a4
Show file tree
Hide file tree
Showing 13 changed files with 44 additions and 58 deletions.
2 changes: 1 addition & 1 deletion src/api/entities/CurrentAccount.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ export class CurrentAccount extends Account {
return {
tokens: null,
transactions: null,
transactionGroups: null,
transactionGroups: [],
portfolios: null,
};
}
Expand Down
4 changes: 2 additions & 2 deletions src/api/entities/__tests__/AuthorizationRequest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ describe('AuthorizationRequest class', () => {
value: {
tokens: null,
transactions: null,
transactionGroups: null,
transactionGroups: [],
portfolios: null,
},
},
Expand Down Expand Up @@ -182,7 +182,7 @@ describe('AuthorizationRequest class', () => {
value: {
tokens: null,
transactions: null,
transactionGroups: null,
transactionGroups: [],
portfolios: null,
},
},
Expand Down
2 changes: 1 addition & 1 deletion src/api/entities/__tests__/CurrentAccount.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ describe('CurrentAccount class', () => {
expect(result).toEqual({
tokens: null,
transactions: null,
transactionGroups: null,
transactionGroups: [],
portfolios: null,
});
});
Expand Down
2 changes: 1 addition & 1 deletion src/api/entities/__tests__/CurrentIdentity.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ describe('CurrentIdentity class', () => {
permissions: {
tokens: null,
transactions: null,
transactionGroups: null,
transactionGroups: [],
portfolios: null,
},
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ describe('consumeJoinIdentityAuthorization procedure', () => {
value: {
tokens: null,
transactions: null,
transactionGroups: null,
transactionGroups: [],
portfolios: null,
},
},
Expand Down Expand Up @@ -119,7 +119,7 @@ describe('consumeJoinIdentityAuthorization procedure', () => {
value: {
tokens: null,
transactions: null,
transactionGroups: null,
transactionGroups: [],
portfolios: null,
},
},
Expand Down Expand Up @@ -159,7 +159,7 @@ describe('consumeJoinIdentityAuthorization procedure', () => {
value: {
tokens: null,
transactions: null,
transactionGroups: null,
transactionGroups: [],
portfolios: null,
},
},
Expand Down Expand Up @@ -192,7 +192,7 @@ describe('consumeJoinIdentityAuthorization procedure', () => {
value: {
tokens: null,
transactions: null,
transactionGroups: null,
transactionGroups: [],
portfolios: null,
},
},
Expand Down
4 changes: 2 additions & 2 deletions src/api/procedures/__tests__/inviteAccount.ts
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ describe('inviteAccount procedure', () => {
value: {
tokens: null,
transactions: null,
transactionGroups: null,
transactionGroups: [],
portfolios: null,
},
},
Expand Down Expand Up @@ -236,7 +236,7 @@ describe('inviteAccount procedure', () => {
value: {
tokens: null,
transactions: null,
transactionGroups: null,
transactionGroups: [],
portfolios: null,
},
},
Expand Down
2 changes: 1 addition & 1 deletion src/api/procedures/__tests__/registerIdentity.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ describe('registerIdentity procedure', () => {
tokens: null,
portfolios: null,
transactions: null,
transactionGroups: null,
transactionGroups: [],
},
},
];
Expand Down
4 changes: 2 additions & 2 deletions src/api/procedures/__tests__/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -275,7 +275,7 @@ describe('assertSecondaryKeys', () => {
permissions: {
tokens: null,
transactions: null,
transactionGroups: null,
transactionGroups: [],
portfolios: null,
},
},
Expand All @@ -296,7 +296,7 @@ describe('assertSecondaryKeys', () => {
permissions: {
tokens: null,
transactions: null,
transactionGroups: null,
transactionGroups: [],
portfolios: null,
},
},
Expand Down
2 changes: 1 addition & 1 deletion src/base/__tests__/Context.ts
Original file line number Diff line number Diff line change
Expand Up @@ -775,7 +775,7 @@ describe('Context class', () => {
tokens: null,
portfolios: null,
transactions: null,
transactionGroups: null,
transactionGroups: [],
},
},
];
Expand Down
18 changes: 9 additions & 9 deletions src/types/index.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import { Keyring } from '@polkadot/api';
import { IKeyringPair, TypeDef } from '@polkadot/types/types';
import BigNumber from 'bignumber.js';
import { some, values } from 'lodash';
import { TxTag, TxTags } from 'polymesh-types/types';

import { StoDetails } from '~/api/entities/types';
Expand Down Expand Up @@ -541,9 +540,10 @@ export interface Permissions {
transactions: TxTag[] | null;
/**
* list of Transaction Groups this key can execute. Having permissions over a TxGroup
* means having permissions over every TxTag in said group
* means having permissions over every TxTag in said group. Transaction permissions are the result of
* combining these with the `transactions` array. If `transactions` is null, then this value is redundant
*/
transactionGroups: TxGroup[] | null;
transactionGroups: TxGroup[];
/* list of Portfolios over which this key has permissions */
portfolios: (DefaultPortfolio | NumberedPortfolio)[] | null;
}
Expand Down Expand Up @@ -683,15 +683,15 @@ export enum TxGroup {
}

/**
* @hidden
* Permissions to grant to a Signer over an Identity
*
* @note TxGroups in the `transactionGroups` array will be transformed into their corresponding `TxTag`s
* and appended to the `transactions` array. If `transactions` is null, then the value of `transactionGroups` is redundant
*/
export function isTxGroup(group: string): group is TxGroup {
return some(values(TxGroup), value => value === group);
}

export interface PermissionsLike {
tokens?: (string | SecurityToken)[] | null;
transactions?: (TxTag | TxGroup)[] | null;
transactions?: TxTag[] | null;
transactionGroups?: TxGroup[];
portfolios?: PortfolioLike[] | null;
}

Expand Down
13 changes: 7 additions & 6 deletions src/utils/__tests__/conversion.ts
Original file line number Diff line number Diff line change
Expand Up @@ -799,7 +799,7 @@ describe('authorizationToAuthorizationData and authorizationDataToAuthorization'
value: {
tokens: null,
transactions: null,
transactionGroups: null,
transactionGroups: [],
portfolios: null,
},
};
Expand Down Expand Up @@ -1020,7 +1020,7 @@ describe('permissionsToMeshPermissions and meshPermissionsToPermissions', () =>
let value: Permissions = {
tokens: null,
transactions: null,
transactionGroups: null,
transactionGroups: [],
portfolios: null,
};
const fakeResult = ('convertedPermission' as unknown) as MeshPermissions;
Expand Down Expand Up @@ -1120,7 +1120,7 @@ describe('permissionsToMeshPermissions and meshPermissionsToPermissions', () =>
fakeResult = {
tokens: null,
transactions: null,
transactionGroups: null,
transactionGroups: [],
portfolios: null,
};
permissions = dsMockUtils.createMockPermissions({
Expand Down Expand Up @@ -3682,7 +3682,7 @@ describe('secondaryKeyToMeshSecondaryKey', () => {
permissions: {
tokens: null,
transactions: null,
transactionGroups: null,
transactionGroups: [],
portfolios: null,
},
};
Expand Down Expand Up @@ -4203,7 +4203,7 @@ describe('permissionsLikeToPermissions', () => {
expect(result).toEqual({
tokens: null,
transactions: null,
transactionGroups: null,
transactionGroups: [],
portfolios: null,
});

Expand All @@ -4214,7 +4214,8 @@ describe('permissionsLikeToPermissions', () => {

args = {
tokens: [firstToken, ticker],
transactions: [TxTags.asset.Transfer, TxGroup.TrustedClaimIssuersManagement],
transactions: [TxTags.asset.Transfer],
transactionGroups: [TxGroup.TrustedClaimIssuersManagement],
portfolios: [portfolio],
};
result = await permissionsLikeToPermissions(args, context);
Expand Down
39 changes: 12 additions & 27 deletions src/utils/conversion.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import BigNumber from 'bignumber.js';
import { computeWithoutCheck } from 'iso-7064';
import {
camelCase,
flatten,
isEqual,
map,
padEnd,
Expand Down Expand Up @@ -116,7 +117,6 @@ import {
InstructionType,
isMultiClaimCondition,
isSingleClaimCondition,
isTxGroup,
KnownTokenType,
MultiClaimCondition,
Permissions,
Expand Down Expand Up @@ -513,7 +513,7 @@ export function textToString(value: Text): string {
}

/**
* @hidden
* Retrieve every Transaction Tag associated to a Transaction Group
*/
export function txGroupToTxTags(group: TxGroup): TxTag[] {
switch (group) {
Expand Down Expand Up @@ -689,7 +689,7 @@ export function meshPermissionsToPermissions(
return {
tokens,
transactions,
transactionGroups: transactions && txTagsToTxGroups(transactions),
transactionGroups: transactions ? txTagsToTxGroups(transactions) : [],
portfolios,
};
}
Expand Down Expand Up @@ -2330,10 +2330,10 @@ export function permissionsLikeToPermissions(
): Permissions {
let tokenPermissions: SecurityToken[] | null = [];
let transactionPermissions: TxTag[] | null = [];
let transactionGroupPermissions: TxGroup[] | null = [];
let transactionGroupPermissions: TxGroup[] = [];
let portfolioPermissions: (DefaultPortfolio | NumberedPortfolio)[] | null = [];

const { tokens, transactions, portfolios } = permissionsLike;
const { tokens, transactions, transactionGroups, portfolios } = permissionsLike;

if (tokens === null) {
tokenPermissions = null;
Expand All @@ -2344,29 +2344,14 @@ export function permissionsLikeToPermissions(
}

if (transactions !== undefined) {
const separated =
transactions &&
transactions.reduce<{ tags: TxTag[]; groups: TxGroup[] }>(
(prev, curr): { tags: TxTag[]; groups: TxGroup[] } => {
const { tags: prevTags, groups: prevGroups } = prev;
if (isTxGroup(curr)) {
return { tags: [...prevTags, ...txGroupToTxTags(curr)], groups: [...prevGroups, curr] };
} else {
return { tags: [...prevTags, curr], groups: prevGroups };
}
},
{ tags: [], groups: [] }
);

if (separated) {
const { tags, groups } = separated;
transactionPermissions = transactions;
}

transactionPermissions = tags;
transactionGroupPermissions = groups;
} else {
transactionPermissions = null;
transactionGroupPermissions = null;
}
if (transactionGroups !== undefined) {
transactionGroupPermissions = uniq(transactionGroups);
const groupTags = flatten(transactionGroups.map(txGroupToTxTags));
transactionPermissions =
transactionPermissions && uniq([...transactionPermissions, ...groupTags]);
}

if (portfolios === null) {
Expand Down
2 changes: 1 addition & 1 deletion src/utils/index.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
export { tickerToDid, isCusipValid, isLeiValid, isIsinValid } from './conversion';
export { tickerToDid, isCusipValid, isLeiValid, isIsinValid, txGroupToTxTags } from './conversion';
export { cryptoWaitReady } from '@polkadot/util-crypto';

0 comments on commit b2ee1a4

Please sign in to comment.