UNPKG

trimble-connect-sdk

Version:

Trimble Connect SDK for JavaScript

870 lines 162 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.TCPSClient = exports.TCPS = exports.DefaultTCPSServiceUri = void 0; const service_1 = require("./service"); const tcps_interfaces_1 = require("./tcps_interfaces"); const CONNECT_API_PROTOCOL = 'https:'; const CONNECT_API_ROOT = '/tc/api/2.0/'; const imageCache = {}; exports.DefaultTCPSServiceUri = 'https://app.connect.trimble.com/tc/api/2.0/'; function getDefaultConfiguration() { return { serviceUri: exports.DefaultTCPSServiceUri, }; } class TCPS extends service_1.Service { static isFile(item) { return item.type === 'FILE'; } static isFolder(item) { return item.type === 'FOLDER'; } static regionToServiceUri(region, serviceApi) { return __awaiter(this, void 0, void 0, function* () { const response = yield exports.TCPSClient.listServers(); for (const server of response.data) { if (server.awsRegion == region) { return server[serviceApi]; } } return undefined; }); } static formatUrlFromOrigin(origin, path) { return CONNECT_API_PROTOCOL + origin + CONNECT_API_ROOT + path; } constructor(config) { super(Object.assign(Object.assign({}, getDefaultConfiguration()), config)); } search(origin, searchOptions) { return __awaiter(this, void 0, void 0, function* () { const parameters = [`query=${searchOptions.query}`]; if (searchOptions.projectId) { parameters.push(`projectId=${searchOptions.projectId}`); } if (searchOptions.type) { parameters.push(`type=${searchOptions.type}`); } if (searchOptions.startDate) { parameters.push(`startDate=${searchOptions.startDate}`); } if (searchOptions.endDate) { parameters.push(`endDate=${searchOptions.endDate}`); } let sort = searchOptions.sort; if (searchOptions.sort && searchOptions.sort.length) { const startsWith = searchOptions.sort[0]; if ([' ', '+', '-'].indexOf(startsWith) === -1) { sort = ' ' + sort; } } if (sort) { parameters.push(`sort=${sort}`); } const url = TCPS.formatUrlFromOrigin(origin, `search?` + parameters.join('&')); const headers = searchOptions.range ? new Headers({ Range: `items=${searchOptions.range.start}-${searchOptions.range.end}`, }) : undefined; const result = yield this.makeRequest(url, 'GET', undefined, headers); return result; }); } listServers() { return __awaiter(this, void 0, void 0, function* () { const resp = yield this.makeRequest('regions'); resp.data = resp.data.map((s) => new tcps_interfaces_1.ServerReviver(s)); return resp; }); } getUserDetails(userId) { return __awaiter(this, void 0, void 0, function* () { return this.makeRequest(`users/${userId}`); }); } listProjects(server) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(server.origin, 'projects'); const items = yield this.makeRequest(url); for (const item of items.data) { item.origin = server.origin; } return items; }); } getProject(id, server) { return __awaiter(this, void 0, void 0, function* () { if (!id) { throw Error('id is required'); } const servers = server ? [server] : (yield this.listServers()).data; for (const s of servers) { try { const url = TCPS.formatUrlFromOrigin(s.origin, `projects/${id}`); const item = yield this.makeRequest(url); if (item) { item.data.origin = s.origin; return item; } } catch (_a) { } } throw Error('Project with id is not found'); }); } patchProject(projectId, projectOrigin, patchObject) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(projectOrigin, `projects/${projectId}`); return this.makeRequest(url, 'PATCH', JSON.stringify(patchObject)); }); } updateLastVisitedOnProject(project) { return __awaiter(this, void 0, void 0, function* () { const utcDate = convertToUtcDate(new Date()); const patchObject = { lastVisitedOn: utcDate, }; return this.patchProject(project.id, project.origin, patchObject); }); } listProjectMembers(project) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `projects/${project.id}/users`); return this.makeRequest(url); }); } listProjectFileSystemStructure(project) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `sync/${project.id}?excludeVersion=true`); return this.makeRequest(url); }); } createUserGroup(project, name) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `groups`); return this.makeRequest(url, 'POST', JSON.stringify({ name, projectId: project.id })); }); } removeUserGroup(project, groupId) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `groups/${groupId}`); return this.request(url, 'DELETE'); }); } listUserGroups(project) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `groups?projectId=${project.id}`); return this.makeRequest(url); }); } listUsersInGroup(project, groupId) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `groups/${groupId}/users`); return this.makeRequest(url); }); } addUsersToGroup(project, groupId, userIds) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `groups/${groupId}/users`); const ids = JSON.stringify(userIds.map((userId) => ({ id: userId }))); return this.makeRequest(url, 'POST', ids); }); } removeUsersFromGroup(project, groupId, userIds) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `groups/${groupId}/users`); const ids = JSON.stringify(userIds.map((userId) => ({ id: userId }))); return this.request(url, 'DELETE', ids); }); } getUserProjectDetails(origin) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(origin, `projects/me`); return this.makeRequest(url); }); } inviteUserToProject(project, userEmail, userRole) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `projects/${project.id}/users`); return this.makeRequest(url, 'POST', JSON.stringify({ email: userEmail, role: userRole })); }); } getUserFromProject(project, userId) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `projects/${project.id}/users/${userId}`); return this.makeRequest(url); }); } removeUserFromProject(project, userId) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `projects/${project.id}/users/${userId}`); return this.request(url, 'DELETE'); }); } listUsersByCompanyId(origin, companyId) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(origin, `companies/${companyId}/users`); return this.makeRequest(url); }); } getProjectSettings(project) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `projects/${project.id}/settings`); return this.makeRequest(url); }); } putProjectSettings(project, projectSettings) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `projects/${project.id}/settings`); return this.request(url, 'PATCH', JSON.stringify(projectSettings)); }); } listFolderEntries(parent) { return __awaiter(this, void 0, void 0, function* () { const folderId = parent.rootId || parent.id; const url = TCPS.formatUrlFromOrigin(parent.origin, `folders/${folderId}/items`); const items = yield this.makeRequest(url); for (const item of items.data) { item.origin = parent.origin; } items.data.sort((a, b) => { if (a.type === 'FOLDER' && b.type === 'FILE') { return -1; } if (a.type === 'FILE' && b.type === 'FOLDER') { return +1; } return a.name.localeCompare(b.name); }); return items; }); } getFileStatus(project, fileId, versionId, format) { return __awaiter(this, void 0, void 0, function* () { let url = TCPS.formatUrlFromOrigin(project.origin, `files/${fileId}/status`); const parameters = []; if (versionId) { parameters.push(`versionId=${versionId}`); } if (format) { parameters.push(`format=${format}`); } if (parameters.length > 0) { url += '?' + parameters.join('&'); } return this.makeRequest(url); }); } getProjectSyncStatus(project, encode) { return __awaiter(this, void 0, void 0, function* () { let url = TCPS.formatUrlFromOrigin(project.origin, `projects/${project.id}/status`); if (encode !== undefined) { url += `?encode=${encode}`; } return this.makeRequest(url); }); } getProjectSyncObjects(project, status, types, combineStreams) { return __awaiter(this, void 0, void 0, function* () { let url = TCPS.formatUrlFromOrigin(project.origin, `projects/${project.id}/objects`); const parameters = [`status=${status}`]; if (types) { parameters.push(`types=${types}`); } if (combineStreams !== undefined) { parameters.push(`combineStreams=${combineStreams}`); } url += '?' + parameters.join('&'); return this.makeRequest(url); }); } getFile(project, fileId, versionId) { return __awaiter(this, void 0, void 0, function* () { let url = TCPS.formatUrlFromOrigin(project.origin, `files/${fileId}`); const parameters = []; if (versionId) { parameters.push(`versionId=${versionId}`); } if (parameters.length > 0) { url += '?' + parameters.join('&'); } const item = yield this.makeRequest(url); item.data.origin = project.origin; return item; }); } getFileVersions(project, fileId) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `files/${fileId}/versions`); const items = yield this.makeRequest(url); items.data.forEach((i) => (i.origin = project.origin)); return items; }); } getFileVersionsWithPages(project, fileId, onPageRetrieved, pageSize = 1000) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `files/${fileId}/versions`); const onItemsPageRetrieved = (response) => { response.data.forEach((i) => (i.origin = project.origin)); onPageRetrieved(response); }; yield this.getItemsWithPages(url, onItemsPageRetrieved, pageSize); }); } updateFile(project, updateRequest) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `files/${updateRequest.id}`); const item = yield this.makeRequest(url, 'PATCH', JSON.stringify(updateRequest, (key, value) => excludeProperty('id', key, value))); item.data.origin = project.origin; return item; }); } getFolder(project, folderId) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `folders/${folderId}`); const item = yield this.makeRequest(url); item.data.origin = project.origin; return item; }); } getFileDownloadUrl(file, versionId, format) { return __awaiter(this, void 0, void 0, function* () { let url = TCPS.formatUrlFromOrigin(file.origin, `files/fs/${file.id}/downloadurl`); const parameters = []; if (versionId) { parameters.push(`versionId=${versionId}`); } if (format) { parameters.push(`format=${format}`); } if (parameters.length > 0) { url += '?' + parameters.join('&'); } return this.makeRequest(url); }); } uploadFileContent(project, files, parentId, parentType) { return __awaiter(this, void 0, void 0, function* () { const initiateUrl = TCPS.formatUrlFromOrigin(project.origin, `files/fs/initiate`); const commitUrl = TCPS.formatUrlFromOrigin(project.origin, `files/fs/commit`); const actions = files.map((file) => __awaiter(this, void 0, void 0, function* () { const body = JSON.stringify({ parentId, parentType, name: file.name }); const initiateResponse = (yield this.makeRequest(initiateUrl, 'POST', body)).data; yield fetch(initiateResponse.uploadURL, { method: 'PUT', body: file }); const response = yield this.makeRequest(commitUrl, 'POST', JSON.stringify({ uploadId: initiateResponse.uploadId })); return response; })); const items = yield Promise.all(actions); items.forEach((i) => (i.data.origin = project.origin)); return items; }); } assimilateFile(project, file, format = 'TRB') { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `files/${file.id}/process`); const body = JSON.stringify({ format, versionId: file.versionId }); return this.request(url, 'POST', body); }); } putPresentationFileContent(file, parent, format, parentVersionId) { return __awaiter(this, void 0, void 0, function* () { const formData = new FormData(); formData.append('file', file, file.name); const url = TCPS.formatUrlFromOrigin(parent.origin, `files/representation?fileId=${parent.id}&versionId=${parentVersionId || parent.versionId}&format=${format}`); return this.request(url, 'POST', formData, new Headers({ 'Content-Type': 'multipart/form-data' })); }); } getImage(source, path) { return __awaiter(this, void 0, void 0, function* () { let uri = path; const isStaticImage = path.startsWith('/tc/static/') || path.startsWith('/tc/ng-static/') || path.startsWith('/assets/img/'); if (path.startsWith('/')) { uri = ((!isStaticImage && source && CONNECT_API_PROTOCOL + source.origin) || (0, service_1.extractEndpoint)(this.config.serviceUri)) + path; } if (uri in imageCache) { return imageCache[uri]; } else if (isStaticImage) { return (imageCache[uri] = uri); } else { const resp = yield this.request(uri); const blob = yield resp.response.blob(); return (imageCache[uri] = URL.createObjectURL(blob)); } }); } getPlacement(file, versionId) { return __awaiter(this, void 0, void 0, function* () { const baseUrl = TCPS.formatUrlFromOrigin(file.origin, `files/${file.id}/alignment`); if (versionId) { try { const placement = yield this.makeRequest(`${baseUrl}?versionId=${versionId}`, 'GET'); if (placement === null || placement === void 0 ? void 0 : placement.data) { return placement; } } catch (_a) { } } return this.makeRequest(baseUrl, 'GET'); }); } putPlacement(file, placement, versionId) { return __awaiter(this, void 0, void 0, function* () { let queryParam = ''; if (versionId) { queryParam = `?versionId=${versionId}`; } const url = TCPS.formatUrlFromOrigin(file.origin, `files/${file.id}/alignment${queryParam}`); return this.makeRequest(url, 'PUT', JSON.stringify(placement)); }); } listToDos(project) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `todos?projectId=${project.id}`); const items = yield this.makeRequest(url); for (const item of items.data) { item.origin = project.origin; } return items; }); } getToDo(project, todoId) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `todos/${todoId}`); const item = yield this.makeRequest(url); item.data.origin = project.origin; if (item.data.projectId !== project.id) { throw new Error('Item belongs to other project'); } return item; }); } createToDo(project, todo) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `todos`); const item = yield this.makeRequest(url, 'POST', JSON.stringify(todo, excludeOrigin)); item.data.origin = project.origin; return item; }); } updateToDo(project, todo) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `todos/${todo.id}`); const item = yield this.makeRequest(url, 'PATCH', JSON.stringify(todo, excludeOrigin)); item.data.origin = project.origin; return item; }); } removeToDo(project, todoId) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `todos/${todoId}`); return this.request(url, 'DELETE'); }); } listToDoComments(todo) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(todo.origin, `comments?projectId=${todo.projectId}&objectId=${todo.id}&objectType=TODO`); const items = yield this.makeRequest(url); for (const item of items.data) { item.origin = todo.origin; } return items; }); } listComments(project, entityId, entityType) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `comments?projectId=${project.id}&objectId=${entityId}&objectType=${entityType}`); const items = yield this.makeRequest(url); for (const item of items.data) { item.origin = project.origin; } return items; }); } listAttachments(origin, projectId, entityId, entityType) { return __awaiter(this, void 0, void 0, function* () { const type = entityType === 'TODO' ? 'todos' : 'comments'; const url = TCPS.formatUrlFromOrigin(origin, `${type}/${entityId}/attachments?projectId=${projectId}`); const items = yield this.makeRequest(url); for (const item of items.data) { item.origin = origin; } return items; }); } listToDoAttachments(todo) { return __awaiter(this, void 0, void 0, function* () { return this.listAttachments(todo.origin, todo.projectId, todo.id, 'TODO'); }); } addAttachmentsToEntity(origin, projectId, entity, attachments) { return __awaiter(this, void 0, void 0, function* () { const target = entity.type === 'TODO' ? 'todos' : 'comments'; const url = TCPS.formatUrlFromOrigin(origin, `${target}/${entity.id}/attachments?projectId=${projectId}`); const attachmentList = []; attachments.forEach((i) => { const attachment = i.type === 'URL' ? { type: i.type, url: i.id, urlName: i.urlName || '' } : { type: i.type, id: i.id, embedded: i.embedded || false }; attachmentList.push(attachment); }); const body = JSON.stringify(attachmentList); const item = yield this.makeRequest(url, 'POST', body); item.data.origin = origin; return item; }); } attachViewToTodo(todo, view) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(todo.origin, `todos/${todo.id}/attachments?projectId=${todo.projectId}`); const item = yield this.makeRequest(url, 'POST', JSON.stringify([{ type: 'VIEW', id: view.id }])); item.data.origin = todo.origin; return item; }); } removeAttachment(origin, projectId, entityId, entityType, attachmentId, attachmentType) { return __awaiter(this, void 0, void 0, function* () { const target = entityType === 'TODO' ? 'todos' : 'comments'; const url = TCPS.formatUrlFromOrigin(origin, `${target}/${entityId}/attachments?projectId=${projectId}`); return this.request(url, 'DELETE', JSON.stringify([{ id: attachmentId, type: attachmentType }])); }); } createComment(project, comment) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `comments`); const item = yield this.makeRequest(url, 'POST', JSON.stringify(comment)); item.data.origin = project.origin; return item; }); } updateComment(comment) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(comment.origin, `comments/${comment.id}`); const item = yield this.makeRequest(url, 'PATCH', JSON.stringify({ description: comment.description })); item.data.origin = comment.origin; return item; }); } deleteComment(project, commentId) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `comments/${commentId}`); return this.request(url, 'DELETE'); }); } list2DViews(project) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `views2d?projectId=${project.id}`); const items = yield this.makeRequest(url); for (const item of items.data) { item.origin = project.origin; } return items; }); } get2DView(project, viewId) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `views2d/${viewId}`); const item = yield this.makeRequest(url); item.data.origin = project.origin; if (item.data.projectId !== project.id) { throw new Error('Item belongs to different project'); } return item; }); } create2DView(project, view) { return __awaiter(this, void 0, void 0, function* () { if (view.description === '') { view.description = undefined; } const url = TCPS.formatUrlFromOrigin(project.origin, `views2d`); const item = yield this.makeRequest(url, 'POST', JSON.stringify(view, excludeOrigin)); item.data.origin = project.origin; return item; }); } update2DView(project, view) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `views2d/${view.id}`); const item = yield this.makeRequest(url, 'PATCH', JSON.stringify(view, excludeOrigin)); item.data.origin = project.origin; return item; }); } remove2DView(project, viewId, force = false) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `views2d/${viewId}?force=${force}`); return this.request(url, 'DELETE'); }); } listViews(project) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `views?projectId=${project.id}`); const items = yield this.makeRequest(url); for (const item of items.data) { item.origin = project.origin; } return items; }); } listViewPaginated(project, onPageRetrieved, pageSize = 500) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `views?projectId=${project.id}`); const onItemsPageRetrieved = (response) => { var _a; (_a = response.data) === null || _a === void 0 ? void 0 : _a.forEach((i) => (i.origin = project.origin)); onPageRetrieved(response); }; yield this.getItemsWithPages(url, onItemsPageRetrieved, pageSize); }); } getView(project, viewId) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `views/${viewId}`); const item = yield this.makeRequest(url); item.data.origin = project.origin; if (item.data.projectId !== project.id) { throw new Error('Item belongs to different project'); } return item; }); } createView(project, view) { return __awaiter(this, void 0, void 0, function* () { if (view.description === '') { view.description = undefined; } const url = TCPS.formatUrlFromOrigin(project.origin, `views`); const item = yield this.makeRequest(url, 'POST', JSON.stringify(view, excludeOrigin)); item.data.origin = project.origin; return item; }); } updateView(project, view) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `views/${view.id}`); const item = yield this.makeRequest(url, 'PATCH', JSON.stringify(view, excludeOrigin)); item.data.origin = project.origin; return item; }); } removeView(project, viewId, force = false) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `views/${viewId}?force=${force}`); return this.request(url, 'DELETE'); }); } createViewGroup(project, name, views) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `viewgroups`); const item = yield this.makeRequest(url, 'POST', JSON.stringify({ projectId: project.id, name, views })); item.data.origin = project.origin; return item; }); } removeViewGroup(project, viewGroupId) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `viewgroups/${viewGroupId}`); return this.request(url, 'DELETE'); }); } updateViewGroup(project, viewGroup) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `viewgroups/${viewGroup.id}`); const item = yield this.makeRequest(url, 'PATCH', JSON.stringify({ name: viewGroup.name, views: viewGroup.views })); item.data.origin = project.origin; return item; }); } listViewGroups(project) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `viewgroups?projectId=${project.id}`); const items = yield this.makeRequest(url); for (const item of items.data) { item.origin = project.origin; } return items; }); } listTags(project) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `tags?projectId=${project.id}`); const items = yield this.makeRequest(url); for (const item of items.data) { item.origin = project.origin; } return items; }); } createTag(project, tag) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `tags`); const item = yield this.makeRequest(url, 'POST', JSON.stringify(tag, excludeOrigin)); item.data.origin = project.origin; return item; }); } addObjectToTag(tag, id, objectType) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(tag.origin, `tags/${tag.id}/objects`); return this.request(url, 'POST', JSON.stringify([{ id, objectType }])); }); } removeObjectFromTag(tag, id, objectType) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(tag.origin, `tags/${tag.id}/objects`); return this.request(url, 'DELETE', JSON.stringify([{ id, objectType }])); }); } listTagsInObject(project, objectId, objectType) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `tags?objectId=${objectId}&objectType=${objectType}&projectId=${project.id}`); const items = yield this.makeRequest(url); for (const item of items.data) { item.origin = project.origin; } return items; }); } getLinksByFile(project, id, versionId, sourceId, includeDeleted = false, full = false) { return __awaiter(this, void 0, void 0, function* () { let params = `objectlink?id=${id}`; params += versionId !== undefined ? `&versionId=${versionId}` : ``; params += sourceId !== undefined ? `&sourceId=${sourceId}` : ``; params += `&includeDeleted=${includeDeleted}`; params += `&full=${full}&detail=${full}`; const url = TCPS.formatUrlFromOrigin(project.origin, params); return this.makeRequest(url, 'GET'); }); } getLinksByEntity(project, objectId, objectType, includeDeleted = false) { return __awaiter(this, void 0, void 0, function* () { const id = objectType === 'URL' ? encodeURIComponent(objectId) : objectId; const url = TCPS.formatUrlFromOrigin(project.origin, `objectlink/target?projectId=${project.id}&type=${objectType}&id=${id}&includeDeleted=${includeDeleted}`); return this.makeRequest(url); }); } createObjectLink(project, modelId, versionId, objectIds, targetId, targetType, urlName) { return __awaiter(this, void 0, void 0, function* () { const data = objectIds.map((id) => ({ sourceId: id, type: 'BIMOBJECT', })); const source = { id: modelId, versionId, data }; const target = { id: targetId, type: targetType }; const link = { source, target }; if (targetType === 'URL') { link.name = urlName; } const url = TCPS.formatUrlFromOrigin(project.origin, `objectlink`); return this.makeRequest(url, 'POST', JSON.stringify(link)); }); } updateObjectLink(project, link) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `objectlink/${link.id}`); return this.makeRequest(url, 'PATCH', JSON.stringify(link)); }); } deleteObjectLink(project, linkId) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `objectlink/${linkId}`); return this.request(url, 'DELETE'); }); } listClashSets(project) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `clashsets?projectId=${project.id}`); const items = yield this.makeRequest(url); items.data.forEach((i) => (i.origin = project.origin)); return items; }); } getClashSetDetails(project, clashSetId) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `clashsets/${clashSetId}`); const item = yield this.makeRequest(url); item.data.origin = project.origin; return item; }); } createClashSet(project, clashset) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `clashsets`); const item = yield this.makeRequest(url, 'POST', JSON.stringify(clashset, excludeOrigin)); item.data.origin = project.origin; return item; }); } updateClashSet(project, clashset) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `clashsets/${clashset.id}`); const item = yield this.makeRequest(url, 'PATCH', JSON.stringify(clashset, excludeOrigin)); item.data.origin = project.origin; return item; }); } deleteClashSet(project, clashSetId) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `clashsets/${clashSetId}`); return this.request(url, 'DELETE'); }); } getClashItems(project, clashSetId) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `clashsets/${clashSetId}/items`); const items = yield this.makeRequest(url); items.data.forEach((i) => (i.origin = project.origin)); return items; }); } getClashItemsWithPages(project, clashSetId, onPageRetrieved, pageSize = 1000) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(project.origin, `clashsets/${clashSetId}/items`); const onItemsPageRetrieved = (response) => { response.data.forEach((i) => (i.origin = project.origin)); onPageRetrieved(response); }; yield this.getItemsWithPages(url, onItemsPageRetrieved, pageSize); }); } getShare(origin, sToken) { return __awaiter(this, void 0, void 0, function* () { const url = TCPS.formatUrlFromOrigin(origin, `shares/token/${sToken}`); const item = yield this.makeRequest(url); item.data.origin = origin; return item; }); } } exports.TCPS = TCPS; function convertToUtcDate(d) { let utcDate = d.toISOString(); utcDate = utcDate.substr(0, utcDate.indexOf('.')) + '+0000'; return utcDate; } function excludeOrigin(key, value) { return excludeProperty('origin', key, value); } function excludeProperty(property, key, value) { return key === property ? undefined : value; } exports.TCPSClient = new TCPS(); exports.default = exports.TCPSClient; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGNwcy5qcyIsInNvdXJjZVJvb3QiOiIuLyIsInNvdXJjZXMiOlsidGNwcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFFQSx1Q0FBcUQ7QUFDckQsdURBNkMyQjtBQUczQixNQUFNLG9CQUFvQixHQUFHLFFBQVEsQ0FBQztBQUN0QyxNQUFNLGdCQUFnQixHQUFHLGNBQWMsQ0FBQztBQUV4QyxNQUFNLFVBQVUsR0FBMkIsRUFBRSxDQUFDO0FBR2pDLFFBQUEscUJBQXFCLEdBQ2hDLDZDQUE2QyxDQUFDO0FBR2hELFNBQVMsdUJBQXVCO0lBQzlCLE9BQU87UUFDTCxVQUFVLEVBQUUsNkJBQXFCO0tBQ2xDLENBQUM7QUFDSixDQUFDO0FBU0QsTUFBYSxJQUFLLFNBQVEsaUJBQU87SUFLeEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUE2QjtRQUNoRCxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDO0lBQzlCLENBQUM7SUFNTSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQTZCO1FBQ2xELE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRLENBQUM7SUFDaEMsQ0FBQztJQVFNLE1BQU0sQ0FBTyxrQkFBa0IsQ0FBQyxNQUFjLEVBQUUsVUFBc0I7O1lBQzNFLE1BQU0sUUFBUSxHQUFHLE1BQU0sa0JBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNoRCxLQUFLLE1BQU0sTUFBTSxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUU7Z0JBQ2xDLElBQUksTUFBTSxDQUFDLFNBQVMsSUFBSSxNQUFNLEVBQUU7b0JBQzlCLE9BQU8sTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2lCQUMzQjthQUNGO1lBQ0QsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztLQUFBO0lBT08sTUFBTSxDQUFDLG1CQUFtQixDQUFDLE1BQWMsRUFBRSxJQUFZO1FBQzdELE9BQU8sb0JBQW9CLEdBQUcsTUFBTSxHQUFHLGdCQUFnQixHQUFHLElBQUksQ0FBQztJQUNq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