Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 9 additions & 10 deletions lib/workspaces/index.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
var _ = require('underscore');

exports.create = function (options) {
var requestor = options.requestor;
Expand All @@ -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) => {
Expand All @@ -63,7 +62,7 @@ exports.create = function (options) {
copyWorkspace: copyWorkspace,
};

_.extend(workspaceObject, shares.create(options));
workspaceObject = { ...workspaceObject, ...shares.create(options) };

return workspaceObject;
};
80 changes: 80 additions & 0 deletions lib/workspaces/index.ts
Original file line number Diff line number Diff line change
@@ -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<string, unknown> = {
url: options.apiUrls.workspaces,
};
optionsToSend = { ...optionsToSend, ...options.clientOptions };

const listWorkspaces = <T>(getOptions: GetWorkspaceOptions, callback?: RequestCallback<T>): Promise<T> => {
const urlOptions = { url: buildUrl(getOptions) };
return requestor.get<T>({ ...optionsToSend, ...urlOptions, ...getOptions }, callback);
};

const listWorkspaceFolders = <T>(getOptions: GetWorkspaceOptions, callback?: RequestCallback<T>): Promise<T> => {
const urlOptions = { url: buildUrl(getOptions) + '/folders' };
return requestor.get<T>({ ...optionsToSend, ...urlOptions, ...getOptions }, callback);
};

const createWorkspace = <T>(postOptions: PostWorkspaceOptions, callback?: RequestCallback<T>): Promise<T> => {
const urlOptions = { url: buildUrl(postOptions) };
return requestor.post<T>({ ...optionsToSend, ...urlOptions, ...postOptions }, callback);
};

const createFolder = <T>(postOptions: PostWorkspaceOptions, callback?: RequestCallback<T>): Promise<T> => {
const urlOptions = { url: buildUrl(postOptions) + '/folders' };
return requestor.post<T>({ ...optionsToSend, ...urlOptions, ...postOptions }, callback);
};

const updateWorkspace = <T>(putOptions: PutWorkspaceOptions, callback?: RequestCallback<T>): Promise<T> => {
const urlOptions = { url: buildUrl(putOptions) };
return requestor.put<T>({ ...optionsToSend, ...urlOptions, ...putOptions }, callback);
};

const deleteWorkspace = <T>(deleteOptions: DeleteWorkspaceOptions, callback?: RequestCallback<T>): Promise<T> => {
const urlOptions = { url: buildUrl(deleteOptions) };
return requestor.delete<T>({ ...optionsToSend, ...urlOptions, ...deleteOptions }, callback);
};

const copyWorkspace = <T>(postOptions: PostWorkspaceOptions, callback?: RequestCallback<T>): Promise<T> => {
const urlOptions = { url: buildUrl(postOptions) + '/copy' };
return requestor.post<T>({ ...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;
};
148 changes: 148 additions & 0 deletions lib/workspaces/types.ts
Original file line number Diff line number Diff line change
@@ -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<string, string | number | boolean>;
body?: unknown;
[key: string]: unknown;
}

/**
* Workspace requestor interface for HTTP operations
*/
export interface WorkspaceRequestor {
get: <T>(options: HttpRequestOptions, callback?: RequestCallback<T>) => Promise<T>;
post: <T>(options: HttpRequestOptions, callback?: RequestCallback<T>) => Promise<T>;
put: <T>(options: HttpRequestOptions, callback?: RequestCallback<T>) => Promise<T>;
delete: <T>(options: HttpRequestOptions, callback?: RequestCallback<T>) => Promise<T>;
}

/**
* Options for the workspace module
*/
export interface WorkspaceOptions {
requestor: WorkspaceRequestor;
apiUrls: {
workspaces: string;
};
clientOptions: Record<string, unknown>;
}

/**
* 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<WorkspaceGetQueryParams, never> {}

/**
* Body for workspace POST operations
*/
export interface WorkspacePostBody {
name?: string;
[key: string]: unknown;
}

/**
* Options for POST workspace operations
*/
export interface PostWorkspaceOptions extends WorkspaceUrlOptions, RequestOptions<Record<string, string | number | boolean>, WorkspacePostBody> {}

/**
* Options for DELETE workspace operations
*/
export interface DeleteWorkspaceOptions extends WorkspaceUrlOptions, RequestOptions<Record<string, string | number | boolean>, 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<Record<string, string | number | boolean>, WorkspacePutBody> {}

/**
* Workspace object interface returned by the create function
*/
export interface WorkspaceObject {
/**
* Lists all workspaces
*/
listWorkspaces: <T>(getOptions: GetWorkspaceOptions, callback?: RequestCallback<T>) => Promise<T>;

/**
* Gets a specific workspace
*/
getWorkspace: <T>(getOptions: GetWorkspaceOptions, callback?: RequestCallback<T>) => Promise<T>;

/**
* Lists folders in a workspace
*/
listWorkspaceFolders: <T>(getOptions: GetWorkspaceOptions, callback?: RequestCallback<T>) => Promise<T>;

/**
* Creates a new workspace
*/
createWorkspace: <T>(postOptions: PostWorkspaceOptions, callback?: RequestCallback<T>) => Promise<T>;

/**
* Creates a folder in a workspace
*/
createFolder: <T>(postOptions: PostWorkspaceOptions, callback?: RequestCallback<T>) => Promise<T>;

/**
* Deletes a workspace
*/
deleteWorkspace: <T>(deleteOptions: DeleteWorkspaceOptions, callback?: RequestCallback<T>) => Promise<T>;

/**
* Updates a workspace
*/
updateWorkspace: <T>(putOptions: PutWorkspaceOptions, callback?: RequestCallback<T>) => Promise<T>;

/**
* Copies a workspace
*/
copyWorkspace: <T>(postOptions: PostWorkspaceOptions, callback?: RequestCallback<T>) => Promise<T>;

}

/**
* 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;
}
Loading