Skip to content
Merged
4 changes: 3 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,15 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](http://keepachangelog.com/)
and this project adheres to [Semantic Versioning](http://semver.org/).

## [4.8.0] - Unreleased
## [x.x.x] - Unreleased
### Added
- WiremMock integration tests for contract testing for GET /2.0/users/{userId}/plans and GET /2.0/users endpoints
- WireMock integration tests for contract testing for POST /2.0/users/{userId}/plans/{planId}/upgrade and POST /2.0/users/{userId}/plans/{planId}/downgrade
- Remove trailing slashes from routes
### Updated
- listAllUsers url generation
- Folder structure for the Users related WireMock tests
- Update endpoint and sheet tests

## [4.7.0] - 2025-06-30
### Added
Expand Down
12 changes: 9 additions & 3 deletions lib/contacts/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,19 @@ import type { RequestOptions } from './../types/RequestOptions';
export function createContacts(options: CreateOptions): ContactsApi {
const requestor = options.requestor;

const baseUrl = options.apiUrls.contacts;
const optionsToSend = {
url: options.apiUrls.contacts,
url: baseUrl,
...options.clientOptions,
};

const getContact = (options: RequestOptions<GetContactOptions, GetContactBody>, callback: RequestCallback<Contact>) =>
requestor.get({ ...optionsToSend, ...options }, callback);
const getContact = (
options: RequestOptions<GetContactOptions, GetContactBody>,
callback: RequestCallback<Contact>
) => {
const urlWithSlash = baseUrl + '/';
return requestor.get({ ...optionsToSend, url: urlWithSlash, ...options }, callback);
};

const listContacts = (
options: RequestOptions<ListContactsOptions, undefined>,
Expand Down
4 changes: 3 additions & 1 deletion lib/favorites/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,9 @@ exports.create = (options) => {
}

var urlOptions = {
url: options.apiUrls.favorites + deleteOptions.type + '/' + (deleteOptions.id || deleteOptions.objectId || ''),
url: deleteOptions.objectId
? options.apiUrls.favorites + '/' + deleteOptions.type + '/' + deleteOptions.objectId
: options.apiUrls.favorites + '/' + deleteOptions.type,
};
return requestor.delete(_.extend({}, optionsToSend, urlOptions, deleteOptions), callback);
};
Expand Down
23 changes: 14 additions & 9 deletions lib/folders/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,27 +22,32 @@ exports.create = function (options) {
*/
var listChildFolders = (getOptions, callback) => {
console.warn('DEPRECATED: Folders.listChildFolders is deprecated. Use getFolderChildren instead.');
var urlOptions = { url: options.apiUrls.folders + getOptions.folderId + '/folders' };
var urlOptions = { url: options.apiUrls.folders + '/' + getOptions.folderId + '/folders' };
return requestor.get(_.extend({}, optionsToSend, urlOptions, getOptions), callback);
};

var createChildFolder = (postOptions, callback) => {
var urlOptions = { url: options.apiUrls.folders + postOptions.folderId + '/folders' };
var urlOptions = { url: options.apiUrls.folders + '/' + postOptions.folderId + '/folders' };
return requestor.post(_.extend({}, optionsToSend, urlOptions, postOptions), callback);
};

var updateFolder = (putOptions, callback) => requestor.put(_.extend({}, optionsToSend, putOptions), callback);
var updateFolder = (putOptions, callback) => {
var urlOptions = { url: options.apiUrls.folders + '/' + putOptions.folderId };
requestor.put(_.extend({}, optionsToSend, urlOptions, putOptions), callback);
};

var deleteFolder = (deleteOptions, callback) =>
requestor.delete(_.extend({}, optionsToSend, deleteOptions), callback);
var deleteFolder = (deleteOptions, callback) => {
var urlOptions = { url: options.apiUrls.folders + '/' + deleteOptions.folderId };
requestor.delete(_.extend({}, optionsToSend, urlOptions, deleteOptions), callback);
};

var copyFolder = (postOptions, callback) => {
var urlOptions = { url: options.apiUrls.folders + postOptions.folderId + '/copy' };
var urlOptions = { url: options.apiUrls.folders + '/' + postOptions.folderId + '/copy' };
return requestor.post(_.extend({}, optionsToSend, urlOptions, postOptions), callback);
};

var moveFolder = (postOptions, callback) => {
var urlOptions = { url: options.apiUrls.folders + postOptions.folderId + '/move' };
var urlOptions = { url: options.apiUrls.folders + '/' + postOptions.folderId + '/move' };
return requestor.post(_.extend({}, optionsToSend, urlOptions, postOptions), callback);
};

Expand All @@ -55,7 +60,7 @@ exports.create = function (options) {
* @param {Function} callback - Callback function
*/
var getFolderMetadata = (getOptions, callback) => {
var urlOptions = { url: options.apiUrls.folders + getOptions.folderId + '/metadata' };
var urlOptions = { url: options.apiUrls.folders + '/' + getOptions.folderId + '/metadata' };
return requestor.get(_.extend({}, optionsToSend, urlOptions, getOptions), callback);
};

Expand All @@ -71,7 +76,7 @@ exports.create = function (options) {
* @param {Function} callback - Callback function
*/
var getFolderChildren = (getOptions, callback) => {
var urlOptions = { url: options.apiUrls.folders + getOptions.folderId + '/children' };
var urlOptions = { url: options.apiUrls.folders + '/' + getOptions.folderId + '/children' };
return requestor.get(_.extend({}, optionsToSend, urlOptions, getOptions), callback);
};

Expand Down
14 changes: 10 additions & 4 deletions lib/groups/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,22 @@ exports.create = function (options) {
var createGroup = (postOptions, callback) => requestor.post(_.extend({}, optionsToSend, postOptions), callback);

var addGroupMembers = (postOptions, callback) => {
var urlOptions = { url: options.apiUrls.groups + postOptions.groupId + '/members/' };
var urlOptions = { url: options.apiUrls.groups + '/' + postOptions.groupId + '/members' };
return requestor.post(_.extend({}, optionsToSend, urlOptions, postOptions), callback);
};

var updateGroup = (putOptions, callback) => requestor.put(_.extend({}, optionsToSend, putOptions), callback);
var updateGroup = (putOptions, callback) => {
var urlOptions = { url: options.apiUrls.groups + '/' + putOptions.groupId };
requestor.put(_.extend({}, optionsToSend, urlOptions, putOptions), callback);
};

var deleteGroup = (deleteOptions, callback) => requestor.delete(_.extend({}, optionsToSend, deleteOptions), callback);
var deleteGroup = (deleteOptions, callback) => {
var urlOptions = { url: options.apiUrls.groups + '/' + deleteOptions.groupId };
requestor.delete(_.extend({}, optionsToSend, urlOptions, deleteOptions), callback);
};

var removeGroupMember = (deleteOptions, callback) => {
var urlOptions = { url: options.apiUrls.groups + deleteOptions.groupId + '/members/' + deleteOptions.userId };
var urlOptions = { url: options.apiUrls.groups + '/' + deleteOptions.groupId + '/members/' + deleteOptions.userId };
return requestor.delete(_.extend({}, optionsToSend, urlOptions, deleteOptions), callback);
};

Expand Down
4 changes: 2 additions & 2 deletions lib/home/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,15 @@ exports.create = function (options) {
*/
var listFolders = (getOptions, callback) => {
console.warn('DEPRECATED: Home.listFolders is deprecated.');
return listContents(_.extend({ url: options.apiUrls.home + 'folders' }, getOptions), callback);
return listContents(_.extend({ url: options.apiUrls.home + '/' + 'folders' }, getOptions), callback);
};

/**
* @deprecated See: https://developers.smartsheet.com/api/smartsheet/guides/updating-code/migrate-from-using-the-sheets-folder
*/
var createFolder = (postOptions, callback) => {
console.warn('DEPRECATED: Home.createFolder is deprecated.');
var urlOptions = { url: options.apiUrls.home + 'folders' };
var urlOptions = { url: options.apiUrls.home + '/' + 'folders' };
return requestor.post(_.extend({}, optionsToSend, urlOptions, postOptions), callback);
};

Expand Down
19 changes: 13 additions & 6 deletions lib/reports/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,31 +12,38 @@ exports.create = function (options) {
_.extend(optionsToSend, options.clientOptions);

var getReport = (getOptions, callback) => {
return requestor.get(_.extend({}, optionsToSend, getOptions), callback);
let url = options.apiUrls.reports;
if (getOptions?.reportId) {
url += '/' + getOptions.reportId;
}
var urlOptions = { url };
return requestor.get(_.extend({}, optionsToSend, urlOptions, getOptions), callback);
};

var sendReportViaEmail = (postOptions, callback) => {
var urlOptions = { url: options.apiUrls.reports + postOptions.reportId + '/emails' };
var urlOptions = { url: options.apiUrls.reports + '/' + postOptions.reportId + '/emails' };
return requestor.post(_.extend({}, optionsToSend, urlOptions, postOptions), callback);
};

var getReportAsExcel = (getOptions, callback) => {
var acceptOptions = { accept: constants.acceptHeaders.vndMsExcel, encoding: null };
return requestor.get(_.extend({}, optionsToSend, acceptOptions, getOptions), callback);
var urlOptions = { url: options.apiUrls.reports + '/' + getOptions.reportId };
return requestor.get(_.extend({}, optionsToSend, acceptOptions, urlOptions, getOptions), callback);
};

var getReportAsCSV = (getOptions, callback) => {
var acceptOptions = { accept: constants.acceptHeaders.textCsv };
return requestor.get(_.extend({}, optionsToSend, acceptOptions, getOptions), callback);
var urlOptions = { url: options.apiUrls.reports + '/' + getOptions.reportId };
return requestor.get(_.extend({}, optionsToSend, acceptOptions, urlOptions, getOptions), callback);
};

var getReportPublishStatus = (getOptions, callback) => {
var urlOptions = { url: options.apiUrls.reports + getOptions.reportId + '/publish' };
var urlOptions = { url: options.apiUrls.reports + '/' + getOptions.reportId + '/publish' };
return requestor.get(_.extend({}, optionsToSend, urlOptions, getOptions), callback);
};

var setReportPublishStatus = (putOptions, callback) => {
var urlOptions = { url: options.apiUrls.reports + putOptions.reportId + '/publish' };
var urlOptions = { url: options.apiUrls.reports + '/' + putOptions.reportId + '/publish' };
return requestor.put(_.extend({}, optionsToSend, urlOptions, putOptions), callback);
};

Expand Down
4 changes: 3 additions & 1 deletion lib/search/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import type { CreateOptions, RequestCallback } from '../types';
import { apiUrls } from '../utils/apis';
import type { SearchAllOptions, SearchApi, SearchResponse, SearchSheetOptions } from './types';

export const createSearch = (options: CreateOptions): SearchApi => {
Expand Down Expand Up @@ -29,10 +30,11 @@ export const createSearch = (options: CreateOptions): SearchApi => {
...getOptions,
queryParameters: {
query: getOptions.query,
sheetId: getOptions.sheetId,
},
};

options.url = apiUrls.search + '/sheets/' + getOptions.sheetId;

return requestor.get(options, callback);
};

Expand Down
5 changes: 3 additions & 2 deletions lib/share/share.js
Original file line number Diff line number Diff line change
Expand Up @@ -61,9 +61,10 @@ module.exports = (url) => ({

var buildUrl = (urlOptions) =>
url +
'/' +
(urlOptions.sheetId || urlOptions.workspaceId || urlOptions.reportId || urlOptions.sightId) +
'/shares/' +
(urlOptions.shareId || '');
'/shares' +
(urlOptions.shareId !== undefined ? '/' + urlOptions.shareId : '');

return {
/**
Expand Down
9 changes: 7 additions & 2 deletions lib/sheets/attachments.js
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,13 @@ exports.create = function (options) {
return requestor.delete(_.extend({}, optionsToSend, urlOptions, deleteOptions), callback);
};

var buildUrl = (urlOptions) =>
options.apiUrls.sheets + urlOptions.sheetId + '/attachments/' + (urlOptions.attachmentId || '');
var buildUrl = (urlOptions) => {
let url = options.apiUrls.sheets + '/' + urlOptions.sheetId + '/attachments';
if (urlOptions.attachmentId !== undefined) {
url += '/' + urlOptions.attachmentId;
}
return url;
};

return {
getAttachment: listAttachments,
Expand Down
9 changes: 7 additions & 2 deletions lib/sheets/automationrules.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,13 @@ exports.create = function (options) {
return requestor.put(_.extend({}, optionsToSend, urlOptions, putOptions), callback);
};

var buildUrl = (urlOptions) =>
options.apiUrls.sheets + urlOptions.sheetId + '/automationrules/' + (urlOptions.automationRuleId || '');
var buildUrl = (urlOptions) => {
let url = options.apiUrls.sheets + '/' + urlOptions.sheetId + '/automationrules';
if (urlOptions.automationRuleId !== undefined) {
url += '/' + urlOptions.automationRuleId;
}
return url;
};

return {
deleteAutomationRule: deleteAutomationRule,
Expand Down
9 changes: 7 additions & 2 deletions lib/sheets/columns.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,13 @@ exports.create = function (options) {
return requestor.delete(_.extend({}, optionsToSend, urlOptions, deleteOptions), callback);
};

var buildUrl = (urlOptions) =>
options.apiUrls.sheets + urlOptions.sheetId + '/columns/' + (urlOptions.columnId || '');
var buildUrl = (urlOptions) => {
let url = options.apiUrls.sheets + '/' + urlOptions.sheetId + '/columns';
if (urlOptions.columnId !== undefined) {
url += '/' + urlOptions.columnId;
}
return url;
};

return {
getColumns: getColumns,
Expand Down
2 changes: 1 addition & 1 deletion lib/sheets/comments.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ exports.create = function (options) {
};

var buildUrl = (urlOptions) =>
options.apiUrls.sheets + urlOptions.sheetId + '/comments/' + (urlOptions.commentId || '');
options.apiUrls.sheets + '/' + urlOptions.sheetId + '/comments/' + (urlOptions.commentId || '');

return {
getComment: getComment,
Expand Down
14 changes: 7 additions & 7 deletions lib/sheets/create.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ exports.create = function (options) {
};

var copySheet = (postOptions, callback) => {
var urlOptions = { url: options.apiUrls.sheets + postOptions.sheetId + '/copy' };
var urlOptions = { url: options.apiUrls.sheets + '/' + postOptions.sheetId + '/copy' };
return requestor.post(_.extend({}, optionsToSend, urlOptions, postOptions), callback);
};

Expand All @@ -47,21 +47,21 @@ exports.create = function (options) {
};

var _importXlsxAndReplaceSheet = (postOptions, callback) => {
var baseUrl = options.apiUrls.sheets + postOptions.sheetId + '/';
var baseUrl = options.apiUrls.sheets + '/' + postOptions.sheetId + '/';
return importSheet(postOptions, callback, headers.vndOpenXml, baseUrl);
};

var _importCsvAndReplaceSheet = (postOptions, callback) => {
var baseUrl = options.apiUrls.sheets + postOptions.sheetId + '/';
var baseUrl = options.apiUrls.sheets + '/' + postOptions.sheetId + '/';
return importSheet(postOptions, callback, headers.textCsv, baseUrl);
};

var importXlsxSheet = (postOptions, callback) => {
return importSheet(postOptions, callback, headers.vndOpenXml, options.apiUrls.sheets);
return importSheet(postOptions, callback, headers.vndOpenXml, options.apiUrls.sheets + '/');
};

var importCsvSheet = (postOptions, callback) => {
return importSheet(postOptions, callback, headers.textCsv, options.apiUrls.sheets);
return importSheet(postOptions, callback, headers.textCsv, options.apiUrls.sheets + '/');
};

var importXlsxSheetIntoFolder = (postOptions, callback) => {
Expand All @@ -81,11 +81,11 @@ exports.create = function (options) {
};

var buildFolderUrl = (requestOptions) => {
return options.apiUrls.folders + requestOptions.folderId + '/sheets';
return options.apiUrls.folders + '/' + requestOptions.folderId + '/sheets';
};

var buildWorkspaceUrl = (requestOptions) => {
return options.apiUrls.workspaces + requestOptions.workspaceId + '/sheets';
return options.apiUrls.workspaces + '/' + requestOptions.workspaceId + '/sheets';
};

return {
Expand Down
4 changes: 2 additions & 2 deletions lib/sheets/crosssheetreferences.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ exports.create = function (options) {
};

var getCrossSheetReference = (getOptions, callback) => {
var urlOptions = { url: buildUrlBase(getOptions) + getOptions.crossSheetReferenceId };
var urlOptions = { url: buildUrlBase(getOptions) + '/' + getOptions.crossSheetReferenceId };
return requestor.get(_.extend({}, optionsToSend, urlOptions, getOptions), callback);
};

Expand All @@ -20,7 +20,7 @@ exports.create = function (options) {
return requestor.get(_.extend({}, optionsToSend, urlOptions, getOptions), callback);
};

var buildUrlBase = (urlOptions) => options.apiUrls.sheets + urlOptions.sheetId + '/crosssheetreferences/';
var buildUrlBase = (urlOptions) => options.apiUrls.sheets + '/' + urlOptions.sheetId + '/crosssheetreferences';

return {
createCrossSheetReference: createCrossSheetReference,
Expand Down
9 changes: 7 additions & 2 deletions lib/sheets/discussions.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,13 @@ exports.create = function (options) {
return requestor.delete(_.extend({}, optionsToSend, urlOptions, deleteOptions), callback);
};

var buildUrl = (urlOptions) =>
options.apiUrls.sheets + urlOptions.sheetId + '/discussions/' + (urlOptions.discussionId || '');
var buildUrl = (urlOptions) => {
let url = options.apiUrls.sheets + '/' + urlOptions.sheetId + '/discussions';
if (urlOptions.discussionId !== undefined) {
url += '/' + urlOptions.discussionId;
}
return url;
};

return {
getDiscussions: getDiscussions,
Expand Down
2 changes: 1 addition & 1 deletion lib/sheets/get.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ exports.create = function (options) {
listSheets(_.extend({}, getOptions, { accept: headers.vndMsExcel, encoding: null }), callback);

var getSheetVersion = (getOptions, callback) => {
var urlOptions = { url: options.apiUrls.sheets + getOptions.sheetId + '/version' };
var urlOptions = { url: options.apiUrls.sheets + '/' + getOptions.sheetId + '/version' };
return listSheets(_.extend({}, optionsToSend, urlOptions, getOptions), callback);
};

Expand Down
Loading
Loading