trimble-connect-sdk
Version:
Trimble Connect SDK for JavaScript
870 lines • 162 kB
JavaScript
"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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