@memberjunction/graphql-dataprovider 2.78.0 → 2.80.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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/FieldMapper.ts","../src/graphQLTransactionGroup.ts","../src/graphQLDataProvider.ts","../src/config.ts","../src/rolesAndUsersType.ts","../src/graphQLSystemUserClient.ts","../src/graphQLActionClient.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","import { TransactionGroupBase, TransactionResult } from \"@memberjunction/core\";\nimport { GraphQLDataProvider } from \"./graphQLDataProvider\";\nimport { gql } from \"graphql-request\";\nimport { SafeJSONParse } from \"@memberjunction/global\";\n\nexport class GraphQLTransactionGroup extends TransactionGroupBase {\n private _provider: GraphQLDataProvider;\n constructor(provider: GraphQLDataProvider) {\n super();\n this._provider = provider;\n }\n\n // protected async HandleSubmit(): 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 < this.PendingTransactions.length; i++) {\n // const item = this.PendingTransactions[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 this._provider.ExecuteGQL(combinedQuery, combinedVars)\n // const returnResults: TransactionResult[] = [];\n // for (let i = 0; i < this.PendingTransactions.length; i++) {\n // /// NEED TO TEST TO SEE WHAT ORDER WE GET RESULTS BACK AS\n // const result = execResults[`mutation_${i}`];\n // const item = this.PendingTransactions[i];\n // returnResults.push(new TransactionResult(item, result, result !== null));\n // }\n // return returnResults;\n // }\n\n // new implementation\n protected async HandleSubmit(): Promise<TransactionResult[]> {\n // Define the mutation\n const mutation = gql`\n mutation ExecuteTransactionGroup($group: TransactionInputType!) {\n ExecuteTransactionGroup(group: $group) {\n Success\n ErrorMessages\n ResultsJSON\n }\n }\n `;\n\n // Example variables for the mutation\n const items = [];\n for (const pt of this.PendingTransactions) {\n items.push({\n EntityName: pt.BaseEntity.EntityInfo.Name,\n EntityObjectJSON: await pt.BaseEntity.GetDataObjectJSON(),\n OperationType: pt.OperationType\n });\n }\n const vars = {\n group: {\n Items: items,\n Variables: this.Variables.map(v => {\n return {\n Name: v.Name,\n ItemIndex: this.MapVariableEntityObjectToPosition(v),\n FieldName: v.FieldName,\n Type: v.Type\n }\n }) \n }\n }; \n\n const results = await this._provider.ExecuteGQL(mutation, vars)\n if (results && results.ExecuteTransactionGroup) {\n const data = results.ExecuteTransactionGroup;\n const returnResults: TransactionResult[] = [];\n for (let i = 0; i < this.PendingTransactions.length; i++) {\n const resultJSON = data.ResultsJSON[i];\n const resultObject = SafeJSONParse(resultJSON);\n const item = this.PendingTransactions[i];\n returnResults.push(new TransactionResult(item, resultObject, resultObject !== null));\n }\n return returnResults;\n }\n else {\n throw new Error('Failed to execute transaction group');\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, EntityMergeOptions, 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 } 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';\nimport { v4 as uuidv4 } from 'uuid';\nimport { GraphQLTransactionGroup } from \"./graphQLTransactionGroup\";\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\n/**\n * The GraphQLProviderConfigData class is used to configure the GraphQLDataProvider. It is passed to the Config method of the GraphQLDataProvider\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 * This optional parameter is used when using a shared secret key that is static and provided by the publisher of the MJAPI server. Providing this value will result in \n * a special header x-mj-api-key being set with this value in the HTTP request to the server. This is useful when the server is configured to require this key for certain requests.\n * \n * WARNING: This should NEVER BE USED IN A CLIENT APP like a browser. The only suitable use for this is if you are using GraphQLDataProvider on the server side from another MJAPI, or \n * some other secure computing environment where the key can be kept secure.\n */\n get MJAPIKey(): string { return this.Data.MJAPIKey }\n set MJAPIKey(key: string) { this.Data.MJAPIKey = key }\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 * @param mjAPIKey optional, a shared secret key that is static and provided by the publisher of the MJAPI server. \n */\n constructor(token: string,\n url: string,\n wsurl: string,\n refreshTokenFunction: RefreshTokenFunction,\n MJCoreSchemaName?: string,\n includeSchemas?: string[],\n excludeSchemas?: string[],\n mjAPIKey?: string) {\n super(\n {\n Token: token,\n URL: url,\n WSURL: wsurl,\n MJAPIKey: mjAPIKey,\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.\n/**\n * The GraphQLDataProvider class is a data provider for MemberJunction that implements the IEntityDataProvider, IMetadataProvider, IRunViewProvider, IRunReportProvider, IRunQueryProvider interfaces and connects to the\n * MJAPI server using GraphQL. This class is used to interact with the server to get and save data, as well as to get metadata about the entities and fields in the system.\n */\nexport class GraphQLDataProvider extends ProviderBase implements IEntityDataProvider, IMetadataProvider, IRunViewProvider, IRunReportProvider, IRunQueryProvider {\n private static _instance: GraphQLDataProvider;\n public static get Instance(): GraphQLDataProvider {\n return GraphQLDataProvider._instance;\n }\n\n constructor() {\n super();\n if (!GraphQLDataProvider._instance)\n GraphQLDataProvider._instance = this;\n }\n\n private _client: GraphQLClient;\n private _configData: GraphQLProviderConfigData;\n private _sessionId: string;\n\n public get ConfigData(): GraphQLProviderConfigData { \n return this._configData; \n }\n\n /**\n * This getter is not implemented for the GraphQLDataProvider class.\n */\n public get DatabaseConnection(): any {\n throw new Error(\"DatabaseConnection not implemented for the GraphQLDataProvider\");\n }\n\n /**\n * The connection string for each GraphQLProvider instance is simply the URL for the GraphQL endpoint. This is because each GraphQLDataProvider instance can be configured with a different URL and each URL\n * is a unique combination of host/port/etc.\n */\n public get InstanceConnectionString(): string {\n return this._configData.URL\n }\n\n public GenerateUUID() {\n return uuidv4();\n }\n\n /**\n * The GraphQLDataProvider uses a prefix for local storage that is equal to the URL of the GraphQL endpoint. This is because the GraphQLDataProvider can be configured multiple times with different URLs and each\n * configuration will have its own local storage. This is useful when you want to have multiple connections to different servers and you don't want the local storage to be shared between them. The URL is \n * normalized to remove special characters and replace anything other than alphanumeric characters with an underscore.\n */\n protected override get LocalStoragePrefix(): string {\n if (this._configData === undefined || this._configData.URL === undefined) {\n throw new Error(\"GraphQLDataProvider: ConfigData is not set. Please call Config() first.\");\n }\n\n const replacementString = this._configData.URL.replace(/[^a-zA-Z0-9]/g, '_');\n return replacementString + \".\"; // add a period at the end to separate the prefix from the key\n }\n\n /**\n * Retrieves the stored session ID from the LocalStorageProvider if available.\n * If no session ID is found, returns null.\n * The session ID is stored using the same storage mechanism as other persistent data\n * with a key specific to the current URL to ensure uniqueness across different \n * server connections.\n * \n * @returns The stored session ID or null if not found\n */\n public async GetStoredSessionID(): Promise<string> {\n try {\n const ls = this.LocalStorageProvider;\n if (ls) {\n const key = this.LocalStoragePrefix + \"sessionId\";\n const storedSession = await ls.GetItem(key);\n return storedSession;\n }\n return null;\n } catch (e) {\n // If any error occurs, return null\n console.error(\"Error retrieving session ID from local storage:\", e);\n return null;\n }\n }\n\n /**\n * Stores the session ID using the configured LocalStorageProvider for persistence.\n * Uses the same URL-specific key pattern as other storage methods to ensure\n * proper isolation between different server connections.\n * \n * @param sessionId The session ID to store\n */\n private async SaveStoredSessionID(sessionId: string): Promise<void> {\n try {\n const ls = this.LocalStorageProvider;\n if (ls) {\n const key = this.LocalStoragePrefix + \"sessionId\";\n await ls.SetItem(key, sessionId);\n }\n } catch (e) {\n // Silently fail if storage is not available\n }\n }\n\n public async GetPreferredUUID(forceRefreshSessionId?: boolean): Promise<string> {\n // Try to get the stored session ID\n const oldUUID = await this.GetStoredSessionID();\n const UUID = forceRefreshSessionId || !oldUUID ? this.GenerateUUID() : oldUUID;\n return UUID;\n }\n\n\n /**\n * This method configures the class instance. If separateConnection is false or not provided, the global/static variables are set that means that the Config() call\n * will affect all callers to the GraphQLDataProvider including via wrappers like the Metadata class. If separateConnection is true, then the instance variables are set\n * and only this instance of the GraphQLDataProvider will be affected by the Config() call.\n * @important If separateConnection is true, metadata for the provider will be loaded but will NOT affect the Metadata class/singleton. \n * This is because the Metadata class is a singleton that binds to the first Config() call in the process where separateConnection is falsy. \n * @param configData \n * @param separateConnection \n * @returns \n */\n public async Config(configData: GraphQLProviderConfigData, separateConnection?: boolean, forceRefreshSessionId?: boolean): Promise<boolean> {\n try {\n if (separateConnection) {\n this._configData = configData;\n // Get UUID after setting the configData, so that it can be used to get any stored session ID\n this._sessionId = await this.GetPreferredUUID(forceRefreshSessionId);;\n\n this._client = this.CreateNewGraphQLClient(configData.URL, configData.Token, this._sessionId, configData.MJAPIKey);\n // Store the session ID for this connection\n await this.SaveStoredSessionID(this._sessionId);\n }\n else {\n GraphQLDataProvider.Instance._configData = configData;\n\n if (GraphQLDataProvider.Instance._sessionId === undefined) {\n GraphQLDataProvider.Instance._sessionId = await this.GetPreferredUUID(forceRefreshSessionId);;\n }\n \n // now create the new client, if it isn't already created\n if (!GraphQLDataProvider.Instance._client)\n GraphQLDataProvider.Instance._client = this.CreateNewGraphQLClient(configData.URL, configData.Token, GraphQLDataProvider.Instance._sessionId, configData.MJAPIKey); \n \n // Store the session ID for the global instance\n await GraphQLDataProvider.Instance.SaveStoredSessionID(GraphQLDataProvider.Instance._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 this._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 this.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 this.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 if (params.QueryID) {\n return this.RunQueryByID(params.QueryID, params.CategoryID, params.CategoryPath, contextUser, params.Parameters, params.MaxRows, params.StartRow);\n }\n else if (params.QueryName) {\n return this.RunQueryByName(params.QueryName, params.CategoryID, params.CategoryPath, contextUser, params.Parameters, params.MaxRows, params.StartRow);\n }\n else {\n throw new Error(\"No QueryID or QueryName provided to RunQuery\");\n }\n }\n\n public async RunQueryByID(QueryID: string, CategoryID?: string, CategoryPath?: string, contextUser?: UserInfo, Parameters?: Record<string, any>, MaxRows?: number, StartRow?: number): Promise<RunQueryResult> {\n const query = gql`\n query GetQueryDataQuery($QueryID: String!, $CategoryID: String, $CategoryPath: String, $Parameters: JSONObject, $MaxRows: Int, $StartRow: Int) {\n GetQueryData(QueryID: $QueryID, CategoryID: $CategoryID, CategoryPath: $CategoryPath, Parameters: $Parameters, MaxRows: $MaxRows, StartRow: $StartRow) {\n ${this.QueryReturnFieldList}\n }\n }\n `;\n \n // Build the variables object, adding optional parameters if defined.\n const variables: { QueryID: string; CategoryID?: string; CategoryPath?: string; Parameters?: Record<string, any>; MaxRows?: number; StartRow?: number } = { QueryID };\n if (CategoryID !== undefined) {\n variables.CategoryID = CategoryID;\n }\n if (CategoryPath !== undefined) {\n variables.CategoryPath = CategoryPath;\n }\n if (Parameters !== undefined) {\n variables.Parameters = Parameters;\n }\n if (MaxRows !== undefined) {\n variables.MaxRows = MaxRows;\n }\n if (StartRow !== undefined) {\n variables.StartRow = StartRow;\n }\n \n const result = await this.ExecuteGQL(query, variables);\n if (result && result.GetQueryData) {\n return this.TransformQueryPayload(result.GetQueryData);\n }\n }\n \n public async RunQueryByName(QueryName: string, CategoryID?: string, CategoryPath?: string, contextUser?: UserInfo, Parameters?: Record<string, any>, MaxRows?: number, StartRow?: number): Promise<RunQueryResult> {\n const query = gql`\n query GetQueryDataByNameQuery($QueryName: String!, $CategoryID: String, $CategoryPath: String, $Parameters: JSONObject, $MaxRows: Int, $StartRow: Int) {\n GetQueryDataByName(QueryName: $QueryName, CategoryID: $CategoryID, CategoryPath: $CategoryPath, Parameters: $Parameters, MaxRows: $MaxRows, StartRow: $StartRow) {\n ${this.QueryReturnFieldList}\n }\n }\n `;\n \n // Build the variables object, adding optional parameters if defined.\n const variables: { QueryName: string; CategoryID?: string; CategoryPath?: string; Parameters?: Record<string, any>; MaxRows?: number; StartRow?: number } = { QueryName };\n if (CategoryID !== undefined) {\n variables.CategoryID = CategoryID;\n }\n if (CategoryPath !== undefined) {\n variables.CategoryPath = CategoryPath;\n }\n if (Parameters !== undefined) {\n variables.Parameters = Parameters;\n }\n if (MaxRows !== undefined) {\n variables.MaxRows = MaxRows;\n }\n if (StartRow !== undefined) {\n variables.StartRow = StartRow;\n }\n \n const result = await this.ExecuteGQL(query, variables);\n if (result && result.GetQueryDataByName) {\n return this.TransformQueryPayload(result.GetQueryDataByName);\n }\n }\n\n protected get QueryReturnFieldList(): string {\n return `\n Success\n QueryID\n QueryName\n Results\n RowCount\n TotalRowCount\n ExecutionTime\n ErrorMessage\n AppliedParameters`\n }\n protected TransformQueryPayload(data: any): RunQueryResult {\n try {\n return {\n QueryID: data.QueryID,\n QueryName: data.QueryName,\n Success: data.Success,\n Results: JSON.parse(data.Results),\n RowCount: data.RowCount,\n TotalRowCount: data.TotalRowCount,\n ExecutionTime: data.ExecutionTime,\n ErrorMessage: data.ErrorMessage,\n AppliedParameters: data.AppliedParameters ? JSON.parse(data.AppliedParameters) : undefined\n }; \n }\n catch (e) {\n LogError(`Error transforming query payload: ${e}`);\n return null;\n }\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 this.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 this.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 this.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 this.ExecuteGQL(query, {params: request});\n\n if(data && data.GetRecordDuplicates){\n return data.GetRecordDuplicates;\n }\n }\n\n public async MergeRecords(request: RecordMergeRequest, contextUser?: UserInfo, options?: EntityMergeOptions): 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 this.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) {\n // type conversions as needed for GraphQL\n switch(f.EntityFieldInfo.TSType) {\n case EntityFieldTSType.Date:\n val = val.getTime();\n break;\n case EntityFieldTSType.Boolean:\n if (typeof val !== 'boolean') {\n val = parseInt(val) === 0 ? false : true; // convert to boolean\n }\n break;\n case EntityFieldTSType.Number:\n if (typeof val !== 'number') {\n const numValue = Number(val);\n if (!isNaN(numValue)) {\n val = numValue;\n } \n }\n break;\n }\n }\n\n if (val === null && f.EntityFieldInfo.AllowsNull === false) {\n // no value, field doesn't allow nulls, so set to default value, if available and then fall back to either 0 or empty string depending on type\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 (f.EntityFieldInfo.TSType === EntityFieldTSType.Date) \n val = f.OldValue.getTime().toString();\n else if (f.EntityFieldInfo.TSType === EntityFieldTSType.Boolean)\n val = f.OldValue === true ? \"1\" : \"0\";\n else 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 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, \n result.Type === 'create' ? 'Create' : 'Update', \n inner, vars, \n {\n mutationName,\n mutationInputTypes: mutationInputTypes\n },\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 result.NewValues = 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 }\n }));\n\n return true; // part of a TG always return true after we setup the transaction group item above\n }\n else {\n // not part of a transaction group, so just go for it and send across our GQL\n const d = await this.ExecuteGQL(outer, vars)\n if (d && d[type + entity.EntityInfo.ClassName]) {\n result.Success = true;\n result.EndedAt = new Date();\n result.NewValues = this.ConvertBackToMJFields(d[type + entity.EntityInfo.ClassName]);\n return result.NewValues;\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 this.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 // 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, 'Delete', 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 }\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 }\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 }\n }));\n return true;\n }\n else {\n // no transaction just go for it\n const d = await this.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 this.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 this.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(this);\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 this.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 this.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 this.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 this.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 /**\n * Retrieves all of the data context data for the specified data context ID.\n * @param dataContextID \n * @returns \n */\n public async GetDataContextData(dataContextID: string) {\n try {\n const query = gql`query GetDataContextData ($DataContextID: String!) {\n GetDataContextData(DataContextID: $DataContextID) {\n Success\n ErrorMessages\n Results\n }\n }`\n \n const data = await this.ExecuteGQL(query, {DataContextID: dataContextID});\n if (data && data.GetDataContextData) {\n if (data.GetDataContextData.Success) {\n return data.GetDataContextData.Results.map((item: any) => {\n return JSON.parse(item);\n });\n }\n else {\n throw new Error(data.GetDataContextData.ErrorMessages.join(', '));\n }\n }\n else {\n throw new Error('GraphQL query failed');\n } \n }\n catch (e) {\n LogError(e);\n throw e;\n }\n }\n\n /**\n * Retrieves the data context item data for the specified data context item ID.\n * @param dataContextItemID \n * @returns \n */\n public async GetDataContextItemData(dataContextItemID: string) {\n try {\n const query = gql`query GetDataContextItemData ($DataContextItemID: String!) {\n GetDataContextItemData(DataContextItemID: $DataContextItemID) {\n Success\n ErrorMessage\n Result\n }\n }`\n \n const data = await this.ExecuteGQL(query, {DataContextItemID: dataContextItemID});\n if (data && data.GetDataContextItemData) {\n if (data.GetDataContextItemData.Success) {\n return JSON.parse(data.GetDataContextItemData.Result);\n }\n else {\n throw new Error(data.GetDataContextItemData.ErrorMessage);\n }\n }\n else {\n throw new Error('GraphQL query failed');\n } \n }\n catch (e) {\n LogError(e);\n throw e;\n }\n }\n\n /**\n * Static version of the ExecuteGQL method that will use the global instance of the GraphQLDataProvider and execute the specified query with the provided variables. \n * If the token is expired, it will attempt to refresh the token and then re-execute the query. If the token is expired and the refresh fails, it will throw an error.\n * @param query \n * @param variables \n * @param refreshTokenIfNeeded \n * @returns \n */\n public static async ExecuteGQL(query: string, variables: any, refreshTokenIfNeeded: boolean = true): Promise<any> {\n return GraphQLDataProvider.Instance.ExecuteGQL(query, variables, refreshTokenIfNeeded);\n }\n\n /**\n * Executes the GQL query with the provided variables. If the token is expired, it will attempt to refresh the token and then re-execute the query. If the token is expired and the refresh fails, it will throw an error.\n * @param query \n * @param variables \n * @param refreshTokenIfNeeded \n * @returns \n */\n public async ExecuteGQL(query: string, variables: any, refreshTokenIfNeeded: boolean = true): Promise<any> {\n try {\n const data = await this._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 this.RefreshToken();\n return await this.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 async RefreshToken(): Promise<void> {\n if (this._configData.Data.RefreshTokenFunction) {\n const newToken = await this._configData.Data.RefreshTokenFunction();\n if (newToken) {\n this._configData.Token = newToken; // update the token\n this._client = this.CreateNewGraphQLClient(this._configData.URL,\n this._configData.Token,\n this._sessionId,\n this._configData.MJAPIKey); \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 public static async RefreshToken(): Promise<void> {\n return GraphQLDataProvider.Instance.RefreshToken();\n }\n\n protected CreateNewGraphQLClient(url: string, token: string, sessionId: string, mjAPIKey: string): GraphQLClient {\n const headers: Record<string, string> = { \n 'x-session-id': sessionId,\n };\n if (token)\n headers.authorization = 'Bearer ' + token;\n if (mjAPIKey)\n headers['x-mj-api-key'] = mjAPIKey;\n\n return new GraphQLClient(url, {\n headers\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 \n /**\n * Generic subscription method for GraphQL subscriptions\n * @param subscription The GraphQL subscription query\n * @param variables Variables to pass to the subscription\n * @returns Observable that emits subscription data\n */\n public subscribe(subscription: string, variables?: any): Observable<any> {\n // Ensure websocket client is initialized\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\n return new Observable((observer) => {\n const unsubscribe = this._wsClient.subscribe(\n { query: subscription, variables },\n {\n next: (data) => {\n observer.next(data.data);\n },\n error: (error) => {\n observer.error(error);\n },\n complete: () => {\n observer.complete();\n },\n }\n );\n\n // Return cleanup function\n return () => {\n unsubscribe();\n };\n });\n }\n \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","import { RunReport, BaseEntity, Metadata, RunView, RunQuery, SetProvider } from \"@memberjunction/core\";\nimport { GraphQLDataProvider, GraphQLProviderConfigData } from \"./graphQLDataProvider\";\nimport { MJGlobal, MJEventType } from \"@memberjunction/global\";\n\n/**\n * Setup the GraphQL client for the project using the provided configuration data.\n */\nexport async function setupGraphQLClient(config: GraphQLProviderConfigData): Promise<GraphQLDataProvider> {\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 SetProvider(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}","import { CompositeKey } from \"@memberjunction/core\";\n\n\n\nexport class SyncRolesAndUsersResult {\n Success: boolean;\n}\n \nexport class RoleInput {\n ID: string;\n\n Name: string;\n \n Description: string;\n}\n\n\nexport class UserInput {\n ID!: string;\n\n Name!: string;\n\n Email!: string;\n\n Type!: 'Owner' | 'User';\n\n FirstName: string;\n\n LastName: string;\n \n Title: string;\n\n Roles?: RoleInput[];\n}\n\nexport class RolesAndUsersInput {\n public Users: UserInput[];\n \n public Roles: RoleInput[];\n}\n\n\n\n/**\n * This type defines the possible list of actions that can be taken in syncing data: Create, Update, CreateOrUpdate, Delete, or DeleteWithFilter\n * DeleteWithFilter is where you specify a valid SQL expression that can be used in a where clause to get a list of records in a given entity to delete\n * this can be used to ensure cleaning out data from a subset of a given table.\n */\nexport enum SyncDataAction {\n Create = \"Create\",\n Update = \"Update\",\n CreateOrUpdate = \"CreateOrUpdate\",\n Delete = \"Delete\",\n DeleteWithFilter = \"DeleteWithFilter\"\n}\n \nexport class ActionItemInput {\n /**\n * The name of the entity where action is to be taken\n */\n EntityName!: string;\n /**\n * For Update, CreateOrUpdate and Delete operations either a PrimaryKey or an AlternateKey must be provided. For Create and DeleteWithFilter operations, neither is used. \n */\n PrimaryKey?: CompositeKey;\n /**\n * For Update, CreateOrUpdate and Delete operations either a PrimaryKey or an AlternateKey must be provided. For Create and DeleteWithFilter operations, neither is used. \n */\n AlternateKey?: CompositeKey;\n /**\n * The type of action requested. The possible values are Create, Update, CreateOrUpdate, Delete, DeleteWithFilter\n */\n Type!: SyncDataAction;\n /**\n * This field is a JSON representation of the field values of the entity to be created or updated. It is used for all ActionTypes except for \n */\n RecordJSON?: string;\n\n /**\n * This field is only provided when the Action Type is DeleteWithFilter. It is a valid SQL expression that can be used in a where clause to get a list of records in a given entity to delete\n */\n DeleteFilter?: string;\n}\n \n\nexport class SyncDataResult {\n Success: boolean;\n \n Results: ActionItemOutput[] = [];\n}\n\nexport class ActionItemOutput {\n Success: boolean;\n ErrorMessage: string;\n EntityName!: string;\n PrimaryKey?: CompositeKey;\n AlternateKey?: CompositeKey;\n Type!: SyncDataAction;\n\n /**\n * This field is a JSON representation of the field values of the entity to be created or updated. It is used for all ActionTypes except for \n */\n RecordJSON?: string;\n\n /**\n * This field is only provided when the Action Type is DeleteWithFilter. It is a valid SQL expression that can be used in a where clause to get a list of records in a given entity to delete\n */\n DeleteFilter?: string;\n}","import { CompositeKey, LogError } from '@memberjunction/core';\nimport { SafeJSONParse } from '@memberjunction/global';\nimport { gql, GraphQLClient } from 'graphql-request'\nimport { ActionItemInput, RolesAndUsersInput, SyncDataResult, SyncRolesAndUsersResult } from './rolesAndUsersType';\n\n/**\n * Specialized client that is designed to be used exclusively on the server side\n * by the System User using the MJ API KEY. This is designed to allow server side\n * code such as within the context of an MJAPI server to talk to another MAJPI server\n * but as the client.\n * \n * It is possible for a server to use the regular @GraphQLDataProvider client to talk\n * to another MJAPI server, but that would require the server to have a user account\n * and the server would have to be able to log in as that user via a JWT token. This\n * is not always possible or convenient in the flow. \n * \n * Also the standard client configuration process has a certain amount over overhead\n * in always loading up certain metadata that is not necessary for many system user\n * operations.\n * \n * Finaly, this client can be used in parallel with the regular client to allow a server\n * to mix and match the two as needed.\n */\nexport class GraphQLSystemUserClient {\n private _client: GraphQLClient;\n /**\n * Returns the underlying GraphQL client which is an instance of the GraphQLClient object\n * from the graphql-request package. This is useful if you want to perform any operation\n * that is not directly supported by this class via specialized methods.\n */\n public get Client(): GraphQLClient {\n return this._client;\n }\n\n /**\n * @param url MJAPI server URL\n * @param token Optional, JWT token that is used for a normal user authentication flow. This is required if mjAPIKey is not provided.\n * @param sessionId Optional, UUID that is used to track a session. This can be any string.\n * @param mjAPIKey Shared Secret key that is provided for system user authentication. This is required if token is not provided.\n * @returns \n */\n constructor (url: string, token: string, sessionId: string, mjAPIKey: string) {\n const headers: Record<string, string> = { \n 'x-session-id': sessionId,\n };\n if (token)\n headers.authorization = 'Bearer ' + token;\n if (mjAPIKey)\n headers['x-mj-api-key'] = mjAPIKey;\n\n this._client = new GraphQLClient(url, {\n headers\n });\n }\n\n /**\n * Calls the GetData() query on the server to execute any number of provided SQL queries in parallel and returns the results.\n * The queries MUST BE read only and not perform any DML operations. The remote server will execute the queries using a special\n * lower-privilege user that is not allowed to perform any form of write operations.\n * @param queries an array of SQL queries to execute on the remote server\n * @param accessToken the short-lived access token that is required to perform this operation. This is different from the MJAPI key and is used for a second factor and is a short-lived token. You will receive this token \n * when an MJAPI calls your server to request something along with the URL to call back.\n * @returns \n */\n public async GetData(queries: string[], accessToken: string): Promise<GetDataOutput> {\n try {\n const query = `query GetData($input: GetDataInputType!) {\n GetData(input: $input) {\n Success\n ErrorMessages\n Queries\n Results\n }\n }`\n const result = await this.Client.request(query, {input: {Queries: queries, Token: accessToken}}) as {GetData: GetDataOutput};\n if (result && result.GetData) {\n // for each succesful item, we will parse and return the array of objects instead of the string\n return {\n Success: result.GetData.Success,\n Results: result.GetData.Results.map(r => r ? SafeJSONParse(r) : null),\n ErrorMessages: result.GetData.ErrorMessages,\n Queries: result.GetData.Queries \n }\n }\n else {\n return {\n Success: false,\n Results: [],\n ErrorMessages: result.GetData?.ErrorMessages ?? ['Unknown error'],\n Queries: result.GetData?.Queries ?? queries\n }\n }\n }\n catch (e) {\n const error = `GraphQLSystemUserClient::GetData - Error getting geta - ${e}`\n LogError(error);\n return {\n Success: false,\n Results: [],\n ErrorMessages: [error],\n Queries: queries\n }\n }\n }\n\n /**\n * This method will return a list of all entities that are available on the remote server. This is a lightweight call that only returns the basic metadata for each entity and does not include all of the attributes at \n * either the entity or the field level. This is useful for getting a list of entities that are available on the remote server and knowing their IDs and Entity Field IDs on the remote server. For core MemberJunction \n * entities and entity fields, the ID values are globally unique and set by the MemberJunction distribution, however, for other entities that are generated on each target system they can vary so it is best to use\n * lookups name or a combination of SchemaName and BaseTable to uniquely identify an entity.\n * @param client \n * @returns \n */\n public async GetAllRemoteEntities(): Promise<SimpleRemoteEntityOutput> {\n try {\n const query = `query GetAllEntities {\n GetAllEntities {\n Success\n ErrorMessage\n Results {\n ID\n Name\n Description\n SchemaName\n BaseView\n BaseTable\n CodeName\n ClassName\n Fields {\n ID\n Name\n Description\n Type\n AllowsNull\n MaxLength\n }\n }\n }\n }`\n\n const result = (await this.Client.request(query)) as {GetAllEntities: SimpleRemoteEntityOutput};\n if (result && result.GetAllEntities) {\n return result.GetAllEntities;\n }\n else {\n return {\n Success: false,\n Results: [],\n ErrorMessage: result.GetAllEntities?.ErrorMessage ?? 'Unknown error'\n }\n }\n }\n catch (e) {\n LogError(`GraphQLSystemUserClient::GetAllRemoteEntities - Error getting remote entities - ${e}`);\n return {\n Success: false,\n Results: [],\n ErrorMessage: e\n }\n }\n }\n\n /**\n * This method is used to invoke the data synchronization mutation on the remote server. This method is used to create, update, or delete records in the remote server. The method takes an array of ActionItemInput objects\n * Each of the ActionItemInput objects represents a single action to take on a single entity. The action can be Create, Update, CreateOrUpdate, Delete, or DeleteWithFilter. The RecordJSON field is used for Create, CreateOrUpdate and Update whereas\n * the DeleteFilter field is used for DeleteWithFilter. The PrimaryKey and AlternateKey fields are used to identify the record to be acted upon. \n * \n * Use of the AlternateKey is important for situations where you might have divergent primary keys across systems. For example for user entities that are individually generated on each system by CodeGen, the primary key will\n * be different per system, so you would use the combination of the SchemaName and BaseTable to identify the entity and then use the AlternateKey to provide the combination of these fields to uniquely identify the record for updates.\n * @param items \n * @returns \n */\n public async SyncData(items: ActionItemInput[]): Promise<SyncDataResult> {\n try {\n // call the resolver to sync the roles and users\n const query = `mutation SyncData($items: [ActionItemInputType!]!) {\n SyncData(items: $items) {\n Success\n Results {\n Success\n ErrorMessage\n EntityName\n Type\n PrimaryKey {\n KeyValuePairs {\n FieldName\n Value \n }\n }\n AlternateKey {\n KeyValuePairs {\n FieldName\n Value \n }\n }\n DeleteFilter\n RecordJSON\n }\n }\n }`\n const d = <{SyncData: SyncDataResult}>await this.Client.request(query, {items});\n if (d && d.SyncData) {\n return d.SyncData;\n }\n else {\n return {\n Success: false,\n Results: []\n }\n }\n }\n catch (e) {\n LogError(`GraphQLSystemUserClient::SyncData - Error syncing data - ${e}`);\n return {\n Success: false,\n Results: []\n }\n }\n }\n\n /**\n * This method will sync the roles and users on the remote server. This method is used to create, update, or delete roles and users on the remote server. \n * The method takes a RolesAndUsersInput object that contains an array of RoleInput objects. Note that this will not result in the removal of roles on the \n * remote server that are deemed to be built-in MemberJunction roles such as Developer, Integration and UI.\n * @param data \n * @returns \n */\n public async SyncRolesAndUsers(data: RolesAndUsersInput): Promise<SyncRolesAndUsersResult> {\n try {\n // call the resolver to sync the roles and users\n const query = `mutation SyncRolesAndUsers($data: RolesAndUsersInputType!) {\n SyncRolesAndUsers(data: $data) {\n Success\n }\n }`\n const d = await this.Client.request(query, {data}) as {SyncRolesAndUsers: SyncRolesAndUsersResult};\n if (d && d.SyncRolesAndUsers) {\n return d.SyncRolesAndUsers;\n }\n else {\n return {\n Success: false\n }\n }\n } \n catch (e) {\n LogError(`GraphQLSystemUserClient::SyncRolesAndUsers - Error syncing roles and users - ${e}`);\n return {\n Success: false\n }\n } \n }\n\n /**\n * Runs a view by name using the RunViewByNameSystemUser resolver.\n * @param input - View input parameters for running by name\n * @returns Promise containing the view execution results\n */\n public async RunViewByName(input: RunViewByNameSystemUserInput): Promise<RunViewSystemUserResult> {\n try {\n const query = `query RunViewByNameSystemUser($input: RunViewByNameInput!) {\n RunViewByNameSystemUser(input: $input) {\n Results {\n ID\n EntityID\n Data\n }\n UserViewRunID\n RowCount\n TotalRowCount\n ExecutionTime\n ErrorMessage\n Success\n }\n }`\n\n const result = await this.Client.request(query, { input }) as { RunViewByNameSystemUser: RunViewSystemUserResult };\n if (result && result.RunViewByNameSystemUser) {\n return result.RunViewByNameSystemUser;\n } else {\n return {\n Results: [],\n Success: false,\n ErrorMessage: 'Failed to execute view by name'\n };\n }\n }\n catch (e) {\n LogError(`GraphQLSystemUserClient::RunViewByNameSystemUser - Error running view by name - ${e}`);\n return {\n Results: [],\n Success: false,\n ErrorMessage: e.toString()\n };\n }\n }\n\n /**\n * Runs a view by ID using the RunViewByIDSystemUser resolver.\n * @param input - View input parameters for running by ID\n * @returns Promise containing the view execution results\n */\n public async RunViewByID(input: RunViewByIDSystemUserInput): Promise<RunViewSystemUserResult> {\n try {\n const query = `query RunViewByIDSystemUser($input: RunViewByIDInput!) {\n RunViewByIDSystemUser(input: $input) {\n Results {\n ID\n EntityID\n Data\n }\n UserViewRunID\n RowCount\n TotalRowCount\n ExecutionTime\n ErrorMessage\n Success\n }\n }`\n\n const result = await this.Client.request(query, { input }) as { RunViewByIDSystemUser: RunViewSystemUserResult };\n if (result && result.RunViewByIDSystemUser) {\n return result.RunViewByIDSystemUser;\n } else {\n return {\n Results: [],\n Success: false,\n ErrorMessage: 'Failed to execute view by ID'\n };\n }\n }\n catch (e) {\n LogError(`GraphQLSystemUserClient::RunViewByIDSystemUser - Error running view by ID - ${e}`);\n return {\n Results: [],\n Success: false,\n ErrorMessage: e.toString()\n };\n }\n }\n\n /**\n * Runs a dynamic view using the RunDynamicViewSystemUser resolver.\n * @param input - View input parameters for dynamic view execution\n * @returns Promise containing the view execution results\n */\n public async RunDynamicView(input: RunDynamicViewSystemUserInput): Promise<RunViewSystemUserResult> {\n try {\n const query = `query RunDynamicViewSystemUser($input: RunDynamicViewInput!) {\n RunDynamicViewSystemUser(input: $input) {\n Results {\n ID\n EntityID\n Data\n }\n UserViewRunID\n RowCount\n TotalRowCount\n ExecutionTime\n ErrorMessage\n Success\n }\n }`\n\n const result = await this.Client.request(query, { input }) as { RunDynamicViewSystemUser: RunViewSystemUserResult };\n if (result && result.RunDynamicViewSystemUser) {\n return result.RunDynamicViewSystemUser;\n } else {\n return {\n Results: [],\n Success: false,\n ErrorMessage: 'Failed to execute dynamic view'\n };\n }\n }\n catch (e) {\n LogError(`GraphQLSystemUserClient::RunDynamicViewSystemUser - Error running dynamic view - ${e}`);\n return {\n Results: [],\n Success: false,\n ErrorMessage: e.toString()\n };\n }\n }\n\n /**\n * Runs multiple views using the RunViewsSystemUser resolver. This method allows system users\n * to execute view queries with the same functionality as regular users but with system-level privileges.\n * @param input - Array of view input parameters\n * @returns Promise containing the results from all view executions\n */\n public async RunViews(input: RunViewSystemUserInput[]): Promise<RunViewSystemUserResult[]> {\n try {\n const query = `query RunViewsSystemUser($input: [RunViewGenericInput!]!) {\n RunViewsSystemUser(input: $input) {\n Results {\n ID\n EntityID\n Data\n }\n UserViewRunID\n RowCount\n TotalRowCount\n ExecutionTime\n ErrorMessage\n Success\n }\n }`\n\n const result = await this.Client.request(query, { input }) as { RunViewsSystemUser: RunViewSystemUserResult[] };\n if (result && result.RunViewsSystemUser) {\n return result.RunViewsSystemUser;\n } else {\n return [];\n }\n }\n catch (e) {\n LogError(`GraphQLSystemUserClient::RunViewsSystemUser - Error running views - ${e}`);\n return [];\n }\n }\n\n /**\n * Executes a stored query by ID using the GetQueryDataSystemUser resolver.\n * @param input - Query input parameters for execution by ID\n * @returns Promise containing the query execution results\n */\n public async GetQueryData(input: GetQueryDataSystemUserInput): Promise<RunQuerySystemUserResult> {\n try {\n // Validate that Parameters is a JSON object, not an array\n if (input.Parameters !== undefined && Array.isArray(input.Parameters)) {\n throw new Error('Parameters must be a JSON object, not an array. Use {} for empty parameters instead of [].');\n }\n\n const query = `query GetQueryDataSystemUser($QueryID: String!, $CategoryID: String, $CategoryPath: String, $Parameters: JSONObject, $MaxRows: Int, $StartRow: Int) {\n GetQueryDataSystemUser(QueryID: $QueryID, CategoryID: $CategoryID, CategoryPath: $CategoryPath, Parameters: $Parameters, MaxRows: $MaxRows, StartRow: $StartRow) {\n QueryID\n QueryName\n Success\n Results\n RowCount\n TotalRowCount\n ExecutionTime\n ErrorMessage\n AppliedParameters\n }\n }`\n\n const variables: any = { QueryID: input.QueryID };\n if (input.CategoryID !== undefined) variables.CategoryID = input.CategoryID;\n if (input.CategoryPath !== undefined) variables.CategoryPath = input.CategoryPath;\n if (input.Parameters !== undefined) variables.Parameters = input.Parameters;\n if (input.MaxRows !== undefined) variables.MaxRows = input.MaxRows;\n if (input.StartRow !== undefined) variables.StartRow = input.StartRow;\n\n const result = await this.Client.request(query, variables) as { GetQueryDataSystemUser: RunQuerySystemUserResult };\n \n if (result && result.GetQueryDataSystemUser) {\n // Parse the JSON results for easier consumption\n return {\n ...result.GetQueryDataSystemUser,\n Results: result.GetQueryDataSystemUser.Results ? SafeJSONParse(result.GetQueryDataSystemUser.Results) : null\n };\n } else {\n return {\n QueryID: input.QueryID,\n QueryName: '',\n Success: false,\n Results: null,\n RowCount: 0,\n TotalRowCount: 0,\n ExecutionTime: 0,\n ErrorMessage: 'Query execution failed'\n };\n }\n }\n catch (e) {\n LogError(`GraphQLSystemUserClient::GetQueryDataSystemUser - Error executing query - ${e}`);\n return {\n QueryID: input.QueryID,\n QueryName: '',\n Success: false,\n Results: null,\n RowCount: 0,\n TotalRowCount: 0,\n ExecutionTime: 0,\n ErrorMessage: e.toString()\n };\n }\n }\n\n /**\n * Executes a stored query by name using the GetQueryDataByNameSystemUser resolver.\n * @param input - Query input parameters for execution by name\n * @returns Promise containing the query execution results\n */\n public async GetQueryDataByName(input: GetQueryDataByNameSystemUserInput): Promise<RunQuerySystemUserResult> {\n try {\n // Validate that Parameters is a JSON object, not an array\n if (input.Parameters !== undefined && Array.isArray(input.Parameters)) {\n throw new Error('Parameters must be a JSON object, not an array. Use {} for empty parameters instead of [].');\n }\n\n const query = `query GetQueryDataByNameSystemUser($QueryName: String!, $CategoryID: String, $CategoryPath: String, $Parameters: JSONObject, $MaxRows: Int, $StartRow: Int) {\n GetQueryDataByNameSystemUser(QueryName: $QueryName, CategoryID: $CategoryID, CategoryPath: $CategoryPath, Parameters: $Parameters, MaxRows: $MaxRows, StartRow: $StartRow) {\n QueryID\n QueryName\n Success\n Results\n RowCount\n TotalRowCount\n ExecutionTime\n ErrorMessage\n AppliedParameters\n }\n }`\n\n const variables: any = { QueryName: input.QueryName };\n if (input.CategoryID !== undefined) variables.CategoryID = input.CategoryID;\n if (input.CategoryPath !== undefined) variables.CategoryPath = input.CategoryPath;\n if (input.Parameters !== undefined) variables.Parameters = input.Parameters;\n if (input.MaxRows !== undefined) variables.MaxRows = input.MaxRows;\n if (input.StartRow !== undefined) variables.StartRow = input.StartRow;\n\n const result = await this.Client.request(query, variables) as { GetQueryDataByNameSystemUser: RunQuerySystemUserResult };\n \n if (result && result.GetQueryDataByNameSystemUser) {\n // Parse the JSON results for easier consumption\n return {\n ...result.GetQueryDataByNameSystemUser,\n Results: result.GetQueryDataByNameSystemUser.Results ? SafeJSONParse(result.GetQueryDataByNameSystemUser.Results) : null\n };\n } else {\n return {\n QueryID: '',\n QueryName: input.QueryName,\n Success: false,\n Results: null,\n RowCount: 0,\n TotalRowCount: 0,\n ExecutionTime: 0,\n ErrorMessage: 'Query execution failed'\n };\n }\n }\n catch (e) {\n LogError(`GraphQLSystemUserClient::GetQueryDataByNameSystemUser - Error executing query - ${e}`);\n return {\n QueryID: '',\n QueryName: input.QueryName,\n Success: false,\n Results: null,\n RowCount: 0,\n TotalRowCount: 0,\n ExecutionTime: 0,\n ErrorMessage: e.toString()\n };\n }\n }\n\n /**\n * Creates a new query using the CreateQuerySystemUser mutation. This method is restricted to system users only.\n * @param input - CreateQuerySystemUserInput containing all the query attributes including optional CategoryPath\n * @returns Promise containing the result of the query creation\n */\n public async CreateQuery(input: CreateQueryInput): Promise<CreateQueryResult> {\n try {\n const query = `mutation CreateQuerySystemUser($input: CreateQuerySystemUserInput!) {\n CreateQuerySystemUser(input: $input) {\n Success\n ErrorMessage\n QueryData\n }\n }`\n\n const result = await this.Client.request(query, { input }) as { CreateQuerySystemUser: CreateQueryResult };\n if (result && result.CreateQuerySystemUser) {\n // Parse the QueryData JSON if it exists and was successful\n if (result.CreateQuerySystemUser.Success && result.CreateQuerySystemUser.QueryData) {\n return {\n ...result.CreateQuerySystemUser,\n QueryData: result.CreateQuerySystemUser.QueryData // Already JSON string from resolver\n };\n }\n return result.CreateQuerySystemUser;\n } else {\n return {\n Success: false,\n ErrorMessage: 'Failed to create query'\n };\n }\n }\n catch (e) {\n LogError(`GraphQLSystemUserClient::CreateQuery - Error creating query - ${e}`);\n return {\n Success: false,\n ErrorMessage: e.toString()\n };\n }\n }\n\n /**\n * Deletes a query by ID using the DeleteQuerySystemResolver mutation. This method is restricted to system users only.\n * @param ID - The ID of the query to delete\n * @param options - Optional delete options controlling action execution\n * @returns Promise containing the result of the query deletion\n */\n public async DeleteQuery(ID: string, options?: DeleteQueryOptionsInput): Promise<DeleteQueryResult> {\n try {\n // Validate ID is not null/undefined/empty\n if (!ID || ID.trim() === '') {\n LogError('GraphQLSystemUserClient::DeleteQuery - Invalid query ID: ID cannot be null or empty');\n return {\n Success: false,\n ErrorMessage: 'Invalid query ID: ID cannot be null or empty'\n };\n }\n\n const query = `mutation DeleteQuerySystemResolver($ID: String!, $options: DeleteOptionsInput) {\n DeleteQuerySystemResolver(ID: $ID, options: $options) {\n Success\n ErrorMessage\n QueryData\n }\n }`\n\n const variables: any = { ID: ID };\n if (options !== undefined) {\n variables.options = options;\n }\n\n const result = await this.Client.request(query, variables) as { DeleteQuerySystemResolver: DeleteQueryResult };\n \n if (result && result.DeleteQuerySystemResolver) {\n return result.DeleteQuerySystemResolver;\n } else {\n return {\n Success: false,\n ErrorMessage: 'Failed to delete query'\n };\n }\n }\n catch (e) {\n LogError(`GraphQLSystemUserClient::DeleteQuery - Error deleting query - ${e}`);\n return {\n Success: false,\n ErrorMessage: e.toString()\n };\n }\n }\n\n}\n\n/**\n * Output type for GetData calls - contains results from executing multiple SQL queries\n */\nexport class GetDataOutput {\n /**\n * Indicates if the operation was successful overall. If any individual query failed, this will be false. However, any successful queries will still be returned in the Results array.\n */\n Success: boolean;\n /**\n * The original input of Queries that were run - same order as provided in the request\n */\n Queries: string[];\n /**\n * An ordered array of error messages for each query that was run. This array will always have the same # of entries as Queries. If a query was successful, the corresponding entry will be null.\n */\n ErrorMessages: (string | null)[];\n /**\n * An ordered array of results for each query that was run. This array will always have the same # of entries as Queries. If a query failed, the corresponding entry will be null. Successful results are JSON strings containing the query data.\n */\n Results: (string | null)[];\n}\n\n/**\n * Return type for calls to the GetAllRemoteEntities query - provides lightweight entity metadata\n */\nexport class SimpleRemoteEntityOutput {\n /**\n * Indicates whether the remote entity retrieval was successful\n */\n Success: boolean;\n /**\n * Error message if the operation failed, undefined if successful\n */\n ErrorMessage?: string;\n /**\n * An array of simple entity types that are returned from the remote server - contains basic metadata for each entity\n */\n Results: SimpleRemoteEntity[];\n}\n\n/**\n * Represents a simple entity type that is used for lightweight retrieval of partial remote entity metadata \n */\nexport class SimpleRemoteEntity {\n /**\n * Unique identifier of the entity on the remote server\n */\n ID: string;\n /**\n * Display name of the entity (e.g., \"Users\", \"Companies\")\n */\n Name: string;\n /**\n * Optional description explaining the entity's purpose\n */\n Description?: string;\n /**\n * Database schema name where the entity resides (e.g., \"dbo\", \"custom\")\n */\n SchemaName: string;\n /**\n * Name of the database view used for reading this entity\n */\n BaseView: string;\n /**\n * Name of the database table used for storing this entity\n */\n BaseTable: string;\n /**\n * Optional code-friendly name for the entity (typically PascalCase)\n */\n CodeName?: string;\n /**\n * Optional TypeScript/JavaScript class name for the entity\n */\n ClassName?: string;\n /**\n * Array of field definitions for this entity\n */\n Fields: SimpleRemoteEntityField[];\n}\n\n/**\n * Represents a field within a remote entity - contains basic field metadata\n */\nexport class SimpleRemoteEntityField {\n /**\n * Unique identifier of the entity field on the remote server\n */\n ID: string;\n /**\n * Field name (e.g., \"FirstName\", \"Email\", \"CreatedAt\")\n */\n Name: string;\n /**\n * Optional description explaining the field's purpose\n */\n Description?: string;\n /**\n * Data type of the field (e.g., \"nvarchar\", \"int\", \"datetime\", \"bit\")\n */\n Type: string;\n /**\n * Whether the field can contain null values\n */\n AllowsNull: boolean;\n /**\n * Maximum length for string fields, -1 for unlimited, 0 for non-string types\n */\n MaxLength: number;\n}\n\n/**\n * Input type for RunViewByNameSystemUser method calls - executes a saved view by name\n */\nexport interface RunViewByNameSystemUserInput {\n /**\n * Name of the saved view to execute\n */\n ViewName: string;\n /**\n * Additional WHERE clause conditions to apply (optional)\n */\n ExtraFilter?: string;\n /**\n * ORDER BY clause for sorting results (optional)\n */\n OrderBy?: string;\n /**\n * Specific fields to return, if not specified returns all fields (optional)\n */\n Fields?: string[];\n /**\n * Search string to filter results across searchable fields (optional)\n */\n UserSearchString?: string;\n /**\n * ID of a previous view run to exclude results from (optional)\n */\n ExcludeUserViewRunID?: string;\n /**\n * Override the exclude filter with custom logic (optional)\n */\n OverrideExcludeFilter?: string;\n /**\n * Whether to save the view execution results for future reference (optional)\n */\n SaveViewResults?: boolean;\n /**\n * Whether to exclude data from all prior view runs (optional)\n */\n ExcludeDataFromAllPriorViewRuns?: boolean;\n /**\n * Whether to ignore the view's MaxRows setting and return all results (optional)\n */\n IgnoreMaxRows?: boolean;\n /**\n * Maximum number of rows to return, overrides view setting if specified (optional)\n */\n MaxRows?: number;\n /**\n * Whether to force audit logging for this view execution (optional)\n */\n ForceAuditLog?: boolean;\n /**\n * Description for the audit log entry if ForceAuditLog is true (optional)\n */\n AuditLogDescription?: string;\n /**\n * Type of result format: \"simple\", \"entity_object\", etc. (optional)\n */\n ResultType?: string;\n /**\n * Starting row number for pagination (optional, 0-based)\n */\n StartRow?: number;\n}\n\n/**\n * Input type for RunViewByIDSystemUser method calls - executes a saved view by its unique ID\n */\nexport interface RunViewByIDSystemUserInput {\n /**\n * Unique identifier of the saved view to execute\n */\n ViewID: string;\n /**\n * Additional WHERE clause conditions to apply (optional)\n */\n ExtraFilter?: string;\n /**\n * ORDER BY clause for sorting results (optional)\n */\n OrderBy?: string;\n /**\n * Specific fields to return, if not specified returns all fields (optional)\n */\n Fields?: string[];\n /**\n * Search string to filter results across searchable fields (optional)\n */\n UserSearchString?: string;\n /**\n * ID of a previous view run to exclude results from (optional)\n */\n ExcludeUserViewRunID?: string;\n /**\n * Override the exclude filter with custom logic (optional)\n */\n OverrideExcludeFilter?: string;\n /**\n * Whether to save the view execution results for future reference (optional)\n */\n SaveViewResults?: boolean;\n /**\n * Whether to exclude data from all prior view runs (optional)\n */\n ExcludeDataFromAllPriorViewRuns?: boolean;\n /**\n * Whether to ignore the view's MaxRows setting and return all results (optional)\n */\n IgnoreMaxRows?: boolean;\n /**\n * Maximum number of rows to return, overrides view setting if specified (optional)\n */\n MaxRows?: number;\n /**\n * Whether to force audit logging for this view execution (optional)\n */\n ForceAuditLog?: boolean;\n /**\n * Description for the audit log entry if ForceAuditLog is true (optional)\n */\n AuditLogDescription?: string;\n /**\n * Type of result format: \"simple\", \"entity_object\", etc. (optional)\n */\n ResultType?: string;\n /**\n * Starting row number for pagination (optional, 0-based)\n */\n StartRow?: number;\n}\n\n/**\n * Input type for RunDynamicViewSystemUser method calls - creates and executes a view dynamically based on entity\n */\nexport interface RunDynamicViewSystemUserInput {\n /**\n * Name of the entity to query (e.g., \"Users\", \"Companies\")\n */\n EntityName: string;\n /**\n * Additional WHERE clause conditions to apply (optional)\n */\n ExtraFilter?: string;\n /**\n * ORDER BY clause for sorting results (optional)\n */\n OrderBy?: string;\n /**\n * Specific fields to return, if not specified returns all fields (optional)\n */\n Fields?: string[];\n /**\n * Search string to filter results across searchable fields (optional)\n */\n UserSearchString?: string;\n /**\n * ID of a previous view run to exclude results from (optional)\n */\n ExcludeUserViewRunID?: string;\n /**\n * Override the exclude filter with custom logic (optional)\n */\n OverrideExcludeFilter?: string;\n /**\n * Whether to ignore MaxRows limits and return all results (optional)\n */\n IgnoreMaxRows?: boolean;\n /**\n * Maximum number of rows to return (optional)\n */\n MaxRows?: number;\n /**\n * Whether to force audit logging for this view execution (optional)\n */\n ForceAuditLog?: boolean;\n /**\n * Description for the audit log entry if ForceAuditLog is true (optional)\n */\n AuditLogDescription?: string;\n /**\n * Type of result format: \"simple\", \"entity_object\", etc. (optional)\n */\n ResultType?: string;\n /**\n * Starting row number for pagination (optional, 0-based)\n */\n StartRow?: number;\n}\n\n/**\n * Input type for RunViewsSystemUser method calls - executes multiple views in parallel\n */\nexport interface RunViewSystemUserInput {\n /**\n * Name of the entity to query (e.g., \"Users\", \"Companies\")\n */\n EntityName: string;\n /**\n * Additional WHERE clause conditions to apply (optional)\n */\n ExtraFilter?: string;\n /**\n * ORDER BY clause for sorting results (optional)\n */\n OrderBy?: string;\n /**\n * Specific fields to return, if not specified returns all fields (optional)\n */\n Fields?: string[];\n /**\n * Search string to filter results across searchable fields (optional)\n */\n UserSearchString?: string;\n /**\n * ID of a previous view run to exclude results from (optional)\n */\n ExcludeUserViewRunID?: string;\n /**\n * Override the exclude filter with custom logic (optional)\n */\n OverrideExcludeFilter?: string;\n /**\n * Whether to ignore MaxRows limits and return all results (optional)\n */\n IgnoreMaxRows?: boolean;\n /**\n * Maximum number of rows to return (optional)\n */\n MaxRows?: number;\n /**\n * Whether to force audit logging for this view execution (optional)\n */\n ForceAuditLog?: boolean;\n /**\n * Description for the audit log entry if ForceAuditLog is true (optional)\n */\n AuditLogDescription?: string;\n /**\n * Type of result format: \"simple\", \"entity_object\", etc. (optional)\n */\n ResultType?: string;\n /**\n * Starting row number for pagination (optional, 0-based)\n */\n StartRow?: number;\n}\n\n/**\n * Result row type for view execution results - represents a single data row\n */\nexport interface RunViewSystemUserResultRow {\n /**\n * Unique identifier of the record\n */\n ID: string;\n /**\n * ID of the entity type this record belongs to\n */\n EntityID: string;\n /**\n * JSON string containing the actual record data\n */\n Data: string;\n}\n\n/**\n * Result type for RunViewsSystemUser method calls - contains execution results and metadata\n */\nexport interface RunViewSystemUserResult {\n /**\n * Array of result rows containing the actual data\n */\n Results: RunViewSystemUserResultRow[];\n /**\n * Unique identifier for this view execution run (optional)\n */\n UserViewRunID?: string;\n /**\n * Number of rows returned in this result set (optional)\n */\n RowCount?: number;\n /**\n * Total number of rows available (before pagination) (optional)\n */\n TotalRowCount?: number;\n /**\n * Time taken to execute the view in milliseconds (optional)\n */\n ExecutionTime?: number;\n /**\n * Error message if the execution failed (optional)\n */\n ErrorMessage?: string;\n /**\n * Whether the view execution was successful\n */\n Success: boolean;\n}\n\n/**\n * Result type for query execution methods - contains query results and execution metadata\n */\nexport interface RunQuerySystemUserResult {\n /**\n * Unique identifier of the executed query\n */\n QueryID: string;\n /**\n * Display name of the executed query\n */\n QueryName: string;\n /**\n * Whether the query execution was successful\n */\n Success: boolean;\n /**\n * Query results data (parsed from JSON)\n */\n Results: any;\n /**\n * Number of rows returned by the query\n */\n RowCount: number;\n /**\n * Total number of rows available (before pagination)\n */\n TotalRowCount: number;\n /**\n * Time taken to execute the query in milliseconds\n */\n ExecutionTime: number;\n /**\n * Error message if the query execution failed\n */\n ErrorMessage: string;\n /**\n * JSON string containing the applied parameters (optional)\n */\n AppliedParameters?: string;\n}\n\n/**\n * Input type for GetQueryDataSystemUser method calls - executes a stored query by ID\n */\nexport interface GetQueryDataSystemUserInput {\n /**\n * The ID of the query to execute\n */\n QueryID: string;\n /**\n * Optional category ID filter\n */\n CategoryID?: string;\n /**\n * Optional category path filter (hierarchical path like \"/MJ/AI/Agents/\" or simple name)\n */\n CategoryPath?: string;\n /**\n * Optional parameters for templated queries\n */\n Parameters?: Record<string, any>;\n /**\n * Optional maximum number of rows to return\n */\n MaxRows?: number;\n /**\n * Optional starting row number for pagination\n */\n StartRow?: number;\n}\n\n/**\n * Input type for GetQueryDataByNameSystemUser method calls - executes a stored query by name\n */\nexport interface GetQueryDataByNameSystemUserInput {\n /**\n * The name of the query to execute\n */\n QueryName: string;\n /**\n * Optional category ID filter\n */\n CategoryID?: string;\n /**\n * Optional category path filter (hierarchical path like \"/MJ/AI/Agents/\" or simple name)\n */\n CategoryPath?: string;\n /**\n * Optional parameters for templated queries\n */\n Parameters?: Record<string, any>;\n /**\n * Optional maximum number of rows to return\n */\n MaxRows?: number;\n /**\n * Optional starting row number for pagination\n */\n StartRow?: number;\n}\n\n/**\n * Input type for CreateQuery mutation calls - creates a new query with optional hierarchical category path\n */\nexport interface CreateQueryInput {\n /**\n * Required name for the query (must be unique within category)\n */\n Name: string;\n /**\n * Optional existing category ID to assign the query to\n */\n CategoryID?: string;\n /**\n * Optional category path for automatic hierarchy creation (e.g., \"Reports/Sales/Monthly\") - takes precedence over CategoryID\n */\n CategoryPath?: string;\n /**\n * Optional natural language question this query answers\n */\n UserQuestion?: string;\n /**\n * Optional general description of what the query does\n */\n Description?: string;\n /**\n * Optional SQL query text to execute (can contain Nunjucks template syntax)\n */\n SQL?: string;\n /**\n * Optional technical documentation for developers\n */\n TechnicalDescription?: string;\n /**\n * Optional original SQL before optimization or modification\n */\n OriginalSQL?: string;\n /**\n * Optional user feedback about the query\n */\n Feedback?: string;\n /**\n * Optional query approval status (defaults to 'Pending')\n */\n Status?: 'Pending' | 'Approved' | 'Rejected' | 'Expired';\n /**\n * Optional quality indicator (higher = better quality, defaults to 0)\n */\n QualityRank?: number;\n /**\n * Optional execution cost indicator (higher = more expensive to run)\n */\n ExecutionCostRank?: number;\n /**\n * Optional flag indicating if the query uses Nunjucks template syntax (auto-detected if not specified)\n */\n UsesTemplate?: boolean;\n}\n\n/**\n * Result type for CreateQuery mutation calls - contains creation success status and query data\n */\nexport interface CreateQueryResult {\n /**\n * Whether the query creation was successful\n */\n Success: boolean;\n /**\n * Error message if the creation failed (optional)\n */\n ErrorMessage?: string;\n /**\n * JSON string containing the complete created query data if successful (optional)\n */\n QueryData?: string;\n}\n\n/**\n * Delete options input type for controlling delete behavior\n */\nexport interface DeleteQueryOptionsInput {\n /**\n * Whether to skip AI actions during deletion\n */\n SkipEntityAIActions: boolean;\n /**\n * Whether to skip regular entity actions during deletion\n */\n SkipEntityActions: boolean;\n}\n\n/**\n * Result type for DeleteQuery mutation calls - contains deletion success status and deleted query data\n */\nexport interface DeleteQueryResult {\n /**\n * Whether the query deletion was successful\n */\n Success: boolean;\n /**\n * Error message if the deletion failed (optional)\n */\n ErrorMessage?: string;\n /**\n * JSON string containing the deleted query data if successful (optional)\n */\n QueryData?: string;\n}\n\n ","import { ActionParam, ActionResult, EntityActionInvocationParams, EntityActionResult } from \"@memberjunction/actions-base\";\nimport { CompositeKey, LogError } from \"@memberjunction/core\";\nimport { GraphQLDataProvider } from \"./graphQLDataProvider\";\nimport { gql } from \"graphql-request\";\n\n/**\n * Client for executing actions and entity actions through GraphQL.\n * This class provides an easy way to execute actions from a client application,\n * similar to how the ActionEngine and EntityActionEngine work on the server.\n * \n * The GraphQLActionClient follows the same naming convention as other GraphQL clients\n * in the MemberJunction ecosystem, such as GraphQLSystemUserClient.\n * \n * @example\n * ```typescript\n * // Create the client\n * const actionClient = new GraphQLActionClient(graphQLProvider);\n * \n * // Run a regular action\n * const result = await actionClient.RunAction(\"action-id\", [\n * { Name: \"parameter1\", Value: \"value1\", Type: \"Input\" }\n * ]);\n * \n * // Run an entity action\n * const entityActionResult = await actionClient.RunEntityAction({\n * EntityAction: action,\n * InvocationType: { Name: \"SingleRecord\" },\n * EntityObject: entityObject,\n * ContextUser: user\n * });\n * ```\n */\nexport class GraphQLActionClient {\n /**\n * The GraphQLDataProvider instance used to execute GraphQL requests\n * @private\n */\n private _dataProvider: GraphQLDataProvider;\n\n /**\n * Creates a new GraphQLActionClient instance.\n * @param dataProvider The GraphQL data provider to use for queries\n */\n constructor(dataProvider: GraphQLDataProvider) {\n this._dataProvider = dataProvider;\n }\n\n /**\n * Run an action by its ID with the specified parameters.\n * \n * This method invokes an action on the server through GraphQL and returns the result.\n * Action parameters are automatically serialized as needed, and results are deserialized\n * for complex data types.\n * \n * @param actionID The ID of the action to run\n * @param params Optional parameters to pass to the action\n * @param skipActionLog Whether to skip logging the action execution (defaults to false)\n * @returns A Promise that resolves to an ActionResult object containing the result of running the action\n * \n * @example\n * ```typescript\n * const result = await actionClient.RunAction(\"action-id\", [\n * { Name: \"param1\", Value: \"value1\", Type: \"Input\" }\n * ]);\n * \n * if (result.Success) {\n * // Action was successful\n * console.log(result.Message);\n * }\n * ```\n */\n public async RunAction(\n actionID: string, \n params?: ActionParam[], \n skipActionLog: boolean = false\n ): Promise<ActionResult> {\n try {\n // Prepare the input variables\n const serializedParams = this.serializeActionParameters(params);\n const variables = this.createActionVariables(actionID, serializedParams, skipActionLog);\n \n // Execute the mutation\n const result = await this.executeActionMutation(variables);\n \n // Process the result\n return this.processActionResult(result, params);\n } catch (e) {\n return this.handleActionError(e, params);\n }\n }\n\n /**\n * Serializes action parameters to ensure complex objects are properly JSON-encoded\n * @param params The action parameters to serialize\n * @returns The serialized parameters\n * @private\n */\n private serializeActionParameters(params?: ActionParam[]): any[] | undefined {\n if (!params) {\n return undefined;\n }\n\n return params.map(p => {\n let value = p.Value;\n if (value !== null && value !== undefined && typeof value === 'object') {\n value = JSON.stringify(value);\n }\n return {\n ...p,\n Value: value\n };\n });\n }\n\n /**\n * Creates the variables for the action mutation\n * @param actionID The ID of the action to run\n * @param params The serialized action parameters\n * @param skipActionLog Whether to skip action logging\n * @returns The action variables\n * @private\n */\n private createActionVariables(\n actionID: string, \n params?: any[], \n skipActionLog: boolean = false\n ): any {\n return {\n input: {\n ActionID: actionID,\n Params: params,\n SkipActionLog: skipActionLog\n }\n };\n }\n\n /**\n * Executes the action mutation\n * @param variables The variables for the mutation\n * @returns The result of the mutation\n * @private\n */\n private async executeActionMutation(variables: any): Promise<any> {\n const mutation = gql`\n mutation RunAction($input: RunActionInput!) {\n RunAction(input: $input) {\n Success\n Message\n ResultCode\n ResultData\n }\n }\n `;\n\n return await this._dataProvider.ExecuteGQL(mutation, variables);\n }\n\n /**\n * Processes the result of an action\n * @param result The result from the GraphQL query\n * @param originalParams The original parameters passed to the action\n * @returns The processed action result\n * @private\n */\n private processActionResult(result: any, originalParams?: ActionParam[]): ActionResult {\n if (!result?.RunAction) {\n throw new Error(\"Invalid response from server\");\n }\n\n // Parse the ResultData if it exists\n let resultData = undefined;\n try {\n if (result.RunAction.ResultData) {\n resultData = JSON.parse(result.RunAction.ResultData);\n }\n } catch (e) {\n LogError(`Failed to parse action result data: ${e}`);\n }\n\n // Return a properly formatted ActionResult\n return {\n Success: result.RunAction.Success,\n Message: result.RunAction.Message,\n Result: resultData,\n LogEntry: null, // We don't return the log entry to clients\n Params: originalParams || [],\n RunParams: null // We don't return the run params to clients\n };\n }\n\n /**\n * Handles errors in the action execution\n * @param e The error\n * @param originalParams The original parameters passed to the action\n * @returns An error result\n * @private\n */\n private handleActionError(e: unknown, originalParams?: ActionParam[]): ActionResult {\n const error = e as Error;\n LogError(`Error running action: ${error}`);\n return {\n Success: false,\n Message: `Error: ${error.message}`,\n Result: null,\n LogEntry: null,\n Params: originalParams || [],\n RunParams: null\n };\n }\n\n /**\n * Run an entity action with the specified parameters.\n * \n * This method invokes an entity action on the server through GraphQL and returns the result.\n * Entity actions are operations that can be performed on entity records, such as validation,\n * business logic, or custom processing. They can operate on a single record, a view, or a list.\n * \n * @param params The parameters for the entity action, including the action to run, \n * invocation type, entity object or view/list IDs, and optional parameters\n * @returns A Promise that resolves to an EntityActionResult object containing the result\n * \n * @example\n * ```typescript\n * // Run an entity action on a single record\n * const result = await actionClient.RunEntityAction({\n * EntityAction: action,\n * InvocationType: { Name: \"SingleRecord\" },\n * EntityObject: entityObject,\n * ContextUser: user\n * });\n * \n * // Run an entity action on a view\n * const viewResult = await actionClient.RunEntityAction({\n * EntityAction: action,\n * InvocationType: { Name: \"View\" },\n * ViewID: \"view-id\",\n * ContextUser: user\n * });\n * ```\n */\n public async RunEntityAction(params: EntityActionInvocationParams): Promise<EntityActionResult> {\n try {\n // Create the GraphQL input\n const input = this.createEntityActionInput(params);\n\n // Execute the GraphQL mutation\n const result = await this.executeEntityActionMutation(input);\n\n // Process the result\n return this.processEntityActionResult(result);\n } catch (e) {\n return this.handleEntityActionError(e);\n }\n }\n\n /**\n * Creates the GraphQL input for an entity action\n * @param params The entity action parameters\n * @returns The GraphQL input\n * @private\n */\n private createEntityActionInput(params: EntityActionInvocationParams): any {\n const input: any = {\n EntityActionID: params.EntityAction.ID,\n InvocationType: params.InvocationType.Name,\n ListID: params.ListID,\n ViewID: params.ViewID,\n };\n \n // Add parameters if available\n if ((params as any).Params) {\n input.Params = this.convertActionParams((params as any).Params);\n }\n \n // Add entity information if available\n if (params.EntityObject) {\n this.addEntityInformation(input, params.EntityObject);\n }\n\n return input;\n }\n\n /**\n * Converts action parameters to the format expected by the GraphQL API\n * @param params The action parameters\n * @returns The converted parameters\n * @private\n */\n private convertActionParams(params: any[]): any[] {\n return params.map(p => {\n let value = p.Value;\n if (value !== null && value !== undefined && typeof value === 'object') {\n value = JSON.stringify(value);\n }\n return {\n Name: p.Name,\n Value: value,\n Type: p.Type\n };\n });\n }\n\n /**\n * Adds entity information to the input object\n * @param input The input object to add to\n * @param entityObject The entity object\n * @private\n */\n private addEntityInformation(input: any, entityObject: any): void {\n // Prefer using entity name instead of ID for better code readability\n input.EntityName = entityObject.EntityInfo?.Name;\n \n // Convert the entity's primary key to the expected format\n if (entityObject.PrimaryKey) {\n input.PrimaryKey = this.convertPrimaryKey(entityObject.PrimaryKey);\n }\n }\n\n /**\n * Converts a primary key object to the format expected by the GraphQL API\n * @param primaryKey The primary key object\n * @returns The converted primary key\n * @private\n */\n private convertPrimaryKey(primaryKey: any): any {\n return {\n KeyValuePairs: primaryKey.KeyValuePairs.map(kvp => this.convertKeyValuePair(kvp))\n };\n }\n\n /**\n * Converts a key-value pair to a string format\n * @param kvp The key-value pair\n * @returns The converted key-value pair\n * @private\n */\n private convertKeyValuePair(kvp: any): any {\n return {\n FieldName: kvp.FieldName,\n Value: kvp.Value !== null && kvp.Value !== undefined ? \n (typeof kvp.Value === 'object' ? JSON.stringify(kvp.Value) : kvp.Value.toString()) \n : null\n };\n }\n\n /**\n * Executes the GraphQL mutation for an entity action\n * @param input The GraphQL input\n * @returns The GraphQL result\n * @private\n */\n private async executeEntityActionMutation(input: any): Promise<any> {\n const mutation = gql`\n mutation RunEntityAction($input: EntityActionInput!) {\n RunEntityAction(input: $input) {\n Success\n Message\n ResultData\n }\n }\n `;\n\n return await this._dataProvider.ExecuteGQL(mutation, { input });\n }\n\n /**\n * Processes the result of an entity action\n * @param result The GraphQL result\n * @returns The processed entity action result\n * @private\n */\n private processEntityActionResult(result: any): EntityActionResult {\n if (!result?.RunEntityAction) {\n throw new Error(\"Invalid response from server\");\n }\n\n // Parse the ResultData\n let resultData = {};\n try {\n if (result.RunEntityAction.ResultData) {\n resultData = JSON.parse(result.RunEntityAction.ResultData);\n }\n } catch (e) {\n LogError(`Failed to parse entity action result data: ${e}`);\n }\n\n // Return a properly formatted EntityActionResult\n return {\n Success: result.RunEntityAction.Success,\n Message: result.RunEntityAction.Message,\n RunParams: null, // We don't return run params to clients\n LogEntry: null, // We don't return the log entry to clients\n ...resultData\n };\n }\n\n /**\n * Handles errors in the entity action\n * @param e The error\n * @returns An error result\n * @private\n */\n private handleEntityActionError(e: unknown): EntityActionResult {\n const error = e as Error;\n LogError(`Error running entity action: ${error}`);\n return {\n Success: false,\n Message: `Error: ${error.message}`,\n RunParams: null,\n LogEntry: null\n };\n }\n}"],"names":["TransactionGroupBase","gql","SafeJSONParse","TransactionResult","ProviderConfigDataBase","ProviderBase","uuidv4","LogError","UserInfo","ViewInfo","ProviderType","BaseEntityResult","EntityFieldTSType","TransactionItem","GraphQLClient","UserRoleInfo","createClient","Observable","openDB","SetProvider","MJGlobal","MJEventType"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/FieldMapper.ts","../src/graphQLTransactionGroup.ts","../src/graphQLDataProvider.ts","../src/config.ts","../src/rolesAndUsersType.ts","../src/graphQLSystemUserClient.ts","../src/graphQLActionClient.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","import { TransactionGroupBase, TransactionResult } from \"@memberjunction/core\";\nimport { GraphQLDataProvider } from \"./graphQLDataProvider\";\nimport { gql } from \"graphql-request\";\nimport { SafeJSONParse } from \"@memberjunction/global\";\n\nexport class GraphQLTransactionGroup extends TransactionGroupBase {\n private _provider: GraphQLDataProvider;\n constructor(provider: GraphQLDataProvider) {\n super();\n this._provider = provider;\n }\n\n // protected async HandleSubmit(): 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 < this.PendingTransactions.length; i++) {\n // const item = this.PendingTransactions[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 this._provider.ExecuteGQL(combinedQuery, combinedVars)\n // const returnResults: TransactionResult[] = [];\n // for (let i = 0; i < this.PendingTransactions.length; i++) {\n // /// NEED TO TEST TO SEE WHAT ORDER WE GET RESULTS BACK AS\n // const result = execResults[`mutation_${i}`];\n // const item = this.PendingTransactions[i];\n // returnResults.push(new TransactionResult(item, result, result !== null));\n // }\n // return returnResults;\n // }\n\n // new implementation\n protected async HandleSubmit(): Promise<TransactionResult[]> {\n // Define the mutation\n const mutation = gql`\n mutation ExecuteTransactionGroup($group: TransactionInputType!) {\n ExecuteTransactionGroup(group: $group) {\n Success\n ErrorMessages\n ResultsJSON\n }\n }\n `;\n\n // Example variables for the mutation\n const items = [];\n for (const pt of this.PendingTransactions) {\n items.push({\n EntityName: pt.BaseEntity.EntityInfo.Name,\n EntityObjectJSON: await pt.BaseEntity.GetDataObjectJSON(),\n OperationType: pt.OperationType\n });\n }\n const vars = {\n group: {\n Items: items,\n Variables: this.Variables.map(v => {\n return {\n Name: v.Name,\n ItemIndex: this.MapVariableEntityObjectToPosition(v),\n FieldName: v.FieldName,\n Type: v.Type\n }\n }) \n }\n }; \n\n const results = await this._provider.ExecuteGQL(mutation, vars)\n if (results && results.ExecuteTransactionGroup) {\n const data = results.ExecuteTransactionGroup;\n const returnResults: TransactionResult[] = [];\n for (let i = 0; i < this.PendingTransactions.length; i++) {\n const resultJSON = data.ResultsJSON[i];\n const resultObject = SafeJSONParse(resultJSON);\n const item = this.PendingTransactions[i];\n returnResults.push(new TransactionResult(item, resultObject, resultObject !== null));\n }\n return returnResults;\n }\n else {\n throw new Error('Failed to execute transaction group');\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, EntityMergeOptions, 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 } 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';\nimport { v4 as uuidv4 } from 'uuid';\nimport { GraphQLTransactionGroup } from \"./graphQLTransactionGroup\";\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\n/**\n * The GraphQLProviderConfigData class is used to configure the GraphQLDataProvider. It is passed to the Config method of the GraphQLDataProvider\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 * This optional parameter is used when using a shared secret key that is static and provided by the publisher of the MJAPI server. Providing this value will result in \n * a special header x-mj-api-key being set with this value in the HTTP request to the server. This is useful when the server is configured to require this key for certain requests.\n * \n * WARNING: This should NEVER BE USED IN A CLIENT APP like a browser. The only suitable use for this is if you are using GraphQLDataProvider on the server side from another MJAPI, or \n * some other secure computing environment where the key can be kept secure.\n */\n get MJAPIKey(): string { return this.Data.MJAPIKey }\n set MJAPIKey(key: string) { this.Data.MJAPIKey = key }\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 * @param mjAPIKey optional, a shared secret key that is static and provided by the publisher of the MJAPI server. \n */\n constructor(token: string,\n url: string,\n wsurl: string,\n refreshTokenFunction: RefreshTokenFunction,\n MJCoreSchemaName?: string,\n includeSchemas?: string[],\n excludeSchemas?: string[],\n mjAPIKey?: string) {\n super(\n {\n Token: token,\n URL: url,\n WSURL: wsurl,\n MJAPIKey: mjAPIKey,\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.\n/**\n * The GraphQLDataProvider class is a data provider for MemberJunction that implements the IEntityDataProvider, IMetadataProvider, IRunViewProvider, IRunReportProvider, IRunQueryProvider interfaces and connects to the\n * MJAPI server using GraphQL. This class is used to interact with the server to get and save data, as well as to get metadata about the entities and fields in the system.\n */\nexport class GraphQLDataProvider extends ProviderBase implements IEntityDataProvider, IMetadataProvider, IRunViewProvider, IRunReportProvider, IRunQueryProvider {\n private static _instance: GraphQLDataProvider;\n public static get Instance(): GraphQLDataProvider {\n return GraphQLDataProvider._instance;\n }\n\n constructor() {\n super();\n if (!GraphQLDataProvider._instance)\n GraphQLDataProvider._instance = this;\n }\n\n private _client: GraphQLClient;\n private _configData: GraphQLProviderConfigData;\n private _sessionId: string;\n\n public get ConfigData(): GraphQLProviderConfigData { \n return this._configData; \n }\n\n /**\n * This getter is not implemented for the GraphQLDataProvider class.\n */\n public get DatabaseConnection(): any {\n throw new Error(\"DatabaseConnection not implemented for the GraphQLDataProvider\");\n }\n\n /**\n * The connection string for each GraphQLProvider instance is simply the URL for the GraphQL endpoint. This is because each GraphQLDataProvider instance can be configured with a different URL and each URL\n * is a unique combination of host/port/etc.\n */\n public get InstanceConnectionString(): string {\n return this._configData.URL\n }\n\n public GenerateUUID() {\n return uuidv4();\n }\n\n /**\n * The GraphQLDataProvider uses a prefix for local storage that is equal to the URL of the GraphQL endpoint. This is because the GraphQLDataProvider can be configured multiple times with different URLs and each\n * configuration will have its own local storage. This is useful when you want to have multiple connections to different servers and you don't want the local storage to be shared between them. The URL is \n * normalized to remove special characters and replace anything other than alphanumeric characters with an underscore.\n */\n protected override get LocalStoragePrefix(): string {\n if (this._configData === undefined || this._configData.URL === undefined) {\n throw new Error(\"GraphQLDataProvider: ConfigData is not set. Please call Config() first.\");\n }\n\n const replacementString = this._configData.URL.replace(/[^a-zA-Z0-9]/g, '_');\n return replacementString + \".\"; // add a period at the end to separate the prefix from the key\n }\n\n /**\n * Retrieves the stored session ID from the LocalStorageProvider if available.\n * If no session ID is found, returns null.\n * The session ID is stored using the same storage mechanism as other persistent data\n * with a key specific to the current URL to ensure uniqueness across different \n * server connections.\n * \n * @returns The stored session ID or null if not found\n */\n public async GetStoredSessionID(): Promise<string> {\n try {\n const ls = this.LocalStorageProvider;\n if (ls) {\n const key = this.LocalStoragePrefix + \"sessionId\";\n const storedSession = await ls.GetItem(key);\n return storedSession;\n }\n return null;\n } catch (e) {\n // If any error occurs, return null\n console.error(\"Error retrieving session ID from local storage:\", e);\n return null;\n }\n }\n\n /**\n * Stores the session ID using the configured LocalStorageProvider for persistence.\n * Uses the same URL-specific key pattern as other storage methods to ensure\n * proper isolation between different server connections.\n * \n * @param sessionId The session ID to store\n */\n private async SaveStoredSessionID(sessionId: string): Promise<void> {\n try {\n const ls = this.LocalStorageProvider;\n if (ls) {\n const key = this.LocalStoragePrefix + \"sessionId\";\n await ls.SetItem(key, sessionId);\n }\n } catch (e) {\n // Silently fail if storage is not available\n }\n }\n\n public async GetPreferredUUID(forceRefreshSessionId?: boolean): Promise<string> {\n // Try to get the stored session ID\n const oldUUID = await this.GetStoredSessionID();\n const UUID = forceRefreshSessionId || !oldUUID ? this.GenerateUUID() : oldUUID;\n return UUID;\n }\n\n\n /**\n * This method configures the class instance. If separateConnection is false or not provided, the global/static variables are set that means that the Config() call\n * will affect all callers to the GraphQLDataProvider including via wrappers like the Metadata class. If separateConnection is true, then the instance variables are set\n * and only this instance of the GraphQLDataProvider will be affected by the Config() call.\n * @important If separateConnection is true, metadata for the provider will be loaded but will NOT affect the Metadata class/singleton. \n * This is because the Metadata class is a singleton that binds to the first Config() call in the process where separateConnection is falsy. \n * @param configData \n * @param separateConnection \n * @returns \n */\n public async Config(configData: GraphQLProviderConfigData, providerToUse?: IMetadataProvider, separateConnection?: boolean, forceRefreshSessionId?: boolean): Promise<boolean> {\n try {\n if (separateConnection) {\n this._configData = configData;\n // Get UUID after setting the configData, so that it can be used to get any stored session ID\n this._sessionId = await this.GetPreferredUUID(forceRefreshSessionId);;\n\n this._client = this.CreateNewGraphQLClient(configData.URL, configData.Token, this._sessionId, configData.MJAPIKey);\n // Store the session ID for this connection\n await this.SaveStoredSessionID(this._sessionId);\n }\n else {\n GraphQLDataProvider.Instance._configData = configData;\n\n if (GraphQLDataProvider.Instance._sessionId === undefined) {\n GraphQLDataProvider.Instance._sessionId = await this.GetPreferredUUID(forceRefreshSessionId);;\n }\n \n // now create the new client, if it isn't already created\n if (!GraphQLDataProvider.Instance._client)\n GraphQLDataProvider.Instance._client = this.CreateNewGraphQLClient(configData.URL, configData.Token, GraphQLDataProvider.Instance._sessionId, configData.MJAPIKey); \n \n // Store the session ID for the global instance\n await GraphQLDataProvider.Instance.SaveStoredSessionID(GraphQLDataProvider.Instance._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 this._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 this.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 this.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 if (params.QueryID) {\n return this.RunQueryByID(params.QueryID, params.CategoryID, params.CategoryPath, contextUser, params.Parameters, params.MaxRows, params.StartRow);\n }\n else if (params.QueryName) {\n return this.RunQueryByName(params.QueryName, params.CategoryID, params.CategoryPath, contextUser, params.Parameters, params.MaxRows, params.StartRow);\n }\n else {\n throw new Error(\"No QueryID or QueryName provided to RunQuery\");\n }\n }\n\n public async RunQueryByID(QueryID: string, CategoryID?: string, CategoryPath?: string, contextUser?: UserInfo, Parameters?: Record<string, any>, MaxRows?: number, StartRow?: number): Promise<RunQueryResult> {\n const query = gql`\n query GetQueryDataQuery($QueryID: String!, $CategoryID: String, $CategoryPath: String, $Parameters: JSONObject, $MaxRows: Int, $StartRow: Int) {\n GetQueryData(QueryID: $QueryID, CategoryID: $CategoryID, CategoryPath: $CategoryPath, Parameters: $Parameters, MaxRows: $MaxRows, StartRow: $StartRow) {\n ${this.QueryReturnFieldList}\n }\n }\n `;\n \n // Build the variables object, adding optional parameters if defined.\n const variables: { QueryID: string; CategoryID?: string; CategoryPath?: string; Parameters?: Record<string, any>; MaxRows?: number; StartRow?: number } = { QueryID };\n if (CategoryID !== undefined) {\n variables.CategoryID = CategoryID;\n }\n if (CategoryPath !== undefined) {\n variables.CategoryPath = CategoryPath;\n }\n if (Parameters !== undefined) {\n variables.Parameters = Parameters;\n }\n if (MaxRows !== undefined) {\n variables.MaxRows = MaxRows;\n }\n if (StartRow !== undefined) {\n variables.StartRow = StartRow;\n }\n \n const result = await this.ExecuteGQL(query, variables);\n if (result && result.GetQueryData) {\n return this.TransformQueryPayload(result.GetQueryData);\n }\n }\n \n public async RunQueryByName(QueryName: string, CategoryID?: string, CategoryPath?: string, contextUser?: UserInfo, Parameters?: Record<string, any>, MaxRows?: number, StartRow?: number): Promise<RunQueryResult> {\n const query = gql`\n query GetQueryDataByNameQuery($QueryName: String!, $CategoryID: String, $CategoryPath: String, $Parameters: JSONObject, $MaxRows: Int, $StartRow: Int) {\n GetQueryDataByName(QueryName: $QueryName, CategoryID: $CategoryID, CategoryPath: $CategoryPath, Parameters: $Parameters, MaxRows: $MaxRows, StartRow: $StartRow) {\n ${this.QueryReturnFieldList}\n }\n }\n `;\n \n // Build the variables object, adding optional parameters if defined.\n const variables: { QueryName: string; CategoryID?: string; CategoryPath?: string; Parameters?: Record<string, any>; MaxRows?: number; StartRow?: number } = { QueryName };\n if (CategoryID !== undefined) {\n variables.CategoryID = CategoryID;\n }\n if (CategoryPath !== undefined) {\n variables.CategoryPath = CategoryPath;\n }\n if (Parameters !== undefined) {\n variables.Parameters = Parameters;\n }\n if (MaxRows !== undefined) {\n variables.MaxRows = MaxRows;\n }\n if (StartRow !== undefined) {\n variables.StartRow = StartRow;\n }\n \n const result = await this.ExecuteGQL(query, variables);\n if (result && result.GetQueryDataByName) {\n return this.TransformQueryPayload(result.GetQueryDataByName);\n }\n }\n\n protected get QueryReturnFieldList(): string {\n return `\n Success\n QueryID\n QueryName\n Results\n RowCount\n TotalRowCount\n ExecutionTime\n ErrorMessage\n AppliedParameters`\n }\n protected TransformQueryPayload(data: any): RunQueryResult {\n try {\n return {\n QueryID: data.QueryID,\n QueryName: data.QueryName,\n Success: data.Success,\n Results: JSON.parse(data.Results),\n RowCount: data.RowCount,\n TotalRowCount: data.TotalRowCount,\n ExecutionTime: data.ExecutionTime,\n ErrorMessage: data.ErrorMessage,\n AppliedParameters: data.AppliedParameters ? JSON.parse(data.AppliedParameters) : undefined\n }; \n }\n catch (e) {\n LogError(`Error transforming query payload: ${e}`);\n return null;\n }\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 this.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 this.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 this.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 this.ExecuteGQL(query, {params: request});\n\n if(data && data.GetRecordDuplicates){\n return data.GetRecordDuplicates;\n }\n }\n\n public async MergeRecords(request: RecordMergeRequest, contextUser?: UserInfo, options?: EntityMergeOptions): 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 this.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) {\n // type conversions as needed for GraphQL\n switch(f.EntityFieldInfo.TSType) {\n case EntityFieldTSType.Date:\n val = val.getTime();\n break;\n case EntityFieldTSType.Boolean:\n if (typeof val !== 'boolean') {\n val = parseInt(val) === 0 ? false : true; // convert to boolean\n }\n break;\n case EntityFieldTSType.Number:\n if (typeof val !== 'number') {\n const numValue = Number(val);\n if (!isNaN(numValue)) {\n val = numValue;\n } \n }\n break;\n }\n }\n\n if (val === null && f.EntityFieldInfo.AllowsNull === false) {\n // no value, field doesn't allow nulls, so set to default value, if available and then fall back to either 0 or empty string depending on type\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 (f.EntityFieldInfo.TSType === EntityFieldTSType.Date) \n val = f.OldValue.getTime().toString();\n else if (f.EntityFieldInfo.TSType === EntityFieldTSType.Boolean)\n val = f.OldValue === true ? \"1\" : \"0\";\n else 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 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, \n result.Type === 'create' ? 'Create' : 'Update', \n inner, vars, \n {\n mutationName,\n mutationInputTypes: mutationInputTypes\n },\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 result.NewValues = 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 }\n }));\n\n return true; // part of a TG always return true after we setup the transaction group item above\n }\n else {\n // not part of a transaction group, so just go for it and send across our GQL\n const d = await this.ExecuteGQL(outer, vars)\n if (d && d[type + entity.EntityInfo.ClassName]) {\n result.Success = true;\n result.EndedAt = new Date();\n result.NewValues = this.ConvertBackToMJFields(d[type + entity.EntityInfo.ClassName]);\n return result.NewValues;\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 this.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 // 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, 'Delete', 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 }\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 }\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 }\n }));\n return true;\n }\n else {\n // no transaction just go for it\n const d = await this.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 this.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 this.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(this);\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 this.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 this.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 this.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 this.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 /**\n * Retrieves all of the data context data for the specified data context ID.\n * @param dataContextID \n * @returns \n */\n public async GetDataContextData(dataContextID: string) {\n try {\n const query = gql`query GetDataContextData ($DataContextID: String!) {\n GetDataContextData(DataContextID: $DataContextID) {\n Success\n ErrorMessages\n Results\n }\n }`\n \n const data = await this.ExecuteGQL(query, {DataContextID: dataContextID});\n if (data && data.GetDataContextData) {\n if (data.GetDataContextData.Success) {\n return data.GetDataContextData.Results.map((item: any) => {\n return JSON.parse(item);\n });\n }\n else {\n throw new Error(data.GetDataContextData.ErrorMessages.join(', '));\n }\n }\n else {\n throw new Error('GraphQL query failed');\n } \n }\n catch (e) {\n LogError(e);\n throw e;\n }\n }\n\n /**\n * Retrieves the data context item data for the specified data context item ID.\n * @param dataContextItemID \n * @returns \n */\n public async GetDataContextItemData(dataContextItemID: string) {\n try {\n const query = gql`query GetDataContextItemData ($DataContextItemID: String!) {\n GetDataContextItemData(DataContextItemID: $DataContextItemID) {\n Success\n ErrorMessage\n Result\n }\n }`\n \n const data = await this.ExecuteGQL(query, {DataContextItemID: dataContextItemID});\n if (data && data.GetDataContextItemData) {\n if (data.GetDataContextItemData.Success) {\n return JSON.parse(data.GetDataContextItemData.Result);\n }\n else {\n throw new Error(data.GetDataContextItemData.ErrorMessage);\n }\n }\n else {\n throw new Error('GraphQL query failed');\n } \n }\n catch (e) {\n LogError(e);\n throw e;\n }\n }\n\n /**\n * Static version of the ExecuteGQL method that will use the global instance of the GraphQLDataProvider and execute the specified query with the provided variables. \n * If the token is expired, it will attempt to refresh the token and then re-execute the query. If the token is expired and the refresh fails, it will throw an error.\n * @param query \n * @param variables \n * @param refreshTokenIfNeeded \n * @returns \n */\n public static async ExecuteGQL(query: string, variables: any, refreshTokenIfNeeded: boolean = true): Promise<any> {\n return GraphQLDataProvider.Instance.ExecuteGQL(query, variables, refreshTokenIfNeeded);\n }\n\n /**\n * Executes the GQL query with the provided variables. If the token is expired, it will attempt to refresh the token and then re-execute the query. If the token is expired and the refresh fails, it will throw an error.\n * @param query \n * @param variables \n * @param refreshTokenIfNeeded \n * @returns \n */\n public async ExecuteGQL(query: string, variables: any, refreshTokenIfNeeded: boolean = true): Promise<any> {\n try {\n const data = await this._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 this.RefreshToken();\n return await this.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 async RefreshToken(): Promise<void> {\n if (this._configData.Data.RefreshTokenFunction) {\n const newToken = await this._configData.Data.RefreshTokenFunction();\n if (newToken) {\n this._configData.Token = newToken; // update the token\n this._client = this.CreateNewGraphQLClient(this._configData.URL,\n this._configData.Token,\n this._sessionId,\n this._configData.MJAPIKey); \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 public static async RefreshToken(): Promise<void> {\n return GraphQLDataProvider.Instance.RefreshToken();\n }\n\n protected CreateNewGraphQLClient(url: string, token: string, sessionId: string, mjAPIKey: string): GraphQLClient {\n const headers: Record<string, string> = { \n 'x-session-id': sessionId,\n };\n if (token)\n headers.authorization = 'Bearer ' + token;\n if (mjAPIKey)\n headers['x-mj-api-key'] = mjAPIKey;\n\n return new GraphQLClient(url, {\n headers\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 \n /**\n * Generic subscription method for GraphQL subscriptions\n * @param subscription The GraphQL subscription query\n * @param variables Variables to pass to the subscription\n * @returns Observable that emits subscription data\n */\n public subscribe(subscription: string, variables?: any): Observable<any> {\n // Ensure websocket client is initialized\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\n return new Observable((observer) => {\n const unsubscribe = this._wsClient.subscribe(\n { query: subscription, variables },\n {\n next: (data) => {\n observer.next(data.data);\n },\n error: (error) => {\n observer.error(error);\n },\n complete: () => {\n observer.complete();\n },\n }\n );\n\n // Return cleanup function\n return () => {\n unsubscribe();\n };\n });\n }\n \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","import { RunReport, BaseEntity, Metadata, RunView, RunQuery, SetProvider } from \"@memberjunction/core\";\nimport { GraphQLDataProvider, GraphQLProviderConfigData } from \"./graphQLDataProvider\";\nimport { MJGlobal, MJEventType } from \"@memberjunction/global\";\n\n/**\n * Setup the GraphQL client for the project using the provided configuration data.\n */\nexport async function setupGraphQLClient(config: GraphQLProviderConfigData): Promise<GraphQLDataProvider> {\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 SetProvider(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}","import { CompositeKey } from \"@memberjunction/core\";\n\n\n\nexport class SyncRolesAndUsersResult {\n Success: boolean;\n}\n \nexport class RoleInput {\n ID: string;\n\n Name: string;\n \n Description: string;\n}\n\n\nexport class UserInput {\n ID!: string;\n\n Name!: string;\n\n Email!: string;\n\n Type!: 'Owner' | 'User';\n\n FirstName: string;\n\n LastName: string;\n \n Title: string;\n\n Roles?: RoleInput[];\n}\n\nexport class RolesAndUsersInput {\n public Users: UserInput[];\n \n public Roles: RoleInput[];\n}\n\n\n\n/**\n * This type defines the possible list of actions that can be taken in syncing data: Create, Update, CreateOrUpdate, Delete, or DeleteWithFilter\n * DeleteWithFilter is where you specify a valid SQL expression that can be used in a where clause to get a list of records in a given entity to delete\n * this can be used to ensure cleaning out data from a subset of a given table.\n */\nexport enum SyncDataAction {\n Create = \"Create\",\n Update = \"Update\",\n CreateOrUpdate = \"CreateOrUpdate\",\n Delete = \"Delete\",\n DeleteWithFilter = \"DeleteWithFilter\"\n}\n \nexport class ActionItemInput {\n /**\n * The name of the entity where action is to be taken\n */\n EntityName!: string;\n /**\n * For Update, CreateOrUpdate and Delete operations either a PrimaryKey or an AlternateKey must be provided. For Create and DeleteWithFilter operations, neither is used. \n */\n PrimaryKey?: CompositeKey;\n /**\n * For Update, CreateOrUpdate and Delete operations either a PrimaryKey or an AlternateKey must be provided. For Create and DeleteWithFilter operations, neither is used. \n */\n AlternateKey?: CompositeKey;\n /**\n * The type of action requested. The possible values are Create, Update, CreateOrUpdate, Delete, DeleteWithFilter\n */\n Type!: SyncDataAction;\n /**\n * This field is a JSON representation of the field values of the entity to be created or updated. It is used for all ActionTypes except for \n */\n RecordJSON?: string;\n\n /**\n * This field is only provided when the Action Type is DeleteWithFilter. It is a valid SQL expression that can be used in a where clause to get a list of records in a given entity to delete\n */\n DeleteFilter?: string;\n}\n \n\nexport class SyncDataResult {\n Success: boolean;\n \n Results: ActionItemOutput[] = [];\n}\n\nexport class ActionItemOutput {\n Success: boolean;\n ErrorMessage: string;\n EntityName!: string;\n PrimaryKey?: CompositeKey;\n AlternateKey?: CompositeKey;\n Type!: SyncDataAction;\n\n /**\n * This field is a JSON representation of the field values of the entity to be created or updated. It is used for all ActionTypes except for \n */\n RecordJSON?: string;\n\n /**\n * This field is only provided when the Action Type is DeleteWithFilter. It is a valid SQL expression that can be used in a where clause to get a list of records in a given entity to delete\n */\n DeleteFilter?: string;\n}","import { CompositeKey, LogError } from '@memberjunction/core';\nimport { SafeJSONParse } from '@memberjunction/global';\nimport { gql, GraphQLClient } from 'graphql-request'\nimport { ActionItemInput, RolesAndUsersInput, SyncDataResult, SyncRolesAndUsersResult } from './rolesAndUsersType';\n\n/**\n * Specialized client that is designed to be used exclusively on the server side\n * by the System User using the MJ API KEY. This is designed to allow server side\n * code such as within the context of an MJAPI server to talk to another MAJPI server\n * but as the client.\n * \n * It is possible for a server to use the regular @GraphQLDataProvider client to talk\n * to another MJAPI server, but that would require the server to have a user account\n * and the server would have to be able to log in as that user via a JWT token. This\n * is not always possible or convenient in the flow. \n * \n * Also the standard client configuration process has a certain amount over overhead\n * in always loading up certain metadata that is not necessary for many system user\n * operations.\n * \n * Finaly, this client can be used in parallel with the regular client to allow a server\n * to mix and match the two as needed.\n */\nexport class GraphQLSystemUserClient {\n private _client: GraphQLClient;\n /**\n * Returns the underlying GraphQL client which is an instance of the GraphQLClient object\n * from the graphql-request package. This is useful if you want to perform any operation\n * that is not directly supported by this class via specialized methods.\n */\n public get Client(): GraphQLClient {\n return this._client;\n }\n\n /**\n * @param url MJAPI server URL\n * @param token Optional, JWT token that is used for a normal user authentication flow. This is required if mjAPIKey is not provided.\n * @param sessionId Optional, UUID that is used to track a session. This can be any string.\n * @param mjAPIKey Shared Secret key that is provided for system user authentication. This is required if token is not provided.\n * @returns \n */\n constructor (url: string, token: string, sessionId: string, mjAPIKey: string) {\n const headers: Record<string, string> = { \n 'x-session-id': sessionId,\n };\n if (token)\n headers.authorization = 'Bearer ' + token;\n if (mjAPIKey)\n headers['x-mj-api-key'] = mjAPIKey;\n\n this._client = new GraphQLClient(url, {\n headers\n });\n }\n\n /**\n * Calls the GetData() query on the server to execute any number of provided SQL queries in parallel and returns the results.\n * The queries MUST BE read only and not perform any DML operations. The remote server will execute the queries using a special\n * lower-privilege user that is not allowed to perform any form of write operations.\n * @param queries an array of SQL queries to execute on the remote server\n * @param accessToken the short-lived access token that is required to perform this operation. This is different from the MJAPI key and is used for a second factor and is a short-lived token. You will receive this token \n * when an MJAPI calls your server to request something along with the URL to call back.\n * @returns \n */\n public async GetData(queries: string[], accessToken: string): Promise<GetDataOutput> {\n try {\n const query = `query GetData($input: GetDataInputType!) {\n GetData(input: $input) {\n Success\n ErrorMessages\n Queries\n Results\n }\n }`\n const result = await this.Client.request(query, {input: {Queries: queries, Token: accessToken}}) as {GetData: GetDataOutput};\n if (result && result.GetData) {\n // for each succesful item, we will parse and return the array of objects instead of the string\n return {\n Success: result.GetData.Success,\n Results: result.GetData.Results.map(r => r ? SafeJSONParse(r) : null),\n ErrorMessages: result.GetData.ErrorMessages,\n Queries: result.GetData.Queries \n }\n }\n else {\n return {\n Success: false,\n Results: [],\n ErrorMessages: result.GetData?.ErrorMessages ?? ['Unknown error'],\n Queries: result.GetData?.Queries ?? queries\n }\n }\n }\n catch (e) {\n const error = `GraphQLSystemUserClient::GetData - Error getting geta - ${e}`\n LogError(error);\n return {\n Success: false,\n Results: [],\n ErrorMessages: [error],\n Queries: queries\n }\n }\n }\n\n /**\n * This method will return a list of all entities that are available on the remote server. This is a lightweight call that only returns the basic metadata for each entity and does not include all of the attributes at \n * either the entity or the field level. This is useful for getting a list of entities that are available on the remote server and knowing their IDs and Entity Field IDs on the remote server. For core MemberJunction \n * entities and entity fields, the ID values are globally unique and set by the MemberJunction distribution, however, for other entities that are generated on each target system they can vary so it is best to use\n * lookups name or a combination of SchemaName and BaseTable to uniquely identify an entity.\n * @param client \n * @returns \n */\n public async GetAllRemoteEntities(): Promise<SimpleRemoteEntityOutput> {\n try {\n const query = `query GetAllEntities {\n GetAllEntities {\n Success\n ErrorMessage\n Results {\n ID\n Name\n Description\n SchemaName\n BaseView\n BaseTable\n CodeName\n ClassName\n Fields {\n ID\n Name\n Description\n Type\n AllowsNull\n MaxLength\n }\n }\n }\n }`\n\n const result = (await this.Client.request(query)) as {GetAllEntities: SimpleRemoteEntityOutput};\n if (result && result.GetAllEntities) {\n return result.GetAllEntities;\n }\n else {\n return {\n Success: false,\n Results: [],\n ErrorMessage: result.GetAllEntities?.ErrorMessage ?? 'Unknown error'\n }\n }\n }\n catch (e) {\n LogError(`GraphQLSystemUserClient::GetAllRemoteEntities - Error getting remote entities - ${e}`);\n return {\n Success: false,\n Results: [],\n ErrorMessage: e\n }\n }\n }\n\n /**\n * This method is used to invoke the data synchronization mutation on the remote server. This method is used to create, update, or delete records in the remote server. The method takes an array of ActionItemInput objects\n * Each of the ActionItemInput objects represents a single action to take on a single entity. The action can be Create, Update, CreateOrUpdate, Delete, or DeleteWithFilter. The RecordJSON field is used for Create, CreateOrUpdate and Update whereas\n * the DeleteFilter field is used for DeleteWithFilter. The PrimaryKey and AlternateKey fields are used to identify the record to be acted upon. \n * \n * Use of the AlternateKey is important for situations where you might have divergent primary keys across systems. For example for user entities that are individually generated on each system by CodeGen, the primary key will\n * be different per system, so you would use the combination of the SchemaName and BaseTable to identify the entity and then use the AlternateKey to provide the combination of these fields to uniquely identify the record for updates.\n * @param items \n * @returns \n */\n public async SyncData(items: ActionItemInput[]): Promise<SyncDataResult> {\n try {\n // call the resolver to sync the roles and users\n const query = `mutation SyncData($items: [ActionItemInputType!]!) {\n SyncData(items: $items) {\n Success\n Results {\n Success\n ErrorMessage\n EntityName\n Type\n PrimaryKey {\n KeyValuePairs {\n FieldName\n Value \n }\n }\n AlternateKey {\n KeyValuePairs {\n FieldName\n Value \n }\n }\n DeleteFilter\n RecordJSON\n }\n }\n }`\n const d = <{SyncData: SyncDataResult}>await this.Client.request(query, {items});\n if (d && d.SyncData) {\n return d.SyncData;\n }\n else {\n return {\n Success: false,\n Results: []\n }\n }\n }\n catch (e) {\n LogError(`GraphQLSystemUserClient::SyncData - Error syncing data - ${e}`);\n return {\n Success: false,\n Results: []\n }\n }\n }\n\n /**\n * This method will sync the roles and users on the remote server. This method is used to create, update, or delete roles and users on the remote server. \n * The method takes a RolesAndUsersInput object that contains an array of RoleInput objects. Note that this will not result in the removal of roles on the \n * remote server that are deemed to be built-in MemberJunction roles such as Developer, Integration and UI.\n * @param data \n * @returns \n */\n public async SyncRolesAndUsers(data: RolesAndUsersInput): Promise<SyncRolesAndUsersResult> {\n try {\n // call the resolver to sync the roles and users\n const query = `mutation SyncRolesAndUsers($data: RolesAndUsersInputType!) {\n SyncRolesAndUsers(data: $data) {\n Success\n }\n }`\n const d = await this.Client.request(query, {data}) as {SyncRolesAndUsers: SyncRolesAndUsersResult};\n if (d && d.SyncRolesAndUsers) {\n return d.SyncRolesAndUsers;\n }\n else {\n return {\n Success: false\n }\n }\n } \n catch (e) {\n LogError(`GraphQLSystemUserClient::SyncRolesAndUsers - Error syncing roles and users - ${e}`);\n return {\n Success: false\n }\n } \n }\n\n /**\n * Runs a view by name using the RunViewByNameSystemUser resolver.\n * @param input - View input parameters for running by name\n * @returns Promise containing the view execution results\n */\n public async RunViewByName(input: RunViewByNameSystemUserInput): Promise<RunViewSystemUserResult> {\n try {\n const query = `query RunViewByNameSystemUser($input: RunViewByNameInput!) {\n RunViewByNameSystemUser(input: $input) {\n Results {\n ID\n EntityID\n Data\n }\n UserViewRunID\n RowCount\n TotalRowCount\n ExecutionTime\n ErrorMessage\n Success\n }\n }`\n\n const result = await this.Client.request(query, { input }) as { RunViewByNameSystemUser: RunViewSystemUserResult };\n if (result && result.RunViewByNameSystemUser) {\n return result.RunViewByNameSystemUser;\n } else {\n return {\n Results: [],\n Success: false,\n ErrorMessage: 'Failed to execute view by name'\n };\n }\n }\n catch (e) {\n LogError(`GraphQLSystemUserClient::RunViewByNameSystemUser - Error running view by name - ${e}`);\n return {\n Results: [],\n Success: false,\n ErrorMessage: e.toString()\n };\n }\n }\n\n /**\n * Runs a view by ID using the RunViewByIDSystemUser resolver.\n * @param input - View input parameters for running by ID\n * @returns Promise containing the view execution results\n */\n public async RunViewByID(input: RunViewByIDSystemUserInput): Promise<RunViewSystemUserResult> {\n try {\n const query = `query RunViewByIDSystemUser($input: RunViewByIDInput!) {\n RunViewByIDSystemUser(input: $input) {\n Results {\n ID\n EntityID\n Data\n }\n UserViewRunID\n RowCount\n TotalRowCount\n ExecutionTime\n ErrorMessage\n Success\n }\n }`\n\n const result = await this.Client.request(query, { input }) as { RunViewByIDSystemUser: RunViewSystemUserResult };\n if (result && result.RunViewByIDSystemUser) {\n return result.RunViewByIDSystemUser;\n } else {\n return {\n Results: [],\n Success: false,\n ErrorMessage: 'Failed to execute view by ID'\n };\n }\n }\n catch (e) {\n LogError(`GraphQLSystemUserClient::RunViewByIDSystemUser - Error running view by ID - ${e}`);\n return {\n Results: [],\n Success: false,\n ErrorMessage: e.toString()\n };\n }\n }\n\n /**\n * Runs a dynamic view using the RunDynamicViewSystemUser resolver.\n * @param input - View input parameters for dynamic view execution\n * @returns Promise containing the view execution results\n */\n public async RunDynamicView(input: RunDynamicViewSystemUserInput): Promise<RunViewSystemUserResult> {\n try {\n const query = `query RunDynamicViewSystemUser($input: RunDynamicViewInput!) {\n RunDynamicViewSystemUser(input: $input) {\n Results {\n ID\n EntityID\n Data\n }\n UserViewRunID\n RowCount\n TotalRowCount\n ExecutionTime\n ErrorMessage\n Success\n }\n }`\n\n const result = await this.Client.request(query, { input }) as { RunDynamicViewSystemUser: RunViewSystemUserResult };\n if (result && result.RunDynamicViewSystemUser) {\n return result.RunDynamicViewSystemUser;\n } else {\n return {\n Results: [],\n Success: false,\n ErrorMessage: 'Failed to execute dynamic view'\n };\n }\n }\n catch (e) {\n LogError(`GraphQLSystemUserClient::RunDynamicViewSystemUser - Error running dynamic view - ${e}`);\n return {\n Results: [],\n Success: false,\n ErrorMessage: e.toString()\n };\n }\n }\n\n /**\n * Runs multiple views using the RunViewsSystemUser resolver. This method allows system users\n * to execute view queries with the same functionality as regular users but with system-level privileges.\n * @param input - Array of view input parameters\n * @returns Promise containing the results from all view executions\n */\n public async RunViews(input: RunViewSystemUserInput[]): Promise<RunViewSystemUserResult[]> {\n try {\n const query = `query RunViewsSystemUser($input: [RunViewGenericInput!]!) {\n RunViewsSystemUser(input: $input) {\n Results {\n ID\n EntityID\n Data\n }\n UserViewRunID\n RowCount\n TotalRowCount\n ExecutionTime\n ErrorMessage\n Success\n }\n }`\n\n const result = await this.Client.request(query, { input }) as { RunViewsSystemUser: RunViewSystemUserResult[] };\n if (result && result.RunViewsSystemUser) {\n return result.RunViewsSystemUser;\n } else {\n return [];\n }\n }\n catch (e) {\n LogError(`GraphQLSystemUserClient::RunViewsSystemUser - Error running views - ${e}`);\n return [];\n }\n }\n\n /**\n * Executes a stored query by ID using the GetQueryDataSystemUser resolver.\n * @param input - Query input parameters for execution by ID\n * @returns Promise containing the query execution results\n */\n public async GetQueryData(input: GetQueryDataSystemUserInput): Promise<RunQuerySystemUserResult> {\n try {\n // Validate that Parameters is a JSON object, not an array\n if (input.Parameters !== undefined && Array.isArray(input.Parameters)) {\n throw new Error('Parameters must be a JSON object, not an array. Use {} for empty parameters instead of [].');\n }\n\n const query = `query GetQueryDataSystemUser($QueryID: String!, $CategoryID: String, $CategoryPath: String, $Parameters: JSONObject, $MaxRows: Int, $StartRow: Int) {\n GetQueryDataSystemUser(QueryID: $QueryID, CategoryID: $CategoryID, CategoryPath: $CategoryPath, Parameters: $Parameters, MaxRows: $MaxRows, StartRow: $StartRow) {\n QueryID\n QueryName\n Success\n Results\n RowCount\n TotalRowCount\n ExecutionTime\n ErrorMessage\n AppliedParameters\n }\n }`\n\n const variables: any = { QueryID: input.QueryID };\n if (input.CategoryID !== undefined) variables.CategoryID = input.CategoryID;\n if (input.CategoryPath !== undefined) variables.CategoryPath = input.CategoryPath;\n if (input.Parameters !== undefined) variables.Parameters = input.Parameters;\n if (input.MaxRows !== undefined) variables.MaxRows = input.MaxRows;\n if (input.StartRow !== undefined) variables.StartRow = input.StartRow;\n\n const result = await this.Client.request(query, variables) as { GetQueryDataSystemUser: RunQuerySystemUserResult };\n \n if (result && result.GetQueryDataSystemUser) {\n // Parse the JSON results for easier consumption\n return {\n ...result.GetQueryDataSystemUser,\n Results: result.GetQueryDataSystemUser.Results ? SafeJSONParse(result.GetQueryDataSystemUser.Results) : null\n };\n } else {\n return {\n QueryID: input.QueryID,\n QueryName: '',\n Success: false,\n Results: null,\n RowCount: 0,\n TotalRowCount: 0,\n ExecutionTime: 0,\n ErrorMessage: 'Query execution failed'\n };\n }\n }\n catch (e) {\n LogError(`GraphQLSystemUserClient::GetQueryDataSystemUser - Error executing query - ${e}`);\n return {\n QueryID: input.QueryID,\n QueryName: '',\n Success: false,\n Results: null,\n RowCount: 0,\n TotalRowCount: 0,\n ExecutionTime: 0,\n ErrorMessage: e.toString()\n };\n }\n }\n\n /**\n * Executes a stored query by name using the GetQueryDataByNameSystemUser resolver.\n * @param input - Query input parameters for execution by name\n * @returns Promise containing the query execution results\n */\n public async GetQueryDataByName(input: GetQueryDataByNameSystemUserInput): Promise<RunQuerySystemUserResult> {\n try {\n // Validate that Parameters is a JSON object, not an array\n if (input.Parameters !== undefined && Array.isArray(input.Parameters)) {\n throw new Error('Parameters must be a JSON object, not an array. Use {} for empty parameters instead of [].');\n }\n\n const query = `query GetQueryDataByNameSystemUser($QueryName: String!, $CategoryID: String, $CategoryPath: String, $Parameters: JSONObject, $MaxRows: Int, $StartRow: Int) {\n GetQueryDataByNameSystemUser(QueryName: $QueryName, CategoryID: $CategoryID, CategoryPath: $CategoryPath, Parameters: $Parameters, MaxRows: $MaxRows, StartRow: $StartRow) {\n QueryID\n QueryName\n Success\n Results\n RowCount\n TotalRowCount\n ExecutionTime\n ErrorMessage\n AppliedParameters\n }\n }`\n\n const variables: any = { QueryName: input.QueryName };\n if (input.CategoryID !== undefined) variables.CategoryID = input.CategoryID;\n if (input.CategoryPath !== undefined) variables.CategoryPath = input.CategoryPath;\n if (input.Parameters !== undefined) variables.Parameters = input.Parameters;\n if (input.MaxRows !== undefined) variables.MaxRows = input.MaxRows;\n if (input.StartRow !== undefined) variables.StartRow = input.StartRow;\n\n const result = await this.Client.request(query, variables) as { GetQueryDataByNameSystemUser: RunQuerySystemUserResult };\n \n if (result && result.GetQueryDataByNameSystemUser) {\n // Parse the JSON results for easier consumption\n return {\n ...result.GetQueryDataByNameSystemUser,\n Results: result.GetQueryDataByNameSystemUser.Results ? SafeJSONParse(result.GetQueryDataByNameSystemUser.Results) : null\n };\n } else {\n return {\n QueryID: '',\n QueryName: input.QueryName,\n Success: false,\n Results: null,\n RowCount: 0,\n TotalRowCount: 0,\n ExecutionTime: 0,\n ErrorMessage: 'Query execution failed'\n };\n }\n }\n catch (e) {\n LogError(`GraphQLSystemUserClient::GetQueryDataByNameSystemUser - Error executing query - ${e}`);\n return {\n QueryID: '',\n QueryName: input.QueryName,\n Success: false,\n Results: null,\n RowCount: 0,\n TotalRowCount: 0,\n ExecutionTime: 0,\n ErrorMessage: e.toString()\n };\n }\n }\n\n /**\n * Creates a new query using the CreateQuerySystemUser mutation. This method is restricted to system users only.\n * @param input - CreateQuerySystemUserInput containing all the query attributes including optional CategoryPath\n * @returns Promise containing the result of the query creation\n */\n public async CreateQuery(input: CreateQueryInput): Promise<CreateQueryResult> {\n try {\n const query = `mutation CreateQuerySystemUser($input: CreateQuerySystemUserInput!) {\n CreateQuerySystemUser(input: $input) {\n Success\n ErrorMessage\n QueryData\n Fields {\n ID\n QueryID\n Name\n Description\n Type\n Sequence\n SQLBaseType\n SQLFullType\n IsComputed\n ComputationEnabled\n ComputationDescription\n }\n Parameters {\n ID\n QueryID\n Name\n Type\n DefaultValue\n Comments\n IsRequired\n }\n Entities {\n ID\n QueryID\n EntityID\n EntityName\n Sequence\n }\n Permissions {\n ID\n QueryID\n RoleID\n RoleName\n }\n }\n }`\n\n const result = await this.Client.request(query, { input }) as { CreateQuerySystemUser: CreateQueryResult };\n if (result && result.CreateQuerySystemUser) {\n // Parse the QueryData JSON if it exists and was successful\n if (result.CreateQuerySystemUser.Success && result.CreateQuerySystemUser.QueryData) {\n return {\n ...result.CreateQuerySystemUser,\n QueryData: result.CreateQuerySystemUser.QueryData // Already JSON string from resolver\n };\n }\n return result.CreateQuerySystemUser;\n } else {\n return {\n Success: false,\n ErrorMessage: 'Failed to create query'\n };\n }\n }\n catch (e) {\n LogError(`GraphQLSystemUserClient::CreateQuery - Error creating query - ${e}`);\n return {\n Success: false,\n ErrorMessage: e.toString()\n };\n }\n }\n\n /**\n * Updates an existing query with the provided attributes. This method is restricted to system users only.\n * @param input - UpdateQueryInput containing the query ID and fields to update\n * @returns Promise containing the result of the query update including updated fields, parameters, entities, and permissions\n */\n public async UpdateQuery(input: UpdateQueryInput): Promise<UpdateQueryResult> {\n try {\n const query = `mutation UpdateQuerySystemUser($input: UpdateQuerySystemUserInput!) {\n UpdateQuerySystemUser(input: $input) {\n Success\n ErrorMessage\n QueryData\n Fields {\n ID\n QueryID\n Name\n Description\n Type\n Sequence\n SQLBaseType\n SQLFullType\n IsComputed\n ComputationEnabled\n ComputationDescription\n }\n Parameters {\n ID\n QueryID\n Name\n Type\n DefaultValue\n Comments\n IsRequired\n }\n Entities {\n ID\n QueryID\n EntityID\n EntityName\n Sequence\n }\n Permissions {\n ID\n QueryID\n RoleID\n RoleName\n }\n }\n }`\n\n const result = await this.Client.request(query, { input }) as { UpdateQuerySystemUser: UpdateQueryResult };\n if (result && result.UpdateQuerySystemUser) {\n // Parse the QueryData JSON if it exists and was successful\n if (result.UpdateQuerySystemUser.Success && result.UpdateQuerySystemUser.QueryData) {\n return {\n ...result.UpdateQuerySystemUser,\n QueryData: result.UpdateQuerySystemUser.QueryData // Already JSON string from resolver\n };\n }\n return result.UpdateQuerySystemUser;\n } else {\n return {\n Success: false,\n ErrorMessage: 'Failed to update query'\n };\n }\n }\n catch (e) {\n LogError(`GraphQLSystemUserClient::UpdateQuery - Error updating query - ${e}`);\n return {\n Success: false,\n ErrorMessage: e.toString()\n };\n }\n }\n\n /**\n * Deletes a query by ID using the DeleteQuerySystemResolver mutation. This method is restricted to system users only.\n * @param ID - The ID of the query to delete\n * @param options - Optional delete options controlling action execution\n * @returns Promise containing the result of the query deletion\n */\n public async DeleteQuery(ID: string, options?: DeleteQueryOptionsInput): Promise<DeleteQueryResult> {\n try {\n // Validate ID is not null/undefined/empty\n if (!ID || ID.trim() === '') {\n LogError('GraphQLSystemUserClient::DeleteQuery - Invalid query ID: ID cannot be null or empty');\n return {\n Success: false,\n ErrorMessage: 'Invalid query ID: ID cannot be null or empty'\n };\n }\n\n const query = `mutation DeleteQuerySystemResolver($ID: String!, $options: DeleteOptionsInput) {\n DeleteQuerySystemResolver(ID: $ID, options: $options) {\n Success\n ErrorMessage\n QueryData\n }\n }`\n\n const variables: any = { ID: ID };\n if (options !== undefined) {\n variables.options = options;\n }\n\n const result = await this.Client.request(query, variables) as { DeleteQuerySystemResolver: DeleteQueryResult };\n \n if (result && result.DeleteQuerySystemResolver) {\n return result.DeleteQuerySystemResolver;\n } else {\n return {\n Success: false,\n ErrorMessage: 'Failed to delete query'\n };\n }\n }\n catch (e) {\n LogError(`GraphQLSystemUserClient::DeleteQuery - Error deleting query - ${e}`);\n return {\n Success: false,\n ErrorMessage: e.toString()\n };\n }\n }\n\n}\n\n/**\n * Output type for GetData calls - contains results from executing multiple SQL queries\n */\nexport class GetDataOutput {\n /**\n * Indicates if the operation was successful overall. If any individual query failed, this will be false. However, any successful queries will still be returned in the Results array.\n */\n Success: boolean;\n /**\n * The original input of Queries that were run - same order as provided in the request\n */\n Queries: string[];\n /**\n * An ordered array of error messages for each query that was run. This array will always have the same # of entries as Queries. If a query was successful, the corresponding entry will be null.\n */\n ErrorMessages: (string | null)[];\n /**\n * An ordered array of results for each query that was run. This array will always have the same # of entries as Queries. If a query failed, the corresponding entry will be null. Successful results are JSON strings containing the query data.\n */\n Results: (string | null)[];\n}\n\n/**\n * Return type for calls to the GetAllRemoteEntities query - provides lightweight entity metadata\n */\nexport class SimpleRemoteEntityOutput {\n /**\n * Indicates whether the remote entity retrieval was successful\n */\n Success: boolean;\n /**\n * Error message if the operation failed, undefined if successful\n */\n ErrorMessage?: string;\n /**\n * An array of simple entity types that are returned from the remote server - contains basic metadata for each entity\n */\n Results: SimpleRemoteEntity[];\n}\n\n/**\n * Represents a simple entity type that is used for lightweight retrieval of partial remote entity metadata \n */\nexport class SimpleRemoteEntity {\n /**\n * Unique identifier of the entity on the remote server\n */\n ID: string;\n /**\n * Display name of the entity (e.g., \"Users\", \"Companies\")\n */\n Name: string;\n /**\n * Optional description explaining the entity's purpose\n */\n Description?: string;\n /**\n * Database schema name where the entity resides (e.g., \"dbo\", \"custom\")\n */\n SchemaName: string;\n /**\n * Name of the database view used for reading this entity\n */\n BaseView: string;\n /**\n * Name of the database table used for storing this entity\n */\n BaseTable: string;\n /**\n * Optional code-friendly name for the entity (typically PascalCase)\n */\n CodeName?: string;\n /**\n * Optional TypeScript/JavaScript class name for the entity\n */\n ClassName?: string;\n /**\n * Array of field definitions for this entity\n */\n Fields: SimpleRemoteEntityField[];\n}\n\n/**\n * Represents a field within a remote entity - contains basic field metadata\n */\nexport class SimpleRemoteEntityField {\n /**\n * Unique identifier of the entity field on the remote server\n */\n ID: string;\n /**\n * Field name (e.g., \"FirstName\", \"Email\", \"CreatedAt\")\n */\n Name: string;\n /**\n * Optional description explaining the field's purpose\n */\n Description?: string;\n /**\n * Data type of the field (e.g., \"nvarchar\", \"int\", \"datetime\", \"bit\")\n */\n Type: string;\n /**\n * Whether the field can contain null values\n */\n AllowsNull: boolean;\n /**\n * Maximum length for string fields, -1 for unlimited, 0 for non-string types\n */\n MaxLength: number;\n}\n\n/**\n * Input type for RunViewByNameSystemUser method calls - executes a saved view by name\n */\nexport interface RunViewByNameSystemUserInput {\n /**\n * Name of the saved view to execute\n */\n ViewName: string;\n /**\n * Additional WHERE clause conditions to apply (optional)\n */\n ExtraFilter?: string;\n /**\n * ORDER BY clause for sorting results (optional)\n */\n OrderBy?: string;\n /**\n * Specific fields to return, if not specified returns all fields (optional)\n */\n Fields?: string[];\n /**\n * Search string to filter results across searchable fields (optional)\n */\n UserSearchString?: string;\n /**\n * ID of a previous view run to exclude results from (optional)\n */\n ExcludeUserViewRunID?: string;\n /**\n * Override the exclude filter with custom logic (optional)\n */\n OverrideExcludeFilter?: string;\n /**\n * Whether to save the view execution results for future reference (optional)\n */\n SaveViewResults?: boolean;\n /**\n * Whether to exclude data from all prior view runs (optional)\n */\n ExcludeDataFromAllPriorViewRuns?: boolean;\n /**\n * Whether to ignore the view's MaxRows setting and return all results (optional)\n */\n IgnoreMaxRows?: boolean;\n /**\n * Maximum number of rows to return, overrides view setting if specified (optional)\n */\n MaxRows?: number;\n /**\n * Whether to force audit logging for this view execution (optional)\n */\n ForceAuditLog?: boolean;\n /**\n * Description for the audit log entry if ForceAuditLog is true (optional)\n */\n AuditLogDescription?: string;\n /**\n * Type of result format: \"simple\", \"entity_object\", etc. (optional)\n */\n ResultType?: string;\n /**\n * Starting row number for pagination (optional, 0-based)\n */\n StartRow?: number;\n}\n\n/**\n * Input type for RunViewByIDSystemUser method calls - executes a saved view by its unique ID\n */\nexport interface RunViewByIDSystemUserInput {\n /**\n * Unique identifier of the saved view to execute\n */\n ViewID: string;\n /**\n * Additional WHERE clause conditions to apply (optional)\n */\n ExtraFilter?: string;\n /**\n * ORDER BY clause for sorting results (optional)\n */\n OrderBy?: string;\n /**\n * Specific fields to return, if not specified returns all fields (optional)\n */\n Fields?: string[];\n /**\n * Search string to filter results across searchable fields (optional)\n */\n UserSearchString?: string;\n /**\n * ID of a previous view run to exclude results from (optional)\n */\n ExcludeUserViewRunID?: string;\n /**\n * Override the exclude filter with custom logic (optional)\n */\n OverrideExcludeFilter?: string;\n /**\n * Whether to save the view execution results for future reference (optional)\n */\n SaveViewResults?: boolean;\n /**\n * Whether to exclude data from all prior view runs (optional)\n */\n ExcludeDataFromAllPriorViewRuns?: boolean;\n /**\n * Whether to ignore the view's MaxRows setting and return all results (optional)\n */\n IgnoreMaxRows?: boolean;\n /**\n * Maximum number of rows to return, overrides view setting if specified (optional)\n */\n MaxRows?: number;\n /**\n * Whether to force audit logging for this view execution (optional)\n */\n ForceAuditLog?: boolean;\n /**\n * Description for the audit log entry if ForceAuditLog is true (optional)\n */\n AuditLogDescription?: string;\n /**\n * Type of result format: \"simple\", \"entity_object\", etc. (optional)\n */\n ResultType?: string;\n /**\n * Starting row number for pagination (optional, 0-based)\n */\n StartRow?: number;\n}\n\n/**\n * Input type for RunDynamicViewSystemUser method calls - creates and executes a view dynamically based on entity\n */\nexport interface RunDynamicViewSystemUserInput {\n /**\n * Name of the entity to query (e.g., \"Users\", \"Companies\")\n */\n EntityName: string;\n /**\n * Additional WHERE clause conditions to apply (optional)\n */\n ExtraFilter?: string;\n /**\n * ORDER BY clause for sorting results (optional)\n */\n OrderBy?: string;\n /**\n * Specific fields to return, if not specified returns all fields (optional)\n */\n Fields?: string[];\n /**\n * Search string to filter results across searchable fields (optional)\n */\n UserSearchString?: string;\n /**\n * ID of a previous view run to exclude results from (optional)\n */\n ExcludeUserViewRunID?: string;\n /**\n * Override the exclude filter with custom logic (optional)\n */\n OverrideExcludeFilter?: string;\n /**\n * Whether to ignore MaxRows limits and return all results (optional)\n */\n IgnoreMaxRows?: boolean;\n /**\n * Maximum number of rows to return (optional)\n */\n MaxRows?: number;\n /**\n * Whether to force audit logging for this view execution (optional)\n */\n ForceAuditLog?: boolean;\n /**\n * Description for the audit log entry if ForceAuditLog is true (optional)\n */\n AuditLogDescription?: string;\n /**\n * Type of result format: \"simple\", \"entity_object\", etc. (optional)\n */\n ResultType?: string;\n /**\n * Starting row number for pagination (optional, 0-based)\n */\n StartRow?: number;\n}\n\n/**\n * Input type for RunViewsSystemUser method calls - executes multiple views in parallel\n */\nexport interface RunViewSystemUserInput {\n /**\n * Name of the entity to query (e.g., \"Users\", \"Companies\")\n */\n EntityName: string;\n /**\n * Additional WHERE clause conditions to apply (optional)\n */\n ExtraFilter?: string;\n /**\n * ORDER BY clause for sorting results (optional)\n */\n OrderBy?: string;\n /**\n * Specific fields to return, if not specified returns all fields (optional)\n */\n Fields?: string[];\n /**\n * Search string to filter results across searchable fields (optional)\n */\n UserSearchString?: string;\n /**\n * ID of a previous view run to exclude results from (optional)\n */\n ExcludeUserViewRunID?: string;\n /**\n * Override the exclude filter with custom logic (optional)\n */\n OverrideExcludeFilter?: string;\n /**\n * Whether to ignore MaxRows limits and return all results (optional)\n */\n IgnoreMaxRows?: boolean;\n /**\n * Maximum number of rows to return (optional)\n */\n MaxRows?: number;\n /**\n * Whether to force audit logging for this view execution (optional)\n */\n ForceAuditLog?: boolean;\n /**\n * Description for the audit log entry if ForceAuditLog is true (optional)\n */\n AuditLogDescription?: string;\n /**\n * Type of result format: \"simple\", \"entity_object\", etc. (optional)\n */\n ResultType?: string;\n /**\n * Starting row number for pagination (optional, 0-based)\n */\n StartRow?: number;\n}\n\n/**\n * Result row type for view execution results - represents a single data row\n */\nexport interface RunViewSystemUserResultRow {\n /**\n * Unique identifier of the record\n */\n ID: string;\n /**\n * ID of the entity type this record belongs to\n */\n EntityID: string;\n /**\n * JSON string containing the actual record data\n */\n Data: string;\n}\n\n/**\n * Result type for RunViewsSystemUser method calls - contains execution results and metadata\n */\nexport interface RunViewSystemUserResult {\n /**\n * Array of result rows containing the actual data\n */\n Results: RunViewSystemUserResultRow[];\n /**\n * Unique identifier for this view execution run (optional)\n */\n UserViewRunID?: string;\n /**\n * Number of rows returned in this result set (optional)\n */\n RowCount?: number;\n /**\n * Total number of rows available (before pagination) (optional)\n */\n TotalRowCount?: number;\n /**\n * Time taken to execute the view in milliseconds (optional)\n */\n ExecutionTime?: number;\n /**\n * Error message if the execution failed (optional)\n */\n ErrorMessage?: string;\n /**\n * Whether the view execution was successful\n */\n Success: boolean;\n}\n\n/**\n * Result type for query execution methods - contains query results and execution metadata\n */\nexport interface RunQuerySystemUserResult {\n /**\n * Unique identifier of the executed query\n */\n QueryID: string;\n /**\n * Display name of the executed query\n */\n QueryName: string;\n /**\n * Whether the query execution was successful\n */\n Success: boolean;\n /**\n * Query results data (parsed from JSON)\n */\n Results: any;\n /**\n * Number of rows returned by the query\n */\n RowCount: number;\n /**\n * Total number of rows available (before pagination)\n */\n TotalRowCount: number;\n /**\n * Time taken to execute the query in milliseconds\n */\n ExecutionTime: number;\n /**\n * Error message if the query execution failed\n */\n ErrorMessage: string;\n /**\n * JSON string containing the applied parameters (optional)\n */\n AppliedParameters?: string;\n}\n\n/**\n * Input type for GetQueryDataSystemUser method calls - executes a stored query by ID\n */\nexport interface GetQueryDataSystemUserInput {\n /**\n * The ID of the query to execute\n */\n QueryID: string;\n /**\n * Optional category ID filter\n */\n CategoryID?: string;\n /**\n * Optional category path filter (hierarchical path like \"/MJ/AI/Agents/\" or simple name)\n */\n CategoryPath?: string;\n /**\n * Optional parameters for templated queries\n */\n Parameters?: Record<string, any>;\n /**\n * Optional maximum number of rows to return\n */\n MaxRows?: number;\n /**\n * Optional starting row number for pagination\n */\n StartRow?: number;\n}\n\n/**\n * Input type for GetQueryDataByNameSystemUser method calls - executes a stored query by name\n */\nexport interface GetQueryDataByNameSystemUserInput {\n /**\n * The name of the query to execute\n */\n QueryName: string;\n /**\n * Optional category ID filter\n */\n CategoryID?: string;\n /**\n * Optional category path filter (hierarchical path like \"/MJ/AI/Agents/\" or simple name)\n */\n CategoryPath?: string;\n /**\n * Optional parameters for templated queries\n */\n Parameters?: Record<string, any>;\n /**\n * Optional maximum number of rows to return\n */\n MaxRows?: number;\n /**\n * Optional starting row number for pagination\n */\n StartRow?: number;\n}\n\n/**\n * Input type for query permissions to be created with a new query\n */\nexport interface QueryPermissionInput {\n /**\n * Role ID to grant access to\n */\n RoleID: string;\n}\n\n/**\n * Input type for CreateQuery mutation calls - creates a new query with optional hierarchical category path\n */\nexport interface CreateQueryInput {\n /**\n * Required name for the query (must be unique within category)\n */\n Name: string;\n /**\n * Optional existing category ID to assign the query to\n */\n CategoryID?: string;\n /**\n * Optional category path for automatic hierarchy creation (e.g., \"Reports/Sales/Monthly\") - takes precedence over CategoryID\n */\n CategoryPath?: string;\n /**\n * Optional natural language question this query answers\n */\n UserQuestion?: string;\n /**\n * Optional general description of what the query does\n */\n Description?: string;\n /**\n * Optional SQL query text to execute (can contain Nunjucks template syntax)\n */\n SQL?: string;\n /**\n * Optional technical documentation for developers\n */\n TechnicalDescription?: string;\n /**\n * Optional original SQL before optimization or modification\n */\n OriginalSQL?: string;\n /**\n * Optional user feedback about the query\n */\n Feedback?: string;\n /**\n * Optional query approval status (defaults to 'Pending')\n */\n Status?: 'Pending' | 'Approved' | 'Rejected' | 'Expired';\n /**\n * Optional quality indicator (higher = better quality, defaults to 0)\n */\n QualityRank?: number;\n /**\n * Optional execution cost indicator (higher = more expensive to run)\n */\n ExecutionCostRank?: number;\n /**\n * Optional flag indicating if the query uses Nunjucks template syntax (auto-detected if not specified)\n */\n UsesTemplate?: boolean;\n /**\n * Optional array of permissions to create for the query\n */\n Permissions?: QueryPermissionInput[];\n}\n\n/**\n * Type for query field information\n */\nexport interface QueryField {\n ID: string;\n QueryID: string;\n Name: string;\n Description?: string;\n Type?: string;\n Sequence: number;\n SQLBaseType?: string;\n SQLFullType?: string;\n IsComputed: boolean;\n ComputationEnabled: boolean;\n ComputationDescription?: string;\n}\n\n/**\n * Type for query parameter information\n */\nexport interface QueryParameter {\n ID: string;\n QueryID: string;\n Name: string;\n Type: string;\n DefaultValue?: string;\n Comments?: string;\n IsRequired: boolean;\n}\n\n/**\n * Type for query entity information\n */\nexport interface QueryEntity {\n ID: string;\n QueryID: string;\n EntityID: string;\n EntityName?: string;\n Sequence: number;\n}\n\n/**\n * Type for query permission information\n */\nexport interface QueryPermission {\n ID: string;\n QueryID: string;\n RoleID: string;\n RoleName?: string;\n}\n\n/**\n * Result type for CreateQuery mutation calls - contains creation success status and query data\n */\nexport interface CreateQueryResult {\n /**\n * Whether the query creation was successful\n */\n Success: boolean;\n /**\n * Error message if the creation failed (optional)\n */\n ErrorMessage?: string;\n /**\n * JSON string containing the complete created query data if successful (optional)\n */\n QueryData?: string;\n /**\n * Array of fields discovered in the query (optional)\n */\n Fields?: QueryField[];\n /**\n * Array of parameters found in the query template (optional)\n */\n Parameters?: QueryParameter[];\n /**\n * Array of entities referenced by the query (optional)\n */\n Entities?: QueryEntity[];\n /**\n * Array of permissions created for the query (optional)\n */\n Permissions?: QueryPermission[];\n}\n\n/**\n * Input type for UpdateQuery mutation calls - updates an existing query\n */\nexport interface UpdateQueryInput {\n /**\n * Required ID of the query to update\n */\n ID: string;\n /**\n * Optional name for the query (must be unique within category)\n */\n Name?: string;\n /**\n * Optional category ID to move the query to\n */\n CategoryID?: string;\n /**\n * Optional category path for automatic hierarchy creation (e.g., \"Reports/Sales/Monthly\") - takes precedence over CategoryID\n */\n CategoryPath?: string;\n /**\n * Optional natural language question this query answers\n */\n UserQuestion?: string;\n /**\n * Optional general description of what the query does\n */\n Description?: string;\n /**\n * Optional SQL query text to execute (can contain Nunjucks template syntax)\n */\n SQL?: string;\n /**\n * Optional technical documentation for developers\n */\n TechnicalDescription?: string;\n /**\n * Optional original SQL before optimization or modification\n */\n OriginalSQL?: string;\n /**\n * Optional user feedback about the query\n */\n Feedback?: string;\n /**\n * Optional query approval status\n */\n Status?: 'Pending' | 'Approved' | 'Rejected' | 'Expired';\n /**\n * Optional quality indicator (higher = better quality)\n */\n QualityRank?: number;\n /**\n * Optional execution cost indicator (higher = more expensive to run)\n */\n ExecutionCostRank?: number;\n /**\n * Optional flag indicating if the query uses Nunjucks template syntax\n */\n UsesTemplate?: boolean;\n /**\n * Optional array of permissions to update for the query (replaces existing permissions)\n */\n Permissions?: QueryPermissionInput[];\n}\n\n/**\n * Result type for UpdateQuery mutation calls - contains update success status and query data\n */\nexport interface UpdateQueryResult {\n /**\n * Whether the query update was successful\n */\n Success: boolean;\n /**\n * Error message if the update failed (optional)\n */\n ErrorMessage?: string;\n /**\n * JSON string containing the complete updated query data if successful (optional)\n */\n QueryData?: string;\n /**\n * Array of fields discovered in the query (optional)\n */\n Fields?: QueryField[];\n /**\n * Array of parameters found in the query template (optional)\n */\n Parameters?: QueryParameter[];\n /**\n * Array of entities referenced by the query (optional)\n */\n Entities?: QueryEntity[];\n /**\n * Array of permissions for the query (optional)\n */\n Permissions?: QueryPermission[];\n}\n\n/**\n * Delete options input type for controlling delete behavior\n */\nexport interface DeleteQueryOptionsInput {\n /**\n * Whether to skip AI actions during deletion\n */\n SkipEntityAIActions: boolean;\n /**\n * Whether to skip regular entity actions during deletion\n */\n SkipEntityActions: boolean;\n}\n\n/**\n * Result type for DeleteQuery mutation calls - contains deletion success status and deleted query data\n */\nexport interface DeleteQueryResult {\n /**\n * Whether the query deletion was successful\n */\n Success: boolean;\n /**\n * Error message if the deletion failed (optional)\n */\n ErrorMessage?: string;\n /**\n * JSON string containing the deleted query data if successful (optional)\n */\n QueryData?: string;\n}\n\n ","import { ActionParam, ActionResult, EntityActionInvocationParams, EntityActionResult } from \"@memberjunction/actions-base\";\nimport { CompositeKey, LogError } from \"@memberjunction/core\";\nimport { GraphQLDataProvider } from \"./graphQLDataProvider\";\nimport { gql } from \"graphql-request\";\n\n/**\n * Client for executing actions and entity actions through GraphQL.\n * This class provides an easy way to execute actions from a client application,\n * similar to how the ActionEngine and EntityActionEngine work on the server.\n * \n * The GraphQLActionClient follows the same naming convention as other GraphQL clients\n * in the MemberJunction ecosystem, such as GraphQLSystemUserClient.\n * \n * @example\n * ```typescript\n * // Create the client\n * const actionClient = new GraphQLActionClient(graphQLProvider);\n * \n * // Run a regular action\n * const result = await actionClient.RunAction(\"action-id\", [\n * { Name: \"parameter1\", Value: \"value1\", Type: \"Input\" }\n * ]);\n * \n * // Run an entity action\n * const entityActionResult = await actionClient.RunEntityAction({\n * EntityAction: action,\n * InvocationType: { Name: \"SingleRecord\" },\n * EntityObject: entityObject,\n * ContextUser: user\n * });\n * ```\n */\nexport class GraphQLActionClient {\n /**\n * The GraphQLDataProvider instance used to execute GraphQL requests\n * @private\n */\n private _dataProvider: GraphQLDataProvider;\n\n /**\n * Creates a new GraphQLActionClient instance.\n * @param dataProvider The GraphQL data provider to use for queries\n */\n constructor(dataProvider: GraphQLDataProvider) {\n this._dataProvider = dataProvider;\n }\n\n /**\n * Run an action by its ID with the specified parameters.\n * \n * This method invokes an action on the server through GraphQL and returns the result.\n * Action parameters are automatically serialized as needed, and results are deserialized\n * for complex data types.\n * \n * @param actionID The ID of the action to run\n * @param params Optional parameters to pass to the action\n * @param skipActionLog Whether to skip logging the action execution (defaults to false)\n * @returns A Promise that resolves to an ActionResult object containing the result of running the action\n * \n * @example\n * ```typescript\n * const result = await actionClient.RunAction(\"action-id\", [\n * { Name: \"param1\", Value: \"value1\", Type: \"Input\" }\n * ]);\n * \n * if (result.Success) {\n * // Action was successful\n * console.log(result.Message);\n * }\n * ```\n */\n public async RunAction(\n actionID: string, \n params?: ActionParam[], \n skipActionLog: boolean = false\n ): Promise<ActionResult> {\n try {\n // Prepare the input variables\n const serializedParams = this.serializeActionParameters(params);\n const variables = this.createActionVariables(actionID, serializedParams, skipActionLog);\n \n // Execute the mutation\n const result = await this.executeActionMutation(variables);\n \n // Process the result\n return this.processActionResult(result, params);\n } catch (e) {\n return this.handleActionError(e, params);\n }\n }\n\n /**\n * Serializes action parameters to ensure complex objects are properly JSON-encoded\n * @param params The action parameters to serialize\n * @returns The serialized parameters\n * @private\n */\n private serializeActionParameters(params?: ActionParam[]): any[] | undefined {\n if (!params) {\n return undefined;\n }\n\n return params.map(p => {\n let value = p.Value;\n if (value !== null && value !== undefined && typeof value === 'object') {\n value = JSON.stringify(value);\n }\n return {\n ...p,\n Value: value\n };\n });\n }\n\n /**\n * Creates the variables for the action mutation\n * @param actionID The ID of the action to run\n * @param params The serialized action parameters\n * @param skipActionLog Whether to skip action logging\n * @returns The action variables\n * @private\n */\n private createActionVariables(\n actionID: string, \n params?: any[], \n skipActionLog: boolean = false\n ): any {\n return {\n input: {\n ActionID: actionID,\n Params: params,\n SkipActionLog: skipActionLog\n }\n };\n }\n\n /**\n * Executes the action mutation\n * @param variables The variables for the mutation\n * @returns The result of the mutation\n * @private\n */\n private async executeActionMutation(variables: any): Promise<any> {\n const mutation = gql`\n mutation RunAction($input: RunActionInput!) {\n RunAction(input: $input) {\n Success\n Message\n ResultCode\n ResultData\n }\n }\n `;\n\n return await this._dataProvider.ExecuteGQL(mutation, variables);\n }\n\n /**\n * Processes the result of an action\n * @param result The result from the GraphQL query\n * @param originalParams The original parameters passed to the action\n * @returns The processed action result\n * @private\n */\n private processActionResult(result: any, originalParams?: ActionParam[]): ActionResult {\n if (!result?.RunAction) {\n throw new Error(\"Invalid response from server\");\n }\n\n // Parse the ResultData if it exists\n let resultData = undefined;\n try {\n if (result.RunAction.ResultData) {\n resultData = JSON.parse(result.RunAction.ResultData);\n }\n } catch (e) {\n LogError(`Failed to parse action result data: ${e}`);\n }\n\n // Return a properly formatted ActionResult\n return {\n Success: result.RunAction.Success,\n Message: result.RunAction.Message,\n Result: resultData,\n LogEntry: null, // We don't return the log entry to clients\n Params: originalParams || [],\n RunParams: null // We don't return the run params to clients\n };\n }\n\n /**\n * Handles errors in the action execution\n * @param e The error\n * @param originalParams The original parameters passed to the action\n * @returns An error result\n * @private\n */\n private handleActionError(e: unknown, originalParams?: ActionParam[]): ActionResult {\n const error = e as Error;\n LogError(`Error running action: ${error}`);\n return {\n Success: false,\n Message: `Error: ${error.message}`,\n Result: null,\n LogEntry: null,\n Params: originalParams || [],\n RunParams: null\n };\n }\n\n /**\n * Run an entity action with the specified parameters.\n * \n * This method invokes an entity action on the server through GraphQL and returns the result.\n * Entity actions are operations that can be performed on entity records, such as validation,\n * business logic, or custom processing. They can operate on a single record, a view, or a list.\n * \n * @param params The parameters for the entity action, including the action to run, \n * invocation type, entity object or view/list IDs, and optional parameters\n * @returns A Promise that resolves to an EntityActionResult object containing the result\n * \n * @example\n * ```typescript\n * // Run an entity action on a single record\n * const result = await actionClient.RunEntityAction({\n * EntityAction: action,\n * InvocationType: { Name: \"SingleRecord\" },\n * EntityObject: entityObject,\n * ContextUser: user\n * });\n * \n * // Run an entity action on a view\n * const viewResult = await actionClient.RunEntityAction({\n * EntityAction: action,\n * InvocationType: { Name: \"View\" },\n * ViewID: \"view-id\",\n * ContextUser: user\n * });\n * ```\n */\n public async RunEntityAction(params: EntityActionInvocationParams): Promise<EntityActionResult> {\n try {\n // Create the GraphQL input\n const input = this.createEntityActionInput(params);\n\n // Execute the GraphQL mutation\n const result = await this.executeEntityActionMutation(input);\n\n // Process the result\n return this.processEntityActionResult(result);\n } catch (e) {\n return this.handleEntityActionError(e);\n }\n }\n\n /**\n * Creates the GraphQL input for an entity action\n * @param params The entity action parameters\n * @returns The GraphQL input\n * @private\n */\n private createEntityActionInput(params: EntityActionInvocationParams): any {\n const input: any = {\n EntityActionID: params.EntityAction.ID,\n InvocationType: params.InvocationType.Name,\n ListID: params.ListID,\n ViewID: params.ViewID,\n };\n \n // Add parameters if available\n if ((params as any).Params) {\n input.Params = this.convertActionParams((params as any).Params);\n }\n \n // Add entity information if available\n if (params.EntityObject) {\n this.addEntityInformation(input, params.EntityObject);\n }\n\n return input;\n }\n\n /**\n * Converts action parameters to the format expected by the GraphQL API\n * @param params The action parameters\n * @returns The converted parameters\n * @private\n */\n private convertActionParams(params: any[]): any[] {\n return params.map(p => {\n let value = p.Value;\n if (value !== null && value !== undefined && typeof value === 'object') {\n value = JSON.stringify(value);\n }\n return {\n Name: p.Name,\n Value: value,\n Type: p.Type\n };\n });\n }\n\n /**\n * Adds entity information to the input object\n * @param input The input object to add to\n * @param entityObject The entity object\n * @private\n */\n private addEntityInformation(input: any, entityObject: any): void {\n // Prefer using entity name instead of ID for better code readability\n input.EntityName = entityObject.EntityInfo?.Name;\n \n // Convert the entity's primary key to the expected format\n if (entityObject.PrimaryKey) {\n input.PrimaryKey = this.convertPrimaryKey(entityObject.PrimaryKey);\n }\n }\n\n /**\n * Converts a primary key object to the format expected by the GraphQL API\n * @param primaryKey The primary key object\n * @returns The converted primary key\n * @private\n */\n private convertPrimaryKey(primaryKey: any): any {\n return {\n KeyValuePairs: primaryKey.KeyValuePairs.map(kvp => this.convertKeyValuePair(kvp))\n };\n }\n\n /**\n * Converts a key-value pair to a string format\n * @param kvp The key-value pair\n * @returns The converted key-value pair\n * @private\n */\n private convertKeyValuePair(kvp: any): any {\n return {\n FieldName: kvp.FieldName,\n Value: kvp.Value !== null && kvp.Value !== undefined ? \n (typeof kvp.Value === 'object' ? JSON.stringify(kvp.Value) : kvp.Value.toString()) \n : null\n };\n }\n\n /**\n * Executes the GraphQL mutation for an entity action\n * @param input The GraphQL input\n * @returns The GraphQL result\n * @private\n */\n private async executeEntityActionMutation(input: any): Promise<any> {\n const mutation = gql`\n mutation RunEntityAction($input: EntityActionInput!) {\n RunEntityAction(input: $input) {\n Success\n Message\n ResultData\n }\n }\n `;\n\n return await this._dataProvider.ExecuteGQL(mutation, { input });\n }\n\n /**\n * Processes the result of an entity action\n * @param result The GraphQL result\n * @returns The processed entity action result\n * @private\n */\n private processEntityActionResult(result: any): EntityActionResult {\n if (!result?.RunEntityAction) {\n throw new Error(\"Invalid response from server\");\n }\n\n // Parse the ResultData\n let resultData = {};\n try {\n if (result.RunEntityAction.ResultData) {\n resultData = JSON.parse(result.RunEntityAction.ResultData);\n }\n } catch (e) {\n LogError(`Failed to parse entity action result data: ${e}`);\n }\n\n // Return a properly formatted EntityActionResult\n return {\n Success: result.RunEntityAction.Success,\n Message: result.RunEntityAction.Message,\n RunParams: null, // We don't return run params to clients\n LogEntry: null, // We don't return the log entry to clients\n ...resultData\n };\n }\n\n /**\n * Handles errors in the entity action\n * @param e The error\n * @returns An error result\n * @private\n */\n private handleEntityActionError(e: unknown): EntityActionResult {\n const error = e as Error;\n LogError(`Error running entity action: ${error}`);\n return {\n Success: false,\n Message: `Error: ${error.message}`,\n RunParams: null,\n LogEntry: null\n };\n }\n}"],"names":["TransactionGroupBase","gql","SafeJSONParse","TransactionResult","ProviderConfigDataBase","ProviderBase","uuidv4","LogError","UserInfo","ViewInfo","ProviderType","BaseEntityResult","EntityFieldTSType","TransactionItem","GraphQLClient","UserRoleInfo","createClient","Observable","openDB","SetProvider","MJGlobal","MJEventType"],"mappings":"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"}