@memberjunction/graphql-dataprovider 2.7.1 → 2.9.0
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/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +6 -0
- package/dist/index.d.mts +6 -0
- package/dist/index.mjs.map +1 -1
- package/package.json +8 -4
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/FieldMapper.ts","../src/graphQLDataProvider.ts","../src/config.ts"],"sourcesContent":["import { RegisterClass } from '@memberjunction/global';\n\n/**\n * FieldMapper is used to map fields from one name to another. This is useful when we need to map\n * fields from one system to another, or when we need to map fields from one version of a system\n * to another. Uses an internal field mapping but may be overridden or extended as needed.\n */\nexport class FieldMapper {\n private _fieldMap: Record<string, string> = {\n __mj_CreatedAt: '_mj__CreatedAt',\n __mj_UpdatedAt: '_mj__UpdatedAt',\n __mj_DeletedAt: '_mj__DeletedAt',\n };\n\n /**\n * Creates a new FieldMapper instance.\n * @param fieldMap An optional field map to use for mapping fields. If not provided, the default field map will be used.\n */\n constructor() {}\n\n /**\n * Maps fields from one name to another mutating the object in place.\n * @param obj The object to mutate\n */\n public MapFields(obj?: Record<string, unknown>) {\n if (obj) {\n for (const k in obj) {\n if (k in this._fieldMap) {\n obj[this._fieldMap[k]] = obj[k];\n delete obj[k];\n }\n }\n }\n return obj;\n }\n\n /**\n * Maps a field name from one name to another.\n * @param fieldName The field name to map.\n * @returns The mapped field name, or the original field name if no mapping is found.\n */\n public MapFieldName(fieldName: string): string {\n return this._fieldMap[fieldName] ?? fieldName;\n }\n\n /**\n * Maps a field name from one name to another using the reverse mapping.\n * @param fieldName The field name to map.\n * @returns The mapped field name, or the original field name if no mapping is found.\n */\n public ReverseMapFieldName(fieldName: string): string {\n return Object.entries(this._fieldMap).find(([k, v]) => v === fieldName)?.[0] ?? fieldName;\n }\n\n /**\n * Maps fields from one name to another mutating the object in place using the reverse mapping.\n * @param obj The object to mutate\n */\n public ReverseMapFields(obj: Record<string, unknown>) {\n const reversed = Object.fromEntries(Object.entries(this._fieldMap).map(([k, v]) => [v, k]));\n for (const k in obj) {\n if (k in reversed) {\n obj[reversed[k]] = obj[k];\n delete obj[k];\n }\n }\n return obj;\n }\n}\n","/**************************************************************************************************************\n * The graphQLDataProvider provides a data provider for the entities framework that uses GraphQL to communicate\n * with the server.\n * In practice - this FILE will NOT exist in the entities library, we need to move to its own separate project\n * so it is only included by the consumer of the entities library if they want to use it.\n**************************************************************************************************************/\n\nimport { BaseEntity, IEntityDataProvider, IMetadataProvider, IRunViewProvider, ProviderConfigDataBase, RunViewResult,\n EntityInfo, EntityFieldInfo, EntityFieldTSType,\n RunViewParams, ProviderBase, ProviderType, UserInfo, UserRoleInfo, RecordChange,\n ILocalStorageProvider, EntitySaveOptions, LogError,\n TransactionGroupBase, TransactionItem, TransactionResult, DatasetItemFilterType, DatasetResultType, DatasetStatusResultType, EntityRecordNameInput,\n EntityRecordNameResult, IRunReportProvider, RunReportResult, RunReportParams, RecordDependency, RecordMergeRequest, RecordMergeResult,\n IRunQueryProvider, RunQueryResult, PotentialDuplicateRequest, PotentialDuplicateResponse, CompositeKey, EntityDeleteOptions,\n RunQueryParams, BaseEntityResult,\n KeyValuePair,\n LogStatus} from \"@memberjunction/core\";\nimport { UserViewEntityExtended, ViewInfo } from '@memberjunction/core-entities'\n\nimport { gql, GraphQLClient } from 'graphql-request'\nimport { openDB, DBSchema, IDBPDatabase } from '@tempfix/idb';\nimport { Observable } from 'rxjs';\nimport { Client, createClient } from 'graphql-ws';\nimport { FieldMapper } from './FieldMapper';\n\n// define the shape for a RefreshToken function that can be called by the GraphQLDataProvider whenever it receives an exception that the JWT it has already is expired\nexport type RefreshTokenFunction = () => Promise<string>;\n\nexport class GraphQLProviderConfigData extends ProviderConfigDataBase {\n /**\n * Token is the JWT token that is used to authenticate the user with the server\n */\n get Token(): string { return this.Data.Token }\n\n set Token(token: string) { this.Data.Token = token}\n\n /**\n * URL is the URL to the GraphQL endpoint\n */\n get URL(): string { return this.Data.URL }\n /**\n * WSURL is the URL to the GraphQL websocket endpoint. This is used for subscriptions, if you are not using subscriptions, you can pass in a blank string for this\n */\n get WSURL(): string { return this.Data.WSURL }\n\n /**\n * RefreshTokenFunction is a function that can be called by the GraphQLDataProvider whenever it receives an exception that the JWT it has already is expired\n */\n get RefreshTokenFunction(): RefreshTokenFunction { return this.Data.RefreshFunction }\n\n\n /**\n *\n * @param token Token is the JWT token that is used to authenticate the user with the server\n * @param url the URL to the GraphQL endpoint\n * @param wsurl the URL to the GraphQL websocket endpoint. This is used for subscriptions, if you are not using subscriptions, you can pass in a blank string for this\n * @param refreshTokenFunction is a function that can be called by the GraphQLDataProvider whenever it receives an exception that the JWT it has already is expired\n * @param MJCoreSchemaName the name of the MJ Core schema, if it is not the default name of __mj\n * @param includeSchemas optional, an array of schema names to include in the metadata. If not passed, all schemas are included\n * @param excludeSchemas optional, an array of schema names to exclude from the metadata. If not passed, no schemas are excluded\n */\n constructor(token: string,\n url: string,\n wsurl: string,\n refreshTokenFunction: RefreshTokenFunction,\n MJCoreSchemaName?: string,\n includeSchemas?: string[],\n excludeSchemas?: string[]) {\n super(\n {\n Token: token,\n URL: url,\n WSURL: wsurl,\n RefreshTokenFunction: refreshTokenFunction,\n },\n MJCoreSchemaName,\n includeSchemas,\n excludeSchemas\n );\n }\n}\n\n\n\n// The GraphQLDataProvider implements both the IEntityDataProvider and IMetadataProvider interfaces.\nexport class GraphQLDataProvider extends ProviderBase implements IEntityDataProvider, IMetadataProvider, IRunViewProvider, IRunReportProvider, IRunQueryProvider {\n private static _client: GraphQLClient;\n private static _configData: GraphQLProviderConfigData;\n private static _sessionId: string;\n public get ConfigData(): GraphQLProviderConfigData { return GraphQLDataProvider._configData; }\n\n\n public GenerateUUID() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n\n public async Config(configData: GraphQLProviderConfigData): Promise<boolean> {\n try {\n // FIRST, set up the GraphQL client\n if (GraphQLDataProvider._sessionId === undefined)\n GraphQLDataProvider._sessionId = this.GenerateUUID();\n\n GraphQLDataProvider._configData = configData;\n\n // now create the new client, if it isn't alreayd created\n if (!GraphQLDataProvider._client)\n GraphQLDataProvider._client = GraphQLDataProvider.CreateNewGraphQLClient(configData.URL, configData.Token, GraphQLDataProvider._sessionId);\n\n return super.Config(configData); // now parent class can do it's config\n }\n catch (e) {\n LogError(e);\n throw (e)\n }\n }\n\n public get sessionId(): string {\n return GraphQLDataProvider._sessionId;\n }\n\n protected get AllowRefresh(): boolean {\n return true; // this provider doesn't have any issues with allowing refreshes at any time\n }\n\n protected async GetCurrentUser(): Promise<UserInfo> {\n const d = await GraphQLDataProvider.ExecuteGQL(this._currentUserQuery, null);\n if (d) {\n // convert the user and the user roles _mj__*** fields back to __mj_***\n const u = this.ConvertBackToMJFields(d.CurrentUser);\n const roles = u.UserRoles_UserIDArray.map(r => this.ConvertBackToMJFields(r));\n u.UserRoles_UserIDArray = roles;\n return new UserInfo(this, {...u, UserRoles: roles}) // need to pass in the UserRoles as a separate property that is what is expected here\n }\n }\n\n\n /**************************************************************************/\n // START ---- IRunReportProvider\n /**************************************************************************/\n public async RunReport(params: RunReportParams, contextUser?: UserInfo): Promise<RunReportResult> {\n const query = gql`\n query GetReportDataQuery ($ReportID: String!) {\n GetReportData(ReportID: $ReportID) {\n Success\n Results\n RowCount\n ExecutionTime\n ErrorMessage\n }\n }`\n\n const result = await GraphQLDataProvider.ExecuteGQL(query, {ReportID: params.ReportID} );\n if (result && result.GetReportData)\n return {\n ReportID: params.ReportID,\n Success: result.GetReportData.Success,\n Results: JSON.parse(result.GetReportData.Results),\n RowCount: result.GetReportData.RowCount,\n ExecutionTime: result.GetReportData.ExecutionTime,\n ErrorMessage: result.GetReportData.ErrorMessage,\n };\n }\n /**************************************************************************/\n // END ---- IRunReportProvider\n /**************************************************************************/\n\n /**************************************************************************/\n // START ---- IRunQueryProvider\n /**************************************************************************/\n public async RunQuery(params: RunQueryParams, contextUser?: UserInfo): Promise<RunQueryResult> {\n const query = gql`\n query GetQueryDataQuery ($QueryID: String!) {\n GetQueryData(QueryID: $QueryID) {\n Success\n Results\n RowCount\n ExecutionTime\n ErrorMessage\n }\n }`\n\n const result = await GraphQLDataProvider.ExecuteGQL(query, {QueryID: params.QueryID} );\n if (result && result.GetQueryData)\n return {\n QueryID: params.QueryID,\n Success: result.GetQueryData.Success,\n Results: JSON.parse(result.GetQueryData.Results),\n RowCount: result.GetQueryData.RowCount,\n ExecutionTime: result.GetQueryData.ExecutionTime,\n ErrorMessage: result.GetQueryData.ErrorMessage,\n };\n }\n /**************************************************************************/\n // END ---- IRunReportProvider\n /**************************************************************************/\n\n\n\n /**************************************************************************/\n // START ---- IRunViewProvider\n /**************************************************************************/\n public async RunView<T = any>(params: RunViewParams, contextUser?: UserInfo): Promise<RunViewResult<T>> {\n try {\n let qName: string = ''\n let paramType: string = ''\n if (params) {\n const innerParams: any = {}\n let entity: string, viewEntity: any;\n if (params.ViewEntity) {\n viewEntity = params.ViewEntity\n entity = viewEntity.Entity\n }\n else {\n const {entityName, v} = await this.getEntityNameAndUserView(params, contextUser)\n viewEntity = v;\n entity = entityName;\n }\n\n // get entity metadata\n const e = this.Entities.find(e => e.Name === entity);\n if (!e)\n throw new Error(`Entity ${entity} not found in metadata`);\n\n let dynamicView = false;\n\n if (params.ViewID) {\n qName = `Run${e.ClassName}ViewByID`;\n paramType = 'RunViewByIDInput';\n innerParams.ViewID = params.ViewID;\n }\n else if (params.ViewName) {\n qName = `Run${e.ClassName}ViewByName`;\n paramType = 'RunViewByNameInput';\n innerParams.ViewName = params.ViewName;\n }\n else {\n dynamicView = true;\n qName = `Run${e.ClassName}DynamicView`;\n paramType = 'RunDynamicViewInput';\n innerParams.EntityName = params.EntityName;\n }\n innerParams.ExtraFilter = params.ExtraFilter ? params.ExtraFilter : '';\n innerParams.OrderBy = params.OrderBy ? params.OrderBy : '';\n innerParams.UserSearchString = params.UserSearchString ? params.UserSearchString : '';\n innerParams.Fields = params.Fields; // pass it straight through, either null or array of strings\n innerParams.IgnoreMaxRows = params.IgnoreMaxRows ? params.IgnoreMaxRows : false;\n innerParams.MaxRows = params.MaxRows ? params.MaxRows : 0;\n innerParams.ForceAuditLog = params.ForceAuditLog ? params.ForceAuditLog : false;\n innerParams.ResultType = params.ResultType ? params.ResultType : 'simple';\n if (params.AuditLogDescription && params.AuditLogDescription.length > 0)\n innerParams.AuditLogDescription = params.AuditLogDescription;\n\n if (!dynamicView) {\n innerParams.ExcludeUserViewRunID = params.ExcludeUserViewRunID ? params.ExcludeUserViewRunID : \"\";\n innerParams.ExcludeDataFromAllPriorViewRuns = params.ExcludeDataFromAllPriorViewRuns ? params.ExcludeDataFromAllPriorViewRuns : false;\n innerParams.OverrideExcludeFilter = params.OverrideExcludeFilter ? params.OverrideExcludeFilter : '';\n innerParams.SaveViewResults = params.SaveViewResults ? params.SaveViewResults : false;\n }\n\n const fieldList = this.getViewRunTimeFieldList(e, viewEntity, params, dynamicView);\n const query = gql`\n query RunViewQuery ($input: ${paramType}!) {\n ${qName}(input: $input) {\n Results {\n ${fieldList.join(\"\\n \")}\n }\n UserViewRunID\n RowCount\n TotalRowCount\n ExecutionTime\n Success\n ErrorMessage\n }\n }`\n\n const viewData = await GraphQLDataProvider.ExecuteGQL(query, {input: innerParams} );\n if (viewData && viewData[qName]) {\n // now, if we have any results in viewData that are for the CodeName, we need to convert them to the Name\n // so that the caller gets back what they expect\n const results = viewData[qName].Results;\n if (results && results.length > 0) {\n const codeNameDiffFields = e.Fields.filter(f => f.CodeName !== f.Name && f.CodeName !== undefined);\n results.forEach(r => {\n // for _mj__ results, we need to convert them back to the Name\n this.ConvertBackToMJFields(r);\n codeNameDiffFields.forEach(f => {\n r[f.Name] = r[f.CodeName];\n // delete r[f.CodeName]; // Leave the CodeName in the results, it is useful to have both\n })\n })\n }\n return viewData[qName];\n }\n }\n else\n throw (\"No parameters passed to RunView\");\n\n return null;\n }\n catch (e) {\n LogError(e);\n throw (e)\n }\n }\n\n public async RunViews<T = any>(params: RunViewParams[], contextUser?: UserInfo): Promise<RunViewResult<T>[]> {\n try {\n let innerParams: any[] = [];\n let entityInfos: EntityInfo[] = [];\n let fieldList: string[] = [];\n\n for(const param of params){\n let qName: string = ''\n let paramType: string = ''\n const innerParam: any = {}\n let entity: string | null = null;\n let viewEntity: UserViewEntityExtended | null = null;\n if (param.ViewEntity) {\n viewEntity = param.ViewEntity as UserViewEntityExtended;\n entity = viewEntity.Get(\"Entity\");\n }\n else {\n const {entityName, v} = await this.getEntityNameAndUserView(param, contextUser)\n viewEntity = v;\n entity = entityName;\n }\n\n // get entity metadata\n const e = this.Entities.find(e => e.Name === entity);\n if (!e){\n throw new Error(`Entity ${entity} not found in metadata`);\n }\n\n entityInfos.push(e);\n let dynamicView: boolean = false;\n\n if (param.ViewID) {\n qName = `Run${e.ClassName}ViewByID`;\n paramType = 'RunViewByIDInput';\n innerParam.ViewID = param.ViewID;\n }\n else if (param.ViewName) {\n qName = `Run${e.ClassName}ViewByName`;\n paramType = 'RunViewByNameInput';\n innerParam.ViewName = param.ViewName;\n }\n else {\n dynamicView = true;\n qName = `Run${e.ClassName}DynamicView`;\n paramType = 'RunDynamicViewInput';\n innerParam.EntityName = param.EntityName;\n }\n\n innerParam.ExtraFilter = param.ExtraFilter || '';\n innerParam.OrderBy = param.OrderBy || '';\n innerParam.UserSearchString = param.UserSearchString || '';\n // pass it straight through, either null or array of strings\n innerParam.Fields = param.Fields;\n innerParam.IgnoreMaxRows = param.IgnoreMaxRows || false;\n innerParam.MaxRows = param.MaxRows || 0;\n innerParam.ForceAuditLog = param.ForceAuditLog || false;\n innerParam.ResultType = param.ResultType || 'simple';\n if (param.AuditLogDescription && param.AuditLogDescription.length > 0){\n innerParam.AuditLogDescription = param.AuditLogDescription;\n }\n\n if (!dynamicView) {\n innerParam.ExcludeUserViewRunID = param.ExcludeUserViewRunID || \"\";\n innerParam.ExcludeDataFromAllPriorViewRuns = param.ExcludeDataFromAllPriorViewRuns || false;\n innerParam.OverrideExcludeFilter = param.OverrideExcludeFilter || '';\n innerParam.SaveViewResults = param.SaveViewResults || false;\n }\n\n innerParams.push(innerParam);\n fieldList.push(...this.getViewRunTimeFieldList(e, viewEntity, param, dynamicView));\n }\n\n const query = gql`\n query RunViewsQuery ($input: [RunViewGenericInput!]!) {\n RunViews(input: $input) {\n Results {\n ID\n EntityID\n Data\n }\n UserViewRunID\n RowCount\n TotalRowCount\n ExecutionTime\n Success\n ErrorMessage\n }\n }`;\n\n const viewData: unknown = await GraphQLDataProvider.ExecuteGQL(query, {input: innerParams} );\n if (viewData && viewData[\"RunViews\"]) {\n // now, if we have any results in viewData that are for the CodeName, we need to convert them to the Name\n // so that the caller gets back what they expect\n const results: RunViewResult[] = viewData[\"RunViews\"];\n for(const [index, result] of results.entries()){\n //const codeNameDiffFields = entityInfos[index].Fields.filter(f => f.CodeName !== f.Name && f.CodeName !== undefined);\n result.Results = result.Results.map((data: unknown) => {\n let deserializeData: Record<string, unknown> = JSON.parse(data[\"Data\"]);\n // for _mj__ results, we need to convert them back to the Name\n this.ConvertBackToMJFields(deserializeData);\n /*\n codeNameDiffFields.forEach(f => {\n deserializeData[f.Name] = deserializeData[f.CodeName];\n // delete r[f.CodeName]; // Leave the CodeName in the results, it is useful to have both\n });\n */\n return deserializeData;\n });\n }\n\n return results;\n }\n\n return null;\n\n }\n catch (e) {\n LogError(e);\n throw (e);\n }\n }\n\n protected async getEntityNameAndUserView(params: RunViewParams, contextUser?: UserInfo): Promise<{entityName: string, v: UserViewEntityExtended}> {\n let entityName: string;\n let v: UserViewEntityExtended;\n\n if (!params.EntityName) {\n if (params.ViewID) {\n v = await ViewInfo.GetViewEntity(params.ViewID, contextUser)\n entityName = v.Entity\n }\n else if (params.ViewName) {\n v = await ViewInfo.GetViewEntityByName(params.ViewName, contextUser);\n entityName = v.Entity\n }\n else\n throw new Error(`No EntityName, ViewID or ViewName passed to RunView`)\n }\n else\n entityName = params.EntityName\n\n return {entityName, v}\n }\n\n protected getViewRunTimeFieldList(e: EntityInfo, v: UserViewEntityExtended, params: RunViewParams, dynamicView: boolean): string[] {\n const fieldList = [];\n const mapper = new FieldMapper();\n if (params.Fields) {\n for (const kv of e.PrimaryKeys) {\n if (params.Fields.find(f => f.trim().toLowerCase() === kv.Name.toLowerCase()) === undefined)\n fieldList.push(kv.Name); // always include the primary key fields in view run time field list\n }\n\n // now add any other fields that were passed in\n params.Fields.forEach(f => {\n fieldList.push(mapper.MapFieldName(f))\n });\n }\n else {\n // no fields were passed in. So, let's check to see if we are running an dynamic view.\n // If so, we need to include all fields since the caller didn't specify the fields they want\n // otherwise, we include the fields that are part of the view definition.\n if (dynamicView) {\n // include all fields since no fields were passed in\n e.Fields.forEach(f => {\n if (!f.IsBinaryFieldType) {\n fieldList.push(mapper.MapFieldName(f.CodeName));\n }\n });\n }\n else {\n // NOTE: in the below, c.EntityField SHOULD always exist, however there is a possibility that at some point a VIEW was created that used fields\n // and those fields are NO LONGER part of an entity, in that situation we should just remove them, rather than letting the whole view blow up which\n // would happen if we dno't check for c.EntityField? in the below\n\n // first make sure we have the primary key field in the view column list, always should, but make sure\n for (const kv of e.PrimaryKeys) {\n if (fieldList.find(f => f.trim().toLowerCase() === kv.Name.toLowerCase()) === undefined)\n fieldList.push(kv.Name); // always include the primary key fields in view run time field list\n }\n\n // Now: include the fields that are part of the view definition\n v.Columns.forEach(c => {\n if (c.hidden === false && !fieldList.find(item => item.trim().toLowerCase() === c.EntityField?.Name.trim().toLowerCase())) { // don't include hidden fields and don't include the pkey field again\n if (!c.EntityField) {\n // this can happen if a field was previously included in a view, but is no longer part of the entity\n // simply don't include it in the field list\n }\n else\n fieldList.push(mapper.MapFieldName(c.EntityField.CodeName));\n }\n });\n }\n }\n return fieldList;\n }\n /**************************************************************************/\n // END ---- IRunViewProvider\n /**************************************************************************/\n\n\n /**************************************************************************/\n // START ---- IEntityDataProvider\n /**************************************************************************/\n public get ProviderType(): ProviderType {\n return ProviderType.Network;\n }\n\n public async GetRecordChanges(entityName: string, primaryKey: CompositeKey): Promise<RecordChange[]> {\n try {\n const p: RunViewParams = {\n EntityName: 'Record Changes',\n ExtraFilter: `RecordID = '${primaryKey.Values()}' AND Entity = '${entityName}'`,\n //OrderBy: 'ChangedAt DESC',\n }\n const result = await this.RunView(p);\n if (result) {\n // sort the results client side because, for now, the RunViewParams doesn't support OrderBy dynamically like we tried. Later change this to do via the SQL query\n return result.Results.sort((a: RecordChange, b: RecordChange) => {\n return (a.ChangedAt > b.ChangedAt) ? -1 : 1 // sort descending on the date.... GraphQL passes back the date as time since base date\n });\n }\n else\n return null;\n }\n catch (e) {\n LogError(e);\n throw (e)\n }\n }\n\n\n /**\n * Returns a list of dependencies - records that are linked to the specified Entity/KeyValuePairs combination. A dependency is as defined by the relationships in the database. The MemberJunction metadata that is used\n * for this simply reflects the foreign key relationships that exist in the database. The CodeGen tool is what detects all of the relationships and generates the metadata that is used by MemberJunction. The metadata in question\n * is within the EntityField table and specifically the RelatedEntity and RelatedEntityField columns. In turn, this method uses that metadata and queries the database to determine the dependencies. To get the list of entity dependencies\n * you can use the utility method GetEntityDependencies(), which doesn't check for dependencies on a specific record, but rather gets the metadata in one shot that can be used for dependency checking.\n * @param entityName the name of the entity to check\n * @param KeyValuePairs the KeyValuePairs of the record to check\n */\n public async GetRecordDependencies(entityName: string, primaryKey: CompositeKey): Promise<RecordDependency[]> {\n try {\n // execute the gql query to get the dependencies\n const query = gql`query GetRecordDependenciesQuery ($entityName: String!, $CompositeKey: CompositeKeyInputType!) {\n GetRecordDependencies(entityName: $entityName, CompositeKey: $CompositeKey) {\n EntityName\n RelatedEntityName\n FieldName\n CompositeKey {\n KeyValuePairs {\n FieldName\n Value\n }\n }\n }\n }`\n\n // now we have our query built, execute it\n const vars = {\n entityName: entityName,\n CompositeKey: {KeyValuePairs: this.ensureKeyValuePairValueIsString(primaryKey.KeyValuePairs)}\n };\n const data = await GraphQLDataProvider.ExecuteGQL(query, vars);\n\n return data?.GetRecordDependencies; // shape of the result should exactly match the RecordDependency type\n }\n catch (e) {\n LogError(e);\n throw (e)\n }\n }\n\n protected ensureKeyValuePairValueIsString(kvps: KeyValuePair[]): {FieldName: string, Value: string}[] {\n return kvps.map(kv => {\n return {FieldName: kv.FieldName, Value: kv.Value.toString()}\n })\n }\n\n public async GetRecordDuplicates(params: PotentialDuplicateRequest, contextUser?: UserInfo): Promise<PotentialDuplicateResponse>\n {\n if(!params){\n return null;\n }\n\n const query: string = gql`query GetRecordDuplicatesQuery ($params: PotentialDuplicateRequestType!) {\n GetRecordDuplicates(params: $params) {\n Status\n ErrorMessage\n PotentialDuplicateResult {\n EntityID\n DuplicateRunDetailMatchRecordIDs\n RecordPrimaryKeys {\n KeyValuePairs {\n FieldName\n Value\n }\n }\n Duplicates {\n ProbabilityScore\n KeyValuePairs {\n FieldName\n Value\n }\n }\n }\n }\n }`\n\n let request = {\n EntityID: params.EntityID,\n EntityDocumentID: params.EntityDocumentID,\n ListID: params.ListID,\n ProbabilityScore: params.ProbabilityScore,\n Options: params.Options,\n RecordIDs: params.RecordIDs.map(recordID => {\n return recordID.Copy();\n })\n }\n const data = await GraphQLDataProvider.ExecuteGQL(query, {params: request});\n\n if(data && data.GetRecordDuplicates){\n return data.GetRecordDuplicates;\n }\n }\n\n public async MergeRecords(request: RecordMergeRequest): Promise<RecordMergeResult> {\n const e = this.Entities.find(e=>e.Name.trim().toLowerCase() === request.EntityName.trim().toLowerCase());\n if (!e || !e.AllowRecordMerge)\n throw new Error(`Entity ${request.EntityName} does not allow record merging, check the AllowRecordMerge property in the entity metadata`);\n\n try {\n // execute the gql query to get the dependencies\n const mutation = gql`mutation MergeRecordsMutation ($request: RecordMergeRequest!) {\n MergeRecords(request: $request) {\n Success\n OverallStatus\n RecordMergeLogID\n RecordStatus {\n CompositeKey {\n KeyValuePairs {\n FieldName\n Value\n }\n }\n Success\n RecordMergeDeletionLogID\n Message\n }\n }\n }`\n\n // create a new request that is compatible with the server's expectations where field maps and also the primary key values are all strings\n const newRequest = {\n EntityName: request.EntityName,\n SurvivingRecordCompositeKey: {KeyValuePairs: this.ensureKeyValuePairValueIsString(request.SurvivingRecordCompositeKey.KeyValuePairs)},\n FieldMap: request.FieldMap?.map(fm => {\n return {\n FieldName: fm.FieldName,\n Value: fm.Value.toString() // turn the value into a string, since that is what the server expects\n }\n }),\n RecordsToMerge: request.RecordsToMerge.map(r => {\n return r.Copy();\n })\n }\n\n // now we have our query built, execute it\n const data = await GraphQLDataProvider.ExecuteGQL(mutation, {request: newRequest});\n\n return data?.MergeRecords; // shape of the result should exactly match the RecordDependency type\n }\n catch (e) {\n LogError(e);\n return {\n Success: false,\n OverallStatus: e && e.message ? e.message : e,\n RecordStatus: [],\n RecordMergeLogID: \"\",\n Request: request,\n }\n throw (e)\n }\n }\n\n public async Save(entity: BaseEntity, user: UserInfo, options: EntitySaveOptions) : Promise<{}> {\n const result = new BaseEntityResult();\n try {\n entity.RegisterTransactionPreprocessing(); // as of the time of writing, this isn't technically needed because we are not doing any async preprocessing, but it is good to have it here for future use in case something is added with async between here and the TransactionItem being added.\n\n const vars = { input: {} };\n const type: string = entity.IsSaved ? \"Update\" : \"Create\";\n\n result.StartedAt = new Date();\n result.Type = entity.IsSaved ? 'update' : 'create';\n result.OriginalValues = entity.Fields.map(f => { return {FieldName: f.CodeName, Value: f.Value} });\n entity.ResultHistory.push(result); // push the new result as we have started a process\n\n // Create the query for the mutation first, we will provide the specific\n // input values later in the loop below. Here we are just setting up the mutation\n // and the fields that will be returned since the mutation returns back the latest\n // values for the entity and we need to have those values to update the entity after the\n // save\n\n const mutationName = `${type}${entity.EntityInfo.ClassName}`\n\n // only pass along writable fields, AND the PKEY value if this is an update\n const filteredFields = entity.Fields.filter(f => !f.ReadOnly || (f.IsPrimaryKey && entity.IsSaved));\n const mapper = new FieldMapper();\n const inner = ` ${mutationName}(input: $input) {\n ${entity.Fields.map(f => mapper.MapFieldName(f.CodeName)).join(\"\\n \")}\n }`\n const outer = gql`mutation ${type}${entity.EntityInfo.ClassName} ($input: ${mutationName}Input!) {\n ${inner}\n }\n `\n for (let i = 0; i < filteredFields.length; i++) {\n const f = filteredFields[i];\n let val = f.Value;\n if (val && f.EntityFieldInfo.TSType === EntityFieldTSType.Date)\n val = val.getTime();\n if (val && f.EntityFieldInfo.TSType === EntityFieldTSType.Boolean && typeof val !== 'boolean')\n val = parseInt(val) === 0 ? false : true; // convert to boolean\n\n if (val === null && f.EntityFieldInfo.AllowsNull === false) {\n if (f.EntityFieldInfo.DefaultValue !== null) {\n // no value, but there is a default value, so use that, since field does NOT allow NULL\n val = f.EntityFieldInfo.DefaultValue;\n }\n else {\n // no default value, null value and field doesn't allow nulls, so set to either 0 or empty string\n if (f.FieldType === EntityFieldTSType.Number || f.FieldType === EntityFieldTSType.Boolean)\n val = 0;\n else\n val = '';\n }\n }\n vars.input[f.CodeName] = val;\n }\n\n // now add an OldValues prop to the vars IF the type === 'update' and the options.SkipOldValuesCheck === false\n if (type.trim().toLowerCase() === 'update' &&\n options.SkipOldValuesCheck === false) {\n const ov = [];\n entity.Fields.forEach(f => {\n let val = null;\n if (f.OldValue !== null && f.OldValue !== undefined) {\n if (typeof f.OldValue !== 'string')\n val = f.OldValue.toString();\n else\n val = f.OldValue;\n }\n ov.push({Key: f.CodeName, Value: val }); // pass ALL old values to server, slightly inefficient but we want full record\n });\n vars.input['OldValues___'] = ov; // add the OldValues prop to the input property that is part of the vars already\n }\n\n if (entity.TransactionGroup) {\n return new Promise((resolve, reject) => {\n const mutationInputTypes = [\n {\n varName: 'input',\n inputType: mutationName + 'Input!'\n }\n ];\n\n entity.RaiseReadyForTransaction(); // let the entity know we're ready to be part of the transaction\n\n // we are part of a transaction group, so just add our query to the list\n // and when the transaction is committed, we will send all the queries at once\n entity.TransactionGroup.AddTransaction(new TransactionItem(entity, inner, vars, {mutationName,\n mutationInputTypes: mutationInputTypes},\n (results: any, success: boolean) => {\n // we get here whenever the transaction group does gets around to committing\n // our query. We need to update our entity with the values that were returned\n // from the mutation if it was successful.\n result.EndedAt = new Date();\n if (success && results) {\n // got our data, send it back to the caller, which is the entity object\n // and that object needs to update itself from this data.\n result.Success = true;\n resolve (this.ConvertBackToMJFields(results));\n }\n else {\n // the transaction failed, nothing to update, but we need to call Reject so the\n // promise resolves with a rejection so our outer caller knows\n result.Success = false;\n result.Message = 'Transaction failed';\n reject();\n }\n }));\n });\n }\n else {\n // not part of a transaction group, so just go for it and send across our GQL\n const d = await GraphQLDataProvider.ExecuteGQL(outer, vars)\n if (d && d[type + entity.EntityInfo.ClassName]) {\n result.Success = true;\n result.EndedAt = new Date();\n const ret = this.ConvertBackToMJFields(d[type + entity.EntityInfo.ClassName]);\n return ret;\n }\n else\n throw new Error(`Save failed for ${entity.EntityInfo.ClassName}`);\n }\n }\n catch (e) {\n result.Success = false;\n result.EndedAt = new Date();\n result.Message = e.response?.errors?.length > 0 ? e.response.errors[0].message : e.message;\n LogError(e);\n return null;\n }\n }\n public async Load(entity: BaseEntity, primaryKey: CompositeKey, EntityRelationshipsToLoad: string[] = null, user: UserInfo) : Promise<{}> {\n try {\n const vars = {};\n let pkeyInnerParamString: string = '';\n let pkeyOuterParamString: string = '';\n\n for (let i = 0; i < primaryKey.KeyValuePairs.length; i++) {\n const field: EntityFieldInfo = entity.Fields.find(f => f.Name.trim().toLowerCase() === primaryKey.KeyValuePairs[i].FieldName.trim().toLowerCase()).EntityFieldInfo;\n const val = primaryKey.GetValueByIndex(i);\n const pkeyGraphQLType: string = field.GraphQLType;\n\n // build up the param string for the outer query definition\n if (pkeyOuterParamString.length > 0)\n pkeyOuterParamString += ', ';\n pkeyOuterParamString += `$${field.CodeName}: ${pkeyGraphQLType}!`;\n\n // build up the param string for the inner query call\n if (pkeyInnerParamString.length > 0)\n pkeyInnerParamString += ', ';\n pkeyInnerParamString += `${field.CodeName}: $${field.CodeName}`;\n\n // build up the variables we are passing along to the query\n if (field.TSType === EntityFieldTSType.Number) {\n if (isNaN(primaryKey.GetValueByIndex(i)))\n throw new Error(`Primary Key value ${val} (${field.Name}) is not a valid number`);\n vars[field.CodeName] = parseInt(val); // converting to number here for graphql type to work properly\n }\n else\n vars[field.CodeName] = val;\n }\n\n const rel = EntityRelationshipsToLoad && EntityRelationshipsToLoad.length > 0 ? this.getRelatedEntityString(entity.EntityInfo, EntityRelationshipsToLoad) : '';\n\n const mapper = new FieldMapper();\n const query = gql`query Single${entity.EntityInfo.ClassName}${rel.length > 0 ? 'Full' : ''} (${pkeyOuterParamString}) {\n ${entity.EntityInfo.ClassName}(${pkeyInnerParamString}) {\n ${entity.Fields.filter((f) => !f.EntityFieldInfo.IsBinaryFieldType)\n .map((f) => {\n if (f.EntityFieldInfo.Name.trim().toLowerCase().startsWith('__mj_')) {\n // fields that start with __mj_ need to be converted to _mj__ for the GraphQL query\n return f.CodeName.replace('__mj_', '_mj__');\n } else {\n return f.CodeName;\n }\n })\n .join('\\n ')}\n ${rel}\n }\n }\n `;\n\n const d = await GraphQLDataProvider.ExecuteGQL(query, vars)\n if (d && d[entity.EntityInfo.ClassName]) {\n // the resulting object has all the values in it, but we need to convert any elements that start with _mj__ back to __mj_\n return this.ConvertBackToMJFields(d[entity.EntityInfo.ClassName]);\n }\n else\n return null;\n }\n catch (e) {\n LogError(e);\n return null;\n }\n }\n\n /**\n * This method will convert back any fields that start with _mj__ back to __mj_ so that the entity object can properly update itself with the data that was returned from the server\n * @param ret\n * @returns\n */\n protected ConvertBackToMJFields(ret: any): any {\n const mapper = new FieldMapper();\n mapper.ReverseMapFields(ret);\n return ret; // clean object to pass back here\n }\n\n protected getRelatedEntityString(entityInfo: EntityInfo, EntityRelationshipsToLoad: string[]): string {\n let rel = '';\n for (let i = 0; i < entityInfo.RelatedEntities.length; i++) {\n if (EntityRelationshipsToLoad.indexOf(entityInfo.RelatedEntities[i].RelatedEntity) >= 0) {\n const r = entityInfo.RelatedEntities[i];\n const re = this.Entities.find(e => e.ID === r.RelatedEntityID);\n let uniqueCodeName: string = '';\n if (r.Type.toLowerCase().trim() === 'many to many') {\n uniqueCodeName = `${r.RelatedEntityCodeName}_${r.JoinEntityJoinField.replace(/\\s/g, '')}`;\n }\n else {\n uniqueCodeName = `${r.RelatedEntityCodeName}_${r.RelatedEntityJoinField.replace(/\\s/g, '')}`;\n }\n rel += `\n ${uniqueCodeName} {\n ${re.Fields.map(f => f.CodeName).join(\"\\n \")}\n }\n `;\n }\n }\n return rel;\n }\n\n public async Delete(entity: BaseEntity, options: EntityDeleteOptions, user: UserInfo) : Promise<boolean> {\n const result = new BaseEntityResult();\n try {\n entity.RegisterTransactionPreprocessing();\n\n result.StartedAt = new Date();\n result.Type = 'delete';\n result.OriginalValues = entity.Fields.map(f => { return {FieldName: f.CodeName, Value: f.Value} });\n entity.ResultHistory.push(result); // push the new result as we have started a process\n\n const vars = {};\n const mutationInputTypes = [];\n let pkeyInnerParamString: string = '';\n let pkeyOuterParamString: string = '';\n let returnValues: string = '';\n for (let kv of entity.PrimaryKey.KeyValuePairs) {\n const pk = entity.Fields.find(f => f.Name.trim().toLowerCase() === kv.FieldName.trim().toLowerCase()); // get the field for the primary key field\n vars[pk.CodeName] = pk.Value;\n mutationInputTypes.push({varName: pk.CodeName, inputType: pk.EntityFieldInfo.GraphQLType + '!'}); // only used when doing a transaction group, but it is easier to do in this main loop\n if (pkeyInnerParamString.length > 0)\n pkeyInnerParamString += ', ';\n pkeyInnerParamString += `${pk.CodeName}: $${pk.CodeName}`;\n\n if (pkeyOuterParamString.length > 0)\n pkeyOuterParamString += ', ';\n pkeyOuterParamString += `$${pk.CodeName}: ${pk.EntityFieldInfo.GraphQLType}!`;\n\n if (returnValues.length > 0)\n returnValues += '\\n ';\n returnValues += `${pk.CodeName}`;\n }\n\n mutationInputTypes.push({varName: \"options___\", inputType: 'DeleteOptionsInput!'}); // only used when doing a transaction group, but it is easier to do in this main loop\n vars[\"options___\"] = options ? options : {SkipEntityAIActions: false, SkipEntityActions: false};\n\n const queryName: string = 'Delete' + entity.EntityInfo.ClassName;\n const inner = gql`${queryName}(${pkeyInnerParamString}, options___: $options___) {\n ${returnValues}\n }\n `\n const query = gql`mutation ${queryName} (${pkeyOuterParamString}, $options___: DeleteOptionsInput!) {\n ${inner}\n }\n `\n\n if (entity.TransactionGroup) {\n // we have a transaction group, need to play nice and be part of it\n entity.RaiseReadyForTransaction();\n return new Promise((resolve, reject) => {\n // we are part of a transaction group, so just add our query to the list\n // and when the transaction is committed, we will send all the queries at once\n entity.TransactionGroup.AddTransaction(new TransactionItem(entity, inner, vars, {mutationName: queryName,\n mutationInputTypes: mutationInputTypes},\n (results: any, success: boolean) => {\n // we get here whenever the transaction group does gets around to committing\n // our query.\n result.EndedAt = new Date(); // done processing\n if (success && results) {\n // success indicated by the entity.PrimaryKey.Value matching the return value of the mutation\n let success: boolean = true;\n for (const pk of entity.PrimaryKey.KeyValuePairs) {\n // check each primary key value to see if it matches the return value of the mutation\n if (pk.Value !== results[pk.FieldName]) {\n success = false;\n }\n }\n if (success) {\n result.Success = true;\n resolve (true)\n }\n else {\n // the transaction failed, nothing to update, but we need to call Reject so the\n // promise resolves with a rejection so our outer caller knows\n result.Success = false;\n result.Message = 'Transaction failed to commit'\n reject();\n }\n }\n else {\n // the transaction failed, nothing to update, but we need to call Reject so the\n // promise resolves with a rejection so our outer caller knows\n result.Success = false;\n result.Message = 'Transaction failed to commit'\n reject();\n }\n }));\n });\n }\n else {\n // no transaction just go for it\n const d = await GraphQLDataProvider.ExecuteGQL(query, vars)\n if (d && d[queryName]) {\n const data = d[queryName];\n for (let key of entity.PrimaryKey.KeyValuePairs) {\n // we want to now compare key.Value against data[key.FieldName]\n let returnedVal = data[key.FieldName];\n let originalVal = key.Value;\n // we want to ignore types so we should convert numbers to strings for the comparison\n if (typeof originalVal === 'number')\n originalVal = originalVal.toString();\n if (typeof returnedVal === 'number')\n returnedVal = returnedVal.toString();\n // now compare the two values\n if (originalVal !== returnedVal) {\n throw new Error (`Primary key value mismatch in server Delete response. Field: ${key.FieldName}, Original: ${originalVal}, Returned: ${returnedVal}`);\n }\n }\n result.Success = true;\n result.EndedAt = new Date(); // done processing\n return true; // all of the return values match the primary key values, so we are good and delete worked\n }\n else\n throw new Error(`Delete failed for ${entity.EntityInfo.Name}: ${entity.PrimaryKey.ToString()} `);\n }\n }\n catch (e) {\n result.EndedAt = new Date(); // done processing\n result.Success = false;\n result.Message = e.response?.errors?.length > 0 ? e.response.errors[0].message : e.message;\n LogError(e);\n\n return false;\n }\n }\n /**************************************************************************/\n // END ---- IEntityDataProvider\n /**************************************************************************/\n\n\n /**************************************************************************/\n // START ---- IMetadataProvider\n /**************************************************************************/\n public async GetDatasetByName(datasetName: string, itemFilters?: DatasetItemFilterType[]): Promise<DatasetResultType> {\n const query = gql`query GetDatasetByName($DatasetName: String!, $ItemFilters: [DatasetItemFilterTypeGQL!]) {\n GetDatasetByName(DatasetName: $DatasetName, ItemFilters: $ItemFilters) {\n DatasetID\n DatasetName\n Success\n Status\n LatestUpdateDate\n Results\n }\n }`\n const data = await GraphQLDataProvider.ExecuteGQL(query, {DatasetName: datasetName, ItemFilters: itemFilters });\n if (data && data.GetDatasetByName && data.GetDatasetByName.Success) {\n return {\n DatasetID: data.GetDatasetByName.DatasetID,\n DatasetName: data.GetDatasetByName.DatasetName,\n Success: data.GetDatasetByName.Success,\n Status: data.GetDatasetByName.Status,\n LatestUpdateDate: new Date(data.GetDatasetByName.LatestUpdateDate),\n Results: JSON.parse(data.GetDatasetByName.Results)\n }\n }\n else {\n return {\n DatasetID: \"\",\n DatasetName: datasetName,\n Success: false,\n Status: 'Unknown',\n LatestUpdateDate: null,\n Results: null\n };\n }\n }\n\n public async GetDatasetStatusByName(datasetName: string, itemFilters?: DatasetItemFilterType[]): Promise<DatasetStatusResultType> {\n const query = gql`query GetDatasetStatusByName($DatasetName: String!, $ItemFilters: [DatasetItemFilterTypeGQL!]) {\n GetDatasetStatusByName(DatasetName: $DatasetName, ItemFilters: $ItemFilters) {\n DatasetID\n DatasetName\n Success\n Status\n LatestUpdateDate\n EntityUpdateDates\n }\n }`\n const data = await GraphQLDataProvider.ExecuteGQL(query, {DatasetName: datasetName, ItemFilters: itemFilters});\n if (data && data.GetDatasetStatusByName && data.GetDatasetStatusByName.Success) {\n return {\n DatasetID: data.GetDatasetStatusByName.DatasetID,\n DatasetName: data.GetDatasetStatusByName.DatasetName,\n Success: data.GetDatasetStatusByName.Success,\n Status: data.GetDatasetStatusByName.Status,\n LatestUpdateDate: new Date(data.GetDatasetStatusByName.LatestUpdateDate),\n EntityUpdateDates: JSON.parse(data.GetDatasetStatusByName.EntityUpdateDates)\n }\n }\n else {\n return {\n DatasetID: \"\",\n DatasetName: datasetName,\n Success: false,\n Status: 'Unknown',\n LatestUpdateDate: null,\n EntityUpdateDates: null\n };\n }\n }\n\n public async CreateTransactionGroup(): Promise<TransactionGroupBase> {\n return new GraphQLTransactionGroup();\n }\n\n public async GetRecordFavoriteStatus(userId: string, entityName: string, primaryKey: CompositeKey): Promise<boolean> {\n const valResult = primaryKey.Validate();\n if (!valResult.IsValid)\n return false;\n\n const e = this.Entities.find(e => e.Name === entityName)\n if (!e)\n throw new Error(`Entity ${entityName} not found in metadata`);\n\n const query = gql`query GetRecordFavoriteStatus($params: UserFavoriteSearchParams!) {\n GetRecordFavoriteStatus(params: $params) {\n Success\n IsFavorite\n }\n }`\n\n const data = await GraphQLDataProvider.ExecuteGQL(query, {params: {\n UserID: userId,\n EntityID: e.ID,\n CompositeKey: {KeyValuePairs: this.ensureKeyValuePairValueIsString(primaryKey.KeyValuePairs)}\n }\n }\n );\n if (data && data.GetRecordFavoriteStatus && data.GetRecordFavoriteStatus.Success)\n return data.GetRecordFavoriteStatus.IsFavorite;\n }\n\n public async SetRecordFavoriteStatus(userId: string, entityName: string, primaryKey: CompositeKey, isFavorite: boolean, contextUser: UserInfo): Promise<void> {\n const e = this.Entities.find(e => e.Name === entityName)\n if (!e){\n throw new Error(`Entity ${entityName} not found in metadata`);\n }\n\n const query = gql`mutation SetRecordFavoriteStatus($params: UserFavoriteSetParams!) {\n SetRecordFavoriteStatus(params: $params){\n Success\n }\n }`\n\n const data = await GraphQLDataProvider.ExecuteGQL(query, { params: {\n UserID: userId,\n EntityID: e.ID,\n CompositeKey: {KeyValuePairs: this.ensureKeyValuePairValueIsString(primaryKey.KeyValuePairs)},\n IsFavorite: isFavorite}\n }\n );\n if (data && data.SetRecordFavoriteStatus !== null)\n return data.SetRecordFavoriteStatus.Success;\n }\n\n public async GetEntityRecordName(entityName: string, primaryKey: CompositeKey): Promise<string> {\n if (!entityName || !primaryKey || primaryKey.KeyValuePairs?.length === 0){\n return null;\n }\n\n const query = gql`query GetEntityRecordNameQuery ($EntityName: String!, $CompositeKey: CompositeKeyInputType!) {\n GetEntityRecordName(EntityName: $EntityName, CompositeKey: $CompositeKey) {\n Success\n Status\n RecordName\n }\n }`\n\n const data = await GraphQLDataProvider.ExecuteGQL(query, {\n EntityName: entityName,\n CompositeKey: {KeyValuePairs: this.ensureKeyValuePairValueIsString(primaryKey.KeyValuePairs)}\n });\n if (data && data.GetEntityRecordName && data.GetEntityRecordName.Success)\n return data.GetEntityRecordName.RecordName;\n }\n\n public async GetEntityRecordNames(info: EntityRecordNameInput[]): Promise<EntityRecordNameResult[]> {\n if (!info)\n return null;\n\n const query = gql`query GetEntityRecordNamesQuery ($info: [EntityRecordNameInput!]!) {\n GetEntityRecordNames(info: $info) {\n Success\n Status\n CompositeKey {\n KeyValuePairs {\n FieldName\n Value\n }\n }\n EntityName\n RecordName\n }\n }`\n\n const data = await GraphQLDataProvider.ExecuteGQL(query, {info: info.map(i => {\n return {\n EntityName: i.EntityName,\n CompositeKey: {KeyValuePairs: this.ensureKeyValuePairValueIsString(i.CompositeKey.KeyValuePairs)}\n }\n })});\n if (data && data.GetEntityRecordNames)\n return data.GetEntityRecordNames;\n }\n\n public static async ExecuteGQL(query: string, variables: any, refreshTokenIfNeeded: boolean = true): Promise<any> {\n try {\n const data = await GraphQLDataProvider._client.request(query, variables);\n return data;\n }\n catch (e) {\n if (e && e.response && e.response.errors?.length > 0) {//e.code === 'JWT_EXPIRED') {\n const error = e.response.errors[0];\n const code = error?.extensions?.code?.toUpperCase().trim()\n if (code === 'JWT_EXPIRED') {\n if (refreshTokenIfNeeded) {\n // token expired, so we need to refresh it and try again\n await GraphQLDataProvider.RefreshToken();\n return await GraphQLDataProvider.ExecuteGQL(query, variables, false/*don't attempt to refresh again*/);\n }\n else {\n // token expired but the caller doesn't want a refresh, so just return the error\n LogError(`JWT_EXPIRED and refreshTokenIfNeeded is false`);\n throw e;\n }\n }\n else\n throw e;\n }\n else {\n LogError(e);\n throw e; // force the caller to handle the error\n }\n }\n }\n\n public static async RefreshToken(): Promise<void> {\n if (GraphQLDataProvider._configData.Data.RefreshTokenFunction) {\n const newToken = await GraphQLDataProvider._configData.Data.RefreshTokenFunction();\n if (newToken) {\n GraphQLDataProvider._configData.Token = newToken; // update the token\n GraphQLDataProvider._client = this.CreateNewGraphQLClient(GraphQLDataProvider._configData.URL,\n GraphQLDataProvider._configData.Token,\n GraphQLDataProvider._sessionId);\n }\n else {\n throw new Error('Refresh token function returned null or undefined token');\n }\n }\n else {\n throw new Error('No refresh token function provided');\n }\n }\n\n protected static CreateNewGraphQLClient(url: string, token: string, sessionId: string): GraphQLClient {\n return new GraphQLClient(url, {\n headers: {\n authorization: 'Bearer ' + token,\n 'x-session-id': sessionId\n }\n });\n }\n\n private _innerCurrentUserQueryString = `CurrentUser {\n ${this.userInfoString()}\n UserRoles_UserIDArray {\n ${this.userRoleInfoString()}\n }\n }\n `\n\n\n private _currentUserQuery = gql`query CurrentUserAndRoles {\n ${this._innerCurrentUserQueryString}\n }`\n\n\n\n private userInfoString(): string {\n return this.infoString(new UserInfo(null, null))\n }\n private userRoleInfoString(): string {\n return this.infoString(new UserRoleInfo(null))\n }\n private infoString(object: any): string {\n let sOutput: string = '';\n const keys = Object.keys(object)\n for (const k of keys) {\n if (k.startsWith('__mj_')) {\n sOutput += k.replace('__mj_', '_mj__') + '\\n '\n }\n else if (!k.startsWith('_')) {\n sOutput += k + '\\n '\n }\n }\n return sOutput\n }\n\n\n private _localStorageProvider: ILocalStorageProvider;\n get LocalStorageProvider(): ILocalStorageProvider {\n if (!this._localStorageProvider)\n this._localStorageProvider = new BrowserIndexedDBStorageProvider();\n\n return this._localStorageProvider;\n }\n\n\n /**************************************************************************/\n // END ---- IMetadataProvider\n /**************************************************************************/\n protected get Metadata(): IMetadataProvider {\n return this;\n }\n\n private _wsClient: Client = null;\n private _pushStatusRequests: {sessionId: string, observable: Observable<string>}[] = [];\n public PushStatusUpdates(sessionId: string = null): Observable<string> {\n if (!sessionId)\n sessionId = this.sessionId;\n\n if (!this._wsClient)\n this._wsClient = createClient({\n url: this.ConfigData.WSURL,\n connectionParams: {\n Authorization: 'Bearer ' + this.ConfigData.Token,\n },\n });\n\n const existingRequest = this._pushStatusRequests.find(r => r.sessionId === sessionId);\n if (existingRequest)\n return existingRequest.observable;\n\n const SUBSCRIBE_TO_STATUS = gql`subscription StatusUpdates($sessionId: String!) {\n statusUpdates(sessionId: $sessionId) {\n date\n message\n sessionId\n }\n }\n `;\n\n const newObservable = new Observable<string>((observer) => {\n const unsubscribe = this._wsClient.subscribe(\n { query: SUBSCRIBE_TO_STATUS, variables: { sessionId } },\n {\n next: (data) => {\n return observer.next(<string>data.data.statusUpdates)\n },\n error: (error) => {\n return observer.error(error)\n },\n complete: () => {\n return observer.complete()\n },\n }\n );\n\n return () => {\n // Cleanup logic\n console.log('would unsub here')\n //unsubscribe();\n };\n });\n this._pushStatusRequests.push({sessionId, observable: newObservable});\n return newObservable;\n }\n}\n\n\n// this class implements a simple in-memory only storage as a fallback if the browser doesn't support local storage\nclass BrowserStorageProviderBase implements ILocalStorageProvider {\n private _localStorage: { [key: string]: string } = {};\n\n public async getItem(key: string): Promise<string | null> {\n return new Promise((resolve) => {\n if (this._localStorage.hasOwnProperty(key))\n resolve(this._localStorage[key]);\n else\n resolve(null);\n });\n }\n\n public async setItem(key: string, value: string): Promise<void> {\n return new Promise((resolve) => {\n this._localStorage[key] = value;\n resolve();\n });\n }\n\n public async remove(key: string): Promise<void> {\n return new Promise((resolve) => {\n if (this._localStorage.hasOwnProperty(key)) {\n delete this._localStorage[key];\n }\n resolve();\n });\n }\n}\n\n\n// This implementation just wraps the browser local storage and if for some reason the browser doesn't\n// have a localStorage object, we just use a simple object to store the data in memory.\nclass BrowserLocalStorageProvider extends BrowserStorageProviderBase {\n public async getItem(key: string): Promise<string | null> {\n if (localStorage)\n return localStorage.getItem(key);\n else\n return await super.getItem(key)\n }\n\n public async setItem(key: string, value: string): Promise<void> {\n if (localStorage)\n localStorage.setItem(key, value);\n else\n await super.setItem(key, value)\n }\n\n public async remove(key: string): Promise<void> {\n if (localStorage)\n localStorage.removeItem(key);\n else\n await super.remove(key)\n }\n}\n\n\n\nconst IDB_DB_NAME = 'MJ_Metadata';\nconst IDB_DB_ObjectStoreName = 'Metadata_KVPairs';\n\ninterface MJ_MetadataDB extends DBSchema {\n 'Metadata_KVPairs': {\n key: string;\n value: any;\n };\n}\n\nclass BrowserIndexedDBStorageProvider extends BrowserStorageProviderBase {\n private dbPromise: Promise<IDBPDatabase<MJ_MetadataDB>>;\n\n constructor() {\n super();\n\n this.dbPromise = openDB<MJ_MetadataDB>(IDB_DB_NAME, 1, {\n upgrade(db) {\n if (!db.objectStoreNames.contains(IDB_DB_ObjectStoreName)) {\n db.createObjectStore(IDB_DB_ObjectStoreName);\n }\n },\n });\n }\n\n async setItem(key: string, value: any): Promise<void> {\n const db = await this.dbPromise;\n const tx = db.transaction(IDB_DB_ObjectStoreName, 'readwrite');\n await tx.objectStore(IDB_DB_ObjectStoreName).put(value, key);\n await tx.done;\n }\n\n async getItem(key: string): Promise<any> {\n const db = await this.dbPromise;\n const value = await db.transaction(IDB_DB_ObjectStoreName).objectStore(IDB_DB_ObjectStoreName).get(key);\n return value;\n }\n\n async remove(key: string): Promise<void> {\n const db = await this.dbPromise;\n const tx = db.transaction(IDB_DB_ObjectStoreName, 'readwrite');\n await tx.objectStore(IDB_DB_ObjectStoreName).delete(key);\n await tx.done;\n }\n}\n\nexport class GraphQLTransactionGroup extends TransactionGroupBase {\n protected async HandleSubmit(items: TransactionItem[]): Promise<TransactionResult[]> {\n // iterate through each instruction and build up the combined query string\n // and the combined variables object\n let combinedQuery = '';\n let mutationParams = '';\n const combinedVars: any = {};\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n let itemMutation = item.Instruction;\n if (item.Vars) {\n const keys = Object.keys(item.Vars);\n // rename the variables to avoid collisions and aggregate the varisables\n // from the item into our combined variables\n for (let j = 0; j < keys.length; j++) {\n const key = keys[j];\n const newKey = `${key}_${i}`;\n combinedVars[newKey] = item.Vars[key];\n\n const keyRegEx = new RegExp('\\\\$' + key, 'g'); // Create the RegExp dynamically with the global flag.\n itemMutation = itemMutation.replace(keyRegEx, '$' + newKey);\n const mutationInputType = item.ExtraData.mutationInputTypes.find((t: any) => t.varName === key)?.inputType;\n //{varName: pk.CodeName, inputType: pk.EntityFieldInfo.GraphQLType + '!'}\n mutationParams += `$${newKey}: ${mutationInputType} \\n`;\n }\n }\n // add in the specific mutation and give it an alias so we can easily figure out the results\n // from each of them and pass back properly\n combinedQuery += `mutation_${i}: ` + itemMutation + '\\n';\n }\n\n combinedQuery = `mutation TransactionGroup(${mutationParams}){ \\n` + combinedQuery+ '\\n}'; // wrap it up in a mutation so we can execute it\n const execResults = await GraphQLDataProvider.ExecuteGQL(combinedQuery, combinedVars)\n const returnResults: TransactionResult[] = [];\n for (let i = 0; i < items.length; i++) {\n /// NEED TO TEST TO SEE WHAT ORDER WE GET RESULTS BACK AS\n const result = execResults[`mutation_${i}`];\n const item = items[i];\n returnResults.push(new TransactionResult(item, result, result !== null));\n }\n return returnResults;\n }\n}\n","import { RunReport, BaseEntity, Metadata, RunView, RunQuery } from \"@memberjunction/core\";\nimport { GraphQLDataProvider, GraphQLProviderConfigData } from \"./graphQLDataProvider\";\nimport { MJGlobal, MJEventType } from \"@memberjunction/global\";\n\nexport async function setupGraphQLClient(config: GraphQLProviderConfigData) {\n // Set the provider for all entities to be GraphQL in this project, can use a different provider in other situations....\n const provider = new GraphQLDataProvider()\n\n // BaseEntity + Metadata share the same GraphQLDataProvider instance\n BaseEntity.Provider = provider\n Metadata.Provider = provider\n RunView.Provider = provider\n RunReport.Provider = provider\n RunQuery.Provider = provider\n\n await provider.Config(config);\n\n // fire off the logged in event if we get here\n MJGlobal.Instance.RaiseEvent({ event: MJEventType.LoggedIn, eventCode: null, component: this, args: null });\n\n return provider;\n}"],"names":["ProviderConfigDataBase","ProviderBase","gql","LogError","UserInfo","ViewInfo","ProviderType","BaseEntityResult","EntityFieldTSType","TransactionItem","GraphQLClient","UserRoleInfo","createClient","Observable","openDB","TransactionGroupBase","TransactionResult","BaseEntity","Metadata","RunView","RunReport","RunQuery","MJGlobal","MJEventType"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/FieldMapper.ts","../src/graphQLDataProvider.ts","../src/config.ts"],"sourcesContent":["import { RegisterClass } from '@memberjunction/global';\n\n/**\n * FieldMapper is used to map fields from one name to another. This is useful when we need to map\n * fields from one system to another, or when we need to map fields from one version of a system\n * to another. Uses an internal field mapping but may be overridden or extended as needed.\n */\nexport class FieldMapper {\n private _fieldMap: Record<string, string> = {\n __mj_CreatedAt: '_mj__CreatedAt',\n __mj_UpdatedAt: '_mj__UpdatedAt',\n __mj_DeletedAt: '_mj__DeletedAt',\n };\n\n /**\n * Creates a new FieldMapper instance.\n * @param fieldMap An optional field map to use for mapping fields. If not provided, the default field map will be used.\n */\n constructor() {}\n\n /**\n * Maps fields from one name to another mutating the object in place.\n * @param obj The object to mutate\n */\n public MapFields(obj?: Record<string, unknown>) {\n if (obj) {\n for (const k in obj) {\n if (k in this._fieldMap) {\n obj[this._fieldMap[k]] = obj[k];\n delete obj[k];\n }\n }\n }\n return obj;\n }\n\n /**\n * Maps a field name from one name to another.\n * @param fieldName The field name to map.\n * @returns The mapped field name, or the original field name if no mapping is found.\n */\n public MapFieldName(fieldName: string): string {\n return this._fieldMap[fieldName] ?? fieldName;\n }\n\n /**\n * Maps a field name from one name to another using the reverse mapping.\n * @param fieldName The field name to map.\n * @returns The mapped field name, or the original field name if no mapping is found.\n */\n public ReverseMapFieldName(fieldName: string): string {\n return Object.entries(this._fieldMap).find(([k, v]) => v === fieldName)?.[0] ?? fieldName;\n }\n\n /**\n * Maps fields from one name to another mutating the object in place using the reverse mapping.\n * @param obj The object to mutate\n */\n public ReverseMapFields(obj: Record<string, unknown>) {\n const reversed = Object.fromEntries(Object.entries(this._fieldMap).map(([k, v]) => [v, k]));\n for (const k in obj) {\n if (k in reversed) {\n obj[reversed[k]] = obj[k];\n delete obj[k];\n }\n }\n return obj;\n }\n}\n","/**************************************************************************************************************\n * The graphQLDataProvider provides a data provider for the entities framework that uses GraphQL to communicate\n * with the server.\n * In practice - this FILE will NOT exist in the entities library, we need to move to its own separate project\n * so it is only included by the consumer of the entities library if they want to use it.\n**************************************************************************************************************/\n\nimport { BaseEntity, IEntityDataProvider, IMetadataProvider, IRunViewProvider, ProviderConfigDataBase, RunViewResult,\n EntityInfo, EntityFieldInfo, EntityFieldTSType,\n RunViewParams, ProviderBase, ProviderType, UserInfo, UserRoleInfo, RecordChange,\n ILocalStorageProvider, EntitySaveOptions, LogError,\n TransactionGroupBase, TransactionItem, TransactionResult, DatasetItemFilterType, DatasetResultType, DatasetStatusResultType, EntityRecordNameInput,\n EntityRecordNameResult, IRunReportProvider, RunReportResult, RunReportParams, RecordDependency, RecordMergeRequest, RecordMergeResult,\n IRunQueryProvider, RunQueryResult, PotentialDuplicateRequest, PotentialDuplicateResponse, CompositeKey, EntityDeleteOptions,\n RunQueryParams, BaseEntityResult,\n KeyValuePair,\n LogStatus} from \"@memberjunction/core\";\nimport { UserViewEntityExtended, ViewInfo } from '@memberjunction/core-entities'\n\nimport { gql, GraphQLClient } from 'graphql-request'\nimport { openDB, DBSchema, IDBPDatabase } from '@tempfix/idb';\nimport { Observable } from 'rxjs';\nimport { Client, createClient } from 'graphql-ws';\nimport { FieldMapper } from './FieldMapper';\n\n// define the shape for a RefreshToken function that can be called by the GraphQLDataProvider whenever it receives an exception that the JWT it has already is expired\nexport type RefreshTokenFunction = () => Promise<string>;\n\nexport class GraphQLProviderConfigData extends ProviderConfigDataBase {\n /**\n * Token is the JWT token that is used to authenticate the user with the server\n */\n get Token(): string { return this.Data.Token }\n\n set Token(token: string) { this.Data.Token = token}\n\n /**\n * URL is the URL to the GraphQL endpoint\n */\n get URL(): string { return this.Data.URL }\n /**\n * WSURL is the URL to the GraphQL websocket endpoint. This is used for subscriptions, if you are not using subscriptions, you can pass in a blank string for this\n */\n get WSURL(): string { return this.Data.WSURL }\n\n /**\n * RefreshTokenFunction is a function that can be called by the GraphQLDataProvider whenever it receives an exception that the JWT it has already is expired\n */\n get RefreshTokenFunction(): RefreshTokenFunction { return this.Data.RefreshFunction }\n\n\n /**\n *\n * @param token Token is the JWT token that is used to authenticate the user with the server\n * @param url the URL to the GraphQL endpoint\n * @param wsurl the URL to the GraphQL websocket endpoint. This is used for subscriptions, if you are not using subscriptions, you can pass in a blank string for this\n * @param refreshTokenFunction is a function that can be called by the GraphQLDataProvider whenever it receives an exception that the JWT it has already is expired\n * @param MJCoreSchemaName the name of the MJ Core schema, if it is not the default name of __mj\n * @param includeSchemas optional, an array of schema names to include in the metadata. If not passed, all schemas are included\n * @param excludeSchemas optional, an array of schema names to exclude from the metadata. If not passed, no schemas are excluded\n */\n constructor(token: string,\n url: string,\n wsurl: string,\n refreshTokenFunction: RefreshTokenFunction,\n MJCoreSchemaName?: string,\n includeSchemas?: string[],\n excludeSchemas?: string[]) {\n super(\n {\n Token: token,\n URL: url,\n WSURL: wsurl,\n RefreshTokenFunction: refreshTokenFunction,\n },\n MJCoreSchemaName,\n includeSchemas,\n excludeSchemas\n );\n }\n}\n\n\n\n// The GraphQLDataProvider implements both the IEntityDataProvider and IMetadataProvider interfaces.\nexport class GraphQLDataProvider extends ProviderBase implements IEntityDataProvider, IMetadataProvider, IRunViewProvider, IRunReportProvider, IRunQueryProvider {\n private static _client: GraphQLClient;\n private static _configData: GraphQLProviderConfigData;\n private static _sessionId: string;\n public get ConfigData(): GraphQLProviderConfigData { return GraphQLDataProvider._configData; }\n\n\n public GenerateUUID() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n\n public async Config(configData: GraphQLProviderConfigData): Promise<boolean> {\n try {\n // FIRST, set up the GraphQL client\n if (GraphQLDataProvider._sessionId === undefined)\n GraphQLDataProvider._sessionId = this.GenerateUUID();\n\n GraphQLDataProvider._configData = configData;\n\n // now create the new client, if it isn't alreayd created\n if (!GraphQLDataProvider._client)\n GraphQLDataProvider._client = GraphQLDataProvider.CreateNewGraphQLClient(configData.URL, configData.Token, GraphQLDataProvider._sessionId);\n\n return super.Config(configData); // now parent class can do it's config\n }\n catch (e) {\n LogError(e);\n throw (e)\n }\n }\n\n public get sessionId(): string {\n return GraphQLDataProvider._sessionId;\n }\n\n protected get AllowRefresh(): boolean {\n return true; // this provider doesn't have any issues with allowing refreshes at any time\n }\n\n protected async GetCurrentUser(): Promise<UserInfo> {\n const d = await GraphQLDataProvider.ExecuteGQL(this._currentUserQuery, null);\n if (d) {\n // convert the user and the user roles _mj__*** fields back to __mj_***\n const u = this.ConvertBackToMJFields(d.CurrentUser);\n const roles = u.UserRoles_UserIDArray.map(r => this.ConvertBackToMJFields(r));\n u.UserRoles_UserIDArray = roles;\n return new UserInfo(this, {...u, UserRoles: roles}) // need to pass in the UserRoles as a separate property that is what is expected here\n }\n }\n\n\n /**************************************************************************/\n // START ---- IRunReportProvider\n /**************************************************************************/\n public async RunReport(params: RunReportParams, contextUser?: UserInfo): Promise<RunReportResult> {\n const query = gql`\n query GetReportDataQuery ($ReportID: String!) {\n GetReportData(ReportID: $ReportID) {\n Success\n Results\n RowCount\n ExecutionTime\n ErrorMessage\n }\n }`\n\n const result = await GraphQLDataProvider.ExecuteGQL(query, {ReportID: params.ReportID} );\n if (result && result.GetReportData)\n return {\n ReportID: params.ReportID,\n Success: result.GetReportData.Success,\n Results: JSON.parse(result.GetReportData.Results),\n RowCount: result.GetReportData.RowCount,\n ExecutionTime: result.GetReportData.ExecutionTime,\n ErrorMessage: result.GetReportData.ErrorMessage,\n };\n }\n /**************************************************************************/\n // END ---- IRunReportProvider\n /**************************************************************************/\n\n /**************************************************************************/\n // START ---- IRunQueryProvider\n /**************************************************************************/\n public async RunQuery(params: RunQueryParams, contextUser?: UserInfo): Promise<RunQueryResult> {\n const query = gql`\n query GetQueryDataQuery ($QueryID: String!) {\n GetQueryData(QueryID: $QueryID) {\n Success\n Results\n RowCount\n ExecutionTime\n ErrorMessage\n }\n }`\n\n const result = await GraphQLDataProvider.ExecuteGQL(query, {QueryID: params.QueryID} );\n if (result && result.GetQueryData)\n return {\n QueryID: params.QueryID,\n Success: result.GetQueryData.Success,\n Results: JSON.parse(result.GetQueryData.Results),\n RowCount: result.GetQueryData.RowCount,\n ExecutionTime: result.GetQueryData.ExecutionTime,\n ErrorMessage: result.GetQueryData.ErrorMessage,\n };\n }\n /**************************************************************************/\n // END ---- IRunReportProvider\n /**************************************************************************/\n\n\n\n /**************************************************************************/\n // START ---- IRunViewProvider\n /**************************************************************************/\n public async RunView<T = any>(params: RunViewParams, contextUser?: UserInfo): Promise<RunViewResult<T>> {\n try {\n let qName: string = ''\n let paramType: string = ''\n if (params) {\n const innerParams: any = {}\n let entity: string, viewEntity: any;\n if (params.ViewEntity) {\n viewEntity = params.ViewEntity\n entity = viewEntity.Entity\n }\n else {\n const {entityName, v} = await this.getEntityNameAndUserView(params, contextUser)\n viewEntity = v;\n entity = entityName;\n }\n\n // get entity metadata\n const e = this.Entities.find(e => e.Name === entity);\n if (!e)\n throw new Error(`Entity ${entity} not found in metadata`);\n\n let dynamicView = false;\n\n if (params.ViewID) {\n qName = `Run${e.ClassName}ViewByID`;\n paramType = 'RunViewByIDInput';\n innerParams.ViewID = params.ViewID;\n }\n else if (params.ViewName) {\n qName = `Run${e.ClassName}ViewByName`;\n paramType = 'RunViewByNameInput';\n innerParams.ViewName = params.ViewName;\n }\n else {\n dynamicView = true;\n qName = `Run${e.ClassName}DynamicView`;\n paramType = 'RunDynamicViewInput';\n innerParams.EntityName = params.EntityName;\n }\n innerParams.ExtraFilter = params.ExtraFilter ? params.ExtraFilter : '';\n innerParams.OrderBy = params.OrderBy ? params.OrderBy : '';\n innerParams.UserSearchString = params.UserSearchString ? params.UserSearchString : '';\n innerParams.Fields = params.Fields; // pass it straight through, either null or array of strings\n innerParams.IgnoreMaxRows = params.IgnoreMaxRows ? params.IgnoreMaxRows : false;\n innerParams.MaxRows = params.MaxRows ? params.MaxRows : 0;\n innerParams.ForceAuditLog = params.ForceAuditLog ? params.ForceAuditLog : false;\n innerParams.ResultType = params.ResultType ? params.ResultType : 'simple';\n if (params.AuditLogDescription && params.AuditLogDescription.length > 0)\n innerParams.AuditLogDescription = params.AuditLogDescription;\n\n if (!dynamicView) {\n innerParams.ExcludeUserViewRunID = params.ExcludeUserViewRunID ? params.ExcludeUserViewRunID : \"\";\n innerParams.ExcludeDataFromAllPriorViewRuns = params.ExcludeDataFromAllPriorViewRuns ? params.ExcludeDataFromAllPriorViewRuns : false;\n innerParams.OverrideExcludeFilter = params.OverrideExcludeFilter ? params.OverrideExcludeFilter : '';\n innerParams.SaveViewResults = params.SaveViewResults ? params.SaveViewResults : false;\n }\n\n const fieldList = this.getViewRunTimeFieldList(e, viewEntity, params, dynamicView);\n const query = gql`\n query RunViewQuery ($input: ${paramType}!) {\n ${qName}(input: $input) {\n Results {\n ${fieldList.join(\"\\n \")}\n }\n UserViewRunID\n RowCount\n TotalRowCount\n ExecutionTime\n Success\n ErrorMessage\n }\n }`\n\n const viewData = await GraphQLDataProvider.ExecuteGQL(query, {input: innerParams} );\n if (viewData && viewData[qName]) {\n // now, if we have any results in viewData that are for the CodeName, we need to convert them to the Name\n // so that the caller gets back what they expect\n const results = viewData[qName].Results;\n if (results && results.length > 0) {\n const codeNameDiffFields = e.Fields.filter(f => f.CodeName !== f.Name && f.CodeName !== undefined);\n results.forEach(r => {\n // for _mj__ results, we need to convert them back to the Name\n this.ConvertBackToMJFields(r);\n codeNameDiffFields.forEach(f => {\n r[f.Name] = r[f.CodeName];\n // delete r[f.CodeName]; // Leave the CodeName in the results, it is useful to have both\n })\n })\n }\n return viewData[qName];\n }\n }\n else\n throw (\"No parameters passed to RunView\");\n\n return null;\n }\n catch (e) {\n LogError(e);\n throw (e)\n }\n }\n\n public async RunViews<T = any>(params: RunViewParams[], contextUser?: UserInfo): Promise<RunViewResult<T>[]> {\n try {\n let innerParams: any[] = [];\n let entityInfos: EntityInfo[] = [];\n let fieldList: string[] = [];\n\n for(const param of params){\n let qName: string = ''\n let paramType: string = ''\n const innerParam: any = {}\n let entity: string | null = null;\n let viewEntity: UserViewEntityExtended | null = null;\n if (param.ViewEntity) {\n viewEntity = param.ViewEntity as UserViewEntityExtended;\n entity = viewEntity.Get(\"Entity\");\n }\n else {\n const {entityName, v} = await this.getEntityNameAndUserView(param, contextUser)\n viewEntity = v;\n entity = entityName;\n }\n\n // get entity metadata\n const e = this.Entities.find(e => e.Name === entity);\n if (!e){\n throw new Error(`Entity ${entity} not found in metadata`);\n }\n\n entityInfos.push(e);\n let dynamicView: boolean = false;\n\n if (param.ViewID) {\n qName = `Run${e.ClassName}ViewByID`;\n paramType = 'RunViewByIDInput';\n innerParam.ViewID = param.ViewID;\n }\n else if (param.ViewName) {\n qName = `Run${e.ClassName}ViewByName`;\n paramType = 'RunViewByNameInput';\n innerParam.ViewName = param.ViewName;\n }\n else {\n dynamicView = true;\n qName = `Run${e.ClassName}DynamicView`;\n paramType = 'RunDynamicViewInput';\n innerParam.EntityName = param.EntityName;\n }\n\n innerParam.ExtraFilter = param.ExtraFilter || '';\n innerParam.OrderBy = param.OrderBy || '';\n innerParam.UserSearchString = param.UserSearchString || '';\n // pass it straight through, either null or array of strings\n innerParam.Fields = param.Fields;\n innerParam.IgnoreMaxRows = param.IgnoreMaxRows || false;\n innerParam.MaxRows = param.MaxRows || 0;\n innerParam.ForceAuditLog = param.ForceAuditLog || false;\n innerParam.ResultType = param.ResultType || 'simple';\n if (param.AuditLogDescription && param.AuditLogDescription.length > 0){\n innerParam.AuditLogDescription = param.AuditLogDescription;\n }\n\n if (!dynamicView) {\n innerParam.ExcludeUserViewRunID = param.ExcludeUserViewRunID || \"\";\n innerParam.ExcludeDataFromAllPriorViewRuns = param.ExcludeDataFromAllPriorViewRuns || false;\n innerParam.OverrideExcludeFilter = param.OverrideExcludeFilter || '';\n innerParam.SaveViewResults = param.SaveViewResults || false;\n }\n\n innerParams.push(innerParam);\n fieldList.push(...this.getViewRunTimeFieldList(e, viewEntity, param, dynamicView));\n }\n\n const query = gql`\n query RunViewsQuery ($input: [RunViewGenericInput!]!) {\n RunViews(input: $input) {\n Results {\n ID\n EntityID\n Data\n }\n UserViewRunID\n RowCount\n TotalRowCount\n ExecutionTime\n Success\n ErrorMessage\n }\n }`;\n\n const viewData: unknown = await GraphQLDataProvider.ExecuteGQL(query, {input: innerParams} );\n if (viewData && viewData[\"RunViews\"]) {\n // now, if we have any results in viewData that are for the CodeName, we need to convert them to the Name\n // so that the caller gets back what they expect\n const results: RunViewResult[] = viewData[\"RunViews\"];\n for(const [index, result] of results.entries()){\n //const codeNameDiffFields = entityInfos[index].Fields.filter(f => f.CodeName !== f.Name && f.CodeName !== undefined);\n result.Results = result.Results.map((data: unknown) => {\n let deserializeData: Record<string, unknown> = JSON.parse(data[\"Data\"]);\n // for _mj__ results, we need to convert them back to the Name\n this.ConvertBackToMJFields(deserializeData);\n /*\n codeNameDiffFields.forEach(f => {\n deserializeData[f.Name] = deserializeData[f.CodeName];\n // delete r[f.CodeName]; // Leave the CodeName in the results, it is useful to have both\n });\n */\n return deserializeData;\n });\n }\n\n return results;\n }\n\n return null;\n\n }\n catch (e) {\n LogError(e);\n throw (e);\n }\n }\n\n protected async getEntityNameAndUserView(params: RunViewParams, contextUser?: UserInfo): Promise<{entityName: string, v: UserViewEntityExtended}> {\n let entityName: string;\n let v: UserViewEntityExtended;\n\n if (!params.EntityName) {\n if (params.ViewID) {\n v = await ViewInfo.GetViewEntity(params.ViewID, contextUser)\n entityName = v.Entity\n }\n else if (params.ViewName) {\n v = await ViewInfo.GetViewEntityByName(params.ViewName, contextUser);\n entityName = v.Entity\n }\n else\n throw new Error(`No EntityName, ViewID or ViewName passed to RunView`)\n }\n else\n entityName = params.EntityName\n\n return {entityName, v}\n }\n\n protected getViewRunTimeFieldList(e: EntityInfo, v: UserViewEntityExtended, params: RunViewParams, dynamicView: boolean): string[] {\n const fieldList = [];\n const mapper = new FieldMapper();\n if (params.Fields) {\n for (const kv of e.PrimaryKeys) {\n if (params.Fields.find(f => f.trim().toLowerCase() === kv.Name.toLowerCase()) === undefined)\n fieldList.push(kv.Name); // always include the primary key fields in view run time field list\n }\n\n // now add any other fields that were passed in\n params.Fields.forEach(f => {\n fieldList.push(mapper.MapFieldName(f))\n });\n }\n else {\n // no fields were passed in. So, let's check to see if we are running an dynamic view.\n // If so, we need to include all fields since the caller didn't specify the fields they want\n // otherwise, we include the fields that are part of the view definition.\n if (dynamicView) {\n // include all fields since no fields were passed in\n e.Fields.forEach(f => {\n if (!f.IsBinaryFieldType) {\n fieldList.push(mapper.MapFieldName(f.CodeName));\n }\n });\n }\n else {\n // NOTE: in the below, c.EntityField SHOULD always exist, however there is a possibility that at some point a VIEW was created that used fields\n // and those fields are NO LONGER part of an entity, in that situation we should just remove them, rather than letting the whole view blow up which\n // would happen if we dno't check for c.EntityField? in the below\n\n // first make sure we have the primary key field in the view column list, always should, but make sure\n for (const kv of e.PrimaryKeys) {\n if (fieldList.find(f => f.trim().toLowerCase() === kv.Name.toLowerCase()) === undefined)\n fieldList.push(kv.Name); // always include the primary key fields in view run time field list\n }\n\n // Now: include the fields that are part of the view definition\n v.Columns.forEach(c => {\n if (c.hidden === false && !fieldList.find(item => item.trim().toLowerCase() === c.EntityField?.Name.trim().toLowerCase())) { // don't include hidden fields and don't include the pkey field again\n if (!c.EntityField) {\n // this can happen if a field was previously included in a view, but is no longer part of the entity\n // simply don't include it in the field list\n }\n else\n fieldList.push(mapper.MapFieldName(c.EntityField.CodeName));\n }\n });\n }\n }\n return fieldList;\n }\n /**************************************************************************/\n // END ---- IRunViewProvider\n /**************************************************************************/\n\n\n /**************************************************************************/\n // START ---- IEntityDataProvider\n /**************************************************************************/\n public get ProviderType(): ProviderType {\n return ProviderType.Network;\n }\n\n public async GetRecordChanges(entityName: string, primaryKey: CompositeKey): Promise<RecordChange[]> {\n try {\n const p: RunViewParams = {\n EntityName: 'Record Changes',\n ExtraFilter: `RecordID = '${primaryKey.Values()}' AND Entity = '${entityName}'`,\n //OrderBy: 'ChangedAt DESC',\n }\n const result = await this.RunView(p);\n if (result) {\n // sort the results client side because, for now, the RunViewParams doesn't support OrderBy dynamically like we tried. Later change this to do via the SQL query\n return result.Results.sort((a: RecordChange, b: RecordChange) => {\n return (a.ChangedAt > b.ChangedAt) ? -1 : 1 // sort descending on the date.... GraphQL passes back the date as time since base date\n });\n }\n else\n return null;\n }\n catch (e) {\n LogError(e);\n throw (e)\n }\n }\n\n\n /**\n * Returns a list of dependencies - records that are linked to the specified Entity/KeyValuePairs combination. A dependency is as defined by the relationships in the database. The MemberJunction metadata that is used\n * for this simply reflects the foreign key relationships that exist in the database. The CodeGen tool is what detects all of the relationships and generates the metadata that is used by MemberJunction. The metadata in question\n * is within the EntityField table and specifically the RelatedEntity and RelatedEntityField columns. In turn, this method uses that metadata and queries the database to determine the dependencies. To get the list of entity dependencies\n * you can use the utility method GetEntityDependencies(), which doesn't check for dependencies on a specific record, but rather gets the metadata in one shot that can be used for dependency checking.\n * @param entityName the name of the entity to check\n * @param KeyValuePairs the KeyValuePairs of the record to check\n */\n public async GetRecordDependencies(entityName: string, primaryKey: CompositeKey): Promise<RecordDependency[]> {\n try {\n // execute the gql query to get the dependencies\n const query = gql`query GetRecordDependenciesQuery ($entityName: String!, $CompositeKey: CompositeKeyInputType!) {\n GetRecordDependencies(entityName: $entityName, CompositeKey: $CompositeKey) {\n EntityName\n RelatedEntityName\n FieldName\n CompositeKey {\n KeyValuePairs {\n FieldName\n Value\n }\n }\n }\n }`\n\n // now we have our query built, execute it\n const vars = {\n entityName: entityName,\n CompositeKey: {KeyValuePairs: this.ensureKeyValuePairValueIsString(primaryKey.KeyValuePairs)}\n };\n const data = await GraphQLDataProvider.ExecuteGQL(query, vars);\n\n return data?.GetRecordDependencies; // shape of the result should exactly match the RecordDependency type\n }\n catch (e) {\n LogError(e);\n throw (e)\n }\n }\n\n protected ensureKeyValuePairValueIsString(kvps: KeyValuePair[]): {FieldName: string, Value: string}[] {\n return kvps.map(kv => {\n return {FieldName: kv.FieldName, Value: kv.Value.toString()}\n })\n }\n\n public async GetRecordDuplicates(params: PotentialDuplicateRequest, contextUser?: UserInfo): Promise<PotentialDuplicateResponse>\n {\n if(!params){\n return null;\n }\n\n const query: string = gql`query GetRecordDuplicatesQuery ($params: PotentialDuplicateRequestType!) {\n GetRecordDuplicates(params: $params) {\n Status\n ErrorMessage\n PotentialDuplicateResult {\n EntityID\n DuplicateRunDetailMatchRecordIDs\n RecordPrimaryKeys {\n KeyValuePairs {\n FieldName\n Value\n }\n }\n Duplicates {\n ProbabilityScore\n KeyValuePairs {\n FieldName\n Value\n }\n }\n }\n }\n }`\n\n let request = {\n EntityID: params.EntityID,\n EntityDocumentID: params.EntityDocumentID,\n ListID: params.ListID,\n ProbabilityScore: params.ProbabilityScore,\n Options: params.Options,\n RecordIDs: params.RecordIDs.map(recordID => {\n return recordID.Copy();\n })\n }\n const data = await GraphQLDataProvider.ExecuteGQL(query, {params: request});\n\n if(data && data.GetRecordDuplicates){\n return data.GetRecordDuplicates;\n }\n }\n\n public async MergeRecords(request: RecordMergeRequest): Promise<RecordMergeResult> {\n const e = this.Entities.find(e=>e.Name.trim().toLowerCase() === request.EntityName.trim().toLowerCase());\n if (!e || !e.AllowRecordMerge)\n throw new Error(`Entity ${request.EntityName} does not allow record merging, check the AllowRecordMerge property in the entity metadata`);\n\n try {\n // execute the gql query to get the dependencies\n const mutation = gql`mutation MergeRecordsMutation ($request: RecordMergeRequest!) {\n MergeRecords(request: $request) {\n Success\n OverallStatus\n RecordMergeLogID\n RecordStatus {\n CompositeKey {\n KeyValuePairs {\n FieldName\n Value\n }\n }\n Success\n RecordMergeDeletionLogID\n Message\n }\n }\n }`\n\n // create a new request that is compatible with the server's expectations where field maps and also the primary key values are all strings\n const newRequest = {\n EntityName: request.EntityName,\n SurvivingRecordCompositeKey: {KeyValuePairs: this.ensureKeyValuePairValueIsString(request.SurvivingRecordCompositeKey.KeyValuePairs)},\n FieldMap: request.FieldMap?.map(fm => {\n return {\n FieldName: fm.FieldName,\n Value: fm.Value.toString() // turn the value into a string, since that is what the server expects\n }\n }),\n RecordsToMerge: request.RecordsToMerge.map(r => {\n return r.Copy();\n })\n }\n\n // now we have our query built, execute it\n const data = await GraphQLDataProvider.ExecuteGQL(mutation, {request: newRequest});\n\n return data?.MergeRecords; // shape of the result should exactly match the RecordDependency type\n }\n catch (e) {\n LogError(e);\n return {\n Success: false,\n OverallStatus: e && e.message ? e.message : e,\n RecordStatus: [],\n RecordMergeLogID: \"\",\n Request: request,\n }\n throw (e)\n }\n }\n\n public async Save(entity: BaseEntity, user: UserInfo, options: EntitySaveOptions) : Promise<{}> {\n const result = new BaseEntityResult();\n try {\n entity.RegisterTransactionPreprocessing(); // as of the time of writing, this isn't technically needed because we are not doing any async preprocessing, but it is good to have it here for future use in case something is added with async between here and the TransactionItem being added.\n\n const vars = { input: {} };\n const type: string = entity.IsSaved ? \"Update\" : \"Create\";\n\n result.StartedAt = new Date();\n result.Type = entity.IsSaved ? 'update' : 'create';\n result.OriginalValues = entity.Fields.map(f => { return {FieldName: f.CodeName, Value: f.Value} });\n entity.ResultHistory.push(result); // push the new result as we have started a process\n\n // Create the query for the mutation first, we will provide the specific\n // input values later in the loop below. Here we are just setting up the mutation\n // and the fields that will be returned since the mutation returns back the latest\n // values for the entity and we need to have those values to update the entity after the\n // save\n\n const mutationName = `${type}${entity.EntityInfo.ClassName}`\n\n // only pass along writable fields, AND the PKEY value if this is an update\n const filteredFields = entity.Fields.filter(f => !f.ReadOnly || (f.IsPrimaryKey && entity.IsSaved));\n const mapper = new FieldMapper();\n const inner = ` ${mutationName}(input: $input) {\n ${entity.Fields.map(f => mapper.MapFieldName(f.CodeName)).join(\"\\n \")}\n }`\n const outer = gql`mutation ${type}${entity.EntityInfo.ClassName} ($input: ${mutationName}Input!) {\n ${inner}\n }\n `\n for (let i = 0; i < filteredFields.length; i++) {\n const f = filteredFields[i];\n let val = f.Value;\n if (val && f.EntityFieldInfo.TSType === EntityFieldTSType.Date)\n val = val.getTime();\n if (val && f.EntityFieldInfo.TSType === EntityFieldTSType.Boolean && typeof val !== 'boolean')\n val = parseInt(val) === 0 ? false : true; // convert to boolean\n\n if (val === null && f.EntityFieldInfo.AllowsNull === false) {\n if (f.EntityFieldInfo.DefaultValue !== null) {\n // no value, but there is a default value, so use that, since field does NOT allow NULL\n val = f.EntityFieldInfo.DefaultValue;\n }\n else {\n // no default value, null value and field doesn't allow nulls, so set to either 0 or empty string\n if (f.FieldType === EntityFieldTSType.Number || f.FieldType === EntityFieldTSType.Boolean)\n val = 0;\n else\n val = '';\n }\n }\n vars.input[f.CodeName] = val;\n }\n\n // now add an OldValues prop to the vars IF the type === 'update' and the options.SkipOldValuesCheck === false\n if (type.trim().toLowerCase() === 'update' &&\n options.SkipOldValuesCheck === false) {\n const ov = [];\n entity.Fields.forEach(f => {\n let val = null;\n if (f.OldValue !== null && f.OldValue !== undefined) {\n if (typeof f.OldValue !== 'string')\n val = f.OldValue.toString();\n else\n val = f.OldValue;\n }\n ov.push({Key: f.CodeName, Value: val }); // pass ALL old values to server, slightly inefficient but we want full record\n });\n vars.input['OldValues___'] = ov; // add the OldValues prop to the input property that is part of the vars already\n }\n\n if (entity.TransactionGroup) {\n return new Promise((resolve, reject) => {\n const mutationInputTypes = [\n {\n varName: 'input',\n inputType: mutationName + 'Input!'\n }\n ];\n\n entity.RaiseReadyForTransaction(); // let the entity know we're ready to be part of the transaction\n\n // we are part of a transaction group, so just add our query to the list\n // and when the transaction is committed, we will send all the queries at once\n entity.TransactionGroup.AddTransaction(new TransactionItem(entity, inner, vars, {mutationName,\n mutationInputTypes: mutationInputTypes},\n (results: any, success: boolean) => {\n // we get here whenever the transaction group does gets around to committing\n // our query. We need to update our entity with the values that were returned\n // from the mutation if it was successful.\n result.EndedAt = new Date();\n if (success && results) {\n // got our data, send it back to the caller, which is the entity object\n // and that object needs to update itself from this data.\n result.Success = true;\n resolve (this.ConvertBackToMJFields(results));\n }\n else {\n // the transaction failed, nothing to update, but we need to call Reject so the\n // promise resolves with a rejection so our outer caller knows\n result.Success = false;\n result.Message = 'Transaction failed';\n reject();\n }\n }));\n });\n }\n else {\n // not part of a transaction group, so just go for it and send across our GQL\n const d = await GraphQLDataProvider.ExecuteGQL(outer, vars)\n if (d && d[type + entity.EntityInfo.ClassName]) {\n result.Success = true;\n result.EndedAt = new Date();\n const ret = this.ConvertBackToMJFields(d[type + entity.EntityInfo.ClassName]);\n return ret;\n }\n else\n throw new Error(`Save failed for ${entity.EntityInfo.ClassName}`);\n }\n }\n catch (e) {\n result.Success = false;\n result.EndedAt = new Date();\n result.Message = e.response?.errors?.length > 0 ? e.response.errors[0].message : e.message;\n LogError(e);\n return null;\n }\n }\n public async Load(entity: BaseEntity, primaryKey: CompositeKey, EntityRelationshipsToLoad: string[] = null, user: UserInfo) : Promise<{}> {\n try {\n const vars = {};\n let pkeyInnerParamString: string = '';\n let pkeyOuterParamString: string = '';\n\n for (let i = 0; i < primaryKey.KeyValuePairs.length; i++) {\n const field: EntityFieldInfo = entity.Fields.find(f => f.Name.trim().toLowerCase() === primaryKey.KeyValuePairs[i].FieldName.trim().toLowerCase()).EntityFieldInfo;\n const val = primaryKey.GetValueByIndex(i);\n const pkeyGraphQLType: string = field.GraphQLType;\n\n // build up the param string for the outer query definition\n if (pkeyOuterParamString.length > 0)\n pkeyOuterParamString += ', ';\n pkeyOuterParamString += `$${field.CodeName}: ${pkeyGraphQLType}!`;\n\n // build up the param string for the inner query call\n if (pkeyInnerParamString.length > 0)\n pkeyInnerParamString += ', ';\n pkeyInnerParamString += `${field.CodeName}: $${field.CodeName}`;\n\n // build up the variables we are passing along to the query\n if (field.TSType === EntityFieldTSType.Number) {\n if (isNaN(primaryKey.GetValueByIndex(i)))\n throw new Error(`Primary Key value ${val} (${field.Name}) is not a valid number`);\n vars[field.CodeName] = parseInt(val); // converting to number here for graphql type to work properly\n }\n else\n vars[field.CodeName] = val;\n }\n\n const rel = EntityRelationshipsToLoad && EntityRelationshipsToLoad.length > 0 ? this.getRelatedEntityString(entity.EntityInfo, EntityRelationshipsToLoad) : '';\n\n const mapper = new FieldMapper();\n const query = gql`query Single${entity.EntityInfo.ClassName}${rel.length > 0 ? 'Full' : ''} (${pkeyOuterParamString}) {\n ${entity.EntityInfo.ClassName}(${pkeyInnerParamString}) {\n ${entity.Fields.filter((f) => !f.EntityFieldInfo.IsBinaryFieldType)\n .map((f) => {\n if (f.EntityFieldInfo.Name.trim().toLowerCase().startsWith('__mj_')) {\n // fields that start with __mj_ need to be converted to _mj__ for the GraphQL query\n return f.CodeName.replace('__mj_', '_mj__');\n } else {\n return f.CodeName;\n }\n })\n .join('\\n ')}\n ${rel}\n }\n }\n `;\n\n const d = await GraphQLDataProvider.ExecuteGQL(query, vars)\n if (d && d[entity.EntityInfo.ClassName]) {\n // the resulting object has all the values in it, but we need to convert any elements that start with _mj__ back to __mj_\n return this.ConvertBackToMJFields(d[entity.EntityInfo.ClassName]);\n }\n else\n return null;\n }\n catch (e) {\n LogError(e);\n return null;\n }\n }\n\n /**\n * This method will convert back any fields that start with _mj__ back to __mj_ so that the entity object can properly update itself with the data that was returned from the server\n * @param ret\n * @returns\n */\n protected ConvertBackToMJFields(ret: any): any {\n const mapper = new FieldMapper();\n mapper.ReverseMapFields(ret);\n return ret; // clean object to pass back here\n }\n\n protected getRelatedEntityString(entityInfo: EntityInfo, EntityRelationshipsToLoad: string[]): string {\n let rel = '';\n for (let i = 0; i < entityInfo.RelatedEntities.length; i++) {\n if (EntityRelationshipsToLoad.indexOf(entityInfo.RelatedEntities[i].RelatedEntity) >= 0) {\n const r = entityInfo.RelatedEntities[i];\n const re = this.Entities.find(e => e.ID === r.RelatedEntityID);\n let uniqueCodeName: string = '';\n if (r.Type.toLowerCase().trim() === 'many to many') {\n uniqueCodeName = `${r.RelatedEntityCodeName}_${r.JoinEntityJoinField.replace(/\\s/g, '')}`;\n }\n else {\n uniqueCodeName = `${r.RelatedEntityCodeName}_${r.RelatedEntityJoinField.replace(/\\s/g, '')}`;\n }\n rel += `\n ${uniqueCodeName} {\n ${re.Fields.map(f => f.CodeName).join(\"\\n \")}\n }\n `;\n }\n }\n return rel;\n }\n\n public async Delete(entity: BaseEntity, options: EntityDeleteOptions, user: UserInfo) : Promise<boolean> {\n const result = new BaseEntityResult();\n try {\n entity.RegisterTransactionPreprocessing();\n\n result.StartedAt = new Date();\n result.Type = 'delete';\n result.OriginalValues = entity.Fields.map(f => { return {FieldName: f.CodeName, Value: f.Value} });\n entity.ResultHistory.push(result); // push the new result as we have started a process\n\n const vars = {};\n const mutationInputTypes = [];\n let pkeyInnerParamString: string = '';\n let pkeyOuterParamString: string = '';\n let returnValues: string = '';\n for (let kv of entity.PrimaryKey.KeyValuePairs) {\n const pk = entity.Fields.find(f => f.Name.trim().toLowerCase() === kv.FieldName.trim().toLowerCase()); // get the field for the primary key field\n vars[pk.CodeName] = pk.Value;\n mutationInputTypes.push({varName: pk.CodeName, inputType: pk.EntityFieldInfo.GraphQLType + '!'}); // only used when doing a transaction group, but it is easier to do in this main loop\n if (pkeyInnerParamString.length > 0)\n pkeyInnerParamString += ', ';\n pkeyInnerParamString += `${pk.CodeName}: $${pk.CodeName}`;\n\n if (pkeyOuterParamString.length > 0)\n pkeyOuterParamString += ', ';\n pkeyOuterParamString += `$${pk.CodeName}: ${pk.EntityFieldInfo.GraphQLType}!`;\n\n if (returnValues.length > 0)\n returnValues += '\\n ';\n returnValues += `${pk.CodeName}`;\n }\n\n mutationInputTypes.push({varName: \"options___\", inputType: 'DeleteOptionsInput!'}); // only used when doing a transaction group, but it is easier to do in this main loop\n vars[\"options___\"] = options ? options : {SkipEntityAIActions: false, SkipEntityActions: false};\n\n const queryName: string = 'Delete' + entity.EntityInfo.ClassName;\n const inner = gql`${queryName}(${pkeyInnerParamString}, options___: $options___) {\n ${returnValues}\n }\n `\n const query = gql`mutation ${queryName} (${pkeyOuterParamString}, $options___: DeleteOptionsInput!) {\n ${inner}\n }\n `\n\n if (entity.TransactionGroup) {\n // we have a transaction group, need to play nice and be part of it\n entity.RaiseReadyForTransaction();\n return new Promise((resolve, reject) => {\n // we are part of a transaction group, so just add our query to the list\n // and when the transaction is committed, we will send all the queries at once\n entity.TransactionGroup.AddTransaction(new TransactionItem(entity, inner, vars, {mutationName: queryName,\n mutationInputTypes: mutationInputTypes},\n (results: any, success: boolean) => {\n // we get here whenever the transaction group does gets around to committing\n // our query.\n result.EndedAt = new Date(); // done processing\n if (success && results) {\n // success indicated by the entity.PrimaryKey.Value matching the return value of the mutation\n let success: boolean = true;\n for (const pk of entity.PrimaryKey.KeyValuePairs) {\n // check each primary key value to see if it matches the return value of the mutation\n if (pk.Value !== results[pk.FieldName]) {\n success = false;\n }\n }\n if (success) {\n result.Success = true;\n resolve (true)\n }\n else {\n // the transaction failed, nothing to update, but we need to call Reject so the\n // promise resolves with a rejection so our outer caller knows\n result.Success = false;\n result.Message = 'Transaction failed to commit'\n reject();\n }\n }\n else {\n // the transaction failed, nothing to update, but we need to call Reject so the\n // promise resolves with a rejection so our outer caller knows\n result.Success = false;\n result.Message = 'Transaction failed to commit'\n reject();\n }\n }));\n });\n }\n else {\n // no transaction just go for it\n const d = await GraphQLDataProvider.ExecuteGQL(query, vars)\n if (d && d[queryName]) {\n const data = d[queryName];\n for (let key of entity.PrimaryKey.KeyValuePairs) {\n // we want to now compare key.Value against data[key.FieldName]\n let returnedVal = data[key.FieldName];\n let originalVal = key.Value;\n // we want to ignore types so we should convert numbers to strings for the comparison\n if (typeof originalVal === 'number')\n originalVal = originalVal.toString();\n if (typeof returnedVal === 'number')\n returnedVal = returnedVal.toString();\n // now compare the two values\n if (originalVal !== returnedVal) {\n throw new Error (`Primary key value mismatch in server Delete response. Field: ${key.FieldName}, Original: ${originalVal}, Returned: ${returnedVal}`);\n }\n }\n result.Success = true;\n result.EndedAt = new Date(); // done processing\n return true; // all of the return values match the primary key values, so we are good and delete worked\n }\n else\n throw new Error(`Delete failed for ${entity.EntityInfo.Name}: ${entity.PrimaryKey.ToString()} `);\n }\n }\n catch (e) {\n result.EndedAt = new Date(); // done processing\n result.Success = false;\n result.Message = e.response?.errors?.length > 0 ? e.response.errors[0].message : e.message;\n LogError(e);\n\n return false;\n }\n }\n /**************************************************************************/\n // END ---- IEntityDataProvider\n /**************************************************************************/\n\n\n /**************************************************************************/\n // START ---- IMetadataProvider\n /**************************************************************************/\n /**\n * Returns a dataset by name\n * @param datasetName \n * @param itemFilters \n * @returns \n */\n public async GetDatasetByName(datasetName: string, itemFilters?: DatasetItemFilterType[]): Promise<DatasetResultType> {\n const query = gql`query GetDatasetByName($DatasetName: String!, $ItemFilters: [DatasetItemFilterTypeGQL!]) {\n GetDatasetByName(DatasetName: $DatasetName, ItemFilters: $ItemFilters) {\n DatasetID\n DatasetName\n Success\n Status\n LatestUpdateDate\n Results\n }\n }`\n const data = await GraphQLDataProvider.ExecuteGQL(query, {DatasetName: datasetName, ItemFilters: itemFilters });\n if (data && data.GetDatasetByName && data.GetDatasetByName.Success) {\n return {\n DatasetID: data.GetDatasetByName.DatasetID,\n DatasetName: data.GetDatasetByName.DatasetName,\n Success: data.GetDatasetByName.Success,\n Status: data.GetDatasetByName.Status,\n LatestUpdateDate: new Date(data.GetDatasetByName.LatestUpdateDate),\n Results: JSON.parse(data.GetDatasetByName.Results)\n }\n }\n else {\n return {\n DatasetID: \"\",\n DatasetName: datasetName,\n Success: false,\n Status: 'Unknown',\n LatestUpdateDate: null,\n Results: null\n };\n }\n }\n\n public async GetDatasetStatusByName(datasetName: string, itemFilters?: DatasetItemFilterType[]): Promise<DatasetStatusResultType> {\n const query = gql`query GetDatasetStatusByName($DatasetName: String!, $ItemFilters: [DatasetItemFilterTypeGQL!]) {\n GetDatasetStatusByName(DatasetName: $DatasetName, ItemFilters: $ItemFilters) {\n DatasetID\n DatasetName\n Success\n Status\n LatestUpdateDate\n EntityUpdateDates\n }\n }`\n const data = await GraphQLDataProvider.ExecuteGQL(query, {DatasetName: datasetName, ItemFilters: itemFilters});\n if (data && data.GetDatasetStatusByName && data.GetDatasetStatusByName.Success) {\n return {\n DatasetID: data.GetDatasetStatusByName.DatasetID,\n DatasetName: data.GetDatasetStatusByName.DatasetName,\n Success: data.GetDatasetStatusByName.Success,\n Status: data.GetDatasetStatusByName.Status,\n LatestUpdateDate: new Date(data.GetDatasetStatusByName.LatestUpdateDate),\n EntityUpdateDates: JSON.parse(data.GetDatasetStatusByName.EntityUpdateDates)\n }\n }\n else {\n return {\n DatasetID: \"\",\n DatasetName: datasetName,\n Success: false,\n Status: 'Unknown',\n LatestUpdateDate: null,\n EntityUpdateDates: null\n };\n }\n }\n\n public async CreateTransactionGroup(): Promise<TransactionGroupBase> {\n return new GraphQLTransactionGroup();\n }\n\n public async GetRecordFavoriteStatus(userId: string, entityName: string, primaryKey: CompositeKey): Promise<boolean> {\n const valResult = primaryKey.Validate();\n if (!valResult.IsValid)\n return false;\n\n const e = this.Entities.find(e => e.Name === entityName)\n if (!e)\n throw new Error(`Entity ${entityName} not found in metadata`);\n\n const query = gql`query GetRecordFavoriteStatus($params: UserFavoriteSearchParams!) {\n GetRecordFavoriteStatus(params: $params) {\n Success\n IsFavorite\n }\n }`\n\n const data = await GraphQLDataProvider.ExecuteGQL(query, {params: {\n UserID: userId,\n EntityID: e.ID,\n CompositeKey: {KeyValuePairs: this.ensureKeyValuePairValueIsString(primaryKey.KeyValuePairs)}\n }\n }\n );\n if (data && data.GetRecordFavoriteStatus && data.GetRecordFavoriteStatus.Success)\n return data.GetRecordFavoriteStatus.IsFavorite;\n }\n\n public async SetRecordFavoriteStatus(userId: string, entityName: string, primaryKey: CompositeKey, isFavorite: boolean, contextUser: UserInfo): Promise<void> {\n const e = this.Entities.find(e => e.Name === entityName)\n if (!e){\n throw new Error(`Entity ${entityName} not found in metadata`);\n }\n\n const query = gql`mutation SetRecordFavoriteStatus($params: UserFavoriteSetParams!) {\n SetRecordFavoriteStatus(params: $params){\n Success\n }\n }`\n\n const data = await GraphQLDataProvider.ExecuteGQL(query, { params: {\n UserID: userId,\n EntityID: e.ID,\n CompositeKey: {KeyValuePairs: this.ensureKeyValuePairValueIsString(primaryKey.KeyValuePairs)},\n IsFavorite: isFavorite}\n }\n );\n if (data && data.SetRecordFavoriteStatus !== null)\n return data.SetRecordFavoriteStatus.Success;\n }\n\n public async GetEntityRecordName(entityName: string, primaryKey: CompositeKey): Promise<string> {\n if (!entityName || !primaryKey || primaryKey.KeyValuePairs?.length === 0){\n return null;\n }\n\n const query = gql`query GetEntityRecordNameQuery ($EntityName: String!, $CompositeKey: CompositeKeyInputType!) {\n GetEntityRecordName(EntityName: $EntityName, CompositeKey: $CompositeKey) {\n Success\n Status\n RecordName\n }\n }`\n\n const data = await GraphQLDataProvider.ExecuteGQL(query, {\n EntityName: entityName,\n CompositeKey: {KeyValuePairs: this.ensureKeyValuePairValueIsString(primaryKey.KeyValuePairs)}\n });\n if (data && data.GetEntityRecordName && data.GetEntityRecordName.Success)\n return data.GetEntityRecordName.RecordName;\n }\n\n public async GetEntityRecordNames(info: EntityRecordNameInput[]): Promise<EntityRecordNameResult[]> {\n if (!info)\n return null;\n\n const query = gql`query GetEntityRecordNamesQuery ($info: [EntityRecordNameInput!]!) {\n GetEntityRecordNames(info: $info) {\n Success\n Status\n CompositeKey {\n KeyValuePairs {\n FieldName\n Value\n }\n }\n EntityName\n RecordName\n }\n }`\n\n const data = await GraphQLDataProvider.ExecuteGQL(query, {info: info.map(i => {\n return {\n EntityName: i.EntityName,\n CompositeKey: {KeyValuePairs: this.ensureKeyValuePairValueIsString(i.CompositeKey.KeyValuePairs)}\n }\n })});\n if (data && data.GetEntityRecordNames)\n return data.GetEntityRecordNames;\n }\n\n public static async ExecuteGQL(query: string, variables: any, refreshTokenIfNeeded: boolean = true): Promise<any> {\n try {\n const data = await GraphQLDataProvider._client.request(query, variables);\n return data;\n }\n catch (e) {\n if (e && e.response && e.response.errors?.length > 0) {//e.code === 'JWT_EXPIRED') {\n const error = e.response.errors[0];\n const code = error?.extensions?.code?.toUpperCase().trim()\n if (code === 'JWT_EXPIRED') {\n if (refreshTokenIfNeeded) {\n // token expired, so we need to refresh it and try again\n await GraphQLDataProvider.RefreshToken();\n return await GraphQLDataProvider.ExecuteGQL(query, variables, false/*don't attempt to refresh again*/);\n }\n else {\n // token expired but the caller doesn't want a refresh, so just return the error\n LogError(`JWT_EXPIRED and refreshTokenIfNeeded is false`);\n throw e;\n }\n }\n else\n throw e;\n }\n else {\n LogError(e);\n throw e; // force the caller to handle the error\n }\n }\n }\n\n public static async RefreshToken(): Promise<void> {\n if (GraphQLDataProvider._configData.Data.RefreshTokenFunction) {\n const newToken = await GraphQLDataProvider._configData.Data.RefreshTokenFunction();\n if (newToken) {\n GraphQLDataProvider._configData.Token = newToken; // update the token\n GraphQLDataProvider._client = this.CreateNewGraphQLClient(GraphQLDataProvider._configData.URL,\n GraphQLDataProvider._configData.Token,\n GraphQLDataProvider._sessionId);\n }\n else {\n throw new Error('Refresh token function returned null or undefined token');\n }\n }\n else {\n throw new Error('No refresh token function provided');\n }\n }\n\n protected static CreateNewGraphQLClient(url: string, token: string, sessionId: string): GraphQLClient {\n return new GraphQLClient(url, {\n headers: {\n authorization: 'Bearer ' + token,\n 'x-session-id': sessionId\n }\n });\n }\n\n private _innerCurrentUserQueryString = `CurrentUser {\n ${this.userInfoString()}\n UserRoles_UserIDArray {\n ${this.userRoleInfoString()}\n }\n }\n `\n\n\n private _currentUserQuery = gql`query CurrentUserAndRoles {\n ${this._innerCurrentUserQueryString}\n }`\n\n\n\n private userInfoString(): string {\n return this.infoString(new UserInfo(null, null))\n }\n private userRoleInfoString(): string {\n return this.infoString(new UserRoleInfo(null))\n }\n private infoString(object: any): string {\n let sOutput: string = '';\n const keys = Object.keys(object)\n for (const k of keys) {\n if (k.startsWith('__mj_')) {\n sOutput += k.replace('__mj_', '_mj__') + '\\n '\n }\n else if (!k.startsWith('_')) {\n sOutput += k + '\\n '\n }\n }\n return sOutput\n }\n\n\n private _localStorageProvider: ILocalStorageProvider;\n get LocalStorageProvider(): ILocalStorageProvider {\n if (!this._localStorageProvider)\n this._localStorageProvider = new BrowserIndexedDBStorageProvider();\n\n return this._localStorageProvider;\n }\n\n\n /**************************************************************************/\n // END ---- IMetadataProvider\n /**************************************************************************/\n protected get Metadata(): IMetadataProvider {\n return this;\n }\n\n private _wsClient: Client = null;\n private _pushStatusRequests: {sessionId: string, observable: Observable<string>}[] = [];\n public PushStatusUpdates(sessionId: string = null): Observable<string> {\n if (!sessionId)\n sessionId = this.sessionId;\n\n if (!this._wsClient)\n this._wsClient = createClient({\n url: this.ConfigData.WSURL,\n connectionParams: {\n Authorization: 'Bearer ' + this.ConfigData.Token,\n },\n });\n\n const existingRequest = this._pushStatusRequests.find(r => r.sessionId === sessionId);\n if (existingRequest)\n return existingRequest.observable;\n\n const SUBSCRIBE_TO_STATUS = gql`subscription StatusUpdates($sessionId: String!) {\n statusUpdates(sessionId: $sessionId) {\n date\n message\n sessionId\n }\n }\n `;\n\n const newObservable = new Observable<string>((observer) => {\n const unsubscribe = this._wsClient.subscribe(\n { query: SUBSCRIBE_TO_STATUS, variables: { sessionId } },\n {\n next: (data) => {\n return observer.next(<string>data.data.statusUpdates)\n },\n error: (error) => {\n return observer.error(error)\n },\n complete: () => {\n return observer.complete()\n },\n }\n );\n\n return () => {\n // Cleanup logic\n console.log('would unsub here')\n //unsubscribe();\n };\n });\n this._pushStatusRequests.push({sessionId, observable: newObservable});\n return newObservable;\n }\n}\n\n\n// this class implements a simple in-memory only storage as a fallback if the browser doesn't support local storage\nclass BrowserStorageProviderBase implements ILocalStorageProvider {\n private _localStorage: { [key: string]: string } = {};\n\n public async getItem(key: string): Promise<string | null> {\n return new Promise((resolve) => {\n if (this._localStorage.hasOwnProperty(key))\n resolve(this._localStorage[key]);\n else\n resolve(null);\n });\n }\n\n public async setItem(key: string, value: string): Promise<void> {\n return new Promise((resolve) => {\n this._localStorage[key] = value;\n resolve();\n });\n }\n\n public async remove(key: string): Promise<void> {\n return new Promise((resolve) => {\n if (this._localStorage.hasOwnProperty(key)) {\n delete this._localStorage[key];\n }\n resolve();\n });\n }\n}\n\n\n// This implementation just wraps the browser local storage and if for some reason the browser doesn't\n// have a localStorage object, we just use a simple object to store the data in memory.\nclass BrowserLocalStorageProvider extends BrowserStorageProviderBase {\n public async getItem(key: string): Promise<string | null> {\n if (localStorage)\n return localStorage.getItem(key);\n else\n return await super.getItem(key)\n }\n\n public async setItem(key: string, value: string): Promise<void> {\n if (localStorage)\n localStorage.setItem(key, value);\n else\n await super.setItem(key, value)\n }\n\n public async remove(key: string): Promise<void> {\n if (localStorage)\n localStorage.removeItem(key);\n else\n await super.remove(key)\n }\n}\n\n\n\nconst IDB_DB_NAME = 'MJ_Metadata';\nconst IDB_DB_ObjectStoreName = 'Metadata_KVPairs';\n\ninterface MJ_MetadataDB extends DBSchema {\n 'Metadata_KVPairs': {\n key: string;\n value: any;\n };\n}\n\nclass BrowserIndexedDBStorageProvider extends BrowserStorageProviderBase {\n private dbPromise: Promise<IDBPDatabase<MJ_MetadataDB>>;\n\n constructor() {\n super();\n\n this.dbPromise = openDB<MJ_MetadataDB>(IDB_DB_NAME, 1, {\n upgrade(db) {\n if (!db.objectStoreNames.contains(IDB_DB_ObjectStoreName)) {\n db.createObjectStore(IDB_DB_ObjectStoreName);\n }\n },\n });\n }\n\n async setItem(key: string, value: any): Promise<void> {\n const db = await this.dbPromise;\n const tx = db.transaction(IDB_DB_ObjectStoreName, 'readwrite');\n await tx.objectStore(IDB_DB_ObjectStoreName).put(value, key);\n await tx.done;\n }\n\n async getItem(key: string): Promise<any> {\n const db = await this.dbPromise;\n const value = await db.transaction(IDB_DB_ObjectStoreName).objectStore(IDB_DB_ObjectStoreName).get(key);\n return value;\n }\n\n async remove(key: string): Promise<void> {\n const db = await this.dbPromise;\n const tx = db.transaction(IDB_DB_ObjectStoreName, 'readwrite');\n await tx.objectStore(IDB_DB_ObjectStoreName).delete(key);\n await tx.done;\n }\n}\n\nexport class GraphQLTransactionGroup extends TransactionGroupBase {\n protected async HandleSubmit(items: TransactionItem[]): Promise<TransactionResult[]> {\n // iterate through each instruction and build up the combined query string\n // and the combined variables object\n let combinedQuery = '';\n let mutationParams = '';\n const combinedVars: any = {};\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n let itemMutation = item.Instruction;\n if (item.Vars) {\n const keys = Object.keys(item.Vars);\n // rename the variables to avoid collisions and aggregate the varisables\n // from the item into our combined variables\n for (let j = 0; j < keys.length; j++) {\n const key = keys[j];\n const newKey = `${key}_${i}`;\n combinedVars[newKey] = item.Vars[key];\n\n const keyRegEx = new RegExp('\\\\$' + key, 'g'); // Create the RegExp dynamically with the global flag.\n itemMutation = itemMutation.replace(keyRegEx, '$' + newKey);\n const mutationInputType = item.ExtraData.mutationInputTypes.find((t: any) => t.varName === key)?.inputType;\n //{varName: pk.CodeName, inputType: pk.EntityFieldInfo.GraphQLType + '!'}\n mutationParams += `$${newKey}: ${mutationInputType} \\n`;\n }\n }\n // add in the specific mutation and give it an alias so we can easily figure out the results\n // from each of them and pass back properly\n combinedQuery += `mutation_${i}: ` + itemMutation + '\\n';\n }\n\n combinedQuery = `mutation TransactionGroup(${mutationParams}){ \\n` + combinedQuery+ '\\n}'; // wrap it up in a mutation so we can execute it\n const execResults = await GraphQLDataProvider.ExecuteGQL(combinedQuery, combinedVars)\n const returnResults: TransactionResult[] = [];\n for (let i = 0; i < items.length; i++) {\n /// NEED TO TEST TO SEE WHAT ORDER WE GET RESULTS BACK AS\n const result = execResults[`mutation_${i}`];\n const item = items[i];\n returnResults.push(new TransactionResult(item, result, result !== null));\n }\n return returnResults;\n }\n}\n","import { RunReport, BaseEntity, Metadata, RunView, RunQuery } from \"@memberjunction/core\";\nimport { GraphQLDataProvider, GraphQLProviderConfigData } from \"./graphQLDataProvider\";\nimport { MJGlobal, MJEventType } from \"@memberjunction/global\";\n\nexport async function setupGraphQLClient(config: GraphQLProviderConfigData) {\n // Set the provider for all entities to be GraphQL in this project, can use a different provider in other situations....\n const provider = new GraphQLDataProvider()\n\n // BaseEntity + Metadata share the same GraphQLDataProvider instance\n BaseEntity.Provider = provider\n Metadata.Provider = provider\n RunView.Provider = provider\n RunReport.Provider = provider\n RunQuery.Provider = provider\n\n await provider.Config(config);\n\n // fire off the logged in event if we get here\n MJGlobal.Instance.RaiseEvent({ event: MJEventType.LoggedIn, eventCode: null, component: this, args: null });\n\n return provider;\n}"],"names":["ProviderConfigDataBase","ProviderBase","gql","LogError","UserInfo","ViewInfo","ProviderType","BaseEntityResult","EntityFieldTSType","TransactionItem","GraphQLClient","UserRoleInfo","createClient","Observable","openDB","TransactionGroupBase","TransactionResult","BaseEntity","Metadata","RunView","RunReport","RunQuery","MJGlobal","MJEventType"],"mappings":"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"}
|
package/dist/index.d.cts
CHANGED
|
@@ -106,6 +106,12 @@ declare class GraphQLDataProvider extends ProviderBase implements IEntityDataPro
|
|
|
106
106
|
/**************************************************************************/
|
|
107
107
|
/**************************************************************************/
|
|
108
108
|
/**************************************************************************/
|
|
109
|
+
/**
|
|
110
|
+
* Returns a dataset by name
|
|
111
|
+
* @param datasetName
|
|
112
|
+
* @param itemFilters
|
|
113
|
+
* @returns
|
|
114
|
+
*/
|
|
109
115
|
GetDatasetByName(datasetName: string, itemFilters?: DatasetItemFilterType[]): Promise<DatasetResultType>;
|
|
110
116
|
GetDatasetStatusByName(datasetName: string, itemFilters?: DatasetItemFilterType[]): Promise<DatasetStatusResultType>;
|
|
111
117
|
CreateTransactionGroup(): Promise<TransactionGroupBase>;
|