Skip to content

Commit 7d5bd2e

Browse files
authored
Merge pull request #59 from warrant-dev/AddBatchCheckMethod
Add batch check method
2 parents abbb9a0 + b52c55d commit 7d5bd2e

File tree

3 files changed

+90
-34
lines changed

3 files changed

+90
-34
lines changed

src/modules/Authorization.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
import {
2+
BatchCheckParams,
23
Check,
4+
CheckOp,
35
CheckParams,
46
CheckManyParams,
7+
CheckResult,
58
FeatureCheckParams,
69
PermissionCheckParams,
710
checkWarrantParamsToCheckWarrant,
@@ -39,6 +42,16 @@ export default class Authorization {
3942
return this.makeCheckRequest(check, options);
4043
}
4144

45+
public static async batchCheck(checkParams: BatchCheckParams, options: WarrantRequestOptions = {}): Promise<boolean[]> {
46+
const check: Check = {
47+
op: CheckOp.Batch,
48+
warrants: checkParams.warrants.map((checkWarrantParams) => checkWarrantParamsToCheckWarrant(checkWarrantParams)),
49+
debug: checkParams.debug
50+
};
51+
52+
return this.makeBatchCheckRequest(check, options);
53+
}
54+
4255
public static async hasFeature(featureCheckParams: FeatureCheckParams, options: WarrantRequestOptions = {}): Promise<boolean> {
4356
return this.check({
4457
object: {
@@ -94,4 +107,14 @@ export default class Authorization {
94107
throw e;
95108
}
96109
}
110+
111+
private static async makeBatchCheckRequest(check: Check, options: WarrantRequestOptions = {}): Promise<boolean[]> {
112+
const response = await WarrantClient.httpClient.post({
113+
url: `/${API_VERSION}/check`,
114+
data: check,
115+
options,
116+
});
117+
118+
return response.map((checkResult: CheckResult) => checkResult.code === 200);
119+
}
97120
}

src/types/Check.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
export enum CheckOp {
1313
AllOf = "allOf",
1414
AnyOf = "anyOf",
15+
Batch = "batch",
1516
}
1617

1718
export interface CheckWarrantParams {
@@ -31,6 +32,11 @@ export interface CheckManyParams {
3132
debug?: boolean;
3233
}
3334

35+
export interface BatchCheckParams {
36+
warrants: CheckWarrantParams[];
37+
debug?: boolean;
38+
}
39+
3440
export interface FeatureCheckParams {
3541
featureId: string;
3642
subject: WarrantObject | Subject;
@@ -68,3 +74,9 @@ export function checkWarrantParamsToCheckWarrant(checkWarrantParams: CheckWarran
6874
context: checkWarrantParams.context
6975
}
7076
}
77+
78+
export interface CheckResult {
79+
code?: number;
80+
result: string;
81+
isImplicit: boolean;
82+
}

test/LiveTest.spec.ts

Lines changed: 55 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -391,7 +391,7 @@ describe.skip('Live Test', function () {
391391
await this.warrant.Permission.removePermissionFromRole(adminRole.roleId, createPermission.permissionId);
392392
await this.warrant.Role.removeRoleFromUser(adminUser.userId, adminRole.roleId);
393393

394-
adminUserHasPermission = await this.warrant.Authorization.hasPermission({ permissionId: "create-report", subject: adminUser });
394+
adminUserHasPermission = await this.warrant.Authorization.hasPermission({ permissionId: "create-report", subject: adminUser }, { warrantToken: "latest" });
395395
assert.strictEqual(adminUserHasPermission, false);
396396

397397
adminUserRolesList = await this.warrant.Role.listRolesForUser(adminUser.userId, { limit: 100 }, { warrantToken: "latest" });
@@ -678,23 +678,23 @@ describe.skip('Live Test', function () {
678678
});
679679
assert(warrant2.warrantToken);
680680

681-
const warrants1 = await this.warrant.Warrant.list({ limit: 1 });
681+
const warrants1 = await this.warrant.Warrant.list({ limit: 1 }, { warrantToken: "latest" });
682682
assert.strictEqual(warrants1.results.length, 1);
683683
assert.strictEqual(warrants1.results[0].objectType, "permission");
684684
assert.strictEqual(warrants1.results[0].objectId, "perm1");
685685
assert.strictEqual(warrants1.results[0].relation, "member");
686686
assert.strictEqual(warrants1.results[0].subject.objectType, "user");
687687
assert.strictEqual(warrants1.results[0].subject.objectId, user1.userId);
688688

689-
const warrants2 = await this.warrant.Warrant.list({ limit: 1, nextCursor: warrants1.nextCursor });
689+
const warrants2 = await this.warrant.Warrant.list({ limit: 1, nextCursor: warrants1.nextCursor }, { warrantToken: "latest" });
690690
assert.strictEqual(warrants2.results.length, 1);
691691
assert.strictEqual(warrants2.results[0].objectType, "permission");
692692
assert.strictEqual(warrants2.results[0].objectId, "perm1");
693693
assert.strictEqual(warrants2.results[0].relation, "member");
694694
assert.strictEqual(warrants2.results[0].subject.objectType, "user");
695695
assert.strictEqual(warrants2.results[0].subject.objectId, user2.userId);
696696

697-
const warrants3 = await this.warrant.Warrant.list({ subjectId: user1.userId });
697+
const warrants3 = await this.warrant.Warrant.list({ subjectId: user1.userId }, { warrantToken: "latest" });
698698
assert.strictEqual(warrants3.results.length, 1);
699699
assert.strictEqual(warrants3.results[0].objectType, "permission");
700700
assert.strictEqual(warrants3.results[0].objectId, "perm1");
@@ -712,7 +712,7 @@ describe.skip('Live Test', function () {
712712
assert.strictEqual(userHasPermission, true);
713713

714714
const query = `select permission where user:${user1.userId} is member`;
715-
const response = await this.warrant.Warrant.query(query);
715+
const response = await this.warrant.Warrant.query(query, { warrantToken: "latest" });
716716

717717
assert.strictEqual(response.results.length, 1);
718718
assert.strictEqual(response.results[0].objectType, "permission");
@@ -743,28 +743,29 @@ describe.skip('Live Test', function () {
743743
assert(warrantToken);
744744
});
745745

746-
it('batch create/delete warrants', async function () {
746+
it('batch create/delete/check warrants', async function () {
747747
const newUser = await this.warrant.User.create();
748748
const permission1 = await this.warrant.Permission.create({ permissionId: "perm1", meta: { name: "Permission 1", description: "Permission 1" }});
749749
const permission2 = await this.warrant.Permission.create({ permissionId: "perm2", meta: { name: "Permission 2", description: "Permission 2" }});
750750

751-
let userHasPermission1 = await this.warrant.Authorization.check({
752-
object: permission1,
753-
relation: "member",
754-
subject: newUser
755-
}, {
756-
warrantToken: "latest"
757-
});
758-
assert.strictEqual(userHasPermission1, false);
759-
760-
let userHasPermission2 = await this.warrant.Authorization.check({
761-
object: permission2,
762-
relation: "member",
763-
subject: newUser
751+
let userHasPermissions = await this.warrant.Authorization.batchCheck({
752+
warrants: [
753+
{
754+
object: permission1,
755+
relation: "member",
756+
subject: newUser
757+
},
758+
{
759+
object: permission2,
760+
relation: "member",
761+
subject: newUser
762+
}
763+
]
764764
}, {
765765
warrantToken: "latest"
766766
});
767-
assert.strictEqual(userHasPermission2, false);
767+
assert.strictEqual(userHasPermissions[0], false);
768+
assert.strictEqual(userHasPermissions[1], false);
768769

769770
const warrants = await this.warrant.Warrant.batchCreate([
770771
{
@@ -783,23 +784,24 @@ describe.skip('Live Test', function () {
783784
assert(warrant.warrantToken);
784785
}
785786

786-
userHasPermission1 = await this.warrant.Authorization.check({
787-
object: permission1,
788-
relation: "member",
789-
subject: newUser
787+
userHasPermissions = await this.warrant.Authorization.batchCheck({
788+
warrants: [
789+
{
790+
object: permission1,
791+
relation: "member",
792+
subject: newUser
793+
},
794+
{
795+
object: permission2,
796+
relation: "member",
797+
subject: newUser
798+
}
799+
]
790800
}, {
791801
warrantToken: "latest"
792802
});
793-
assert.strictEqual(userHasPermission1, true);
794-
795-
userHasPermission2 = await this.warrant.Authorization.check({
796-
object: permission2,
797-
relation: "member",
798-
subject: newUser
799-
}, {
800-
warrantToken: "latest"
801-
});
802-
assert.strictEqual(userHasPermission2, true);
803+
assert.strictEqual(userHasPermissions[0], true);
804+
assert.strictEqual(userHasPermissions[1], true);
803805

804806
let warrantToken = await this.warrant.Warrant.batchDelete([
805807
{
@@ -820,6 +822,25 @@ describe.skip('Live Test', function () {
820822
{ object: { objectType: "user", objectId: newUser.userId } },
821823
]);
822824
assert(warrantToken);
825+
826+
userHasPermissions = await this.warrant.Authorization.batchCheck({
827+
warrants: [
828+
{
829+
object: permission1,
830+
relation: "member",
831+
subject: newUser
832+
},
833+
{
834+
object: permission2,
835+
relation: "member",
836+
subject: newUser
837+
}
838+
]
839+
}, {
840+
warrantToken: "latest"
841+
});
842+
assert.strictEqual(userHasPermissions[0], false);
843+
assert.strictEqual(userHasPermissions[1], false);
823844
});
824845

825846
it('warrant with policy', async function () {

0 commit comments

Comments
 (0)