From 618694fecb843845c936fb7791f7bff55e6bc7fb Mon Sep 17 00:00:00 2001 From: trungnotchung Date: Fri, 15 Nov 2024 10:28:35 +0700 Subject: [PATCH] inject acl into add-win set --- .../blueprints/src/AccessControlList/index.ts | 4 +- packages/blueprints/src/AddWinsSet/index.ts | 37 ++++++++++++++++--- packages/object/src/constants.ts | 5 --- packages/object/src/hashgraph/index.ts | 6 +++ 4 files changed, 40 insertions(+), 12 deletions(-) delete mode 100644 packages/object/src/constants.ts diff --git a/packages/blueprints/src/AccessControlList/index.ts b/packages/blueprints/src/AccessControlList/index.ts index 3e56a34e..b2b261fd 100644 --- a/packages/blueprints/src/AccessControlList/index.ts +++ b/packages/blueprints/src/AccessControlList/index.ts @@ -3,17 +3,17 @@ import { type CRO, type Operation, type ResolveConflictsType, + Role, SemanticsType, type Vertex, } from "@topology-foundation/object"; -import { Role } from "@topology-foundation/object/src/constants.js"; export class ACL implements CRO { operations: string[] = ["grant", "revoke"]; roles: Map; semanticsType = SemanticsType.pair; - constructor(nodeIds: string[] | undefined) { + constructor(nodeIds?: string[] | undefined) { this.roles = new Map(); if (nodeIds) { for (const nodeId of nodeIds) { diff --git a/packages/blueprints/src/AddWinsSet/index.ts b/packages/blueprints/src/AddWinsSet/index.ts index 10dcc93a..11000452 100644 --- a/packages/blueprints/src/AddWinsSet/index.ts +++ b/packages/blueprints/src/AddWinsSet/index.ts @@ -6,14 +6,17 @@ import { SemanticsType, type Vertex, } from "@topology-foundation/object"; +import { ACL } from "../AccessControlList/index.js"; export class AddWinsSet implements CRO { - operations: string[] = ["add", "remove"]; + operations: string[] = ["add", "remove", "grant", "revoke"]; state: Map; semanticsType = SemanticsType.pair; + accessControlList: ACL; - constructor() { + constructor(nodeIds?: string[] | undefined) { this.state = new Map(); + this.accessControlList = new ACL(nodeIds); } private _add(value: T): void { @@ -51,9 +54,24 @@ export class AddWinsSet implements CRO { vertices[0].operation?.type !== vertices[1].operation?.type && vertices[0].operation?.value === vertices[1].operation?.value ) { - return vertices[0].operation.type === "add" - ? { action: ActionType.DropRight } - : { action: ActionType.DropLeft }; + const vertex0Type = + vertices[0].operation.type === "add" || + vertices[0].operation.type === "remove"; + const vertex1Type = + vertices[1].operation.type === "add" || + vertices[1].operation.type === "remove"; + + if (vertex0Type !== vertex1Type) { + return { action: ActionType.Nop }; + } + + if (vertex0Type) { + return vertices[0].operation.type === "add" + ? { action: ActionType.DropRight } + : { action: ActionType.DropLeft }; + } + + return this.accessControlList.resolveConflicts(vertices); } return { action: ActionType.Nop }; } @@ -61,6 +79,7 @@ export class AddWinsSet implements CRO { // merged at HG level and called as a callback mergeCallback(operations: Operation[]): void { this.state = new Map(); + const aclOperations: Operation[] = []; for (const op of operations) { switch (op.type) { case "add": @@ -69,9 +88,17 @@ export class AddWinsSet implements CRO { case "remove": if (op.value !== null) this._remove(op.value); break; + case "grant": + aclOperations.push(op); + break; + case "revoke": + aclOperations.push(op); + break; default: break; } } + + this.accessControlList.mergeCallback(aclOperations); } } diff --git a/packages/object/src/constants.ts b/packages/object/src/constants.ts deleted file mode 100644 index 14ddccb5..00000000 --- a/packages/object/src/constants.ts +++ /dev/null @@ -1,5 +0,0 @@ -export enum Role { - NONE = 0, - GUEST = 1, - ADMIN = 2, -} diff --git a/packages/object/src/hashgraph/index.ts b/packages/object/src/hashgraph/index.ts index ba269009..05115ead 100644 --- a/packages/object/src/hashgraph/index.ts +++ b/packages/object/src/hashgraph/index.ts @@ -25,6 +25,12 @@ export enum OperationType { NOP = "-1", } +export enum Role { + NONE = 0, + GUEST = 1, + ADMIN = 2, +} + export enum ActionType { DropLeft = 0, DropRight = 1,