diff --git a/lib/workspaces/index.js b/lib/workspaces/index.js index ae7fc975..d4b81f86 100644 --- a/lib/workspaces/index.js +++ b/lib/workspaces/index.js @@ -1,4 +1,3 @@ -var _ = require('underscore'); exports.create = function (options) { var requestor = options.requestor; @@ -7,41 +6,41 @@ exports.create = function (options) { var optionsToSend = { url: options.apiUrls.workspaces, }; - _.extend(optionsToSend, options.clientOptions); + optionsToSend = { ...optionsToSend, ...options.clientOptions }; var listWorkspaces = (getOptions, callback) => { var urlOptions = { url: buildUrl(getOptions) }; - return requestor.get(_.extend({}, optionsToSend, urlOptions, getOptions), callback); + return requestor.get({ ...optionsToSend, ...urlOptions, ...getOptions }, callback); }; var listWorkspaceFolders = (getOptions, callback) => { var urlOptions = { url: buildUrl(getOptions) + '/folders' }; - return requestor.get(_.extend({}, optionsToSend, urlOptions, getOptions), callback); + return requestor.get({ ...optionsToSend, ...urlOptions, ...getOptions }, callback); }; var createWorkspace = (postOptions, callback) => { var urlOptions = { url: buildUrl(postOptions) }; - return requestor.post(_.extend({}, optionsToSend, urlOptions, postOptions), callback); + return requestor.post({ ...optionsToSend, ...urlOptions, ...postOptions }, callback); }; var createFolder = (postOptions, callback) => { var urlOptions = { url: buildUrl(postOptions) + '/folders' }; - return requestor.post(_.extend({}, optionsToSend, urlOptions, postOptions), callback); + return requestor.post({ ...optionsToSend, ...urlOptions, ...postOptions }, callback); }; var updateWorkspace = (putOptions, callback) => { var urlOptions = { url: buildUrl(putOptions) }; - return requestor.put(_.extend({}, optionsToSend, urlOptions, putOptions), callback); + return requestor.put({ ...optionsToSend, ...urlOptions, ...putOptions }, callback); }; var deleteWorkspace = (deleteOptions, callback) => { var urlOptions = { url: buildUrl(deleteOptions) }; - return requestor.delete(_.extend({}, optionsToSend, urlOptions, deleteOptions), callback); + return requestor.delete({ ...optionsToSend, ...urlOptions, ...deleteOptions }, callback); }; var copyWorkspace = (postOptions, callback) => { var urlOptions = { url: buildUrl(postOptions) + '/copy' }; - return requestor.post(_.extend({}, optionsToSend, urlOptions, postOptions), callback); + return requestor.post({ ...optionsToSend, ...urlOptions, ...postOptions }, callback); }; var buildUrl = (urlOptions) => { @@ -63,7 +62,7 @@ exports.create = function (options) { copyWorkspace: copyWorkspace, }; - _.extend(workspaceObject, shares.create(options)); + workspaceObject = { ...workspaceObject, ...shares.create(options) }; return workspaceObject; }; diff --git a/lib/workspaces/index.ts b/lib/workspaces/index.ts new file mode 100644 index 00000000..3a972688 --- /dev/null +++ b/lib/workspaces/index.ts @@ -0,0 +1,80 @@ +import type { + WorkspaceOptions, + WorkspaceUrlOptions, + GetWorkspaceOptions, + PostWorkspaceOptions, + DeleteWorkspaceOptions, + PutWorkspaceOptions, + WorkspaceObject +} from './types'; + +import type { RequestCallback } from '../types/RequestCallback'; +import shareFactory from '../share/share.js'; + +export const create = function(options: WorkspaceOptions): WorkspaceObject { + const requestor = options.requestor; + const shares = shareFactory(options.apiUrls.workspaces); + + let optionsToSend: Record = { + url: options.apiUrls.workspaces, + }; + optionsToSend = { ...optionsToSend, ...options.clientOptions }; + + const listWorkspaces = (getOptions: GetWorkspaceOptions, callback?: RequestCallback): Promise => { + const urlOptions = { url: buildUrl(getOptions) }; + return requestor.get({ ...optionsToSend, ...urlOptions, ...getOptions }, callback); + }; + + const listWorkspaceFolders = (getOptions: GetWorkspaceOptions, callback?: RequestCallback): Promise => { + const urlOptions = { url: buildUrl(getOptions) + '/folders' }; + return requestor.get({ ...optionsToSend, ...urlOptions, ...getOptions }, callback); + }; + + const createWorkspace = (postOptions: PostWorkspaceOptions, callback?: RequestCallback): Promise => { + const urlOptions = { url: buildUrl(postOptions) }; + return requestor.post({ ...optionsToSend, ...urlOptions, ...postOptions }, callback); + }; + + const createFolder = (postOptions: PostWorkspaceOptions, callback?: RequestCallback): Promise => { + const urlOptions = { url: buildUrl(postOptions) + '/folders' }; + return requestor.post({ ...optionsToSend, ...urlOptions, ...postOptions }, callback); + }; + + const updateWorkspace = (putOptions: PutWorkspaceOptions, callback?: RequestCallback): Promise => { + const urlOptions = { url: buildUrl(putOptions) }; + return requestor.put({ ...optionsToSend, ...urlOptions, ...putOptions }, callback); + }; + + const deleteWorkspace = (deleteOptions: DeleteWorkspaceOptions, callback?: RequestCallback): Promise => { + const urlOptions = { url: buildUrl(deleteOptions) }; + return requestor.delete({ ...optionsToSend, ...urlOptions, ...deleteOptions }, callback); + }; + + const copyWorkspace = (postOptions: PostWorkspaceOptions, callback?: RequestCallback): Promise => { + const urlOptions = { url: buildUrl(postOptions) + '/copy' }; + return requestor.post({ ...optionsToSend, ...urlOptions, ...postOptions }, callback); + }; + + const buildUrl = (urlOptions: WorkspaceUrlOptions): string => { + let id = ''; + if (urlOptions && urlOptions.workspaceId) { + id = urlOptions.workspaceId; + } + return options.apiUrls.workspaces + id; + }; + + let workspaceObject: WorkspaceObject = { + listWorkspaces, + getWorkspace: listWorkspaces, + listWorkspaceFolders, + createWorkspace, + createFolder, + deleteWorkspace, + updateWorkspace, + copyWorkspace, + }; + + workspaceObject = { ...workspaceObject, ...shares.create(options) }; + + return workspaceObject; +}; diff --git a/lib/workspaces/types.ts b/lib/workspaces/types.ts new file mode 100644 index 00000000..69d35578 --- /dev/null +++ b/lib/workspaces/types.ts @@ -0,0 +1,148 @@ +import type { RequestCallback } from '../types/RequestCallback'; +import type { RequestOptions } from '../types/RequestOptions'; + +/** + * Generic request options type for all HTTP operations + */ +export interface HttpRequestOptions { + url: string; + queryParameters?: Record; + body?: unknown; + [key: string]: unknown; +} + +/** + * Workspace requestor interface for HTTP operations + */ +export interface WorkspaceRequestor { + get: (options: HttpRequestOptions, callback?: RequestCallback) => Promise; + post: (options: HttpRequestOptions, callback?: RequestCallback) => Promise; + put: (options: HttpRequestOptions, callback?: RequestCallback) => Promise; + delete: (options: HttpRequestOptions, callback?: RequestCallback) => Promise; +} + +/** + * Options for the workspace module + */ +export interface WorkspaceOptions { + requestor: WorkspaceRequestor; + apiUrls: { + workspaces: string; + }; + clientOptions: Record; +} + +/** + * URL options for workspace operations + */ +export interface WorkspaceUrlOptions { + workspaceId?: string; + sheetId?: string; + reportId?: string; + sightId?: string; + shareId?: string; + [key: string]: unknown; +} + +/** + * Query parameters for workspace GET operations + */ +export interface WorkspaceGetQueryParams { + includeAll?: boolean; + [key: string]: string | number | boolean | undefined; +} + +/** + * Options for GET workspace operations + */ +export interface GetWorkspaceOptions extends WorkspaceUrlOptions, RequestOptions {} + +/** + * Body for workspace POST operations + */ +export interface WorkspacePostBody { + name?: string; + [key: string]: unknown; +} + +/** + * Options for POST workspace operations + */ +export interface PostWorkspaceOptions extends WorkspaceUrlOptions, RequestOptions, WorkspacePostBody> {} + +/** + * Options for DELETE workspace operations + */ +export interface DeleteWorkspaceOptions extends WorkspaceUrlOptions, RequestOptions, never> {} + +/** + * Body for workspace PUT operations + */ +export interface WorkspacePutBody { + name?: string; + [key: string]: unknown; +} + +/** + * Options for PUT workspace operations + */ +export interface PutWorkspaceOptions extends WorkspaceUrlOptions, RequestOptions, WorkspacePutBody> {} + +/** + * Workspace object interface returned by the create function + */ +export interface WorkspaceObject { + /** + * Lists all workspaces + */ + listWorkspaces: (getOptions: GetWorkspaceOptions, callback?: RequestCallback) => Promise; + + /** + * Gets a specific workspace + */ + getWorkspace: (getOptions: GetWorkspaceOptions, callback?: RequestCallback) => Promise; + + /** + * Lists folders in a workspace + */ + listWorkspaceFolders: (getOptions: GetWorkspaceOptions, callback?: RequestCallback) => Promise; + + /** + * Creates a new workspace + */ + createWorkspace: (postOptions: PostWorkspaceOptions, callback?: RequestCallback) => Promise; + + /** + * Creates a folder in a workspace + */ + createFolder: (postOptions: PostWorkspaceOptions, callback?: RequestCallback) => Promise; + + /** + * Deletes a workspace + */ + deleteWorkspace: (deleteOptions: DeleteWorkspaceOptions, callback?: RequestCallback) => Promise; + + /** + * Updates a workspace + */ + updateWorkspace: (putOptions: PutWorkspaceOptions, callback?: RequestCallback) => Promise; + + /** + * Copies a workspace + */ + copyWorkspace: (postOptions: PostWorkspaceOptions, callback?: RequestCallback) => Promise; + +} + +/** + * Response type for workspace operations (can be extended for specific responses) + */ +export interface WorkspaceResponse { + message?: string; + result?: { + id?: number | string; + name?: string; + [key: string]: unknown; + }; + statusCode?: number; +}