From fc9056c1ac7bf01f4213a22b46dc90434051f5cb Mon Sep 17 00:00:00 2001 From: Yury Shkoda Date: Mon, 28 Sep 2020 14:59:27 +0300 Subject: [PATCH] chore(folder-management): made 'moveFolder' method public and fixed 'createFolder' method --- src/SASViyaApiClient.ts | 50 ++++++++++++++--------------------------- src/SASjs.ts | 23 +++++++++++++++++++ 2 files changed, 40 insertions(+), 33 deletions(-) diff --git a/src/SASViyaApiClient.ts b/src/SASViyaApiClient.ts index a248e9c..47ac34b 100644 --- a/src/SASViyaApiClient.ts +++ b/src/SASViyaApiClient.ts @@ -43,7 +43,6 @@ export class SASViyaApiClient { this.contextName, this.setCsrfToken ) - private isForceDeploy: boolean = false private folderMap = new Map() /** @@ -625,8 +624,6 @@ export class SASViyaApiClient { if (!parentFolderUri && parentFolderPath) { parentFolderUri = await this.getFolderUri(parentFolderPath, accessToken) if (!parentFolderUri) { - if (isForced) this.isForceDeploy = true - console.log( `Parent folder at path '${parentFolderPath}' is not present.` ) @@ -652,37 +649,16 @@ export class SASViyaApiClient { `Parent folder '${newFolderName}' has been successfully created.` ) parentFolderUri = `/folders/folders/${parentFolder.id}` - } else if (isForced && accessToken && !this.isForceDeploy) { - this.isForceDeploy = true + } else if (isForced && accessToken) { + const folderPath = parentFolderPath + '/' + folderName + const folderUri = await this.getFolderUri(folderPath, accessToken) - await this.deleteFolder(parentFolderPath, accessToken) - - const newParentFolderPath = parentFolderPath.substring( - 0, - parentFolderPath.lastIndexOf('/') - ) - const newFolderName = `${parentFolderPath.split('/').pop()}` - - if (newParentFolderPath === '') { - throw new Error(`Root folder has to be present on the server.`) + if (folderUri) { + await this.deleteFolder( + parentFolderPath + '/' + folderName, + accessToken + ) } - - console.log( - `Creating parent folder:\n'${newFolderName}' in '${newParentFolderPath}'` - ) - - const parentFolder = await this.createFolder( - newFolderName, - newParentFolderPath, - undefined, - accessToken - ) - - console.log( - `Parent folder '${newFolderName}' has been successfully created.` - ) - - parentFolderUri = `/folders/folders/${parentFolder.id}` } } @@ -1508,7 +1484,15 @@ export class SASViyaApiClient { `${this.serverUrl}${url}`, requestInfo ).catch((err) => { - // FIXME: handle 'code: 'ENOTFOUND'' properly + if (err.code && err.code === 'ENOTFOUND') { + const notFoundError = { + body: JSON.stringify({ + message: `Folder '${sourceFolder.split('/').pop()}' was not found.` + }) + } + + throw notFoundError + } throw err }) diff --git a/src/SASjs.ts b/src/SASjs.ts index fd46024..955d1ac 100644 --- a/src/SASjs.ts +++ b/src/SASjs.ts @@ -270,6 +270,29 @@ export default class SASjs { return await this.sasViyaApiClient?.deleteFolder(folderPath, accessToken) } + /** + * Moves folder to a new location. The folder may be renamed at the same time. + * @param sourceFolder - the full path (eg `/Public/example/myFolder`) or URI of the source folder to be moved. Providing URI instead of path will save one extra request. + * @param targetParentFolder - the full path or URI of the _parent_ folder to which the `sourceFolder` will be moved (eg `/Public/newDestination`). To move a folder, a user has to have write permissions in targetParentFolder. Providing URI instead of path will save one extra request. + * @param targetFolderName - the name of the "moved" folder. If left blank, the original folder name will be used (eg `myFolder` in `/Public/newDestination/myFolder` for the example above). Optional field. + * @param accessToken - an access token for authorizing the request. + */ + public async moveFolder( + sourceFolder: string, + targetParentFolder: string, + targetFolderName: string, + accessToken: string + ) { + this.isMethodSupported('moveFolder', ServerType.SASViya) + + return await this.sasViyaApiClient?.moveFolder( + sourceFolder, + targetParentFolder, + targetFolderName, + accessToken + ) + } + public async createJobDefinition( jobName: string, code: string,