Skip to content

Commit

Permalink
feat(permissions): return TxGroups
Browse files Browse the repository at this point in the history
- Add transactionGroups property to the `Permissions` interface
- Improve TxGroup documentation
- Have `CurrentAccount.hasPermissions` receive a `PermissionsLike` as a parameter
  • Loading branch information
monitz87 committed Feb 11, 2021
1 parent a4ba912 commit f9bb557
Show file tree
Hide file tree
Showing 15 changed files with 271 additions and 87 deletions.
16 changes: 12 additions & 4 deletions src/api/entities/CurrentAccount.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
import { difference, differenceBy, differenceWith, isEqual, union } from 'lodash';

import { Account, CurrentIdentity } from '~/internal';
import { Permissions, TxTags } from '~/types';
import { portfolioToPortfolioId, signerToString } from '~/utils/conversion';
import { Permissions, PermissionsLike, TxTags } from '~/types';
import {
permissionsLikeToPermissions,
portfolioToPortfolioId,
signerToString,
} from '~/utils/conversion';

/**
* Represents the current account that is bound to the SDK instance
Expand Down Expand Up @@ -34,6 +38,7 @@ export class CurrentAccount extends Account {
return {
tokens: null,
transactions: null,
transactionGroups: null,
portfolios: null,
};
}
Expand All @@ -47,8 +52,11 @@ export class CurrentAccount extends Account {
/**
* Check if this Account possesses certain Permissions for its corresponding Identity
*/
public async hasPermissions(permissions: Permissions): Promise<boolean> {
const { tokens, transactions, portfolios } = permissions;
public async hasPermissions(permissions: PermissionsLike): Promise<boolean> {
const { tokens, transactions, portfolios } = permissionsLikeToPermissions(
permissions,
this.context
);

const {
tokens: currentTokens,
Expand Down
2 changes: 2 additions & 0 deletions src/api/entities/__tests__/AuthorizationRequest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@ describe('AuthorizationRequest class', () => {
value: {
tokens: null,
transactions: null,
transactionGroups: null,
portfolios: null,
},
},
Expand Down Expand Up @@ -181,6 +182,7 @@ describe('AuthorizationRequest class', () => {
value: {
tokens: null,
transactions: null,
transactionGroups: null,
portfolios: null,
},
},
Expand Down
12 changes: 10 additions & 2 deletions src/api/entities/__tests__/CurrentAccount.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,13 +60,14 @@ describe('CurrentAccount class', () => {
expect(result).toEqual({
tokens: null,
transactions: null,
transactionGroups: null,
portfolios: null,
});
});

test("should return the account's permissions if it is a secondary key", async () => {
const address = 'someAddress';
const permissions = { tokens: [], transactions: [], portfolios: [] };
const permissions = { tokens: [], transactions: [], transactionGroups: [], portfolios: [] };
context = dsMockUtils.getContextInstance({
secondaryKeys: [
{ signer: entityMockUtils.getAccountInstance({ address }), permissions },
Expand All @@ -75,6 +76,7 @@ describe('CurrentAccount class', () => {
permissions: {
tokens: [],
transactions: [TxTags.identity.AcceptAuthorization],
transactionGroups: [],
portfolios: [],
},
},
Expand All @@ -101,7 +103,12 @@ describe('CurrentAccount class', () => {

expect(result).toEqual(true);

let permissions: Permissions = { tokens: [], transactions: [], portfolios: [] };
let permissions: Permissions = {
tokens: [],
transactions: [],
transactionGroups: [],
portfolios: [],
};
context = dsMockUtils.getContextInstance({
secondaryKeys: [{ signer: entityMockUtils.getAccountInstance({ address }), permissions }],
});
Expand All @@ -120,6 +127,7 @@ describe('CurrentAccount class', () => {
permissions = {
tokens: [token],
transactions: [TxTags.asset.CreateAsset],
transactionGroups: [],
portfolios: [entityMockUtils.getDefaultPortfolioInstance({ did: 'someDid' })],
};
context = dsMockUtils.getContextInstance({
Expand Down
1 change: 1 addition & 0 deletions src/api/entities/__tests__/CurrentIdentity.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ describe('CurrentIdentity class', () => {
permissions: {
tokens: null,
transactions: null,
transactionGroups: null,
portfolios: null,
},
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ describe('consumeJoinIdentityAuthorization procedure', () => {
value: {
tokens: null,
transactions: null,
transactionGroups: null,
portfolios: null,
},
},
Expand Down Expand Up @@ -118,6 +119,7 @@ describe('consumeJoinIdentityAuthorization procedure', () => {
value: {
tokens: null,
transactions: null,
transactionGroups: null,
portfolios: null,
},
},
Expand Down Expand Up @@ -157,6 +159,7 @@ describe('consumeJoinIdentityAuthorization procedure', () => {
value: {
tokens: null,
transactions: null,
transactionGroups: null,
portfolios: null,
},
},
Expand Down Expand Up @@ -189,6 +192,7 @@ describe('consumeJoinIdentityAuthorization procedure', () => {
value: {
tokens: null,
transactions: null,
transactionGroups: null,
portfolios: null,
},
},
Expand Down
2 changes: 2 additions & 0 deletions src/api/procedures/__tests__/inviteAccount.ts
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@ describe('inviteAccount procedure', () => {
value: {
tokens: null,
transactions: null,
transactionGroups: null,
portfolios: null,
},
},
Expand Down Expand Up @@ -235,6 +236,7 @@ describe('inviteAccount procedure', () => {
value: {
tokens: null,
transactions: null,
transactionGroups: null,
portfolios: null,
},
},
Expand Down
2 changes: 2 additions & 0 deletions src/api/procedures/__tests__/modifySignerPermissions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ describe('modifySignerPermissions procedure', () => {
permissions: {
tokens: [],
transactions: [],
transactionGroups: [],
portfolios: [],
},
},
Expand Down Expand Up @@ -105,6 +106,7 @@ describe('modifySignerPermissions procedure', () => {
permissions: {
tokens: null,
transactions: null,
transactionGroups: [],
portfolios: null,
},
},
Expand Down
7 changes: 6 additions & 1 deletion src/api/procedures/__tests__/registerIdentity.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,12 @@ describe('registerIdentity procedure', () => {
const secondaryKeys = [
{
signer: new Identity({ did: 'someValue' }, mockContext),
permissions: { tokens: null, portfolios: null, transactions: null },
permissions: {
tokens: null,
portfolios: null,
transactions: null,
transactionGroups: null,
},
},
];
const args = {
Expand Down
2 changes: 2 additions & 0 deletions src/api/procedures/__tests__/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -275,6 +275,7 @@ describe('assertSecondaryKeys', () => {
permissions: {
tokens: null,
transactions: null,
transactionGroups: null,
portfolios: null,
},
},
Expand All @@ -295,6 +296,7 @@ describe('assertSecondaryKeys', () => {
permissions: {
tokens: null,
transactions: null,
transactionGroups: null,
portfolios: null,
},
},
Expand Down
1 change: 1 addition & 0 deletions src/api/procedures/inviteAccount.ts
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ export async function prepareInviteAccount(
let authorizationValue: Permissions = {
tokens: [],
transactions: [],
transactionGroups: [],
portfolios: [],
};

Expand Down
9 changes: 7 additions & 2 deletions src/base/__tests__/Context.ts
Original file line number Diff line number Diff line change
Expand Up @@ -767,11 +767,16 @@ describe('Context class', () => {
fakeResult = [
{
signer: identity,
permissions: { tokens: [], portfolios: [], transactions: [] },
permissions: { tokens: [], portfolios: [], transactions: [], transactionGroups: [] },
},
{
signer: account,
permissions: { tokens: null, portfolios: null, transactions: null },
permissions: {
tokens: null,
portfolios: null,
transactions: null,
transactionGroups: null,
},
},
];
});
Expand Down
61 changes: 59 additions & 2 deletions src/types/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -531,10 +531,19 @@ export interface Fees {
* of the Identity's Security Tokens)
*/
export interface Permissions {
/* list of Security Tokens over which this key has permissions */
/**
* list of Security Tokens over which this key has permissions
*/
tokens: SecurityToken[] | null;
/* list of Transactions this key can execute */
/**
* list of Transactions this key can execute
*/
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
*/
transactionGroups: TxGroup[] | null;
/* list of Portfolios over which this key has permissions */
portfolios: (DefaultPortfolio | NumberedPortfolio)[] | null;
}
Expand Down Expand Up @@ -614,14 +623,62 @@ export interface SecondaryKey {
permissions: Permissions;
}

/**
* Transaction Groups (for permissions purposes)
*/
export enum TxGroup {
/**
* - TxTags.identity.AddInvestorUniquenessClaim
* - TxTags.portfolio.MovePortfolioFunds
* - TxTags.settlement.AddInstruction
* - TxTags.settlement.AddAndAffirmInstruction
* - TxTags.settlement.RejectInstruction
* - TxTags.settlement.CreateVenue
*/
PortfolioManagement = 'PortfolioManagement',
/**
* - TxTags.asset.MakeDivisible
* - TxTags.asset.RenameAsset
* - TxTags.asset.SetFundingRound
* - TxTags.asset.AddDocuments
* - TxTags.asset.RemoveDocuments
*/
TokenManagement = 'TokenManagement',
/**
* - TxTags.asset.Freeze
* - TxTags.asset.Unfreeze
* - TxTags.identity.AddAuthorization
* - TxTags.identity.RemoveAuthorization
*/
AdvancedTokenManagement = 'AdvancedTokenManagement',
/**
* - TxTags.identity.AddInvestorUniquenessClaim
* - TxTags.settlement.CreateVenue
* - TxTags.settlement.AddInstruction
* - TxTags.settlement.AddAndAffirmInstruction
*/
Distribution = 'Distribution',
/**
* - TxTags.asset.Issue
*/
Issuance = 'Issuance',
/**
* - TxTags.complianceManager.AddDefaultTrustedClaimIssuer
* - TxTags.complianceManager.RemoveDefaultTrustedClaimIssuer
*/
TrustedClaimIssuersManagement = 'TrustedClaimIssuersManagement',
/**
* - TxTags.identity.AddClaim
* - TxTags.identity.RevokeClaim
*/
ClaimsManagement = 'ClaimsManagement',
/**
* - TxTags.complianceManager.AddComplianceRequirement
* - TxTags.complianceManager.RemoveComplianceRequirement
* - TxTags.complianceManager.PauseAssetCompliance
* - TxTags.complianceManager.ResumeAssetCompliance
* - TxTags.complianceManager.ResetAssetCompliance
*/
ComplianceRequirementsManagement = 'ComplianceRequirementsManagement',
}

Expand Down
2 changes: 1 addition & 1 deletion src/types/internal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,7 @@ export interface TransferRestriction {
}

export interface ProcedureAuthorization {
signerPermissions?: Permissions | boolean;
signerPermissions?: Omit<Permissions, 'transactionGroups'> | boolean;
identityRoles?: Role[] | boolean;
}

Expand Down

0 comments on commit f9bb557

Please sign in to comment.