diff --git a/src/SASBaseApiClient.ts b/src/SASBaseApiClient.ts index 30684fb..45159ce 100644 --- a/src/SASBaseApiClient.ts +++ b/src/SASBaseApiClient.ts @@ -1,105 +1,35 @@ -import { - MemberType, - FolderMember, - ServiceMember, - ExecutionQuery, - ExecutionResult -} from './types' -import { - createFolder, - createFile, - fileExists, - readFile, - asyncForEach, - generateTimestamp -} from '@sasjs/utils' -import { getTmpFilesFolderPath, getTmpLogFolderPath } from './utils' -import * as path from 'path' -import { promisify } from 'util' -import { execFile } from 'child_process' -const execFilePromise = promisify(execFile) +import { FolderMember, ServiceMember, ExecutionQuery } from './types' +import { RequestClient } from './request/RequestClient' export class SASBaseApiClient { + constructor( + private serverUrl: string, + private requestClient: RequestClient + ) {} + + public setConfig(serverUrl: string) { + if (serverUrl) this.serverUrl = serverUrl + } + public async deploy(members: [FolderMember, ServiceMember]) { - await this.createFileTree(members) + const { result } = await this.requestClient.post<{ + status: string + message: string + example?: {} + }>('/deploy', members, undefined) + + return Promise.resolve(result) } - constructor(private pathSASBase: string) {} + public async executeJob(query: ExecutionQuery) { + const { result } = await this.requestClient.post<{ + status: string + message: string + log?: string + logPath?: string + error?: {} + }>('/execute', query, undefined) - public setConfig(pathSASBase: string) { - if (pathSASBase) this.pathSASBase = pathSASBase - } - - // TODO: make public - private async createFileTree( - members: [FolderMember, ServiceMember], - parentFolders: string[] = [] - ) { - const destinationPath = path.join( - await getTmpFilesFolderPath(), - path.join(...parentFolders) - ) - - await asyncForEach( - members, - async (member: FolderMember | ServiceMember) => { - const name = member.name - - if (member.type === MemberType.folder) { - await createFolder(path.join(destinationPath, name)).catch((err) => - Promise.reject({ error: err, failedToCreate: name }) - ) - - await this.createFileTree(member.members, [ - ...parentFolders, - name - ]).catch((err) => - Promise.reject({ error: err, failedToCreate: name }) - ) - } else { - await createFile(path.join(destinationPath, name), member.code).catch( - (err) => Promise.reject({ error: err, failedToCreate: name }) - ) - } - } - ) - - return Promise.resolve(true) - } - - public async executeScript( - query: ExecutionQuery - ): Promise { - let sasCodePath = path.join(await getTmpFilesFolderPath(), query._program) - - sasCodePath = sasCodePath.replace(new RegExp('/', 'g'), path.sep) - - if (!(await fileExists(sasCodePath))) { - return Promise.reject(`${query._program} does not exist.`) - } - - const sasFile: string = sasCodePath.split(path.sep).pop() || 'default' - - const sasLogPath = path.join( - await getTmpLogFolderPath(), - [sasFile.replace(/\.sas/g, ''), '-', generateTimestamp(), '.log'].join('') - ) - - const { stdout, stderr } = await execFilePromise(this.pathSASBase, [ - '-SYSIN', - sasCodePath, - '-log', - sasLogPath, - '-nosplash' - ]) - - if (stderr) return Promise.reject(stderr) - - if (await fileExists(sasLogPath)) { - return Promise.resolve({ - log: await readFile(sasLogPath), - logPath: sasLogPath - }) - } + return Promise.resolve(result) } } diff --git a/src/SASjs.ts b/src/SASjs.ts index 16b6651..aea66a8 100644 --- a/src/SASjs.ts +++ b/src/SASjs.ts @@ -834,8 +834,8 @@ export default class SASjs { return await this.sasBaseApiClient?.deploy(members) } - public async executeScriptSASBase(query: ExecutionQuery) { - return await this.sasBaseApiClient?.executeScript(query) + public async executeJobSASBase(query: ExecutionQuery) { + return await this.sasBaseApiClient?.executeJob(query) } /** @@ -1018,10 +1018,11 @@ export default class SASjs { if (this.sasjsConfig.serverType === ServerType.Sasjs) { if (this.sasBaseApiClient) { - this.sasBaseApiClient.setConfig(this.sasjsConfig.pathSASBase) + this.sasBaseApiClient.setConfig(this.sasjsConfig.serverUrl) } else { this.sasBaseApiClient = new SASBaseApiClient( - this.sasjsConfig.pathSASBase + this.sasjsConfig.serverUrl, + this.requestClient ) } }