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:
@@ -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
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user