@mondaydotcomorg/monday-authorization 3.3.1 → 3.4.0-feature-bashanye-add-membership-create-delete-api-9ba3b16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +127 -2
- package/dist/authorization-service.js +1 -1
- package/dist/clients/graph-api.d.ts.map +1 -1
- package/dist/clients/graph-api.js +1 -1
- package/dist/esm/authorization-service.mjs +1 -1
- package/dist/esm/clients/graph-api.d.ts.map +1 -1
- package/dist/esm/clients/graph-api.mjs +1 -1
- package/dist/esm/index.d.ts +10 -6
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.mjs +15 -7
- package/dist/esm/memberships.d.ts +30 -0
- package/dist/esm/memberships.d.ts.map +1 -0
- package/dist/esm/memberships.mjs +98 -0
- package/dist/esm/metrics-service.d.ts +7 -4
- package/dist/esm/metrics-service.d.ts.map +1 -1
- package/dist/esm/metrics-service.mjs +34 -16
- package/dist/esm/types/memberships.d.ts +42 -0
- package/dist/esm/types/memberships.d.ts.map +1 -0
- package/dist/esm/types/memberships.mjs +1 -0
- package/dist/esm/utils/api-error-handler.d.ts +1 -1
- package/dist/esm/utils/api-error-handler.d.ts.map +1 -1
- package/dist/esm/utils/api-error-handler.mjs +4 -4
- package/dist/index.d.ts +10 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -7
- package/dist/memberships.d.ts +30 -0
- package/dist/memberships.d.ts.map +1 -0
- package/dist/memberships.js +100 -0
- package/dist/metrics-service.d.ts +7 -4
- package/dist/metrics-service.d.ts.map +1 -1
- package/dist/metrics-service.js +34 -16
- package/dist/types/memberships.d.ts +42 -0
- package/dist/types/memberships.d.ts.map +1 -0
- package/dist/types/memberships.js +1 -0
- package/dist/utils/api-error-handler.d.ts +1 -1
- package/dist/utils/api-error-handler.d.ts.map +1 -1
- package/dist/utils/api-error-handler.js +4 -4
- package/package.json +1 -1
- package/src/authorization-service.ts +1 -1
- package/src/clients/graph-api.ts +1 -1
- package/src/index.ts +25 -15
- package/src/memberships.ts +111 -0
- package/src/metrics-service.ts +50 -18
- package/src/types/memberships.ts +47 -0
- package/src/utils/api-error-handler.ts +9 -5
package/src/metrics-service.ts
CHANGED
|
@@ -1,29 +1,37 @@
|
|
|
1
1
|
import { Metric } from '@mondaydotcomorg/monday-observability-kit';
|
|
2
2
|
import { logger } from './authorization-internal-service';
|
|
3
3
|
|
|
4
|
-
type ApiType = 'platform' | 'graph';
|
|
4
|
+
type ApiType = 'platform' | 'graph' | 'authorization';
|
|
5
|
+
|
|
6
|
+
export type MetricsClient = Pick<typeof Metric, 'distribution' | 'increment'>;
|
|
5
7
|
|
|
6
8
|
interface InitializeMetricsOptions {
|
|
7
|
-
|
|
9
|
+
client?: MetricsClient;
|
|
10
|
+
serviceName?: string;
|
|
8
11
|
host?: string;
|
|
9
12
|
port?: number;
|
|
10
13
|
disabled?: boolean;
|
|
11
14
|
}
|
|
12
15
|
|
|
13
|
-
let
|
|
16
|
+
let metricsClient: MetricsClient | null = null;
|
|
14
17
|
|
|
15
18
|
export function initializeMetrics(options: InitializeMetricsOptions): void {
|
|
16
|
-
if (
|
|
19
|
+
if (metricsClient) {
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
if (options.client) {
|
|
24
|
+
metricsClient = options.client;
|
|
17
25
|
return;
|
|
18
26
|
}
|
|
19
27
|
|
|
20
28
|
const { serviceName } = options;
|
|
21
29
|
if (!serviceName) {
|
|
22
|
-
logger.warn({ tag: '
|
|
30
|
+
logger.warn({ tag: 'monday-authorization-sdk' }, 'Metrics initialization skipped: serviceName is missing');
|
|
23
31
|
return;
|
|
24
32
|
}
|
|
25
33
|
|
|
26
|
-
const resolvedHost = options.host ?? process.env.
|
|
34
|
+
const resolvedHost = options.host ?? process.env.HOST_IP ?? 'localhost';
|
|
27
35
|
const envPort = process.env.DOGSTATSD_PORT ? Number(process.env.DOGSTATSD_PORT) : undefined;
|
|
28
36
|
const resolvedPort = options.port ?? (Number.isFinite(envPort ?? NaN) ? envPort : undefined) ?? 8125;
|
|
29
37
|
const resolvedDisabled =
|
|
@@ -36,32 +44,56 @@ export function initializeMetrics(options: InitializeMetricsOptions): void {
|
|
|
36
44
|
port: resolvedPort,
|
|
37
45
|
disabled: resolvedDisabled,
|
|
38
46
|
});
|
|
39
|
-
|
|
47
|
+
metricsClient = Metric;
|
|
40
48
|
} catch (error) {
|
|
41
|
-
logger.warn({ tag: '
|
|
49
|
+
logger.warn({ tag: 'monday-authorization-sdk', error }, 'Failed to initialize metrics');
|
|
42
50
|
}
|
|
43
51
|
}
|
|
44
52
|
|
|
45
|
-
export function recordAuthorizationTiming(apiType: ApiType, duration: number): void {
|
|
46
|
-
if (!
|
|
53
|
+
export function recordAuthorizationTiming(apiType: ApiType, duration: number, placement: string): void {
|
|
54
|
+
if (!metricsClient) {
|
|
47
55
|
return;
|
|
48
56
|
}
|
|
49
57
|
|
|
50
58
|
try {
|
|
51
|
-
|
|
52
|
-
} catch {
|
|
53
|
-
|
|
59
|
+
metricsClient.distribution(`authorization.authorizationCheck.${apiType}.${placement}.duration`, duration);
|
|
60
|
+
} catch (error) {
|
|
61
|
+
logger.warn(
|
|
62
|
+
{
|
|
63
|
+
tag: 'monday-authorization-sdk',
|
|
64
|
+
metric: 'authorizationCheckDuration',
|
|
65
|
+
apiType,
|
|
66
|
+
placement,
|
|
67
|
+
duration,
|
|
68
|
+
error,
|
|
69
|
+
},
|
|
70
|
+
'Failed to emit authorization timing metric'
|
|
71
|
+
);
|
|
54
72
|
}
|
|
55
73
|
}
|
|
56
74
|
|
|
57
|
-
export function recordAuthorizationError(apiType: ApiType, statusCode: number): void {
|
|
58
|
-
if (!
|
|
75
|
+
export function recordAuthorizationError(apiType: ApiType, statusCode: number, placement: string): void {
|
|
76
|
+
if (!metricsClient) {
|
|
59
77
|
return;
|
|
60
78
|
}
|
|
61
79
|
|
|
62
80
|
try {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
81
|
+
metricsClient.increment(
|
|
82
|
+
`authorization.authorizationCheck.${apiType}.${placement}.error`,
|
|
83
|
+
{ statusCode: String(statusCode) },
|
|
84
|
+
1
|
|
85
|
+
);
|
|
86
|
+
} catch (error) {
|
|
87
|
+
logger.warn(
|
|
88
|
+
{
|
|
89
|
+
tag: 'monday-authorization-sdk',
|
|
90
|
+
metric: 'authorizationCheckError',
|
|
91
|
+
apiType,
|
|
92
|
+
placement,
|
|
93
|
+
statusCode,
|
|
94
|
+
error,
|
|
95
|
+
},
|
|
96
|
+
'Failed to emit authorization error metric'
|
|
97
|
+
);
|
|
66
98
|
}
|
|
67
99
|
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export interface MembershipForCreate {
|
|
2
|
+
entityId: number; // Which entity has the role?
|
|
3
|
+
entityType: string; // What type of entity is this?
|
|
4
|
+
resourceId: number; // What resource is this membership for?
|
|
5
|
+
resourceType: string; // What type of resource is this membership for?
|
|
6
|
+
roleId: number; // What role is this membership for?
|
|
7
|
+
roleType?: string; // What type of role is this membership for? (basic/custom)
|
|
8
|
+
addedById: number; // Who added this membership? for logging purposes
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export interface MembershipForDelete {
|
|
12
|
+
entityId?: number; // Which entity has the role?
|
|
13
|
+
entityType: string; // What type of entity is this?
|
|
14
|
+
resourceId?: number; // What resource is this membership for?
|
|
15
|
+
resourceType: string; // What type of resource is this membership for?
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface Membership {
|
|
19
|
+
id: number;
|
|
20
|
+
entityId: number;
|
|
21
|
+
entityType: string;
|
|
22
|
+
resourceId: number;
|
|
23
|
+
resourceType: string;
|
|
24
|
+
roleId: number;
|
|
25
|
+
roleType: string;
|
|
26
|
+
addedById: null | number | undefined;
|
|
27
|
+
hops: number;
|
|
28
|
+
isNewRecord: boolean;
|
|
29
|
+
previousValues: Partial<Membership>;
|
|
30
|
+
walVersion: number | null | undefined;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface MembershipCreateResponse {
|
|
34
|
+
memberships: Membership[];
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface MembershipDeleteResponse {
|
|
38
|
+
memberships: Membership[];
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export interface MembershipCreateRequest {
|
|
42
|
+
memberships: MembershipForCreate[];
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export interface MembershipDeleteRequest {
|
|
46
|
+
memberships: MembershipForDelete[];
|
|
47
|
+
}
|
|
@@ -2,20 +2,24 @@ import { HttpFetcherError } from '@mondaydotcomorg/monday-fetch-api';
|
|
|
2
2
|
import { AuthorizationInternalService, logger } from '../authorization-internal-service';
|
|
3
3
|
import { recordAuthorizationError } from '../metrics-service';
|
|
4
4
|
|
|
5
|
-
export function handleApiError(
|
|
5
|
+
export function handleApiError(
|
|
6
|
+
err: unknown,
|
|
7
|
+
apiType: 'platform' | 'graph' | 'authorization',
|
|
8
|
+
placement: string
|
|
9
|
+
): never {
|
|
6
10
|
if (err instanceof HttpFetcherError) {
|
|
7
11
|
logger.error(
|
|
8
12
|
{ tag: `${apiType}-api`, status: err.status, error: err.message },
|
|
9
|
-
`${apiType.charAt(0).toUpperCase() + apiType.slice(1)} API
|
|
13
|
+
`${apiType.charAt(0).toUpperCase() + apiType.slice(1)} API ${placement} request failed`
|
|
10
14
|
);
|
|
11
|
-
recordAuthorizationError(apiType, err.status);
|
|
15
|
+
recordAuthorizationError(apiType, err.status, placement);
|
|
12
16
|
AuthorizationInternalService.throwOnHttpError(err.status, placement);
|
|
13
17
|
} else {
|
|
14
18
|
logger.error(
|
|
15
19
|
{ tag: `${apiType}-api`, error: err instanceof Error ? err.message : String(err) },
|
|
16
|
-
`${apiType.charAt(0).toUpperCase() + apiType.slice(1)} API
|
|
20
|
+
`${apiType.charAt(0).toUpperCase() + apiType.slice(1)} API ${placement} request failed`
|
|
17
21
|
);
|
|
18
|
-
recordAuthorizationError(apiType, 500);
|
|
22
|
+
recordAuthorizationError(apiType, 500, placement);
|
|
19
23
|
throw err;
|
|
20
24
|
}
|
|
21
25
|
}
|