Skip to content

Commit 3357ece

Browse files
authored
Improve Authz Relations Delete APIs (#484)
* feat: added deleteRelationsForIDs alias for deleteRelationsForResources and updated comments * feat(authz): added support for deleteResourceRelationsForResources and deleteAllRelations
1 parent 8e2f01d commit 3357ece

File tree

5 files changed

+110
-2
lines changed

5 files changed

+110
-2
lines changed

lib/management/authz.test.ts

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,64 @@ describe('Management Authz', () => {
325325
});
326326
});
327327

328+
describe('deleteResourceRelationsForResources', () => {
329+
it('should delete the relations for given resource', async () => {
330+
const httpResponse = {
331+
ok: true,
332+
json: () => {},
333+
clone: () => ({
334+
json: () => Promise.resolve({}),
335+
}),
336+
status: 200,
337+
};
338+
mockHttpClient.post.mockResolvedValue(httpResponse);
339+
340+
const resp: SdkResponse<never> = await management.authz.deleteResourceRelationsForResources([
341+
'x',
342+
]);
343+
344+
expect(mockHttpClient.post).toHaveBeenCalledWith(
345+
apiPaths.authz.reDeleteResourceRelationsForResources,
346+
{ resources: ['x'] },
347+
{ token: 'key' },
348+
);
349+
expect(resp).toEqual({
350+
code: 200,
351+
data: {},
352+
ok: true,
353+
response: httpResponse,
354+
});
355+
});
356+
});
357+
358+
describe('deleteRelationsForIDs', () => {
359+
it('should delete the relations for the given ids using the reDeleteResources API', async () => {
360+
const httpResponse = {
361+
ok: true,
362+
json: () => {},
363+
clone: () => ({
364+
json: () => Promise.resolve({}),
365+
}),
366+
status: 200,
367+
};
368+
mockHttpClient.post.mockResolvedValue(httpResponse);
369+
370+
const resp: SdkResponse<never> = await management.authz.deleteRelationsForIds(['x']);
371+
372+
expect(mockHttpClient.post).toHaveBeenCalledWith(
373+
apiPaths.authz.reDeleteResources,
374+
{ resources: ['x'] },
375+
{ token: 'key' },
376+
);
377+
expect(resp).toEqual({
378+
code: 200,
379+
data: {},
380+
ok: true,
381+
response: httpResponse,
382+
});
383+
});
384+
});
385+
328386
describe('deleteRelations', () => {
329387
it('should delete the relations', async () => {
330388
const httpResponse = {

lib/management/authz.ts

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,9 +141,11 @@ const WithAuthz = (sdk: CoreSdk, managementKey?: string) => ({
141141
sdk.httpClient.post(apiPaths.authz.reDelete, { relations }, { token: managementKey }),
142142
),
143143
/**
144-
* Delete the relations for the given resources.
144+
* @deprecated use `deleteRelationsForIds` instead for better clarity
145145
*
146-
* @param resources resources to delete relations for.
146+
* Delete any relations with matching resourceIds OR targetIds
147+
*
148+
* @param resources ids to delete relations for.
147149
* @returns standard success or failure response
148150
*/
149151
deleteRelationsForResources: (resources: string[]): Promise<SdkResponse<never>> =>
@@ -154,6 +156,35 @@ const WithAuthz = (sdk: CoreSdk, managementKey?: string) => ({
154156
{ token: managementKey },
155157
),
156158
),
159+
/**
160+
*
161+
* Delete any relations with matching resourceIds
162+
*
163+
* @param resources resource ids to delete relations for.
164+
* @returns
165+
*/
166+
deleteResourceRelationsForResources: (resources: string[]): Promise<SdkResponse<never>> =>
167+
transformResponse(
168+
sdk.httpClient.post(
169+
apiPaths.authz.reDeleteResourceRelationsForResources,
170+
{ resources },
171+
{ token: managementKey },
172+
),
173+
),
174+
/**
175+
* Delete any relations with matching resourceIds OR targetIds
176+
*
177+
* @param ids ids to delete relations for.
178+
* @returns standard success or failure response
179+
*/
180+
deleteRelationsForIds: (ids: string[]): Promise<SdkResponse<never>> =>
181+
transformResponse(
182+
sdk.httpClient.post(
183+
apiPaths.authz.reDeleteResources,
184+
{ resources: ids },
185+
{ token: managementKey },
186+
),
187+
),
157188
/**
158189
* Query relations to see what relations exists.
159190
*

lib/management/fga.test.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,16 @@ describe('Management FGA', () => {
9393
});
9494
});
9595

96+
describe('deleteAllRelations', () => {
97+
it('should delete all relations', async () => {
98+
const response = await WithFGA(mockCoreSdk).deleteAllRelations();
99+
expect(mockHttpClient.delete).toHaveBeenCalledWith(apiPaths.fga.relations, {
100+
token: undefined,
101+
});
102+
expect(response).toEqual(emptySuccessResponse);
103+
});
104+
});
105+
96106
describe('check', () => {
97107
it('should check the relations', async () => {
98108
const relations = [relation1, relation2];

lib/management/fga.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,14 @@ const WithFGA = (sdk: CoreSdk, managementKey?: string) => ({
6464
sdk.httpClient.post(apiPaths.fga.check, { tuples: relations }, { token: managementKey }),
6565
(data) => data.tuples,
6666
),
67+
68+
/**
69+
* Delete all relations.
70+
*
71+
* @returns standard success or failure response
72+
*/
73+
deleteAllRelations: (): Promise<SdkResponse<never>> =>
74+
transformResponse(sdk.httpClient.delete(apiPaths.fga.relations, { token: managementKey })),
6775
});
6876

6977
export default WithFGA;

lib/management/paths.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ export default {
146146
reCreate: '/v1/mgmt/authz/re/create',
147147
reDelete: '/v1/mgmt/authz/re/delete',
148148
reDeleteResources: '/v1/mgmt/authz/re/deleteresources',
149+
reDeleteResourceRelationsForResources: '/v1/mgmt/authz/re/deleteresourcesrelations',
149150
hasRelations: '/v1/mgmt/authz/re/has',
150151
who: '/v1/mgmt/authz/re/who',
151152
resource: '/v1/mgmt/authz/re/resource',

0 commit comments

Comments
 (0)