1
0
mirror of https://github.com/sasjs/adapter.git synced 2026-01-07 12:30:06 +00:00

feat(executeScript): added ability to run arbitrary sas code to 'executeScript()'

This commit is contained in:
Yury Shkoda
2020-09-14 15:21:06 +03:00
parent 3cff286c57
commit 3369b28933

View File

@@ -88,14 +88,18 @@ export class SASViyaApiClient {
const headers: any = { const headers: any = {
'Content-Type': 'application/json' 'Content-Type': 'application/json'
} }
if (accessToken) { if (accessToken) {
headers.Authorization = `Bearer ${accessToken}` headers.Authorization = `Bearer ${accessToken}`
} }
const { result: contexts } = await this.request<{ items: Context[] }>( const { result: contexts } = await this.request<{ items: Context[] }>(
`${this.serverUrl}/compute/contexts`, `${this.serverUrl}/compute/contexts?limit=10000`,
{ headers } { headers }
) )
const contextsList = contexts && contexts.items ? contexts.items : [] const contextsList = contexts && contexts.items ? contexts.items : []
return contextsList.map((context: any) => ({ return contextsList.map((context: any) => ({
createdBy: context.createdBy, createdBy: context.createdBy,
id: context.id, id: context.id,
@@ -113,36 +117,48 @@ export class SASViyaApiClient {
const headers: any = { const headers: any = {
'Content-Type': 'application/json' 'Content-Type': 'application/json'
} }
if (accessToken) { if (accessToken) {
headers.Authorization = `Bearer ${accessToken}` headers.Authorization = `Bearer ${accessToken}`
} }
const { result: contexts } = await this.request<{ items: Context[] }>( const { result: contexts } = await this.request<{ items: Context[] }>(
`${this.serverUrl}/compute/contexts`, `${this.serverUrl}/compute/contexts?limit=10000`,
{ headers } { headers }
) ).catch((err) => {
const contextsList = contexts && contexts.items ? contexts.items : [] throw new Error(err)
})
const contextsList = contexts.items || []
const executableContexts: any[] = [] const executableContexts: any[] = []
const promises = contextsList.map((context: any) => { const promises = contextsList.map((context: any) => {
const linesOfCode = ['%put &=sysuserid;'] const linesOfCode = ['%put &=sysuserid;']
return this.executeScript( return this.executeScript(
`test-${context.name}`, `test-${context.name}`,
linesOfCode, linesOfCode,
context.name, context.name,
accessToken accessToken,
false,
null,
true
).catch(() => null) ).catch(() => null)
}) })
const results = await Promise.all(promises) const results = await Promise.all(promises)
results.forEach((result: any, index: number) => { results.forEach((result: any, index: number) => {
if (result && result.jobStatus === 'completed') { if (result) {
let sysUserId = '' let sysUserId = ''
if (result && result.log && result.log.items) {
const sysUserIdLog = result.log.items.find((i: any) => if (result.log) {
i.line.startsWith('SYSUSERID=') const sysUserIdLog = result.log
) .split('\n')
.find((line: string) => line.startsWith('SYSUSERID='))
if (sysUserIdLog) { if (sysUserIdLog) {
sysUserId = sysUserIdLog.line.replace('SYSUSERID=', '') sysUserId = sysUserIdLog.replace('SYSUSERID=', '')
} }
} }
@@ -380,6 +396,9 @@ export class SASViyaApiClient {
* @param accessToken - an access token for an authorized user. * @param accessToken - an access token for an authorized user.
* @param sessionId - optional session ID to reuse. * @param sessionId - optional session ID to reuse.
* @param silent - optional flag to turn of logging. * @param silent - optional flag to turn of logging.
* @param data - execution data.
* @param debug - flag taht indicates debug mode.
* @param expectWebout - flag that indicates that web output is expected
*/ */
public async executeScript( public async executeScript(
jobName: string, jobName: string,
@@ -388,7 +407,8 @@ export class SASViyaApiClient {
accessToken?: string, accessToken?: string,
silent = false, silent = false,
data = null, data = null,
debug = false debug = false,
expectWebout = false
): Promise<any> { ): Promise<any> {
silent = !debug silent = !debug
try { try {
@@ -433,7 +453,9 @@ export class SASViyaApiClient {
if (data) { if (data) {
if (JSON.stringify(data).includes(';')) { if (JSON.stringify(data).includes(';')) {
files = await this.uploadTables(data, accessToken) files = await this.uploadTables(data, accessToken)
jobVariables['_webin_file_count'] = files.length jobVariables['_webin_file_count'] = files.length
files.forEach((fileInfo, index) => { files.forEach((fileInfo, index) => {
jobVariables[ jobVariables[
`_webin_fileuri${index + 1}` `_webin_fileuri${index + 1}`
@@ -503,7 +525,12 @@ export class SASViyaApiClient {
if (jobStatus === 'failed' || jobStatus === 'error') { if (jobStatus === 'failed' || jobStatus === 'error') {
return Promise.reject({ error: currentJob.error, log }) return Promise.reject({ error: currentJob.error, log })
} }
const resultLink = `/compute/sessions/${executionSessionId}/filerefs/_webout/content`
let resultLink
if (expectWebout) {
resultLink = `/compute/sessions/${executionSessionId}/filerefs/_webout/content`
}
if (resultLink) { if (resultLink) {
jobResult = await this.request<any>( jobResult = await this.request<any>(
@@ -922,7 +949,8 @@ export class SASViyaApiClient {
accessToken, accessToken,
true, true,
data, data,
debug debug,
true
) )
} }