@kweli/cs-rest
Version:
Simple authentication and REST calls for OpenText Content Server.
1 lines • 58 kB
Source Map (JSON)
{"version":3,"file":"cs-rest.cjs","sources":["../src/rpc-client/error-codes.ts","../src/utils/subtypes-enum.ts","../src/rpc-client/index.ts","../src/handlers/service-abstract.ts","../src/handlers/auth.ts","../src/utils/is-node.ts","../src/handlers/nodes.ts","../src/utils/workflow-initiator.ts","../src/handlers/workflow.ts","../src/handlers/rhcore.ts","../src/handlers/search.ts","../src/handlers/members.ts","../src/handlers/versions.ts","../src/handlers/webreports.ts","../src/Session.ts","../src/utils/axios-factory.ts","../src/index.ts"],"sourcesContent":["const ErrorCodes = {\n PARSEERROR: {\n code: -32700,\n message: \"Parse error\",\n },\n INVALIDREQUEST: {\n code: -32600,\n message: \"Invalid Request\",\n },\n METHODNOTFOUND: {\n code: -32601,\n message: \"Method not found\",\n },\n INVALIDPARAMS: {\n code: -32602,\n message: \"Invalid params\",\n },\n INTERNALERROR: {\n code: -32603,\n message: \"Internal error\",\n },\n} as const;\n\ntype ErrorMessage = {\n message: string;\n code: number;\n data: Array<any> | Record<string, any>;\n};\n\nconst isObject = (x: unknown): x is Object =>\n typeof x === \"object\" && x !== null;\n\nclass RPCError extends Error {\n code: number;\n data: Array<any> | Record<string, any>;\n\n constructor(\n message: string | ErrorMessage = ErrorCodes.INTERNALERROR.message,\n data = null,\n code: number = ErrorCodes.INTERNALERROR.code\n ) {\n if (isObject(message)) {\n const messageObj = message as RPCError;\n\n super(messageObj.message);\n\n this.code = messageObj.code;\n this.data = messageObj.data;\n } else {\n super(message as string);\n\n this.code = code;\n this.data = data;\n }\n }\n}\n\nexport { RPCError, ErrorCodes };\n","/**\n * How many do we actually care about?\n */\n\nexport enum SubTypesEnum {\n Alias = 1,\n Category = 131,\n Collection = 298,\n CompoundDoc = 136,\n Document = 144,\n Folder = 0,\n Generation = 2,\n Project = 202,\n ProjectVol = 201,\n Release = 138,\n Revision = 139,\n ScriptNode = 32901,\n Simplate = 31678,\n}\n\n// export enum SubTypesEnum {\n// // TwoWayTee = 294,\n// Accession = 834,\n// ActiveFolder = 1298,\n// Activeview = 30309,\n// ActivityManager = 907,\n// Alias = 1,\n// Appearance = 480,\n// AppearanceFolder = 483,\n// AppearancesVolume = 481,\n// ArchiveFolder = 31711,\n// BackupManager = 290,\n// BackupProcess = 291,\n// BestBets = 274,\n// Blog = 356,\n// BlogEntry = 357,\n// BoxFolder = 530,\n// Category = 131,\n// CategoryFolder = 132,\n// Channel = 207,\n// ChannelVol = 209,\n// Classification = 199,\n// ClassificationShortcut = 197,\n// ClassificationTree = 196,\n// ClassifiedItems = 194,\n// Collection = 298,\n// Column = 902,\n// Comments = 345,\n// CommentsReply = 348,\n// CommentsVol = 346,\n// CommExpertContainer = 3030338,\n// CommExpertGroup = 3030339,\n// CommStore = 3030329,\n// CommTemplate = 3030002,\n// CommTemplateFolder = 3030333,\n// CommTemplateVol = 3030004,\n// CommURLStore = 3030335,\n// CommWorkspace = 3030334,\n// CommXSLVolume = 3030205,\n// CompoundDoc = 136,\n// CompoundEMail = 557,\n// ContentModuleFolder = 3030372,\n// CSApplicationManifest = 32658,\n// CSApplicationsVolume = 32657,\n// CustomView = 146,\n// CustomViewTemplate = 844,\n// DataFlowManager = 270,\n// DataSourceFolder = 276,\n// DirWalker = 277,\n// Discussion = 215,\n// DispositionGroup = 602,\n// Document = 144,\n// DocumentLLNode = 1297,\n// DocumentServer = 283,\n// Dossier = 32912,\n// DossierCabinet = 32916,\n// DossierCabinetArchive = 31707,\n// DossierTemplate = 32914,\n// DossierTemplateFolder = 31709,\n// DossierTemplatesVolume = 32917,\n// DossierTemplateVolume = 32915,\n// DossierVolume = 32913,\n// DPSBinding = 31602,\n// DPSFolder = 31601,\n// DPSVolume = 31603,\n// DTDLLNode = 335,\n// DynamicView = 900,\n// EMail = 749,\n// EmailConversationItems = 2504,\n// EnterpriseArchiveDocument = 753,\n// Facet = 904,\n// FacetFolder = 905,\n// FacetTree = 903,\n// FailedFolder = 1299,\n// FixedSystemColumn = 906,\n// Folder = 0,\n// Form = 223,\n// Generation = 2,\n// GENERICCONTENTMODULE = 3030371,\n// GlobalAppearance = 482,\n// HoldContainer = 833,\n// HTMLConversion = 282,\n// HTMLFormView = 226,\n// Importer = 293,\n// Inbox = 731,\n// IndexEngine = 368,\n// IndexTracer = 147,\n// IndexUpdate = 281,\n// InternalOTDS = 924,\n// ItemTemplateVol = 541,\n// ItemTemplateVolFolder = 542,\n// JournalVolume = 361,\n// LibraryExtractor = 259,\n// LibraryObj = 272,\n// LLNodeEmailFolder = 751,\n// LLNodeFAQ = 123475,\n// LLNodeFAQEntry = 123476,\n// LLNodeForum = 123469,\n// LLNodeForumEntry = 123470,\n// LLNodeURQuestion = 430,\n// LLNodeURReply = 432,\n// Locators = 422,\n// Mailbox = 732,\n// MailStore = 3030331,\n// ManagedSpace = 31710,\n// MediaType = 410,\n// MediaTypesContainer = 414,\n// MemcachedFolder = 919,\n// MemcachedProcess = 920,\n// Merge = 273,\n// MicroPost = 1281,\n// MicroPostVolume = 1282,\n// MultiVolClassification = 372,\n// MultiVolClassificationProxy = 374,\n// MultiVolClassificationTree = 373,\n// MyReservedItems = 870,\n// MyWorkbenches = 532,\n// NAVMENUVOL = 3030756,\n// News = 208,\n// OTCIndexObj = 257,\n// Partition = 371,\n// PartitionMap = 370,\n// PersonalComm = 3030203,\n// PersonalCommSystemVolume = 3030003,\n// PersonalCommVol = 3030204,\n// PersonalStagingFolder = 398,\n// PersonalWebpage = 3030343,\n// PhysicalItemBox = 424,\n// PhysicalItemContainer = 412,\n// PhysicalItemCopy = 419,\n// PhysicalItem_non_Container = 411,\n// PhysObjAdmin = 415,\n// PhysObjBatchLabels = 418,\n// PhysObjCirculation = 416,\n// PhysObjReports = 417,\n// Poll = 218,\n// Process = 271,\n// Profile = 195,\n// Project = 202,\n// ProjectTemplate = 543,\n// ProjectVol = 201,\n// Prospector = 384,\n// ProspectorQueries = 380,\n// ProspectorSnapshot = 387,\n// Provenance = 829,\n// Proxy = 260,\n// PublishingFolder = 31712,\n// PublishingFolderVolume = 31713,\n// QAFolder = 441,\n// QueryFile = 296,\n// QuestionVolume = 431,\n// RecentItems = 327,\n// RecordType = 425,\n// RecordTypesContainer = 428,\n// RedForm = 32918,\n// RedFormVolume = 32919,\n// Release = 138,\n// RemoteLLDataSource = 381,\n// Reply = 134,\n// Report = 299,\n// Revision = 139,\n// RIMSDisposition = 555,\n// RIMSDispositionsContainer = 554,\n// RIMSHoldMaintenance = 552,\n// RIMSRsiContainer = 553,\n// RMAdministration = 556,\n// RMClassification = 551,\n// RMFolder = 426,\n// RMPart = 427,\n// RMReportsContainer = 558,\n// RMThesaurus = 559,\n// ScanConfigurationVolume = 2505,\n// ScheduledHoldCriteria = 835,\n// ScriptNode = 32901,\n// SearchBroker = 258,\n// SearchEngine = 369,\n// SearchManager = 269,\n// SearchReport = 278,\n// SearchResultsTemplate = 383,\n// SearchTemplate = 292,\n// Simplate = 31678,\n// SkyPodLLVolume = 49547,\n// SliceFolder = 275,\n// SocialObject = 1280,\n// SocialObjectVolume = 1283,\n// SPCJOBDESCR = 797,\n// SPCJOBDESCRFOLDER = 796,\n// SPCVOLUME = 795,\n// spdcommittee = 3030202,\n// spdcommitteevol = 3030201,\n// spdcommitteevolume = 3030001,\n// spdemail = 3030130,\n// Spider = 280,\n// StorageManagement = 421,\n// SubmitVersionNode = 231,\n// Task = 206,\n// TaskGroup = 205,\n// TaskList = 204,\n// TaskListVol = 210,\n// TaskMilestone = 212,\n// Template = 230,\n// TemplateFolder = 268,\n// TextDocument = 145,\n// Topic = 130,\n// Transfers = 423,\n// TransportBox = 531,\n// TransportItem = 526,\n// TransportItemPart = 527,\n// UrgentRequests = 3030330,\n// URL = 140,\n// VirtualFolder = 899,\n// VolBlog = 123461,\n// VolCategories = 133,\n// VolClassification = 198,\n// VolComments = 347,\n// VolDAP = 987352,\n// VolDeletedItems = 405,\n// VolDirectory = 375,\n// VolDiscussion = 143,\n// VolDomainWorkspace = 180,\n// VolDTD = 336,\n// VolEditWorkflow = 162,\n// VolFacets = 901,\n// VolLibrary = 141,\n// VolOrphan = 403,\n// VolPersonalStaging = 397,\n// VolPerspectives = 908,\n// VolPhysObj = 413,\n// VolRecMan = 550,\n// VolRelease = 137,\n// VolReports = 211,\n// VolSystem = 148,\n// VolTracer = 149,\n// VolumeFolder = 484,\n// VolumeLLVolume = 1296,\n// VolWarehouse = 525,\n// VolWorkbin = 142,\n// VolWorkflow = 161,\n// WarehouseFolder = 529,\n// WebFormConnectionVolume = 236,\n// WebFormDatabaseConnection = 235,\n// WebFormLookup = 234,\n// WebFormLookupVolume = 233,\n// WebReports = 30303,\n// WFMapLLNode = 128,\n// WFStatusNode = 190,\n// WIKI = 5573,\n// WIKIPAGE = 5574,\n// Workbench = 528,\n// WorkflowAttachments = 154,\n// XMLActivatorCon = 286,\n// XMLActivatorProd = 285,\n// }\n","import { RPCError } from \"./error-codes\";\nimport Session from \"../Session\";\n\nconst sequence = {\n index: 0,\n get next(): number {\n this.index = this.index + 1;\n return this.index;\n },\n};\n\ntype requestObjectType = {\n jsonrpc: string;\n method: string;\n id: number;\n params: Record<string, any> | Array<any>;\n};\n\nexport default class RPCClient {\n session: Session;\n relativePath: string;\n\n protected _batchQueue: Array<requestObjectType>;\n\n constructor(session: Session, relativePath: string) {\n this.session = session;\n this.relativePath = relativePath;\n this.resetQueue();\n }\n\n protected requestObject(\n method: string,\n params: Record<string, any> | Array<any>,\n id: number\n ): requestObjectType {\n return {\n jsonrpc: \"2.0\",\n method,\n id,\n params,\n };\n }\n\n protected handleResponse(data) {\n if (Object.prototype.hasOwnProperty.call(data, \"result\")) {\n return data.result;\n } else if (Object.prototype.hasOwnProperty.call(data, \"error\")) {\n const err = data.error;\n throw new RPCError(err.message, err.data, err.code);\n } else {\n throw Error(\"The server did not respond correctly.\");\n }\n }\n\n // https://www.jsonrpc.org/specification#request_object\n // params is allowed to be null!\n // also on queue function below\n async request(method: string, params: any, id: number = sequence.next) {\n const response = await this.session.postBody(this.relativePath, {\n rpc: this.requestObject(method, params, id),\n });\n\n return this.handleResponse(response.data);\n }\n\n private resetQueue(): void {\n this._batchQueue = [];\n }\n\n queue(method: string, params: any, id: number = sequence.next): RPCClient {\n this._batchQueue.push(this.requestObject(method, params, id));\n return this;\n }\n\n async batch(throwOnError: boolean = false): Promise<any> {\n const queue = this._batchQueue;\n this.resetQueue();\n const response = await this.session.postBody<any>(this.relativePath, {\n rpc: queue,\n });\n\n return (response.data.data ?? []).map((item) => {\n if (throwOnError) {\n return this.handleResponse(item);\n } else {\n try {\n return this.handleResponse(item);\n } catch (e) {\n return e;\n }\n }\n });\n }\n\n rhnode(dataid, method, args = [], id = sequence.next) {\n const params = {\n dataid,\n args,\n };\n\n return this.request(method, params, id);\n }\n\n rhnodeQueue(dataid, method, args = [], id = sequence.next) {\n const params = {\n dataid,\n args,\n };\n\n return this.queue(method, params, id);\n }\n}\n","import type Session from \"../Session\";\n\nclass ServiceAbstract {\n protected _session: Session;\n\n constructor(session: Session) {\n this._session = session;\n }\n\n get session() {\n return this._session;\n }\n}\n\nexport default ServiceAbstract;\n","import ServiceAbstract from \"./service-abstract\";\n\nclass Auth extends ServiceAbstract {\n auth() {\n return this.session.get(\"/api/v1/auth/\");\n }\n}\n\nexport default Auth;\n","/**\n * A simple check whether we're in a browser or node context.\n *\n * @returns\n */\nexport const isNode = () => typeof window === \"undefined\";\n","import { SubTypesEnum } from \"../utils/subtypes-enum\";\r\nimport ServiceAbstract from \"./service-abstract\";\r\nimport { isNode } from \"../utils/is-node\";\r\nimport { components } from \"../types/cs-rest-types/schema\";\r\n\r\n// type TNewVersionType = components[\"schemas\"][\"versions_NewVersionInfo\"];\r\n\r\nclass Nodes extends ServiceAbstract {\r\n addablenodetypes(dataid: number) {\r\n return this.session.get<components[\"schemas\"][\"nodes_AddableTypesInfo\"]>(\r\n `api/v1/nodes/${dataid}/addablenodetypes`,\r\n );\r\n }\r\n\r\n async addDocument({\r\n parent_id,\r\n fileHandler,\r\n // apiVersion = \"v1\",\r\n name = undefined,\r\n description = undefined,\r\n options = {},\r\n }: {\r\n parent_id: number;\r\n fileHandler: File | string;\r\n // apiVersion?: \"v1\" | \"v2\";\r\n name?: string;\r\n description?: string;\r\n options?: Record<string, any>;\r\n }) {\r\n const url = `api/v1/nodes`;\r\n\r\n if (isNode() && this.session._isString(fileHandler)) {\r\n // node.js\r\n const [fs, path] = await Promise.all([import(\"fs\"), import(\"path\")]);\r\n const f = fs.createReadStream(fileHandler);\r\n\r\n const params = {\r\n body: {\r\n ...options,\r\n type: SubTypesEnum.Document,\r\n name: name ?? path.basename(fileHandler),\r\n parent_id,\r\n },\r\n file: f,\r\n };\r\n\r\n return await this.session.postForm<\r\n components[\"schemas\"][\"nodes_CreateResponse\"]\r\n >(url, params);\r\n } else if (this.session._isFile(fileHandler)) {\r\n // browser\r\n\r\n const params = {\r\n body: {\r\n ...options,\r\n type: SubTypesEnum.Document,\r\n name,\r\n description,\r\n parent_id,\r\n },\r\n file: fileHandler,\r\n };\r\n\r\n return await this.session.postForm<\r\n components[\"schemas\"][\"nodes_CreateResponse\"]\r\n >(url, params);\r\n } else {\r\n throw new Error(\"Invalid file.\");\r\n }\r\n }\r\n\r\n async addDocumentMajor({\r\n parent_id,\r\n fileHandler,\r\n name = undefined,\r\n description = undefined,\r\n options = {},\r\n }: {\r\n parent_id: number;\r\n fileHandler: File | string;\r\n name?: string;\r\n description?: string;\r\n options: Record<string, any>;\r\n }) {\r\n const response = await this.addDocument({\r\n parent_id,\r\n fileHandler,\r\n name,\r\n options: {\r\n ...options,\r\n advanced_versioning: true,\r\n },\r\n });\r\n\r\n const dataid = response.data.id;\r\n\r\n await this.session.versions.promote({\r\n dataid,\r\n versionNumber: 1,\r\n description,\r\n });\r\n\r\n await this.session.versions.deleteVersion({\r\n dataid,\r\n versionNumber: 1,\r\n });\r\n\r\n return response;\r\n }\r\n\r\n addItem(type, parent_id, name, params = {}) {\r\n return this.session.postBody<\r\n components[\"schemas\"][\"nodes_V2ResponseElementPost\"]\r\n >(\"api/v2/nodes\", {\r\n type,\r\n parent_id,\r\n name,\r\n ...params,\r\n });\r\n }\r\n\r\n node({ dataid, apiVersion = \"v2\", params = {} }) {\r\n return this.session.get(`api/${apiVersion}/nodes/${dataid}`, {\r\n params,\r\n });\r\n }\r\n\r\n ancestors(dataid, params = {}) {\r\n return this.session.get(`api/v1/nodes/${dataid}/ancestors`, {\r\n params,\r\n });\r\n }\r\n\r\n volumeInfo(objType) {\r\n return this.session.get<\r\n components[\"parameters\"][\"suppress_response_codes\"]\r\n >(`api/v1/volumes/${objType}`);\r\n }\r\n\r\n volumes() {\r\n return this.session.get(\"api/v2/volumes\");\r\n }\r\n\r\n addFolder(parent_id, name, params = {}) {\r\n return this.addItem(SubTypesEnum.Folder, parent_id, name, params);\r\n }\r\n\r\n addGeneration(parent_id, name, original_id, version_number, params = {}) {\r\n return this.addItem(SubTypesEnum.Generation, parent_id, name, {\r\n original_id,\r\n version_number,\r\n ...params,\r\n });\r\n }\r\n\r\n nodes(dataid, params = {}) {\r\n // https://developer.opentext.com/webaccess/#url=%2Fawd%2Fresources%2Fapis%2Fcs-rest-api-for-cs-16-s%23!%2Fnodes%2FgetSubnodes_get_15&tab=501\r\n return this.session.get(`api/v2/nodes/${dataid}/nodes`, {\r\n params,\r\n });\r\n }\r\n\r\n children(dataid, params = {}) {\r\n return this.nodes(dataid, params);\r\n }\r\n\r\n delete(dataid) {\r\n return this.session.delete(`api/v1/nodes/${dataid}`);\r\n }\r\n\r\n download({ dataid, apiVersion = \"v1\", filePath }) {\r\n // this.session.nodes.download(1267501, 'v2', '/Users/chris/Downloads/test.pdf')\r\n if (isNode()) {\r\n return this.session\r\n .get<any>(`api/${apiVersion}/nodes/${dataid}/content`, {\r\n responseType: \"stream\",\r\n })\r\n .then(async (response) => {\r\n const fs = await import(\"fs\");\r\n const writer = fs.createWriteStream(filePath);\r\n\r\n response.data.pipe(writer);\r\n\r\n return new Promise((resolve, reject) => {\r\n writer.on(\"finish\", resolve);\r\n writer.on(\"error\", reject);\r\n });\r\n });\r\n } else {\r\n return Promise.reject(\"Not implemented yet\");\r\n }\r\n }\r\n\r\n audit({ dataid, apiVersion = \"v2\", params = {} }) {\r\n return this.session.get(`api/${apiVersion}/nodes/${dataid}/audit`, {\r\n params,\r\n });\r\n }\r\n}\r\n\r\nexport default Nodes;\r\n","import Session from \"../Session\";\n\nimport { components } from \"../types/cs-rest-types/schema\";\n\ntype draftprocesses_DraftProcess =\n components[\"schemas\"][\"draftprocesses_DraftProcess\"];\n\ntype forms_WorkflowPropertiesFormInfo =\n components[\"schemas\"][\"forms_WorkflowPropertiesFormInfo\"];\n\ntype draftprocesses_DraftProcess_Put =\n components[\"schemas\"][\"draftprocesses_DraftProcess_Put\"];\n\nexport type TWorkflowPut = {\n action: \"Initiate\" | \"formUpdate\";\n values?: any;\n comment?: string;\n authentication_info?: { password: string };\n};\n\nclass WorkflowInitiator {\n workflowPropertiesInfo: forms_WorkflowPropertiesFormInfo | null = null;\n\n constructor(private session: Session, private mapId: number) {}\n\n /**\n * This method prepares the workflow for initiation. It must be called before any other method.\n */\n async start() {\n this.workflowPropertiesInfo = await this.session.workflow.start(this.mapId);\n }\n\n get form() {\n return this.workflowPropertiesInfo.forms[0];\n }\n\n findWorkflowAttribute(attributeName: string) {\n const properties: Record<string, any> = this.form.schema.properties;\n\n return Object.entries(properties).find(\n ([workflowName, value]) => value.title === attributeName\n );\n }\n\n get processId(): number {\n // @ts-ignore - This is missing in the openapi schema.\n return this.workflowPropertiesInfo.data.process_id;\n }\n\n get attachmentsFolderId(): number | undefined {\n const dataPackages = this.workflowPropertiesInfo.data.data_packages;\n const attachmentPkg = dataPackages.find(\n (pkg) => pkg.type === 1 && pkg.sub_type === 1\n );\n return attachmentPkg?.data.attachment_folder_id;\n }\n\n get wantComments(): boolean {\n return this.workflowPropertiesInfo.data.comments_on;\n }\n\n get wantAuthentication(): boolean {\n return this.workflowPropertiesInfo.data.authentication;\n }\n\n setWorkflowAttribute(\n attributeName: string,\n value: any\n ): typeof WorkflowInitiator {\n const [fieldName, definition] =\n this.findWorkflowAttribute(attributeName) ?? [];\n\n const attributeType = definition.type;\n const isArray = attributeType === \"array\";\n\n if (isArray === Array.isArray(value)) {\n this.form.data[fieldName] = value;\n return WorkflowInitiator;\n } else {\n throw new Error(\"Invalid type.\");\n }\n }\n\n async formUpdate() {\n return await this.session.workflow.draftprocessesPut(this.processId, {\n action: \"formUpdate\",\n values: this.form.data,\n });\n }\n\n async initiate({\n comment,\n password,\n }: { comment?: string; password?: string } = {}) {\n await this.formUpdate();\n\n const initiateValues = {\n action: \"Initiate\",\n ...(this.wantComments && { comment }),\n ...(this.wantAuthentication && { authentication_info: { password } }),\n } as const;\n\n const response = await this.session.workflow.draftprocessesPut(\n this.processId,\n initiateValues\n );\n\n return response;\n }\n}\n\nexport { WorkflowInitiator };\n","import ServiceAbstract from \"./service-abstract\";\r\nimport { components } from \"../types/cs-rest-types/schema\";\r\nimport { TWorkflowPut, WorkflowInitiator } from \"../utils/workflow-initiator\";\r\n\r\nclass Workflow extends ServiceAbstract {\r\n workflowInitiator(mapId: number): WorkflowInitiator {\r\n return new WorkflowInitiator(this.session, mapId);\r\n }\r\n\r\n start(mapId: number) {\r\n return this.draftprocesses(mapId)\r\n .then((draftProcess) => {\r\n // this is a bug in the definition?\r\n // @ts-ignore\r\n return draftProcess.results.draftprocess_id as number;\r\n })\r\n .then((draftprocessId: number) =>\r\n this.draftprocessesUpdate(draftprocessId)\r\n );\r\n }\r\n\r\n async draftprocesses(workflowId: number) {\r\n const { data } = await this.session.postForm<\r\n components[\"schemas\"][\"draftprocesses_DraftProcess_V2EmptyResponse\"]\r\n >(\"api/v2/draftprocesses\", {\r\n workflow_id: workflowId,\r\n });\r\n\r\n return data;\r\n }\r\n\r\n async draftprocessesUpdate(draftprocessId: number) {\r\n const { data } = await this.session.get<\r\n components[\"schemas\"][\"forms_WorkflowPropertiesFormInfo\"]\r\n >(\"api/v1/forms/draftprocesses/update\", {\r\n params: {\r\n draftprocess_id: draftprocessId,\r\n },\r\n });\r\n\r\n return data;\r\n }\r\n\r\n async draftprocessesPut(draftprocessId: number, body: TWorkflowPut) {\r\n const { data } = await this.session.putForm<\r\n components[\"schemas\"][\"draftprocesses_DraftProcess_PutV2EmptyResponse\"]\r\n >(`api/v2/draftprocesses/${draftprocessId}`, {\r\n body,\r\n });\r\n\r\n return data;\r\n }\r\n}\r\n\r\nexport default Workflow;\r\n","import ServiceAbstract from \"./service-abstract\";\r\n\r\nclass RHCore extends ServiceAbstract {\r\n scriptNode<T>(id, body = {}) {\r\n return this.session.postForm<T>(`api/v1/rhcore/${id}`, body);\r\n }\r\n}\r\n\r\nexport default RHCore;\r\n","import ServiceAbstract from \"./service-abstract\";\n\nclass Search extends ServiceAbstract {\n search(where, params = {}) {\n return this.session.postBody(\"api/v2/search\", {\n where,\n ...params,\n });\n }\n\n regions(params = {}) {\n return this.session.get(\"api/v1/regions\", params);\n }\n}\n\nexport default Search;\n","import Session from \"../Session\";\nimport ServiceAbstract from \"./service-abstract\";\n\nclass Members extends ServiceAbstract {\n // public readonly USER: 0\n // public readonly GROUP: 1\n\n public readonly USER: number;\n public readonly GROUP: number;\n\n constructor(session: Session) {\n super(session);\n\n this.USER = 0;\n this.GROUP = 1;\n }\n userQuery(query, options = {}, version = \"v2\") {\n const params = {\n limit: 20,\n where_type: JSON.stringify([this.USER, this.GROUP]),\n query,\n ...options,\n };\n\n return this.session.get(`api/${version}/members`, { params });\n }\n\n member(id, version = \"v2\") {\n return this.session.get(`api/${version}/members/${id}`);\n }\n}\n\nexport default Members;\n","import { isNode } from \"../utils/is-node\";\r\nimport ServiceAbstract from \"./service-abstract\";\r\nimport { components } from \"../types/cs-rest-types/schema\";\r\n\r\ntype TNewVersionType = components[\"schemas\"][\"versions_NewVersionInfo\"];\r\n\r\nclass Versions extends ServiceAbstract {\r\n async addVersion({\r\n dataid,\r\n fileHandler,\r\n options = {},\r\n }: {\r\n dataid: number;\r\n fileHandler: File | string;\r\n options?: Record<string, any>;\r\n }) {\r\n console.assert(dataid != null, \"dataid cannot be null\");\r\n console.assert(fileHandler != null, \"fileHandler cannot be null\");\r\n\r\n const url = `api/v1/nodes/${dataid}/versions`;\r\n\r\n if (isNode() && this.session._isString(fileHandler)) {\r\n // node.js\r\n const fs = await import(\"fs\");\r\n const f = fs.createReadStream(fileHandler);\r\n\r\n const params = {\r\n file: f,\r\n ...options,\r\n };\r\n\r\n return this.session.postForm<TNewVersionType>(url, params);\r\n } else if (this.session._isFile(fileHandler)) {\r\n // browser\r\n const params = {\r\n file: fileHandler,\r\n ...options,\r\n };\r\n\r\n return this.session.postForm<TNewVersionType>(url, params);\r\n } else {\r\n throw new Error(\"Invalid file.\");\r\n }\r\n }\r\n\r\n download({ dataid, version, filePath }) {\r\n console.assert(dataid != null, \"dataid cannot be null\");\r\n console.assert(version != null, \"version cannot be null\");\r\n console.assert(filePath != null, \"filePath cannot be null\");\r\n\r\n if (isNode()) {\r\n return this.session\r\n .get<any>(`api/v1/nodes/${dataid}/versions/${version}/content`, {\r\n responseType: \"stream\",\r\n })\r\n .then(async (response) => {\r\n const fs = await import(\"fs\");\r\n const writer = fs.createWriteStream(filePath);\r\n\r\n response.data.pipe(writer);\r\n\r\n return new Promise((resolve, reject) => {\r\n writer.on(\"finish\", resolve);\r\n writer.on(\"error\", reject);\r\n });\r\n });\r\n } else {\r\n return Promise.reject(\"Not implemented yet\");\r\n }\r\n }\r\n\r\n list(dataid: number) {\r\n const url = `api/v1/nodes/${dataid}/versions`;\r\n return this.session.get(url);\r\n }\r\n version(dataid, version_number = \"latest\") {\r\n // latest not supported in v2\r\n const url = `api/v1/nodes/${dataid}/versions/${version_number}`;\r\n return this.session.get(url);\r\n }\r\n\r\n promote({ dataid, versionNumber, description = null }) {\r\n console.assert(dataid != null, \"dataid cannot be null\");\r\n console.assert(versionNumber != null, \"number_to_keep must be an integer\");\r\n\r\n const url = `api/v2/nodes/${dataid}/versions/${versionNumber}/promote`;\r\n\r\n return this.session.postBody(url, {\r\n ...(!!description && {\r\n description,\r\n }),\r\n });\r\n }\r\n\r\n deleteVersion({ dataid, versionNumber, apiVersion = \"v1\" }) {\r\n console.assert(dataid != null, \"dataid cannot be null\");\r\n console.assert(versionNumber != null, \"number_to_keep must be an integer\");\r\n\r\n const url = `api/${apiVersion}/nodes/${dataid}/versions/${versionNumber}`;\r\n\r\n // careful with deleteForm or deleteBody\r\n return this.session.delete(url);\r\n }\r\n\r\n purge({ dataid, number_to_keep = 1 }) {\r\n console.assert(dataid != null, \"dataid cannot be null\");\r\n console.assert(!isNaN(number_to_keep), \"number_to_keep must be an integer\");\r\n\r\n // delete parameters not supported\r\n // https://stackoverflow.com/questions/51069552/axios-delete-request-with-body-and-headers\r\n // number_to_keep is ignored\r\n\r\n const url = `api/v2/nodes/${dataid}/versions`;\r\n\r\n return this.session.deleteForm(url, {\r\n number_to_keep,\r\n });\r\n }\r\n}\r\n\r\nexport default Versions;\r\n","import ServiceAbstract from \"./service-abstract\";\n\nclass WebReports extends ServiceAbstract {\n run(dataid, params = {}) {\n const url = `api/v1/nodes/${dataid}/output`;\n return this.session.get(url, { params });\n }\n}\n\nexport default WebReports;\n","import axiosFactory, { CSRestOptions } from \"./utils/axios-factory\";\r\nimport Auth from \"./handlers/auth\";\r\nimport Nodes from \"./handlers/nodes\";\r\nimport Workflow from \"./handlers/workflow\";\r\nimport RHCore from \"./handlers/rhcore\";\r\nimport Search from \"./handlers/search\";\r\nimport Members from \"./handlers/members\";\r\nimport Versions from \"./handlers/versions\";\r\nimport WebReports from \"./handlers/webreports\";\r\nimport RPCClient from \"./rpc-client/index\";\r\nimport { AxiosInstance, AxiosRequestConfig, AxiosResponse } from \"axios\";\r\n\r\nexport default class Session {\r\n protected readonly axios: AxiosInstance;\r\n protected _nodes: Nodes;\r\n protected _auth: Auth;\r\n protected _workflow: any;\r\n protected _rhcore: RHCore;\r\n protected _members: Members;\r\n protected _search: Search;\r\n protected _webreports: WebReports;\r\n protected _versions: Versions;\r\n\r\n public readonly baseUrl: string;\r\n\r\n constructor(options: CSRestOptions) {\r\n this.baseUrl = options.baseUrl;\r\n this.axios = axiosFactory(options);\r\n }\r\n\r\n get nodes(): Nodes {\r\n if (this._nodes === undefined) {\r\n this._nodes = new Nodes(this);\r\n }\r\n\r\n return this._nodes;\r\n }\r\n\r\n get auth(): Auth {\r\n if (this._auth === undefined) {\r\n this._auth = new Auth(this);\r\n }\r\n\r\n return this._auth;\r\n }\r\n\r\n get workflow(): Workflow {\r\n if (this._workflow === undefined) {\r\n this._workflow = new Workflow(this);\r\n }\r\n\r\n return this._workflow;\r\n }\r\n\r\n get rhcore(): RHCore {\r\n if (this._rhcore === undefined) {\r\n this._rhcore = new RHCore(this);\r\n }\r\n\r\n return this._rhcore;\r\n }\r\n\r\n get members(): Members {\r\n if (this._members === undefined) {\r\n this._members = new Members(this);\r\n }\r\n\r\n return this._members;\r\n }\r\n\r\n get search(): Search {\r\n if (this._search === undefined) {\r\n this._search = new Search(this);\r\n }\r\n\r\n return this._search;\r\n }\r\n\r\n get webreports(): WebReports {\r\n if (this._webreports === undefined) {\r\n this._webreports = new WebReports(this);\r\n }\r\n\r\n return this._webreports;\r\n }\r\n\r\n get versions(): Versions {\r\n if (this._versions === undefined) {\r\n this._versions = new Versions(this);\r\n }\r\n\r\n return this._versions;\r\n }\r\n\r\n rpcClient(relativePath = \"/api/v1/rh/rpc/rhnode/\") {\r\n return new RPCClient(this, relativePath);\r\n }\r\n\r\n _isObject(value: unknown): value is Object {\r\n return value && typeof value === \"object\" && value.constructor === Object;\r\n }\r\n\r\n _isString(value: unknown): value is string {\r\n return typeof value === \"string\" || value instanceof String;\r\n }\r\n\r\n _isBoolean(value: unknown): value is boolean {\r\n return typeof value === \"boolean\";\r\n }\r\n\r\n _isFile(value: any): value is File {\r\n return typeof value?.name === \"string\";\r\n }\r\n\r\n putForm<T>(url: string, params: Record<string, any>) {\r\n return this.put<T>(url, this.objectToForm(params), {\r\n headers: {\r\n \"Content-Type\": \"multipart/form-data\",\r\n },\r\n });\r\n }\r\n\r\n postForm<T>(url: string, params: Record<string, any>) {\r\n return this.post<T>(url, this.objectToForm(params), {\r\n headers: {\r\n \"Content-Type\": \"multipart/form-data\",\r\n },\r\n maxBodyLength: Infinity,\r\n });\r\n }\r\n\r\n patchForm<T>(url: string, params: Record<string, any>) {\r\n return this.patch<T>(url, this.objectToForm(params), {\r\n headers: {\r\n \"Content-Type\": \"multipart/form-data\",\r\n },\r\n });\r\n }\r\n\r\n deleteForm(url: string, params: Record<string, any>) {\r\n // FormData does not working on Delete!!\r\n // See here: https://stackoverflow.com/questions/51069552/axios-delete-request-with-body-and-headers\r\n // const formData = this.objectToForm(params)\r\n\r\n return this.delete(url);\r\n }\r\n\r\n objectToForm(obj: Record<string, any>) {\r\n return Object.entries(obj).reduce(\r\n (a: Record<string, any>, [key, value]) => {\r\n return {\r\n ...a,\r\n [key]:\r\n Array.isArray(value) || this._isObject(value)\r\n ? JSON.stringify(value)\r\n : value,\r\n };\r\n },\r\n {}\r\n );\r\n }\r\n\r\n putBody(url: string, body) {\r\n return this.putForm(url, {\r\n body,\r\n });\r\n }\r\n\r\n postBody<T>(url: string, body: Record<string, any>) {\r\n return this.postForm<T>(url, {\r\n body,\r\n });\r\n }\r\n\r\n patchBody(url: string, body: Record<string, any>) {\r\n return this.patchForm(url, {\r\n body,\r\n });\r\n }\r\n\r\n deleteBody(url: string, body: Record<string, any>) {\r\n return this.deleteForm(url, {\r\n body,\r\n });\r\n }\r\n\r\n get<T = any>(url: string, config?: AxiosRequestConfig) {\r\n return this.axios.get<T>(url, config);\r\n }\r\n\r\n post<T = any>(url: string, data?: any, config?: AxiosRequestConfig) {\r\n return this.axios.post<T>(url, data, config);\r\n }\r\n\r\n put<T = any>(url: string, data?: any, config?: AxiosRequestConfig) {\r\n return this.axios.put<T>(url, data, config);\r\n }\r\n\r\n patch<T = any>(url: string, data?: any, config?: AxiosRequestConfig) {\r\n return this.axios.patch<T>(url, data, config);\r\n }\r\n\r\n options<T = any>(url: string, config?: AxiosRequestConfig) {\r\n return this.axios.options<T>(url, config);\r\n }\r\n\r\n delete<T = any>(url: string, config?: AxiosRequestConfig) {\r\n return this.axios.delete<T>(url, config);\r\n }\r\n\r\n async $get<T = any>(url: string, config?: AxiosRequestConfig): Promise<T> {\r\n const response = await this.get<T>(url, config);\r\n return response.data;\r\n }\r\n}\r\n","import axios, { AxiosInstance } from \"axios\";\nimport { components } from \"../types/cs-rest-types/schema\";\n\nexport type CSRestOptions = {\n username?: string;\n password?: string;\n otcsticket?: string;\n baseUrl: string;\n};\n\nconst getInstance = (options: CSRestOptions) => {\n const instance = axios.create({\n baseURL: options.baseUrl,\n paramsSerializer: {\n // ensures ?field=A&field=B instead of ?field[]=A&field[]=B\n indexes: null,\n },\n });\n\n instance.interceptors.response.use(\n (response) => {\n const otcsticket = response?.headers.otcsticket;\n\n if (otcsticket) {\n instance.defaults.headers.common.OTCSTicket = otcsticket;\n }\n return response;\n },\n (error) => {\n return Promise.reject(error);\n }\n );\n\n return instance;\n};\n\nconst axiosFactory = (options: CSRestOptions): AxiosInstance => {\n const instance = getInstance(options);\n\n const username = options.username;\n const password = options.password;\n const otcsticket = options.otcsticket;\n\n if (otcsticket) {\n instance.defaults.headers.common.OTCSTicket = otcsticket;\n } else if (username && password) {\n instance.interceptors.request.use(async (config) => {\n if (config.headers.common?.OTCSTicket) {\n return config;\n } else {\n const response = await axios.post<\n components[\"schemas\"][\"auth_AuthenticationInfo\"]\n >(\n `${options.baseUrl}/api/v1/auth/`,\n {\n username,\n password,\n },\n {\n headers: {\n \"Content-Type\": \"multipart/form-data\",\n },\n }\n );\n\n config.headers.OTCSTicket = response.data.ticket;\n\n return config;\n }\n });\n } else {\n throw Error(\"You must provide an otcsticket or username and password.\");\n }\n\n return instance;\n};\n\nexport default axiosFactory;\n","import RPCClient from \"./rpc-client\";\r\nimport { RPCError } from \"./rpc-client/error-codes\";\r\nimport Session from \"./Session\";\r\n\r\n// https://medium.com/ovrsea/checking-the-type-of-an-object-in-typescript-the-type-guards-24d98d9119b0\r\nconst isRPCError = (e: RPCError | any): e is RPCError => {\r\n return (\r\n (e as RPCError).code !== undefined && (e as RPCError).data !== undefined\r\n );\r\n};\r\n\r\nexport { isRPCError, RPCError, Session, RPCClient };\r\n"],"names":["SubTypesEnum","RPCError","_Error","message","data","code","_this","x","messageObj","call","this","_assertThisInitialized","_inheritsLoose","_wrapNativeSuper","Error","sequence","index","next","RPCClient","session","relativePath","_batchQueue","resetQueue","_proto","prototype","requestObject","method","params","id","jsonrpc","handleResponse","Object","hasOwnProperty","result","err","error","request","Promise","undefined","resolve","postBody","rpc","then","response","e","reject","queue","push","batch","throwOnError","_this2","_response$data$data","map","item","rhnode","dataid","args","rhnodeQueue","ServiceAbstract","_createClass","_session","key","get","Auth","_ServiceAbstract","apply","arguments","auth","isNode","window","Nodes","addablenodetypes","addDocument","_ref","parent_id","fileHandler","_ref$name","name","_ref$description","description","_ref$options","options","url","_isString","all","_interopNamespace","require","_ref2","path","f","createReadStream","body","_extends","type","Document","basename","file","postForm","_isFile","addDocumentMajor","_ref3","_ref3$name","_ref3$description","_ref3$options","advanced_versioning","versions","promote","versionNumber","deleteVersion","addItem","node","_ref4","_ref4$apiVersion","apiVersion","_ref4$params","ancestors","volumeInfo","objType","volumes","addFolder","Folder","addGeneration","original_id","version_number","Generation","nodes","children","download","_ref5","_ref5$apiVersion","filePath","responseType","fs","writer","createWriteStream","pipe","on","audit","_ref6","_ref6$apiVersion","_ref6$params","WorkflowInitiator","mapId","workflowPropertiesInfo","start","workflow","_this$session$workflo","findWorkflowAttribute","attributeName","entries","form","schema","properties","find","title","setWorkflowAttribute","value","_this$findWorkflowAtt","fieldName","definition","Array","isArray","formUpdate","draftprocessesPut","processId","action","values","initiate","_temp","comment","password","_this3","initiateValues","wantComments","wantAuthentication","authentication_info","forms","process_id","attachmentPkg","data_packages","pkg","sub_type","attachment_folder_id","comments_on","authentication","Workflow","workflowInitiator","draftprocesses","draftProcess","results","draftprocess_id","draftprocessId","draftprocessesUpdate","workflowId","workflow_id","putForm","RHCore","scriptNode","Search","search","where","regions","Members","USER","GROUP","userQuery","query","version","limit","where_type","JSON","stringify","member","Versions","addVersion","console","assert","list","purge","_ref5$number_to_keep","number_to_keep","isNaN","deleteForm","WebReports","run","Session","axios","_nodes","_auth","_workflow","_rhcore","_members","_search","_webreports","_versions","baseUrl","instance","create","baseURL","paramsSerializer","indexes","interceptors","use","otcsticket","headers","defaults","common","OTCSTicket","getInstance","username","config","_config$headers$commo","post","ticket","axiosFactory","rpcClient","_isObject","constructor","String","_isBoolean","put","objectToForm","maxBodyLength","Infinity","patchForm","patch","obj","reduce","a","_extends2","putBody","patchBody","deleteBody","$get"],"mappings":"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