@skedulo/pulse-solution-services 0.0.6 → 0.0.7

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 (69) hide show
  1. package/CHANGELOG.md +5 -1
  2. package/README.md +226 -3
  3. package/dist/clients/availability-api-client.js +1 -0
  4. package/dist/clients/geo-api-client.js +1 -0
  5. package/dist/constants/index.js +1 -1
  6. package/dist/constants/tenant-endpoints.js +1 -1
  7. package/dist/core/entity-factory.js +1 -0
  8. package/dist/core/execution-context.js +1 -1
  9. package/dist/core/index.js +1 -1
  10. package/dist/core/tenant-objects.js +1 -0
  11. package/dist/index.d.ts +469 -44
  12. package/dist/interfaces/geoservice-interfaces.js +1 -0
  13. package/dist/interfaces/index.js +1 -1
  14. package/dist/interfaces/resource-availability.js +1 -0
  15. package/dist/services/data-service.js +1 -0
  16. package/dist/services/geoservice.js +1 -0
  17. package/dist/services/graphql/graphql-query-builder.d.ts +11 -24
  18. package/dist/services/graphql/graphql-query-builder.js +1 -1
  19. package/dist/services/index.js +1 -1
  20. package/dist/services/resource-availability/builder/data-service.d.ts +9 -0
  21. package/dist/services/resource-availability/builder/data-service.js +1 -0
  22. package/dist/services/resource-availability/builder/index.d.ts +3 -0
  23. package/dist/services/resource-availability/builder/index.js +1 -0
  24. package/dist/services/resource-availability/builder/resource-availability-service.d.ts +8 -0
  25. package/dist/services/resource-availability/builder/resource-availability-service.js +1 -0
  26. package/dist/services/resource-availability/builder/resource-builder.d.ts +17 -0
  27. package/dist/services/resource-availability/builder/resource-builder.js +1 -0
  28. package/dist/services/resource-availability/builder/resource-query-param.d.ts +23 -0
  29. package/dist/services/resource-availability/builder/resource-query-param.js +1 -0
  30. package/dist/services/resource-availability/index.d.ts +2 -0
  31. package/dist/services/resource-availability/index.js +1 -0
  32. package/dist/services/resource-availability/object-factory.d.ts +13 -0
  33. package/dist/services/resource-availability/object-factory.js +1 -0
  34. package/dist/services/resource-availability/resource-availability-service.d.ts +7 -0
  35. package/dist/services/resource-availability/resource-availability-service.js +1 -0
  36. package/dist/services/resource-availability/resource-builder.d.ts +16 -0
  37. package/dist/services/resource-availability/resource-builder.js +1 -0
  38. package/dist/services/resource-availability/resource-query-service.d.ts +7 -0
  39. package/dist/services/resource-availability/resource-query-service.js +1 -0
  40. package/dist/services/resource-availability/resource-validator.d.ts +29 -0
  41. package/dist/services/resource-availability/resource-validator.js +1 -0
  42. package/dist/services/resource-availability/validator/index.d.ts +3 -0
  43. package/dist/services/resource-availability/validator/index.js +1 -0
  44. package/dist/services/resource-availability/validator/resource-job-validation.d.ts +11 -0
  45. package/dist/services/resource-availability/validator/resource-job-validation.js +1 -0
  46. package/dist/services/resource-availability/validator/resource-validation-option.d.ts +5 -0
  47. package/dist/services/resource-availability/validator/resource-validation-option.js +1 -0
  48. package/dist/services/resource-availability/validator/resource-validator.d.ts +13 -0
  49. package/dist/services/resource-availability/validator/resource-validator.js +1 -0
  50. package/dist/services/resource-availability/validator/validation-result.d.ts +12 -0
  51. package/dist/services/resource-availability/validator/validation-result.js +1 -0
  52. package/dist/utils/datetime-utils.js +1 -0
  53. package/dist/utils/index.js +1 -1
  54. package/package.json +4 -1
  55. package/yarn.lock +15 -0
  56. package/dist/clients/artifacts/artifact-client.d.ts +0 -19
  57. package/dist/clients/artifacts/artifact-client.js +0 -1
  58. package/dist/clients/artifacts/base-artifact-client.d.ts +0 -14
  59. package/dist/clients/artifacts/base-artifact-client.js +0 -1
  60. package/dist/clients/artifacts/object-based-artifact-client.d.ts +0 -11
  61. package/dist/clients/artifacts/object-based-artifact-client.js +0 -1
  62. package/dist/clients/custom-field-client.js +0 -1
  63. package/dist/clients/custom-schema-client.js +0 -1
  64. package/dist/constants/artifact.js +0 -1
  65. package/dist/constants/config-var.js +0 -1
  66. package/dist/constants/config-variable-constants.js +0 -1
  67. package/dist/constants/mobile-notification.js +0 -1
  68. /package/dist/{interfaces/custom-field.js → core/tenant-entities.js} +0 -0
  69. /package/dist/interfaces/{custom-schema.js → availability.js} +0 -0
package/CHANGELOG.md CHANGED
@@ -1,9 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## [v0.0.7] - 2025-02-13
4
+ ### Added
5
+ - Geo API Client, Geo Service, Resource Builder, Resource Validator
6
+
3
7
  ## [v0.0.6] - 2025-02-06
4
8
  ### Added
