@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.
Files changed (45) hide show
  1. package/README.md +127 -2
  2. package/dist/authorization-service.js +1 -1
  3. package/dist/clients/graph-api.d.ts.map +1 -1
  4. package/dist/clients/graph-api.js +1 -1
  5. package/dist/esm/authorization-service.mjs +1 -1
  6. package/dist/esm/clients/graph-api.d.ts.map +1 -1
  7. package/dist/esm/clients/graph-api.mjs +1 -1
  8. package/dist/esm/index.d.ts +10 -6
  9. package/dist/esm/index.d.ts.map +1 -1
  10. package/dist/esm/index.mjs +15 -7
  11. package/dist/esm/memberships.d.ts +30 -0
  12. package/dist/esm/memberships.d.ts.map +1 -0
  13. package/dist/esm/memberships.mjs +98 -0
  14. package/dist/esm/metrics-service.d.ts +7 -4
  15. package/dist/esm/metrics-service.d.ts.map +1 -1
  16. package/dist/esm/metrics-service.mjs +34 -16
  17. package/dist/esm/types/memberships.d.ts +42 -0
  18. package/dist/esm/types/memberships.d.ts.map +1 -0
  19. package/dist/esm/types/memberships.mjs +1 -0
  20. package/dist/esm/utils/api-error-handler.d.ts +1 -1
  21. package/dist/esm/utils/api-error-handler.d.ts.map +1 -1
  22. package/dist/esm/utils/api-error-handler.mjs +4 -4
  23. package/dist/index.d.ts +10 -6
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +16 -7
  26. package/dist/memberships.d.ts +30 -0
  27. package/dist/memberships.d.ts.map +1 -0
  28. package/dist/memberships.js +100 -0
  29. package/dist/metrics-service.d.ts +7 -4
  30. package/dist/metrics-service.d.ts.map +1 -1
  31. package/dist/metrics-service.js +34 -16
  32. package/dist/types/memberships.d.ts +42 -0
  33. package/dist/types/memberships.d.ts.map +1 -0
  34. package/dist/types/memberships.js +1 -0
  35. package/dist/utils/api-error-handler.d.ts +1 -1
  36. package/dist/utils/api-error-handler.d.ts.map +1 -1
  37. package/dist/utils/api-error-handler.js +4 -4
  38. package/package.json +1 -1
  39. package/src/authorization-service.ts +1 -1
  40. package/src/clients/graph-api.ts +1 -1
  41. package/src/index.ts +25 -15
  42. package/src/memberships.ts +111 -0
  43. package/src/metrics-service.ts +50 -18
  44. package/src/types/memberships.ts +47 -0
  45. package/src/utils/api-error-handler.ts +9 -5
@@ -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
- serviceName: string;
9
+ client?: MetricsClient;
10
+ serviceName?: string;
8
11
  host?: string;
9
12
  port?: number;
10
13
  disabled?: boolean;
11
14
  }
12
15
 
13
- let initialized = false;
16
+ let metricsClient: MetricsClient | null = null;
14
17
 
15
18
  export function initializeMetrics(options: InitializeMetricsOptions): void {
16
- if (initialized) {
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: 'metrics-service' }, 'Metrics initialization skipped: serviceName is missing');
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.DOGSTATSD_HOST ?? 'localhost';
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
- initialized = true;
47
+ metricsClient = Metric;
40
48
  } catch (error) {
41
- logger.warn({ tag: 'metrics-service', error }, 'Failed to initialize metrics');
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 (!initialized) {
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
- Metric.distribution(`authorization.authorizationCheck.${apiType}.duration`, duration);
52
- } catch {
53
- // ignore metric emission failures
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 (!initialized) {
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
- Metric.increment(`authorization.authorizationCheck.${apiType}.error`, { statusCode: String(statusCode) }, 1);
64
- } catch {
65
- // ignore metric emission failures
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(err: unknown, apiType: 'platform' | 'graph', placement: string): never {
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 authorization request failed`
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 authorization request failed`
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
  }