@skedulo/pulse-solution-services 0.0.7 → 0.0.8
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/CHANGELOG.md +8 -0
- package/README.md +96 -23
- package/dist/clients/artifact-client.js +1 -1
- package/dist/clients/base-client.js +1 -1
- package/dist/clients/graphql-client.js +1 -1
- package/dist/constants/graphql-constants.js +1 -0
- package/dist/constants/index.js +1 -1
- package/dist/core/execution-context.js +1 -1
- package/dist/core/execution-options.js +1 -0
- package/dist/core/index.js +1 -1
- package/dist/core/request-context.js +1 -0
- package/dist/core/request-header-constants.js +1 -0
- package/dist/index.d.ts +240 -108
- package/dist/interfaces/api-client.js +1 -0
- package/dist/interfaces/index.js +1 -1
- package/dist/services/batch-processor/fetching-strategies/cursor-based-fetching-strategy.js +1 -1
- package/dist/services/batch-processor/fetching-strategies/date-based-fetching-strategy.js +1 -1
- package/dist/services/graph-batch/graph-batch-config.d.ts +34 -0
- package/dist/services/graph-batch/graph-batch-config.js +1 -0
- package/dist/services/graph-batch/graph-batch.d.ts +56 -0
- package/dist/services/graph-batch/graph-batch.js +1 -0
- package/dist/services/graph-batch/index.d.ts +3 -0
- package/dist/services/graph-batch/index.js +1 -0
- package/dist/services/graph-batch/pagination-strategy.d.ts +5 -0
- package/dist/services/graph-batch/pagination-strategy.js +1 -0
- package/dist/services/graphql/graphql-query-builder.d.ts +6 -4
- package/dist/services/graphql/graphql-query-builder.js +1 -1
- package/dist/services/graphql/graphql-service.d.ts +20 -13
- package/dist/services/graphql/graphql-service.js +1 -1
- package/dist/services/graphql/queries.d.ts +5 -4
- package/dist/services/graphql/queries.js +1 -1
- package/dist/services/index.js +1 -1
- package/dist/services/resource-availability/builder/data-service.d.ts +2 -1
- package/dist/services/resource-availability/builder/data-service.js +1 -1
- package/package.json +4 -2
- package/yarn.lock +23 -0
- package/dist/constants/tenant-objects.js +0 -1
- package/dist/services/data-service.js +0 -1
- package/dist/services/resource-availability/object-factory.d.ts +0 -13
- package/dist/services/resource-availability/object-factory.js +0 -1
- package/dist/services/resource-availability/resource-availability-service.d.ts +0 -7
- package/dist/services/resource-availability/resource-availability-service.js +0 -1
- package/dist/services/resource-availability/resource-builder.d.ts +0 -16
- package/dist/services/resource-availability/resource-builder.js +0 -1
- package/dist/services/resource-availability/resource-query-service.d.ts +0 -7
- package/dist/services/resource-availability/resource-query-service.js +0 -1
- package/dist/services/resource-availability/resource-validator.d.ts +0 -29
- package/dist/services/resource-availability/resource-validator.js +0 -1
- /package/dist/{interfaces/resource-availability.js → core/base-config.js} +0 -0
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { GraphqlQueryParams, QueryResult } from "../../interfaces/graphql";
|
|
2
2
|
import { GraphQLService } from "./graphql-service";
|
|
3
3
|
/**
|
|
4
4
|
* A utility class for building GraphQL queries dynamically.
|
|
5
5
|
*/
|
|
6
6
|
export declare class GraphQLQueryBuilder {
|
|
7
7
|
private objectName;
|
|
8
|
+
operationName: string;
|
|
8
9
|
private fields;
|
|
9
10
|
private filters;
|
|
10
11
|
private first?;
|
|
@@ -15,12 +16,13 @@ export declare class GraphQLQueryBuilder {
|
|
|
15
16
|
private childQueries;
|
|
16
17
|
private isParent;
|
|
17
18
|
private graphqlService;
|
|
19
|
+
private queryParams;
|
|
18
20
|
/**
|
|
19
21
|
* Creates an instance of GraphQLQueryBuilder.
|
|
20
|
-
* @param {string}
|
|
22
|
+
* @param {string} graphqlQueryParams - The necessary parameters for the query.
|
|
21
23
|
* @param {boolean} [isParent=false] - Indicates if this query is a parent query.
|
|
22
24
|
*/
|
|
23
|
-
constructor(
|
|
25
|
+
constructor(queryParams: GraphqlQueryParams, isParent?: boolean);
|
|
24
26
|
/**
|
|
25
27
|
* Sets the GraphQL service to use for executing the query.
|
|
26
28
|
*/
|
|
@@ -64,7 +66,7 @@ export declare class GraphQLQueryBuilder {
|
|
|
64
66
|
/**
|
|
65
67
|
* Builds the GraphQL query parameters in a more structured format.
|
|
66
68
|
*/
|
|
67
|
-
build():
|
|
69
|
+
build(): GraphqlQueryParams;
|
|
68
70
|
/**
|
|
69
71
|
* Executes the query using the GraphQL service, with improved error handling.
|
|
70
72
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.GraphQLQueryBuilder=void 0;class GraphQLQueryBuilder{constructor(r
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.GraphQLQueryBuilder=void 0;class GraphQLQueryBuilder{constructor(e,r=!1){this.fields=new Set(["UID"]),this.filters=[],this.parentQueries={},this.childQueries={},this.graphqlService=null,this.queryParams=e,this.objectName=e.objectName.charAt(0).toLowerCase()+e.objectName.slice(1),this.operationName=e.operationName,this.isParent=r}setGraphqlService(e){this.graphqlService=e}withFields(e){return e.forEach((e=>this.fields.add(e))),this}withFilter(e){if(this.isParent)throw new Error("Cannot apply filters to a parent query.");return this.filters.push(e),this}withLimit(e){if(this.isParent)throw new Error("Cannot apply limit to a parent query.");return this.first=e,this}withOffset(e){if(this.isParent)throw new Error("Cannot apply offset to a parent query.");return this.offset=e,this}withOrderBy(e){if(this.isParent)throw new Error("Cannot apply orderBy to a parent query.");return this.orderBy=e,this}withCursor(e){if(this.isParent)throw new Error("Cannot apply cursor to a parent query.");return this.after=e,this}withParentQuery(e){const r=new GraphQLQueryBuilder({objectName:e,operationName:this.operationName},!0);return this.parentQueries[e]=r,r}withChildQuery(e){const r=new GraphQLQueryBuilder({objectName:e,operationName:this.operationName});return this.childQueries[e]=r,r}formatQueryFields(){const e=Object.entries(this.parentQueries).map((([e,r])=>`${e} { ${r.formatQueryFields()} }`)).join(", "),r=Object.entries(this.childQueries).map((([e,r])=>{const t=r.build();return`${e} ${t.filter?`(filter: "${t.filter}")`:""} { ${t.fields} }`})).join(", ");return[...this.fields,e,r].filter(Boolean).join(", ")}build(){return{objectName:this.objectName,operationName:this.operationName,fields:this.formatQueryFields(),filter:this.filters.length>0?this.filters.join(" AND "):void 0,first:this.first,offset:this.offset,orderBy:this.orderBy,after:this.after}}execute(){if(!this.graphqlService)return Promise.reject(new Error("No GraphQL service set for query execution."));const e=this.build();return e.readOnly=this.queryParams.readOnly,this.graphqlService.query(e)}toString(){return`{ ${this.objectName} { ${this.formatQueryFields()} } }`}}exports.GraphQLQueryBuilder=GraphQLQueryBuilder;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { GraphQLClient } from "../../clients/graphql-client";
|
|
2
|
-
import {
|
|
2
|
+
import { GraphqlMurationParams, GraphqlQueryParams, MutationResult, QueryResult } from "../../interfaces/graphql";
|
|
3
3
|
/**
|
|
4
4
|
* A service class for handling GraphQL operations.
|
|
5
5
|
*/
|
|
@@ -12,35 +12,42 @@ export declare class GraphQLService {
|
|
|
12
12
|
constructor(client: GraphQLClient);
|
|
13
13
|
/**
|
|
14
14
|
* Executes a GraphQL query to fetch records.
|
|
15
|
-
* @param {
|
|
15
|
+
* @param {GraphqlQueryParams} params - The query parameters.
|
|
16
16
|
* @returns {Promise<QueryResult>} - The query result including records, total count, page info, and cursors.
|
|
17
17
|
*/
|
|
18
|
-
query(params:
|
|
18
|
+
query(params: GraphqlQueryParams): Promise<QueryResult>;
|
|
19
19
|
/**
|
|
20
|
-
*
|
|
20
|
+
* Performs a mutation operation on the GraphQL API.
|
|
21
21
|
* @param {string} objectName - The name of the object.
|
|
22
22
|
* @param {HasId[]} records - The records to delete.
|
|
23
23
|
* @returns {Promise<any>} - The response from the delete operation.
|
|
24
24
|
*/
|
|
25
|
-
|
|
25
|
+
mutate(params: GraphqlMurationParams): Promise<any>;
|
|
26
|
+
/**
|
|
27
|
+
* Deletes records from the GraphQL API.
|
|
28
|
+
*/
|
|
29
|
+
delete(params: GraphqlMurationParams): Promise<any>;
|
|
26
30
|
/**
|
|
27
31
|
* Updates records in the GraphQL API.
|
|
28
|
-
* @param {string} objectName - The name of the object.
|
|
29
|
-
* @param {HasId[]} records - The records to update.
|
|
30
|
-
* @returns {Promise<any>} - The response from the update operation.
|
|
31
32
|
*/
|
|
32
|
-
update(
|
|
33
|
+
update(params: GraphqlMurationParams): Promise<any>;
|
|
33
34
|
/**
|
|
34
35
|
* Inserts records into the GraphQL API.
|
|
35
|
-
* @param {string} objectName - The name of the object.
|
|
36
|
-
* @param {HasId[]} records - The records to insert.
|
|
37
|
-
* @returns {Promise<any>} - The response from the insert operation.
|
|
38
36
|
*/
|
|
39
|
-
insert(
|
|
37
|
+
insert(params: GraphqlMurationParams): Promise<any>;
|
|
40
38
|
/**
|
|
41
39
|
* Extracts job UIDs from a GraphQL mutation response.
|
|
42
40
|
* @param {MutationResult} response - The response object.
|
|
43
41
|
* @returns {string[]} - An array of job UIDs.
|
|
44
42
|
*/
|
|
45
43
|
extractJobUIDs(response: MutationResult): string[];
|
|
44
|
+
/**
|
|
45
|
+
* Formats the object name to follow GraphQL naming conventions.
|
|
46
|
+
* @param {string} objectName - The object name to format.
|
|
47
|
+
* @returns {string} - The formatted object name.
|
|
48
|
+
*/
|
|
49
|
+
private getQueryName;
|
|
50
|
+
private getQueryHeaders;
|
|
51
|
+
private getMutationHeaders;
|
|
52
|
+
private getOperationHeader;
|
|
46
53
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var __decorate=this&&this.__decorate||function(e,t,
|
|
1
|
+
"use strict";var __decorate=this&&this.__decorate||function(e,t,a,r){var o,n=arguments.length,i=n<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,a):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,t,a,r);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(i=(n<3?o(i):n>3?o(t,a,i):o(t,a))||i);return n>3&&i&&Object.defineProperty(t,a,i),i},__metadata=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)},__awaiter=this&&this.__awaiter||function(e,t,a,r){return new(a||(a=Promise))((function(o,n){function i(e){try{d(r.next(e))}catch(e){n(e)}}function s(e){try{d(r.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?o(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(i,s)}d((r=r.apply(e,t||[])).next())}))};Object.defineProperty(exports,"__esModule",{value:!0}),exports.GraphQLService=void 0;const constants_1=require("../../constants"),request_header_constants_1=require("../../core/request-header-constants"),logging_1=require("../../logging"),queries_1=require("./queries");class GraphQLService{constructor(e){this.client=e}query(e){return __awaiter(this,void 0,void 0,(function*(){var t,a,r,o,n,i,s,d,u,c,_,l;e.objectName=this.getQueryName(e.objectName);const p=(0,queries_1.FETCH_RECORDS_QUERY)(e),v=this.getQueryHeaders(e),g=yield this.client.execute(p,v),h={records:(null===(a=null===(t=null==g?void 0:g.data)||void 0===t?void 0:t[e.objectName])||void 0===a?void 0:a.edges.map((e=>e.node)))||[],totalCount:(null===(o=null===(r=null==g?void 0:g.data)||void 0===r?void 0:r[e.objectName])||void 0===o?void 0:o.totalCount)||0,pageInfo:(null===(i=null===(n=null==g?void 0:g.data)||void 0===n?void 0:n[e.objectName])||void 0===i?void 0:i.pageInfo)||{}};if(h.records.length>0){const t=(null===(u=null===(d=null===(s=null==g?void 0:g.data)||void 0===s?void 0:s[e.objectName])||void 0===d?void 0:d.edges)||void 0===u?void 0:u.map((e=>e.offset)))||[],a=(null===(l=null===(_=null===(c=null==g?void 0:g.data)||void 0===c?void 0:c[e.objectName])||void 0===_?void 0:_.edges)||void 0===l?void 0:l.map((e=>e.cursor)))||[];h.endOffset=t[t.length-1],h.endCursor=a[a.length-1]}return h}))}mutate(e){return __awaiter(this,void 0,void 0,(function*(){if(!e.records||0===e.records.length)return Promise.resolve({message:"No records to process"});let t="";switch(e.operation){case constants_1.GraphqlOperations.DELETE:t=(0,queries_1.DELETE_OBJECTS_MUTATION)(e);break;case constants_1.GraphqlOperations.UPDATE:case constants_1.GraphqlOperations.INSERT:t=(0,queries_1.UPSERT_OBJECTS_MUTATION)(e);break;default:throw new Error(`Invalid operation: ${e.operation}`)}const a=this.getMutationHeaders(e);return yield this.client.execute(t,a)}))}delete(e){return __awaiter(this,void 0,void 0,(function*(){return e.operation=constants_1.GraphqlOperations.DELETE,this.mutate(e)}))}update(e){return __awaiter(this,void 0,void 0,(function*(){return e.operation=constants_1.GraphqlOperations.UPDATE,this.mutate(e)}))}insert(e){return __awaiter(this,void 0,void 0,(function*(){return e.operation=constants_1.GraphqlOperations.INSERT,this.mutate(e)}))}extractJobUIDs(e){var t;return(null===(t=null==e?void 0:e.data)||void 0===t?void 0:t.schema)?Object.values(e.data.schema):[]}getQueryName(e){return e.charAt(0).toLowerCase()+e.slice(1)}getQueryHeaders(e){const t=this.getOperationHeader(e.operationName);return e.readOnly&&(t[request_header_constants_1.REQUEST_HEADERS.X_SKEDULO_READ_ONLY]="true"),t}getMutationHeaders(e){const t=this.getOperationHeader(e.operationName);return e.bulkOperation&&(t[request_header_constants_1.REQUEST_HEADERS.X_SKEDULO_BULK_OPERATION]="true"),t}getOperationHeader(e){return{[request_header_constants_1.REQUEST_HEADERS.X_GRAPHQL_OPERATION]:e}}}exports.GraphQLService=GraphQLService,__decorate([(0,logging_1.LogMethod)(),__metadata("design:type",Function),__metadata("design:paramtypes",[Object]),__metadata("design:returntype",Promise)],GraphQLService.prototype,"query",null),__decorate([(0,logging_1.LogMethod)(),__metadata("design:type",Function),__metadata("design:paramtypes",[Object]),__metadata("design:returntype",Promise)],GraphQLService.prototype,"mutate",null),__decorate([(0,logging_1.LogMethod)(),__metadata("design:type",Function),__metadata("design:paramtypes",[Object]),__metadata("design:returntype",Promise)],GraphQLService.prototype,"delete",null),__decorate([(0,logging_1.LogMethod)(),__metadata("design:type",Function),__metadata("design:paramtypes",[Object]),__metadata("design:returntype",Promise)],GraphQLService.prototype,"update",null),__decorate([(0,logging_1.LogMethod)(),__metadata("design:type",Function),__metadata("design:paramtypes",[Object]),__metadata("design:returntype",Promise)],GraphQLService.prototype,"insert",null);
|
|
@@ -1,19 +1,20 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { GraphqlMurationParams, GraphqlQueryParams } from "../../interfaces/graphql";
|
|
2
2
|
/**
|
|
3
3
|
* Constructs a GraphQL query for fetching records with specified parameters.
|
|
4
4
|
*
|
|
5
5
|
* @param params - The query parameters including object name, filter, pagination, ordering, and fields.
|
|
6
6
|
* @returns The constructed GraphQL query string.
|
|
7
7
|
*/
|
|
8
|
-
export declare const FETCH_RECORDS_QUERY: ({ objectName, filter, first, offset, after, orderBy, fields, }:
|
|
8
|
+
export declare const FETCH_RECORDS_QUERY: ({ objectName, operationName, filter, first, offset, after, orderBy, fields, }: GraphqlQueryParams) => string;
|
|
9
9
|
/**
|
|
10
10
|
* Constructs a GraphQL mutation for deleting multiple objects.
|
|
11
11
|
*
|
|
12
12
|
* @param objectName - The name of the object to delete.
|
|
13
|
+
* @param operationName - The graphql operation name.
|
|
13
14
|
* @param records - The records to be deleted.
|
|
14
15
|
* @returns The constructed GraphQL mutation string.
|
|
15
16
|
*/
|
|
16
|
-
export declare const DELETE_OBJECTS_MUTATION: (objectName
|
|
17
|
+
export declare const DELETE_OBJECTS_MUTATION: ({ objectName, operationName, records }: GraphqlMurationParams) => string;
|
|
17
18
|
/**
|
|
18
19
|
* Constructs a GraphQL mutation for upserting (inserting/updating) multiple objects.
|
|
19
20
|
*
|
|
@@ -22,4 +23,4 @@ export declare const DELETE_OBJECTS_MUTATION: (objectName: string, records: HasI
|
|
|
22
23
|
* @param operation - The operation type ("insert" or "update").
|
|
23
24
|
* @returns The constructed GraphQL mutation string.
|
|
24
25
|
*/
|
|
25
|
-
export declare const UPSERT_OBJECTS_MUTATION: (objectName
|
|
26
|
+
export declare const UPSERT_OBJECTS_MUTATION: ({ objectName, operationName, records, operation }: GraphqlMurationParams) => string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.UPSERT_OBJECTS_MUTATION=exports.DELETE_OBJECTS_MUTATION=exports.FETCH_RECORDS_QUERY=void 0;const FETCH_RECORDS_QUERY=({objectName:e,
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.UPSERT_OBJECTS_MUTATION=exports.DELETE_OBJECTS_MUTATION=exports.FETCH_RECORDS_QUERY=void 0;const FETCH_RECORDS_QUERY=({objectName:e,operationName:n,filter:t,first:o=200,offset:E=0,after:T,orderBy:r,fields:s})=>`\n query ${n} {\n ${e}(${[t?`filter: "${t}"`:"",T?`after: "${T}"`:"",`first: ${o}`,E?`offset: ${E}`:"",r?`orderBy: "${r}"`:""].filter((e=>e)).join(", ")}) {\n totalCount\n pageInfo{\n hasNextPage\n }\n edges {\n cursor\n offset\n node {\n ${s||"UID"}\n }\n }\n }\n }\n `;exports.FETCH_RECORDS_QUERY=FETCH_RECORDS_QUERY;const DELETE_OBJECTS_MUTATION=({objectName:e,operationName:n,records:t})=>`\n mutation ${n} {\n schema {\n ${t.map(((n,t)=>`alias${t+1}:delete${e}(UID: "${n.UID}")`)).join("\n ")}\n }\n }`;exports.DELETE_OBJECTS_MUTATION=DELETE_OBJECTS_MUTATION;const UPSERT_OBJECTS_MUTATION=({objectName:e,operationName:n,records:t,operation:o})=>`\n mutation ${n} {\n schema {\n ${t.map(((n,t)=>`\n alias${t+1}:${o}${e}(input: {\n ${Object.entries(n).map((([e,n])=>`${e}: ${"string"==typeof n?`"${n}"`:n}`)).join(", ")}\n }) \n `)).join("\n ")}\n }\n }`;exports.UPSERT_OBJECTS_MUTATION=UPSERT_OBJECTS_MUTATION;
|
package/dist/services/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var __createBinding=this&&this.__createBinding||(Object.create?function(e,r,t,
|
|
1
|
+
"use strict";var __createBinding=this&&this.__createBinding||(Object.create?function(e,r,t,o){void 0===o&&(o=t);var i=Object.getOwnPropertyDescriptor(r,t);i&&!("get"in i?!r.__esModule:i.writable||i.configurable)||(i={enumerable:!0,get:function(){return r[t]}}),Object.defineProperty(e,o,i)}:function(e,r,t,o){void 0===o&&(o=t),e[o]=r[t]}),__exportStar=this&&this.__exportStar||function(e,r){for(var t in e)"default"===t||Object.prototype.hasOwnProperty.call(r,t)||__createBinding(r,e,t)};Object.defineProperty(exports,"__esModule",{value:!0}),__exportStar(require("./batch-processor"),exports),__exportStar(require("./cache"),exports),__exportStar(require("./graph-batch"),exports),__exportStar(require("./graphql"),exports),__exportStar(require("./metadata-service"),exports),__exportStar(require("./resource-availability"),exports);
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { GraphqlQueryParams } from "../../../interfaces";
|
|
1
2
|
import { GraphQLQueryBuilder, GraphQLService } from "../../graphql";
|
|
2
3
|
import { ResourceQueryParam } from "./resource-query-param";
|
|
3
4
|
export declare class DataService {
|
|
@@ -5,5 +6,5 @@ export declare class DataService {
|
|
|
5
6
|
constructor(graphqlService: GraphQLService);
|
|
6
7
|
getResources(param: ResourceQueryParam): Promise<Record<string, any>[]>;
|
|
7
8
|
getHolidays(regionIds: string[], startTime?: Date, endTime?: Date): Promise<Record<string, any>>;
|
|
8
|
-
newQueryBuilder(
|
|
9
|
+
newQueryBuilder(params: GraphqlQueryParams): GraphQLQueryBuilder;
|
|
9
10
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var __awaiter=this&&this.__awaiter||function(e,t,i,
|
|
1
|
+
"use strict";var __awaiter=this&&this.__awaiter||function(e,t,i,n){return new(i||(i=Promise))((function(s,a){function r(e){try{c(n.next(e))}catch(e){a(e)}}function o(e){try{c(n.throw(e))}catch(e){a(e)}}function c(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(r,o)}c((n=n.apply(e,t||[])).next())}))};Object.defineProperty(exports,"__esModule",{value:!0}),exports.DataService=void 0;const tenant_objects_1=require("../../../core/tenant-objects"),graphql_1=require("../../graphql");class DataService{constructor(e){this.graphqlService=e}getResources(e){return __awaiter(this,void 0,void 0,(function*(){const t=this.newQueryBuilder({objectName:tenant_objects_1.TenantObjects.Resources.Name,operationName:"fetchResourcesWithAvailabilities"});t.withFields(tenant_objects_1.TenantObjects.Resources.Fields).withFilter("IsActive == true"),t.withParentQuery("PrimaryRegion").withFields(tenant_objects_1.TenantObjects.Regions.Fields),e.resourceIds&&e.resourceIds.size>0?t.withFilter(`UID IN ${JSON.stringify(Array.from(e.resourceIds))}`):e.regionIds&&e.regionIds.size>0&&t.withFilter(`PrimaryRegionId IN [${Array.from(e.regionIds).map((e=>`'${e}'`)).join(",")}]`),e.useTag&&t.withChildQuery(tenant_objects_1.TenantObjects.ResourceTags.Name).withParentQuery("Tag").withFields(tenant_objects_1.TenantObjects.Tags.Fields),e.useActivity&&t.withChildQuery(tenant_objects_1.TenantObjects.Activities.Name).withFields(tenant_objects_1.TenantObjects.Activities.Fields),e.useAvailability&&t.withChildQuery(tenant_objects_1.TenantObjects.Availabilities.Name).withFields(tenant_objects_1.TenantObjects.Availabilities.Fields),e.useJobAllocation&&t.withChildQuery(tenant_objects_1.TenantObjects.JobAllocations.Name).withFields(tenant_objects_1.TenantObjects.JobAllocations.Fields).withFilter("Status NOTIN ['Deleted', 'Declined']").withParentQuery("Job").withFields(tenant_objects_1.TenantObjects.Jobs.Fields);return(yield t.execute()).records}))}getHolidays(e,t,i){return __awaiter(this,void 0,void 0,(function*(){const n={},s=t?t.toISOString().split("T")[0]:null,a=i?i.toISOString().split("T")[0]:null,r=this.newQueryBuilder({objectName:tenant_objects_1.TenantObjects.Holidays.Name,operationName:"fetchHolidays"});r.withFields(tenant_objects_1.TenantObjects.Holidays.Fields),r.withFilter("Global == true"),s&&r.withFilter(`EndDate >= ${s}`),a&&r.withFilter(`StartDate <= ${a}`);const o=yield r.execute();if(n.GLOBAL=o.records||[],e&&e.length>0){const t=this.newQueryBuilder({objectName:tenant_objects_1.TenantObjects.Holidays.Name,operationName:"fetchHolidays"});t.withFields(tenant_objects_1.TenantObjects.Holidays.Fields),t.withChildQuery(tenant_objects_1.TenantObjects.HolidayRegions.Name).withFields(tenant_objects_1.TenantObjects.HolidayRegions.Fields).withFilter(`RegionId IN [${e.map((e=>`'${e}'`)).join(",")}]`),s&&t.withFilter(`EndDate >= ${s}`),a&&t.withFilter(`StartDate <= ${a}`);const i=yield t.execute();for(const e of i.records||[])for(const t of e.HolidayRegions||[]){const i=t.RegionId;n[i]||(n[i]=[]),n[i].push(e)}}return n}))}newQueryBuilder(e){const t=new graphql_1.GraphQLQueryBuilder(e);return t.setGraphqlService(this.graphqlService),t}}exports.DataService=DataService;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@skedulo/pulse-solution-services",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.8",
|
|
4
4
|
"description": "A collection of services and utilities to support solution development on the Pulse platform.",
|
|
5
5
|
"author": "Skedulo",
|
|
6
6
|
"license": "MIT",
|
|
@@ -39,8 +39,10 @@
|
|
|
39
39
|
"@skedulo/function-utilities": "^0.0.6",
|
|
40
40
|
"@types/luxon": "^3.4.2",
|
|
41
41
|
"luxon": "^3.5.0",
|
|
42
|
+
"p-queue": "^8.1.0",
|
|
42
43
|
"typescript": "~5.6.3",
|
|
43
44
|
"uuid": "^11.0.5",
|
|
44
|
-
"winston": "^3.17.0"
|
|
45
|
+
"winston": "^3.17.0",
|
|
46
|
+
"zod": "^3.24.2"
|
|
45
47
|
}
|
|
46
48
|
}
|
package/yarn.lock
CHANGED
|
@@ -1399,6 +1399,11 @@ esutils@^2.0.2:
|
|
|
1399
1399
|
resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
|
|
1400
1400
|
integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
|
|
1401
1401
|
|
|
1402
|
+
eventemitter3@^5.0.1:
|
|
1403
|
+
version "5.0.1"
|
|
1404
|
+
resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4"
|
|
1405
|
+
integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==
|
|
1406
|
+
|
|
1402
1407
|
execa@^5.0.0:
|
|
1403
1408
|
version "5.1.1"
|
|
1404
1409
|
resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd"
|
|
@@ -2446,6 +2451,19 @@ p-locate@^5.0.0:
|
|
|
2446
2451
|
dependencies:
|
|
2447
2452
|
p-limit "^3.0.2"
|
|
2448
2453
|
|
|
2454
|
+
p-queue@^8.1.0:
|
|
2455
|
+
version "8.1.0"
|
|
2456
|
+
resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-8.1.0.tgz#d71929249868b10b16f885d8a82beeaf35d32279"
|
|
2457
|
+
integrity sha512-mxLDbbGIBEXTJL0zEx8JIylaj3xQ7Z/7eEVjcF9fJX4DBiH9oqe+oahYnlKKxm0Ci9TlWTyhSHgygxMxjIB2jw==
|
|
2458
|
+
dependencies:
|
|
2459
|
+
eventemitter3 "^5.0.1"
|
|
2460
|
+
p-timeout "^6.1.2"
|
|
2461
|
+
|
|
2462
|
+
p-timeout@^6.1.2:
|
|
2463
|
+
version "6.1.4"
|
|
2464
|
+
resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-6.1.4.tgz#418e1f4dd833fa96a2e3f532547dd2abdb08dbc2"
|
|
2465
|
+
integrity sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==
|
|
2466
|
+
|
|
2449
2467
|
p-try@^2.0.0:
|
|
2450
2468
|
version "2.2.0"
|
|
2451
2469
|
resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
|
|
@@ -3027,3 +3045,8 @@ yocto-queue@^0.1.0:
|
|
|
3027
3045
|
version "0.1.0"
|
|
3028
3046
|
resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
|
|
3029
3047
|
integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
|
|
3048
|
+
|
|
3049
|
+
zod@^3.24.2:
|
|
3050
|
+
version "3.24.2"
|
|
3051
|
+
resolved "https://registry.yarnpkg.com/zod/-/zod-3.24.2.tgz#8efa74126287c675e92f46871cfc8d15c34372b3"
|
|
3052
|
+
integrity sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";var TenantObject;Object.defineProperty(exports,"__esModule",{value:!0}),exports.TenantObject=void 0,function(e){e.Accounts="Accounts",e.Jobs="Jobs",e.JobAllocations="JobAllocations",e.Regions="Regions",e.Contacts="Contacts",e.Locations="Locations",e.Resources="Resources",e.Tags="Tags",e.JobTags="JobTags",e.ResourceTags="ResourceTags",e.Activities="Activities",e.Availabilities="Availabilities",e.Holidays="Holidays",e.AvailabilityPatterns="AvailabilityPatterns",e.AvailabilityPatternResources="AvailabilityPatternResources",e.AccountResourceScores="AccountResourceScores",e.LocationResourceScores="LocationResourceScores",e.Products="Products",e.JobProducts="JobProducts"}(TenantObject||(exports.TenantObject=TenantObject={}));
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";var __awaiter=this&&this.__awaiter||function(e,t,i,r){return new(i||(i=Promise))((function(a,o){function s(e){try{l(r.next(e))}catch(e){o(e)}}function n(e){try{l(r.throw(e))}catch(e){o(e)}}function l(e){var t;e.done?a(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(s,n)}l((r=r.apply(e,t||[])).next())}))};Object.defineProperty(exports,"__esModule",{value:!0}),exports.DataService=void 0;const graphql_1=require("./graphql");class DataService{constructor(e){this.graphqlService=e}getResources(e){return __awaiter(this,void 0,void 0,(function*(){const t=this.newQueryBuilder("Resources");return t.withFields(["UID","Name","Category","ResourceType","EmploymentType","UserId","PrimaryRegionId"]).withFilter("IsActive == true"),t.withParentQuery("PrimaryRegion").withFields(["UID","Name","Timezone"]),e.resourceIds&&e.resourceIds.size>0?t.withFilter(`UID IN ${JSON.stringify(Array.from(e.resourceIds))}`):e.regionIds&&e.regionIds.size>0&&t.withFilter(`PrimaryRegionId IN [${Array.from(e.regionIds).map((e=>`'${e}'`)).join(",")}]`),e.useTag&&t.withChildQuery("ResourceTags").withParentQuery("Tag").withFields(["UID","Name"]),e.useActivity&&t.withChildQuery("Activities").withFields(["UID","Name","Start","End","Type"]),e.useAvailability&&t.withChildQuery("Availabilities").withFields(["UID","Start","Finish","Type","IsAvailable"]),e.useJobAllocation&&t.withChildQuery("JobAllocations").withFields(["UID","Name","Start","End","JobId"]).withFilter("Status NOTIN ['Deleted', 'Declined']").withParentQuery("Job").withFields(["UID","Name","Start","End","Type"]),(yield t.execute()).records}))}getHolidays(e,t,i){return __awaiter(this,void 0,void 0,(function*(){const r={},a=t?t.toISOString().split("T")[0]:null,o=i?i.toISOString().split("T")[0]:null,s=this.newQueryBuilder("Holidays");s.withFields(["UID","Name","StartDate","EndDate","Global"]),s.withFilter("Global == true"),a&&s.withFilter(`EndDate >= ${a}`),o&&s.withFilter(`StartDate <= ${o}`);const n=yield s.execute();if(r.GLOBAL=n.records||[],e&&e.length>0){const t=this.newQueryBuilder("Holidays");t.withFields(["UID","Name","StartDate","EndDate"]),t.withChildQuery("HolidayRegions").withFields(["RegionId"]).withFilter(`RegionId IN [${e.map((e=>`'${e}'`)).join(",")}]`),a&&t.withFilter(`EndDate >= ${a}`),o&&t.withFilter(`StartDate <= ${o}`);const i=yield t.execute();for(const e of i.records||[])for(const t of e.HolidayRegions||[]){const i=t.RegionId;r[i]||(r[i]=[]),r[i].push(e)}}return r}))}newQueryBuilder(e){const t=new graphql_1.GraphQLQueryBuilder(e);return t.setGraphqlService(this.graphqlService),t}}exports.DataService=DataService;
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { Activity, Availability, BaseEvent, BaseObject, Job, JobAllocation, Resource, ResourceShift, Shift, Tag } from "../../interfaces/resource-availability";
|
|
2
|
-
export declare class ObjectFactory {
|
|
3
|
-
static createBaseObject(data: Record<string, string>): BaseObject;
|
|
4
|
-
static createBaseEvent(data: Record<string, string>): BaseEvent;
|
|
5
|
-
static createTag(data: Record<string, any>): Tag;
|
|
6
|
-
static createResource(data: Record<string, any>): Resource;
|
|
7
|
-
static createJob(data: Record<string, any>): Job;
|
|
8
|
-
static createAvailability(data: Record<string, any>): Availability;
|
|
9
|
-
static createActivity(data: Record<string, any>): Activity;
|
|
10
|
-
static createJobAllocation(data: Record<string, any>): JobAllocation;
|
|
11
|
-
static createResourceShift(data: Record<string, any>): ResourceShift;
|
|
12
|
-
static createShift(data: Record<string, any>): Shift;
|
|
13
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.ObjectFactory=void 0;class ObjectFactory{static createBaseObject(e){return{id:e.UID||"",name:e.Name||"",propertyMap:{}}}static createBaseEvent(e){return e.Finish?e.Finish:e.End,Object.assign(Object.assign({},this.createBaseObject(e)),{start:new Date(e.Start),finish:new Date(e.Start),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||"",start:e.Start?new Date(e.Start):new Date(0),finish:e.Finish?new Date(e.Finish):new Date(0),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.ObjectFactory=ObjectFactory;
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { AvailabilityAPIClient } from "../../clients/availability-api-client";
|
|
2
|
-
import { BaseEvent, ResourceQueryParam } from "../../interfaces/resource-availability";
|
|
3
|
-
export declare class ResourceAvailabilityService {
|
|
4
|
-
private availabilityAPIClient;
|
|
5
|
-
constructor(availabilityAPIClient: AvailabilityAPIClient);
|
|
6
|
-
getAvailabilityPatterns(param: ResourceQueryParam): Promise<Map<string, BaseEvent[]>>;
|
|
7
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";var __awaiter=this&&this.__awaiter||function(e,t,i,r){return new(i||(i=Promise))((function(a,n){function s(e){try{c(r.next(e))}catch(e){n(e)}}function o(e){try{c(r.throw(e))}catch(e){n(e)}}function c(e){var t;e.done?a(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(s,o)}c((r=r.apply(e,t||[])).next())}))};Object.defineProperty(exports,"__esModule",{value:!0}),exports.ResourceAvailabilityService=void 0;class ResourceAvailabilityService{constructor(e){this.availabilityAPIClient=e}getAvailabilityPatterns(e){return __awaiter(this,void 0,void 0,(function*(){const t=yield this.availabilityAPIClient.fetchAvailability({resourceIds:Array.from(e.resourceIds||[]),start:e.startTime.toISOString(),end:e.endTime.toISOString(),mergedAvailabilities:!1,entries:!0}),i=new Map;return t.forEach((e=>{if(!e.entries)return;const t=e.entries.filter((e=>"pattern"===e.type)).map((e=>({id:`${e.start}_${e.end}`,name:`${e.name}(${e.type})`,start:e.start?new Date(e.start):new Date(0),finish:e.end?new Date(e.end):new Date(0),eventType:e.type})));i.set(e.resourceId,t)})),i}))}}exports.ResourceAvailabilityService=ResourceAvailabilityService;
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { Resource, ResourceQueryParam } from "../../interfaces/resource-availability";
|
|
2
|
-
import { DataService } from "../data-service";
|
|
3
|
-
import { ResourceAvailabilityService } from "./resource-availability-service";
|
|
4
|
-
export declare class ResourceBuilder {
|
|
5
|
-
private dataService;
|
|
6
|
-
private availabilityService;
|
|
7
|
-
constructor(dataService: DataService, availabilityService: ResourceAvailabilityService);
|
|
8
|
-
build(queryParam: ResourceQueryParam): Promise<Resource[]>;
|
|
9
|
-
private loadAvailabilityPatterns;
|
|
10
|
-
private loadActivityEvents;
|
|
11
|
-
private loadAvailabilityEvents;
|
|
12
|
-
private loadJobAllocationEvents;
|
|
13
|
-
private loadResourceShiftEvents;
|
|
14
|
-
private loadHolidayEvents;
|
|
15
|
-
protected buildMore(resources: Resource[]): Resource[];
|
|
16
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";var __decorate=this&&this.__decorate||function(e,t,i,a){var r,s=arguments.length,o=s<3?t:null===a?a=Object.getOwnPropertyDescriptor(t,i):a;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,a);else for(var n=e.length-1;n>=0;n--)(r=e[n])&&(o=(s<3?r(o):s>3?r(t,i,o):r(t,i))||o);return s>3&&o&&Object.defineProperty(t,i,o),o},__metadata=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)},__awaiter=this&&this.__awaiter||function(e,t,i,a){return new(i||(i=Promise))((function(r,s){function o(e){try{l(a.next(e))}catch(e){s(e)}}function n(e){try{l(a.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(o,n)}l((a=a.apply(e,t||[])).next())}))};Object.defineProperty(exports,"__esModule",{value:!0}),exports.ResourceBuilder=void 0;const resource_availability_1=require("../../interfaces/resource-availability"),logging_1=require("../../logging"),utils_1=require("../../utils"),object_factory_1=require("./object-factory");class ResourceBuilder{constructor(e,t){this.dataService=e,this.availabilityService=t}build(e){return __awaiter(this,void 0,void 0,(function*(){var t,i;if(!e)throw new Error("ResourceBuilder Error: queryParam is required");const a=[],r=yield this.dataService.getResources(e);e.resourceIds&&0!==e.resourceIds.size||(e.resourceIds=new Set(r.map((e=>e.UID))));for(const t of r){const i=object_factory_1.ObjectFactory.createResource(t);a.push(i),e.useActivity&&this.loadActivityEvents(t,i),e.useAvailability&&this.loadAvailabilityEvents(t,i),e.useJobAllocation&&this.loadJobAllocationEvents(t,i),e.useResourceShift&&this.loadResourceShiftEvents(t,i),e.useHoliday&&this.loadHolidayEvents(i,e)}e.useAvailabilityPattern&&(yield this.loadAvailabilityPatterns(a,e));for(const r of a)e.mergeAvailability?r.availabilities=utils_1.DateTimeUtils.mergeEvents(r.availabilities):null===(t=r.availabilities)||void 0===t||t.sort(((e,t)=>e.start.getTime()-t.start.getTime())),e.mergeEvents?r.events=utils_1.DateTimeUtils.mergeEvents(r.events):null===(i=r.events)||void 0===i||i.sort(((e,t)=>e.start.getTime()-t.start.getTime()));return this.buildMore(a)}))}loadAvailabilityPatterns(e,t){return __awaiter(this,void 0,void 0,(function*(){const i=yield this.availabilityService.getAvailabilityPatterns(t);for(const t of e)t.availabilities.push(...i.get(t.id)||[])}))}loadActivityEvents(e,t){e.Activities&&t.events.push(...e.Activities.map((e=>({id:e.UID,name:e.Name,start:new Date(e.Start),finish:new Date(e.End),eventType:"activity"}))))}loadAvailabilityEvents(e,t){if(e.availabilities){const i=[],a=[];e.Availabilities.forEach((e=>{e.IsAvailable?i.push(object_factory_1.ObjectFactory.createBaseEvent(e)):a.push(object_factory_1.ObjectFactory.createBaseEvent(e))})),t.availabilities=i,t.events.push(...a)}}loadJobAllocationEvents(e,t){e.JobAllocations&&t.events.push(...e.JobAllocations.map((e=>({id:e.UID,name:e.Name,start:e.Start?new Date(e.Start):void 0,finish:e.End?new Date(e.End):void 0,eventType:"job_allocation"}))))}loadResourceShiftEvents(e,t){e.resourceShifts&&t.events.push(...e.resourceShifts.map((e=>({id:e.id,name:e.name,start:e.start?new Date(e.start):new Date(0),finish:e.finish?new Date(e.finish):new Date(0),eventType:"resource_shift"}))))}loadHolidayEvents(e,t){return __awaiter(this,void 0,void 0,(function*(){const i=yield this.dataService.getHolidays(Array.from(t.regionIds||[]),t.startTime,t.endTime),a=i.GLOBAL||[];i[e.regionId]&&a.push(...i[e.regionId]),a.forEach((i=>{let a=utils_1.DateTimeUtils.getStartOfDate(i.StartDate,e.timezone),r=utils_1.DateTimeUtils.getEndOfDate(i.EndDate,e.timezone);a<t.startTime&&(a=t.startTime),r>t.endTime&&(r=t.endTime),e.events.push({id:`${a.toISOString()}_${r.toISOString()}`,name:i.Name,start:a,finish:r,eventType:"holiday"})}))}))}buildMore(e){return e}}exports.ResourceBuilder=ResourceBuilder,__decorate([(0,logging_1.LogMethod)(),__metadata("design:type",Function),__metadata("design:paramtypes",[resource_availability_1.ResourceQueryParam]),__metadata("design:returntype",Promise)],ResourceBuilder.prototype,"build",null);
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { ResourceQueryParam } from "../../interfaces/resource-availability";
|
|
2
|
-
import { GraphQLQueryBuilder } from "../graphql";
|
|
3
|
-
export declare class ResourceQueryService {
|
|
4
|
-
private queryBuilder;
|
|
5
|
-
constructor(queryBuilder: GraphQLQueryBuilder);
|
|
6
|
-
getResources(param: ResourceQueryParam): Promise<Record<string, any>[]>;
|
|
7
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";var __awaiter=this&&this.__awaiter||function(e,i,r,t){return new(r||(r=Promise))((function(s,u){function o(e){try{n(t.next(e))}catch(e){u(e)}}function a(e){try{n(t.throw(e))}catch(e){u(e)}}function n(e){var i;e.done?s(e.value):(i=e.value,i instanceof r?i:new r((function(e){e(i)}))).then(o,a)}n((t=t.apply(e,i||[])).next())}))};Object.defineProperty(exports,"__esModule",{value:!0}),exports.ResourceQueryService=void 0;class ResourceQueryService{constructor(e){this.queryBuilder=e}getResources(e){return __awaiter(this,void 0,void 0,(function*(){return this.queryBuilder.withFields(["UID","Name","Category","ResourceType","EmploymentType","UserId","PrimaryRegionId"]).withFilter("IsActive == true"),this.queryBuilder.withParentQuery("PrimaryRegion").withFields(["UID","Name","Timezone"]),e.resourceIds&&e.resourceIds.size>0?this.queryBuilder.withFilter(`UID IN ${JSON.stringify(Array.from(e.resourceIds))}`):e.regionIds&&e.regionIds.size>0&&this.queryBuilder.withFilter(`PrimaryRegionId IN ${JSON.stringify(Array.from(e.regionIds))}`),e.useTag&&this.queryBuilder.withChildQuery("ResourceTags").withParentQuery("Tag").withFields(["UID","Name"]),e.useActivity&&this.queryBuilder.withChildQuery("Activities").withFields(["UID","Name","Start","End","Type"]),e.useAvailability&&this.queryBuilder.withChildQuery("Availabilities").withFields(["UID","Start","Finish","Type","IsAvailable"]),e.useJobAllocation&&this.queryBuilder.withChildQuery("JobAllocations").withFields(["UID","Name","Start","End","JobId"]).withFilter("Status NOTIN ['Deleted', 'Declined']").withParentQuery("Job").withFields(["UID","Name","Start","End","Type"]),(yield this.queryBuilder.execute()).records}))}}exports.ResourceQueryService=ResourceQueryService;
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { BaseEvent, Job, Resource, ResourceValidationOption, Tag } from "../../interfaces";
|
|
2
|
-
declare class ResourceJobValidation {
|
|
3
|
-
resource: Resource;
|
|
4
|
-
job: Job;
|
|
5
|
-
availableEvent: BaseEvent | null;
|
|
6
|
-
conflictEvents: BaseEvent[];
|
|
7
|
-
missingTags: Tag[];
|
|
8
|
-
constructor(resource: Resource, job: Job, availableEvent?: BaseEvent | null, conflictEvents?: BaseEvent[], missingTags?: Tag[]);
|
|
9
|
-
isQualified(option: ResourceValidationOption): boolean;
|
|
10
|
-
}
|
|
11
|
-
export declare class ValidationResult {
|
|
12
|
-
private readonly validations;
|
|
13
|
-
private readonly option;
|
|
14
|
-
constructor(validations: ResourceJobValidation[], option: ResourceValidationOption);
|
|
15
|
-
getQualifiedResources(): Resource[];
|
|
16
|
-
getJobsWithXQualifiedResources(minQualifiedResources: number): Job[];
|
|
17
|
-
getUnqualifiedJobsWithReasons(): ResourceJobValidation[];
|
|
18
|
-
}
|
|
19
|
-
export declare class ResourceValidator {
|
|
20
|
-
private readonly option;
|
|
21
|
-
constructor(option: ResourceValidationOption);
|
|
22
|
-
validate(resources: Resource[], jobs: Job[]): ValidationResult;
|
|
23
|
-
private validateResource;
|
|
24
|
-
private findAvailableEvent;
|
|
25
|
-
private findConflictingEvents;
|
|
26
|
-
private findMissingTags;
|
|
27
|
-
private prepareData;
|
|
28
|
-
}
|
|
29
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.ResourceValidator=exports.ValidationResult=void 0;const utils_1=require("../../utils");class ResourceJobValidation{constructor(i,t,s=null,e=[],o=[]){this.resource=i,this.job=t,this.availableEvent=s,this.conflictEvents=e,this.missingTags=o}isQualified(i){return!(i.checkAvailability&&null===this.availableEvent||i.checkConflict&&0!==this.conflictEvents.length||i.checkTag&&0!==this.missingTags.length)}}class ValidationResult{constructor(i,t){this.validations=i,this.option=t}getQualifiedResources(){const i=new Map;for(const t of this.validations)t.isQualified(this.option)&&i.set(t.resource.id,t.resource);return Array.from(i.values())}getJobsWithXQualifiedResources(i){const t=new Map;for(const i of this.validations)i.isQualified(this.option)&&t.set(i.job.id,(t.get(i.job.id)||0)+1);return Array.from(new Set(this.validations.map((i=>i.job)))).filter((s=>(t.get(s.id)||0)>=i))}getUnqualifiedJobsWithReasons(){return this.validations.filter((i=>!i.isQualified(this.option)))}}exports.ValidationResult=ValidationResult;class ResourceValidator{constructor(i){this.option=i}validate(i,t){if(!i.length||!t.length)throw new Error("ResourceValidator Error: Resources and jobs must be provided before validation.");this.prepareData(i,t);const s=[];for(const e of t)for(const t of i)s.push(this.validateResource(t,e));return new ValidationResult(s,this.option)}validateResource(i,t){const s=new ResourceJobValidation(i,t);return this.option.checkAvailability&&(s.availableEvent=this.findAvailableEvent(i,t)),this.option.checkConflict&&(s.conflictEvents=this.findConflictingEvents(i,t)),this.option.checkTag&&(s.missingTags=this.findMissingTags(i,t)),s}findAvailableEvent(i,t){return i.availabilities.find((i=>utils_1.DateTimeUtils.isIncluding(i,t)))||null}findConflictingEvents(i,t){return i.events.filter((i=>i.id!==t.id&&utils_1.DateTimeUtils.isOverlapping(i,t)))}findMissingTags(i,t){if(!t.tags||!i.tags)return[];const s=new Set(i.tags.map((i=>i.id)));return t.tags.filter((i=>!s.has(i.id)))}prepareData(i,t){for(const t of i)t.tags||(t.tags=[]);for(const i of t)i.id||(i.id=`${i.start}-${i.finish}`),i.name||(i.name=`${i.start}-${i.finish}`),i.tags||(i.tags=[])}}exports.ResourceValidator=ResourceValidator;
|
|
File without changes
|