5
9
  - API Clients for Artifact, Vocabulary, Config Templates, and Org Preference, Notification APIs.
6
10
 
7
- ## [v0.0.5] - 2025-03-03
11
+ ## [v0.0.5] - 2025-02-03
8
12
  ### Initial Release
9
13
  - First version of the project.
package/README.md CHANGED
@@ -13,12 +13,17 @@
13
13
  - [Config Features (Feature Flags) Client](#config-features-feature-flags-client)
14
14
  - [Mobile Notification Client](#mobile-notification-client)
15
15
  - [Configuration Templates](#configuration-templates)
16
+ - [Geoservices Client](#geoservices-client)
16
17
  - [Artifact Client](#artifact-client)
17
18
  - [GraphQL Service](#graphql-service)
18
19
  - [Query Data](#query-data)
19
20
  - [Update Data](#update-data)
20
21
  - [Pagination with Offset](#pagination-with-offset)
21
22
  - [Pagination with Cursor](#pagination-with-cursor)
23
+ - [Resource Service](#resource-service)
24
+ - [Resource Builder](#resource-builder)
25
+ - [Resource Validator](#resource-validator)
26
+ - [GeoService](#geoservice)
22
27
  - [Batch Service](#batch-service)
23
28
  - [Cache Service](#cache-service)
24
29
  - [Logging Utils](#logging-utils)
@@ -48,9 +53,10 @@ const context = ExecutionContext.fromContext(skedToken);
48
53
  ```javascript
49
54
  const context = ExecutionContext.fromCredentials({
50
55
  apiServer: user.apiBasePath,
51
- apiToken: user.user.accessToken,
56
+ apiToken: user.accessToken,
52
57
  });
53
58
  ```
59
+ Once initialized, the context object provides access to the various services detailed in subsequent sections.
54
60
  ### API Clients
55
61
 
56
62
  #### Metadata Client
@@ -207,7 +213,7 @@ const result: Record<string,string> = await context.configTemplateClient.delete(
207
213
  **Template Values**
208
214
  ```javascript
209
215
  // Get template values
210
- const values: {result: ConfigValue[]} = await context.configTemplateClient.getTemmplateValues(templateId);
216
+ const values: ConfigValue[] = await context.configTemplateClient.getTemmplateValues(templateId);
211
217
 
212
218
  // Create a new template and values
213
219
  const newTemplate: ConfigTemplate = {
@@ -236,6 +242,73 @@ const newValues = await context.configTemplateClient.upsertTemplateValues(create
236
242
  console.log(JSON.stringify(newValues, null, 2));
237
243
  ```
238
244
 
245
+ #### Geo API Client
246
+ Provides access to geolocation-related services via the `/geoservices` endpoints.
247
+
248
+ ```javascript
249
+ // Calls /distanceMatrix endpoint to compute travel distance and time
250
+ const distanceMatrix: DistanceMatrixResponse = await context.geoAPIClient.getDistanceMatrix({
251
+ origins: [{ lat: 37.7749, lng: -122.4194 }],
252
+ destinations: [{ lat: 34.0522, lng: -118.2437 }],
253
+ avoid: ["highway"],
254
+ });
255
+
256
+ // Calls /directions endpoint to fetch directions between two locations
257
+ const directions: DirectionsResponse = await context.geoAPIClient.getDirections({
258
+ requests: [{
259
+ origin: { lat: 37.7749, lng: -122.4194 },
260
+ destination: { lat: 34.0522, lng: -118.2437 },
261
+ waypoints: [{ lat: 36.7783, lng: -119.4179 }],
262
+ avoid: ["toll"],
263
+ }],
264
+ });
265
+
266
+ // Calls /geocode endpoint to retrieve latitude and longitude for an address
267
+ const geocode: GeocodeResponse = await context.geoAPIClient.geocodeAddress({
268
+ addresses: ["1600 Amphitheatre Parkway, Mountain View, CA"],
269
+ });
270
+
271
+ // Calls /autocomplete endpoint to get address suggestions
272
+ const autocomplete = await context.geoAPIClient.autocompleteAddress({
273
+ input: "1600 Amphi",
274
+ sessionId: "unique-session-id",
275
+ location: { lat: 37.7749, lng: -122.4194 },
276
+ radius: 5000,
277
+ country: "US",
278
+ });
279
+
280
+ // Calls /place endpoint to fetch place details using a place ID
281
+ const placeDetails = await context.geoAPIClient.getPlaceDetails({
282
+ placeId: "ChIJ2eUgeAK6j4ARbn5u_wAGqWA",
283
+ sessionId: "unique-session-id",
284
+ });
285
+
286
+ // Calls /timezone endpoint to fetch timezone information for a location
287
+ const timezone: TimezoneResponse = await context.geoAPIClient.getTimezone({
288
+ location: [37.7749, -122.4194],
289
+ timestamp: Math.floor(Date.now() / 1000),
290
+ });
291
+ ```
292
+
293
+ #### Availability API Client
294
+ ```javascript
295
+ // Calls /availability/simple endpoint to retrieve availability for resources
296
+ const resourceAvailability: AvailabilityResult[] = await context.availabilityAPIClient.fetchAvailability({
297
+ resourceIds: ["resource_123", "resource_456"],
298
+ start: "2024-06-01T00:00:00Z",
299
+ end: "2024-06-02T00:00:00Z",
300
+ mergedAvailabilities: false, // Optional, defaults to false
301
+ entries: true // Optional, defaults to true
302
+ });
303
+
304
+ // Example: Accessing merged availability intervals
305
+ console.log(availability[0].mergedAvailabilities);
306
+
307
+ // Example: Accessing detailed availability entries
308
+ console.log(availability[0].entries);
309
+
310
+ ```
311
+
239
312
  #### Artifact Client
240
313
  The `ArtifactClient` provides a unified way to manage various artifact types.
241
314
  ```javascript
@@ -319,7 +392,7 @@ queryBuilder.withChildQuery('JobAllocations')
319
392
  // Add a parent query for Primary Region
320
393
  queryBuilder.withParentQuery('PrimaryRegion')
321
394
  .withFields(['UID', 'Name']);
322
- // Finally, execute the query via your GraphQL service
395
+ // Finally, execute the query
323
396
  let queryResult = await queryBuilder.execute();
324
397
 
325
398
  console.log(queryResult.records);
@@ -353,6 +426,156 @@ while(queryResult.pageInfo.hasNextPage) {
353
426
  }
354
427
  ```
355
428
 
429
+ ### Resource Service
430
+ The Resource Service consists of two main components:
431
+
432
+ - **Resource Builder**: Retrieves resource information, including availability, scheduled jobs, activities, tags, etc
433
+ - **Resource Validator**: Validates which resources are available for which jobs based on given conditions.
434
+
435
+ #### Resource Builder
436
+
437
+ The Resource Builder retrieves resource data, including availability, activities, scheduled jobs, tags, and other relevant details. By default, it enables the following options: `useTag`, `useJobAllocation`, `useResourceShift`, `useActivity`, `useAvailabilityPattern`, and `useHoliday`, with a time range set to 14 days from the current time.
438
+
439
+ **Usage**
440
+ ```javascript
441
+ // Define query parameters for resource fetching
442
+ const params = new ResourceQueryParam();
443
+ params.regionIds = new Set(['<region_id>']);
444
+ // Override default values
445
+ params.useTag = false;
446
+ params.startTime = new Date();
447
+ params.endTime = new Date(new Date().getTime() + 7 * 24 * 60 * 60 * 1000);// next 7 days from now
448
+
449
+ // Build resources with the given parameters
450
+ const resources = await context.resourceBuilder.build(params);
451
+ console.log(resources);
452
+ ```
453
+
454
+ #### Resource Validator
455
+ The Resource Validator takes a list of resources and jobs, and determines which resources are qualified to perform the jobs based on:
456
+
457
+ - Availability: Is the resource available during the job's timeframe?
458
+ - Conflict Detection: Does the resource already have conflicting events (e.g., another job, activity, or time-off)?
459
+ - Tag Matching: Does the resource have the required skills for the job?
460
+
461
+ **Usage**
462
+ ```javascript
463
+ // Fetch jobs using GraphQL
464
+ const jobQueryResult = await context
465
+ .newQueryBuilder(TenantObjects.Jobs.Name)
466
+ .withLimit(2)
467
+ .withFields(TenantObjects.Jobs.Fields)
468
+ .execute();
469
+
470
+ // Convert raw job data into structured Job entities
471
+ const jobs: Job[] = jobQueryResult.records.map((job) => EntityFactory.createJob(job));
472
+
473
+ // Define validation options
474
+ const validationOptions = {
475
+ checkAvailability: true, // Check if the resource is available
476
+ checkConflict: true, // Check for conflicting events
477
+ checkTag: true // Check if the resource has the required skills
478
+ };
479
+
480
+ // Create a validator instance
481
+ const validator = new ResourceValidator(validationOptions);
482
+
483
+ // Run validation
484
+ const result: ValidationResult = validator.validate(resources, jobs);
485
+
486
+ // Output results
487
+ console.log(JSON.stringify(result, null, 2));
488
+
489
+ const resourcesQualifiedForAtleastOneJob = result.getQualifiedResources();
490
+ const jobsWithAtLeastXQualifiedResources = result.getJobsWithXQualifiedResources(2);
491
+ const unqualifiedJobsWithReasons = result.getUnqualifiedJobsWithReasons();
492
+ ```
493
+ **Validation Output**
494
+ The Resource Validator returns a structured JSON output indicating which resources are qualified, and the reasons why certain jobs are not assigned. The results can be formatted to present a clearer qualification status along with detailed reasons.
495
+ ```javascript
496
+ console.log(JSON.stringify(result.format(), null, 2));
497
+
498
+ /*
499
+ [
500
+ {
501
+ "resource": {
502
+ "id": "0005fcae-3c63-46c0-8533-b2e154c25040",
503
+ "name": "Tracey Rodriguez"
504
+ },
505
+ "job": {
506
+ "id": "00143a8e-7958-4df1-8ade-767b19e9aff8",
507
+ "name": "JOB-71777"
508
+ },
509
+ "qualificationStatus": "Qualified",
510
+ "reasons": []
511
+ },
512
+ {
513
+ "resource": {
514
+ "id": "0005fcae-3c63-46c0-8533-b2e154c25040",
515
+ "name": "Tracey Rodriguez"
516
+ },
517
+ "job": {
518
+ "id": "0014bfb0-2993-4d6a-ad25-ed5d9c79de14",
519
+ "name": "JOB-71743"
520
+ },
521
+ "qualificationStatus": "Not Qualified",
522
+ "reasons": [
523
+ {
524
+ "reason": "Conflict Detected",
525
+ "conflictingEvents": [
526
+ {
527
+ "id": "2025-02-13T14:00:00.000Z_2025-02-14T14:00:00.000Z",
528
+ "name": "Regional Holiday",
529
+ "eventType": "holiday"
530
+ }
531
+ ]
532
+ }
533
+ ]
534
+ }
535
+ ]
536
+ */
537
+ ```
538
+
539
+ ### GeoService
540
+ Provides a high-level interface for geolocation-related operations, built on top of `GeoAPIClient`.
541
+
542
+ **Get Distance Matrix**
543
+ Computes travel distance and duration between origins and destinations. Handles cases where no route is available.
544
+ ```javascript
545
+ const origins = [{ lat: 55.93, lng: -3.118 }, { lat: 50.087, lng: 14.421 }];
546
+ const destinations = [{ lat: 50.087, lng: 14.421 }, { lat: 0, lng: 0 }];
547
+
548
+ const distanceMatrix: Map<string, DistanceMatrixEntry> = await context.geoService.getDistanceMatrix(origins, destinations);
549
+
550
+ for(const origin of origins) {
551
+ for(const destination of destinations) {
552
+ const key = context.geoService.createKey(origin, destination);
553
+ const entry = distanceMatrix.get(key);
554
+ console.log(`Origin-Destination: ${key} - Status: ${entry?.status}`);
555
+ if(entry?.status === "OK") {
556
+ console.log(`Distance: ${entry?.distance?.distanceInMeters} meters`);
557
+ console.log(`Duration: ${entry?.duration?.durationInSeconds} seconds`);
558
+ }
559
+ }
560
+ }
561
+ ```
562
+
563
+ **Get Address Suggestions**
564
+ Fetches address autocomplete suggestions and retrieves detailed place information.
565
+ ```javascript
566
+ const input = "1600 Amphitheatre Pkwy";
567
+ const suggestions: PlaceResponse[]|null = await context.geoService.getAddressSuggestions({ input, country: 'US' }, 2);
568
+
569
+ if (suggestions) {
570
+ suggestions.forEach((place, index) => {
571
+ console.log(`Place ${index + 1}: ${place.formattedAddress}`);
572
+ console.log(`Latitude: ${place.geometry.lat}, Longitude: ${place.geometry.lng}`);
573
+ });
574
+ } else {
575
+ console.log("No place details found.");
576
+ }
577
+ ```
578
+
356
579
  ### Batch Service
357
580
  The Batch Service offers a flexible and scalable solution for large-scale data processing.
358
581
  ```javascript
@@ -0,0 +1 @@
1
+ "use strict";var __awaiter=this&&this.__awaiter||function(e,t,i,n){return new(i||(i=Promise))((function(r,s){function a(e){try{l(n.next(e))}catch(e){s(e)}}function o(e){try{l(n.throw(e))}catch(e){s(e)}}function l(e){var t;e.done?r(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(a,o)}l((n=n.apply(e,t||[])).next())}))};Object.defineProperty(exports,"__esModule",{value:!0}),exports.AvailabilityAPIClient=void 0;const constants_1=require("../constants"),base_client_1=require("./base-client");class AvailabilityAPIClient extends base_client_1.BaseClient{fetchAvailability(e){return __awaiter(this,void 0,void 0,(function*(){var t,i,n,r;if(!e.resourceIds.length)throw new Error("At least one resource ID must be provided.");const s={resource_ids:e.resourceIds.join(","),start:e.start,end:e.end,mergedAvailabilities:null!==(i=null===(t=e.mergedAvailabilities)||void 0===t?void 0:t.toString())&&void 0!==i?i:"false",entries:null!==(r=null===(n=e.entries)||void 0===n?void 0:n.toString())&&void 0!==r?r:"true"};return yield this.performRequest({endpoint:constants_1.TENANT_ENDPOINTS.AVAILABILITY.SIMPLE,queryParams:s})}))}}exports.AvailabilityAPIClient=AvailabilityAPIClient;
@@ -0,0 +1 @@
1
+ "use strict";var __awaiter=this&&this.__awaiter||function(t,e,n,o){return new(n||(n=Promise))((function(i,s){function r(t){try{c(o.next(t))}catch(t){s(t)}}function a(t){try{c(o.throw(t))}catch(t){s(t)}}function c(t){var e;t.done?i(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(r,a)}c((o=o.apply(t,e||[])).next())}))};Object.defineProperty(exports,"__esModule",{value:!0}),exports.GeoAPIClient=void 0;const constants_1=require("../constants"),base_client_1=require("./base-client");class GeoAPIClient extends base_client_1.BaseClient{getDistanceMatrix(t){return __awaiter(this,void 0,void 0,(function*(){return this.performRequest({method:constants_1.HttpMethod.POST,endpoint:constants_1.TENANT_ENDPOINTS.GEOSERVICES.DISTANCE_MATRIX,body:t})}))}getDirections(t){return __awaiter(this,void 0,void 0,(function*(){return this.performRequest({method:constants_1.HttpMethod.POST,endpoint:constants_1.TENANT_ENDPOINTS.GEOSERVICES.DIRECTIONS,body:t})}))}geocodeAddress(t){return __awaiter(this,void 0,void 0,(function*(){return this.performRequest({method:constants_1.HttpMethod.POST,endpoint:constants_1.TENANT_ENDPOINTS.GEOSERVICES.GEOCODE,body:t})}))}autocompleteAddress(t){return __awaiter(this,void 0,void 0,(function*(){return this.performRequest({method:constants_1.HttpMethod.POST,endpoint:constants_1.TENANT_ENDPOINTS.GEOSERVICES.AUTOCOMPLETE,body:t})}))}getPlaceDetails(t){return __awaiter(this,void 0,void 0,(function*(){return this.performRequest({method:constants_1.HttpMethod.POST,endpoint:constants_1.TENANT_ENDPOINTS.GEOSERVICES.PLACE,body:t})}))}getTimezone(t){return __awaiter(this,void 0,void 0,(function*(){return this.performRequest({method:constants_1.HttpMethod.GET,endpoint:constants_1.TENANT_ENDPOINTS.GEOSERVICES.TIMEZONE,queryParams:{location:t.location.join(","),timestamp:t.timestamp.toString()}})}))}}exports.GeoAPIClient=GeoAPIClient;
@@ -1 +1 @@
1
- "use strict";var __createBinding=this&&this.__createBinding||(Object.create?function(t,e,r,o){void 0===o&&(o=r);var n=Object.getOwnPropertyDescriptor(e,r);n&&!("get"in n?!e.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,o,n)}:function(t,e,r,o){void 0===o&&(o=r),t[o]=e[r]}),__exportStar=this&&this.__exportStar||function(t,e){for(var r in t)"default"===r||Object.prototype.hasOwnProperty.call(e,r)||__createBinding(e,t,r)};Object.defineProperty(exports,"__esModule",{value:!0}),__exportStar(require("./artifact-constants"),exports),__exportStar(require("./config-var-constants"),exports),__exportStar(require("./http"),exports),__exportStar(require("./mobile-notification-constants"),exports),__exportStar(require("./tenant-endpoints"),exports),__exportStar(require("./tenant-objects"),exports);
1
+ "use strict";var __createBinding=this&&this.__createBinding||(Object.create?function(t,e,r,o){void 0===o&&(o=r);var i=Object.getOwnPropertyDescriptor(e,r);i&&!("get"in i?!e.__esModule:i.writable||i.configurable)||(i={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,o,i)}:function(t,e,r,o){void 0===o&&(o=r),t[o]=e[r]}),__exportStar=this&&this.__exportStar||function(t,e){for(var r in t)"default"===r||Object.prototype.hasOwnProperty.call(e,r)||__createBinding(e,t,r)};Object.defineProperty(exports,"__esModule",{value:!0}),__exportStar(require("./artifact-constants"),exports),__exportStar(require("./config-var-constants"),exports),__exportStar(require("./http"),exports),__exportStar(require("./mobile-notification-constants"),exports),__exportStar(require("./tenant-endpoints"),exports);
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.TENANT_ENDPOINTS=void 0,exports.TENANT_ENDPOINTS={CONFIG_VAR:{CREATE:"configuration/extension",GET:t=>`configuration/extension/${t}`,UPDATE:t=>`configuration/extension/${t}`,DELETE:t=>`configuration/extension/${t}`,SEARCH:"configuration/extension/search"},GRAPHQL:"graphql/graphql",METADATA:{ALL:"custom/metadata",OBJECT:t=>`custom/metadata/${t}`},ORG_PREFERENCE:{GET:"config/org_preference",UPDATE:"config/org_preference"},CONFIG_TEMPLATE:{GET_TEMPLATES:t=>`config/templates/${t}`,GET_VALUES:t=>`config/template/${t}/values`,UPDATE_VALUES:t=>`config/template/${t}/values`,CREATE:"config/template",DELETE:t=>`config/template/${t}`},CONFIG_FEATURES:{GET:"config/features",UPDATE:t=>`config/features/${t}`},VOCABULARY:{GET_ITEMS:(t,o)=>`custom/vocabulary/${t}/${o}`,ADD_ITEM:(t,o)=>`custom/vocabulary/${t}/${o}`,UPDATE_ITEM:(t,o,i)=>`custom/vocabulary/${t}/${o}/${i}`},NOTIFICATIONS:{GET_TEMPLATES:"notifications/v2/templates",DELETE_TEMPLATE:(t,o)=>`notifications/v2/template/${t}/${o}`,SET_TEMPLATE:(t,o)=>`notifications/v2/template/${t}/${o}`,DISPATCH:"notifications/dispatch",NOTIFY:"notifications/notify",NOTIFY_CANCEL:"notifications/notify_cancel",ONE_OFF:"notifications/oneoff",SEND_SMS:"notifications/sms",SMS_CONFIRMATION_REQUEST:"notifications/sms/confirmation_request"}};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.TENANT_ENDPOINTS=void 0,exports.TENANT_ENDPOINTS={CONFIG_VAR:{CREATE:"configuration/extension",GET:e=>`configuration/extension/${e}`,UPDATE:e=>`configuration/extension/${e}`,DELETE:e=>`configuration/extension/${e}`,SEARCH:"configuration/extension/search"},GRAPHQL:"graphql/graphql",METADATA:{ALL:"custom/metadata",OBJECT:e=>`custom/metadata/${e}`},ORG_PREFERENCE:{GET:"config/org_preference",UPDATE:"config/org_preference"},CONFIG_TEMPLATE:{GET_TEMPLATES:e=>`config/templates/${e}`,GET_VALUES:e=>`config/template/${e}/values`,UPDATE_VALUES:e=>`config/template/${e}/values`,CREATE:"config/template",DELETE:e=>`config/template/${e}`},CONFIG_FEATURES:{GET:"config/features",UPDATE:e=>`config/features/${e}`},VOCABULARY:{GET_ITEMS:(e,o)=>`custom/vocabulary/${e}/${o}`,ADD_ITEM:(e,o)=>`custom/vocabulary/${e}/${o}`,UPDATE_ITEM:(e,o,i)=>`custom/vocabulary/${e}/${o}/${i}`},NOTIFICATIONS:{GET_TEMPLATES:"notifications/v2/templates",DELETE_TEMPLATE:(e,o)=>`notifications/v2/template/${e}/${o}`,SET_TEMPLATE:(e,o)=>`notifications/v2/template/${e}/${o}`,DISPATCH:"notifications/dispatch",NOTIFY:"notifications/notify",NOTIFY_CANCEL:"notifications/notify_cancel",ONE_OFF:"notifications/oneoff",SEND_SMS:"notifications/sms",SMS_CONFIRMATION_REQUEST:"notifications/sms/confirmation_request"},GEOSERVICES:{DISTANCE_MATRIX:"geoservices/distanceMatrix",DIRECTIONS:"geoservices/directions",GEOCODE:"geoservices/geocode",AUTOCOMPLETE:"geoservices/autocomplete",PLACE:"geoservices/place",TIMEZONE:"geoservices/timezone"},AVAILABILITY:{SIMPLE:"availability/simple"}};
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.EntityFactory=void 0;class EntityFactory{static createBaseObject(e){return{id:e.UID||"",name:e.Name||"",propertyMap:{}}}static createBaseEvent(e){const t=e.Finish?e.Finish:e.End;return Object.assign(Object.assign({},this.createBaseObject(e)),{start:new Date(e.Start),finish:new Date(t),eventType:e.Type||""})}static createTag(e){return this.createBaseObject(e)}static createResource(e){var t;return Object.assign(Object.assign({},this.createBaseObject(e)),{category:e.Category||"",employmentType:e.EmploymentType||"",resourceType:e.ResourceType||"",userId:e.UserId||"",regionId:e.PrimaryRegionId||"",timezone:(null===(t=e.PrimaryRegion)||void 0===t?void 0:t.Timezone)||"",tags:(e.ResourceTags||[]).map((e=>this.createTag(e.Tag))),availabilities:[],events:[]})}static createJob(e){return Object.assign(Object.assign({},this.createBaseEvent(e)),{jobStatus:e.JobStatus||"",regionId:e.RegionId||"",contactId:e.ContactId||"",geoLocation:e.GeoLocation||{lat:e.GeoLatitude,lng:e.GeoLongitude},address:e.Address,eventType:"job",tags:(e.JobTags||[]).map((e=>this.createTag(e.Tag)))})}static createAvailability(e){return Object.assign(Object.assign({},this.createBaseEvent(e)),{resourceId:e.resourceId||"",isAvailable:!0===e.isAvailable||"true"===e.isAvailable,status:e.status||"",availabilityType:e.availabilityType||""})}static createActivity(e){return Object.assign(Object.assign({},this.createBaseEvent(e)),{resourceId:e.resourceId||"",activityType:e.activityType||""})}static createJobAllocation(e){return Object.assign(Object.assign({},this.createBaseEvent(e)),{jobId:e.jobId||"",resourceId:e.resourceId||"",status:e.status||""})}static createResourceShift(e){return Object.assign(Object.assign({},this.createBaseEvent(e)),{resourceId:e.resourceId||"",shift:this.createShift(e.shift||{})})}static createShift(e){return Object.assign(Object.assign({},this.createBaseEvent(e)),{regionId:e.regionId||"",displayName:e.displayName||"",isDraft:!0===e.isDraft||"true"===e.isDraft})}}exports.EntityFactory=EntityFactory;
@@ -1 +1 @@
1
- "use strict";var __importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.ExecutionContext=void 0;const function_utilities_1=require("@skedulo/function-utilities"),artifact_client_1=require("../clients/artifact-client"),config_features_client_1=require("../clients/config-features-client"),config_template_client_1=require("../clients/config-template-client"),config_var_client_1=require("../clients/config-var-client"),graphql_client_1=require("../clients/graphql-client"),metadata_client_1=require("../clients/metadata-client"),mobile_notification_client_1=require("../clients/mobile-notification-client"),org_preference_client_1=require("../clients/org-preference-client"),vocabulary_client_1=require("../clients/vocabulary-client"),logger_1=__importDefault(require("../logging/logger")),cache_service_1=require("../services/cache/cache-service"),storage_1=require("../services/cache/storage"),graphql_1=require("../services/graphql"),metadata_service_1=require("../services/metadata-service"),utils_1=require("../utils");class ExecutionContext{constructor(e){this.logger=logger_1.default,this.services=new Map,this.skedContext=e,this.contextData={},this.baseConfig={apiToken:e.auth.token,apiServer:e.auth.baseUrl}}static fromContext(e){return new ExecutionContext(e)}static fromCredentials(e){const t={Authorization:`Bearer ${e.apiToken}`,"sked-api-server":e.apiServer},i=(0,function_utilities_1.createSkedContext)(t),r=new ExecutionContext(i);return r.baseConfig=Object.assign(Object.assign({},e),r.baseConfig),r}getOrCreateService(e,t){return this.services.has(e)||this.services.set(e,t()),this.services.get(e)}get configHelper(){return this.getOrCreateService("configHelper",(()=>new utils_1.ConfigHelper(this.skedContext.configVars)))}get graphqlClient(){return this.getOrCreateService("graphqlClient",(()=>new graphql_client_1.GraphQLClient(this.baseConfig)))}get graphqlService(){return this.getOrCreateService("graphqlService",(()=>new graphql_1.GraphQLService(this.graphqlClient)))}get metadataClient(){return this.getOrCreateService("metadataClient",(()=>new metadata_client_1.MetadataClient(this.baseConfig)))}get metadataService(){return this.getOrCreateService("metadataService",(()=>new metadata_service_1.MetadataService(this.metadataClient)))}get vocabularyClient(){return this.getOrCreateService("vocabularyClient",(()=>new vocabulary_client_1.VocabularyClient(this.baseConfig)))}get orgPreferencesClient(){return this.getOrCreateService("orgPreferencesClient",(()=>new org_preference_client_1.OrgPreferenceClient(this.baseConfig)))}get configTemplateClient(){return this.getOrCreateService("configTemplateClient",(()=>new config_template_client_1.ConfigTemplateClient(this.baseConfig)))}get configFeaturesClient(){return this.getOrCreateService("configFeaturesClient",(()=>new config_features_client_1.ConfigFeaturesClient(this.baseConfig)))}get configVarClient(){return this.getOrCreateService("configVarClient",(()=>new config_var_client_1.ConfigVarClient(this.baseConfig)))}get mobileNotificationClient(){return this.getOrCreateService("mobileNotificationClient",(()=>new mobile_notification_client_1.MobileNotificationClient(this.baseConfig)))}get configVarCache(){return this.getOrCreateService("configVarCache",(()=>new cache_service_1.CacheService(new storage_1.ConfigVarCacheStorage(this.configVarClient))))}get inMemoryCache(){return this.getOrCreateService("inMemoryCache",(()=>{const e=new cache_service_1.CacheService(new storage_1.InMemoryCacheStorage);return e.setSecondaryCache(this.configVarCache),e}))}newQueryBuilder(e){const t=new graphql_1.GraphQLQueryBuilder(e);return t.setGraphqlService(this.graphqlService),t}newArtifactClient(e){return this.getOrCreateService(`${e}Client`,(()=>new artifact_client_1.ArtifactClient(this.baseConfig,e)))}dispose(){this.services.clear()}}exports.ExecutionContext=ExecutionContext;
1
+ "use strict";var __importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.ExecutionContext=void 0;const function_utilities_1=require("@skedulo/function-utilities"),artifact_client_1=require("../clients/artifact-client"),availability_api_client_1=require("../clients/availability-api-client"),config_features_client_1=require("../clients/config-features-client"),config_template_client_1=require("../clients/config-template-client"),config_var_client_1=require("../clients/config-var-client"),geo_api_client_1=require("../clients/geo-api-client"),graphql_client_1=require("../clients/graphql-client"),metadata_client_1=require("../clients/metadata-client"),mobile_notification_client_1=require("../clients/mobile-notification-client"),org_preference_client_1=require("../clients/org-preference-client"),vocabulary_client_1=require("../clients/vocabulary-client"),logger_1=__importDefault(require("../logging/logger")),cache_service_1=require("../services/cache/cache-service"),storage_1=require("../services/cache/storage"),geoservice_1=require("../services/geoservice"),graphql_1=require("../services/graphql"),metadata_service_1=require("../services/metadata-service"),data_service_1=require("../services/resource-availability/builder/data-service"),resource_availability_service_1=require("../services/resource-availability/builder/resource-availability-service"),resource_builder_1=require("../services/resource-availability/builder/resource-builder"),utils_1=require("../utils");class ExecutionContext{constructor(e){this.logger=logger_1.default,this.services=new Map,this.skedContext=e,this.contextData={},this.baseConfig={apiToken:e.auth.token,apiServer:e.auth.baseUrl}}static fromContext(e){return new ExecutionContext(e)}static fromCredentials(e){const i={Authorization:`Bearer ${e.apiToken}`,"sked-api-server":e.apiServer},t=(0,function_utilities_1.createSkedContext)(i),r=new ExecutionContext(t);return r.baseConfig=Object.assign(Object.assign({},e),r.baseConfig),r}getOrCreateService(e,i){return this.services.has(e)||this.services.set(e,i()),this.services.get(e)}get configHelper(){return this.getOrCreateService("configHelper",(()=>new utils_1.ConfigHelper(this.skedContext.configVars)))}get graphqlClient(){return this.getOrCreateService("graphqlClient",(()=>new graphql_client_1.GraphQLClient(this.baseConfig)))}get graphqlService(){return this.getOrCreateService("graphqlService",(()=>new graphql_1.GraphQLService(this.graphqlClient)))}get metadataClient(){return this.getOrCreateService("metadataClient",(()=>new metadata_client_1.MetadataClient(this.baseConfig)))}get metadataService(){return this.getOrCreateService("metadataService",(()=>new metadata_service_1.MetadataService(this.metadataClient)))}get vocabularyClient(){return this.getOrCreateService("vocabularyClient",(()=>new vocabulary_client_1.VocabularyClient(this.baseConfig)))}get orgPreferencesClient(){return this.getOrCreateService("orgPreferencesClient",(()=>new org_preference_client_1.OrgPreferenceClient(this.baseConfig)))}get configTemplateClient(){return this.getOrCreateService("configTemplateClient",(()=>new config_template_client_1.ConfigTemplateClient(this.baseConfig)))}get configFeaturesClient(){return this.getOrCreateService("configFeaturesClient",(()=>new config_features_client_1.ConfigFeaturesClient(this.baseConfig)))}get configVarClient(){return this.getOrCreateService("configVarClient",(()=>new config_var_client_1.ConfigVarClient(this.baseConfig)))}get mobileNotificationClient(){return this.getOrCreateService("mobileNotificationClient",(()=>new mobile_notification_client_1.MobileNotificationClient(this.baseConfig)))}get geoAPIClient(){return this.getOrCreateService("geoAPIClient",(()=>new geo_api_client_1.GeoAPIClient(this.baseConfig)))}get availabilityAPIClient(){return this.getOrCreateService("availabilityAPIClient",(()=>new availability_api_client_1.AvailabilityAPIClient(this.baseConfig)))}get geoService(){return this.getOrCreateService("geoService",(()=>new geoservice_1.GeoService(this.geoAPIClient)))}get configVarCache(){return this.getOrCreateService("configVarCache",(()=>new cache_service_1.CacheService(new storage_1.ConfigVarCacheStorage(this.configVarClient))))}get inMemoryCache(){return this.getOrCreateService("inMemoryCache",(()=>{const e=new cache_service_1.CacheService(new storage_1.InMemoryCacheStorage);return e.setSecondaryCache(this.configVarCache),e}))}get resourceAvailabilityService(){return this.getOrCreateService("resourceAvailabilityService",(()=>new resource_availability_service_1.ResourceAvailabilityService(this.availabilityAPIClient)))}get dataService(){return this.getOrCreateService("dataService",(()=>new data_service_1.DataService(this.graphqlService)))}get resourceBuilder(){return this.getOrCreateService("resourceBuilder",(()=>new resource_builder_1.ResourceBuilder(this.dataService,this.resourceAvailabilityService)))}newQueryBuilder(e){const i=new graphql_1.GraphQLQueryBuilder(e);return i.setGraphqlService(this.graphqlService),i}newArtifactClient(e){return this.getOrCreateService(`${e}Client`,(()=>new artifact_client_1.ArtifactClient(this.baseConfig,e)))}dispose(){this.services.clear()}}exports.ExecutionContext=ExecutionContext;
@@ -1 +1 @@
1
- "use strict";var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,r,i){void 0===i&&(i=r);var n=Object.getOwnPropertyDescriptor(t,r);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,i,n)}:function(e,t,r,i){void 0===i&&(i=r),e[i]=t[r]}),__exportStar=this&&this.__exportStar||function(e,t){for(var r in e)"default"===r||Object.prototype.hasOwnProperty.call(t,r)||__createBinding(t,e,r)};Object.defineProperty(exports,"__esModule",{value:!0}),__exportStar(require("./execution-context"),exports);
1
+ "use strict";var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,r,i){void 0===i&&(i=r);var o=Object.getOwnPropertyDescriptor(t,r);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,i,o)}:function(e,t,r,i){void 0===i&&(i=r),e[i]=t[r]}),__exportStar=this&&this.__exportStar||function(e,t){for(var r in e)"default"===r||Object.prototype.hasOwnProperty.call(t,r)||__createBinding(t,e,r)};Object.defineProperty(exports,"__esModule",{value:!0}),__exportStar(require("./entity-factory"),exports),__exportStar(require("./execution-context"),exports),__exportStar(require("./tenant-entities"),exports),__exportStar(require("./tenant-objects"),exports);
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.TenantObjects=void 0,exports.TenantObjects={Accounts:{Name:"Accounts",Fields:["UID","Name","Industry","OwnerId"]},Jobs:{Name:"Jobs",Fields:["UID","Name","Start","End","Type"]},JobTags:{Name:"JobTags",Fields:["UID","Name"]},JobAllocations:{Name:"JobAllocations",Fields:["UID","Name","Start","End","JobId"]},Regions:{Name:"Regions",Fields:["UID","Name","Timezone"]},Contacts:{Name:"Contacts",Fields:["UID","FirstName","LastName","Email"]},Locations:{Name:"Locations",Fields:["UID","Name","Address"]},Resources:{Name:"Resources",Fields:["UID","Name","Category","ResourceType","EmploymentType","UserId","PrimaryRegionId"]},Tags:{Name:"Tags",Fields:["UID","Name"]},Activities:{Name:"Activities",Fields:["UID","Name","Start","End","Type"]},Availabilities:{Name:"Availabilities",Fields:["UID","Start","Finish","Type","IsAvailable"]},Holidays:{Name:"Holidays",Fields:["UID","Name","StartDate","EndDate","Global"]},ResourceTags:{Name:"ResourceTags",Fields:["UID","Name"]},HolidayRegions:{Name:"HolidayRegions",Fields:["UID","RegionId","HolidayId"]}};