1
0
mirror of https://github.com/sasjs/adapter.git synced 2025-12-11 09:24:35 +00:00

fix: web approach login callback and debug issue

This commit is contained in:
Mihajlo Medjedovic
2021-02-23 22:36:11 +01:00
parent 50be3acc78
commit c7e54cfe9f
6 changed files with 163 additions and 72 deletions

View File

@@ -20,35 +20,50 @@ export class ComputeJobExecutor extends BaseJobExecutor {
const waitForResult = true
const expectWebout = true
return this.sasViyaApiClient
?.executeComputeJob(
sasJob,
config.contextName,
config.debug,
data,
accessToken,
waitForResult,
expectWebout
)
.then((response) => {
this.appendRequest(response, sasJob, config.debug)
let responseJson
const requestPromise = new Promise((resolve, reject) => {
this.sasViyaApiClient
?.executeComputeJob(
sasJob,
config.contextName,
config.debug,
data,
accessToken,
waitForResult,
expectWebout
)
.then((response) => {
this.appendRequest(response, sasJob, config.debug)
return response.result
resolve(response.result)
})
.catch(async (e: Error) => {
if (e instanceof ComputeJobExecutionError) {
this.appendRequest(e, sasJob, config.debug)
return responseJson
})
.catch(async (e: Error) => {
if (e instanceof ComputeJobExecutionError) {
this.appendRequest(e, sasJob, config.debug)
}
if (e instanceof LoginRequiredError) {
await loginCallback()
this.appendWaitingRequest(() =>
this.execute(sasJob, data, config, loginRequiredCallback)
)
}
return Promise.reject(new ErrorResponse(e?.message, e))
})
reject(new ErrorResponse(e?.message, e))
}
if (e instanceof LoginRequiredError) {
await loginCallback()
this.appendWaitingRequest(() => {
return this.execute(
sasJob,
data,
config,
loginRequiredCallback
).then(
(res: any) => {
resolve(res)
},
(err: any) => {
reject(err)
}
)
})
}
})
})
return requestPromise
}
}

View File

@@ -17,24 +17,50 @@ export class JesJobExecutor extends BaseJobExecutor {
accessToken?: string
) {
const loginCallback = loginRequiredCallback || (() => Promise.resolve())
return await this.sasViyaApiClient
?.executeJob(sasJob, config.contextName, config.debug, data, accessToken)
.then((response) => {
this.appendRequest(response, sasJob, config.debug)
return response.result
})
.catch(async (e: Error) => {
if (e instanceof JobExecutionError) {
this.appendRequest(e, sasJob, config.debug)
}
if (e instanceof LoginRequiredError) {
await loginCallback()
this.appendWaitingRequest(() =>
this.execute(sasJob, data, config, loginRequiredCallback)
)
}
return Promise.reject(new ErrorResponse(e?.message, e))
})
const requestPromise = new Promise((resolve, reject) => {
this.sasViyaApiClient
?.executeJob(
sasJob,
config.contextName,
config.debug,
data,
accessToken
)
.then((response) => {
this.appendRequest(response, sasJob, config.debug)
resolve(response.result)
})
.catch(async (e: Error) => {
if (e instanceof JobExecutionError) {
this.appendRequest(e, sasJob, config.debug)
reject(new ErrorResponse(e?.message, e))
}
if (e instanceof LoginRequiredError) {
await loginCallback()
this.appendWaitingRequest(() => {
return this.execute(
sasJob,
data,
config,
loginRequiredCallback
).then(
(res: any) => {
resolve(res)
},
(err: any) => {
reject(err)
}
)
})
}
})
})
return requestPromise
}
}

View File

@@ -7,6 +7,11 @@ import { SASViyaApiClient } from '../SASViyaApiClient'
import { isRelativePath } from '../utils'
import { BaseJobExecutor } from './JobExecutor'
export interface WaitingRequstPromise {
promise: Promise<any> | null
resolve: any
reject: any
}
export class WebJobExecutor extends BaseJobExecutor {
constructor(
serverUrl: string,
@@ -80,30 +85,49 @@ export class WebJobExecutor extends BaseJobExecutor {
}
}
return this.requestClient!.post(apiUrl, formData, undefined)
.then(async (res) => {
if (this.serverType === ServerType.SasViya && config.debug) {
const jsonResponse = await this.parseSasViyaDebugResponse(
res.result as string
)
const requestPromise = new Promise((resolve, reject) => {
this.requestClient!.post(apiUrl, formData, undefined)
.then(async (res) => {
if (this.serverType === ServerType.SasViya && config.debug) {
const jsonResponse = await this.parseSasViyaDebugResponse(
res.result as string
)
this.appendRequest(res, sasJob, config.debug)
resolve(jsonResponse)
}
this.appendRequest(res, sasJob, config.debug)
return jsonResponse
}
this.appendRequest(res, sasJob, config.debug)
return res.result
})
.catch(async (e: Error) => {
if (e instanceof JobExecutionError) {
this.appendRequest(e, sasJob, config.debug)
}
if (e instanceof LoginRequiredError) {
await loginCallback()
this.appendWaitingRequest(() =>
this.execute(sasJob, data, config, loginRequiredCallback)
)
}
return Promise.reject(new ErrorResponse(e?.message, e))
})
resolve(res.result)
})
.catch(async (e: Error) => {
if (e instanceof JobExecutionError) {
this.appendRequest(e, sasJob, config.debug)
reject(new ErrorResponse(e?.message, e))
}
if (e instanceof LoginRequiredError) {
await loginCallback()
this.appendWaitingRequest(() => {
return this.execute(
sasJob,
data,
config,
loginRequiredCallback
).then(
(res: any) => {
resolve(res)
},
(err: any) => {
reject(err)
}
)
})
}
})
})
return requestPromise
}
private parseSasViyaDebugResponse = async (response: string) => {

View File

@@ -376,6 +376,7 @@ export class RequestClient implements HttpClient {
}
return {
result: parsedResponse as T,
log: response.data,
etag
}
}

View File

@@ -8,6 +8,16 @@ const mockedAxios = axios as jest.Mocked<typeof axios>
describe('ContextManager', () => {
dotenv.config()
const sampleLogResponse = {
"items": [{
"attributes": {},
"createdBy": "fake creator",
"id": "fakeId",
"name": "Compute Context To Delete",
"version": 2,
}]
}
const contextManager = new ContextManager(
process.env.SERVER_URL as string,
new RequestClient(process.env.SERVER_URL as string)
@@ -448,9 +458,12 @@ describe('ContextManager', () => {
Promise.resolve({ data: sampleResponseGetComputeContextByName })
)
sampleLogResponse.items[0].name = 'updated name'
const expectedResponse = {
etag: '',
result: sampleResponseGetComputeContextByName
result: sampleResponseGetComputeContextByName,
log: sampleLogResponse
}
await expect(
@@ -577,9 +590,12 @@ describe('ContextManager', () => {
Promise.resolve({ data: sampleResponseDeletedContext })
)
sampleLogResponse.items[0].name = 'Compute Context To Delete'
const expectedResponse = {
etag: '',
result: sampleResponseDeletedContext
result: sampleResponseDeletedContext,
log: sampleLogResponse
}
await expect(

View File

@@ -25,11 +25,20 @@ describe('SessionManager', () => {
version: 1
}
const sampleLogResponse = {
"links": [],
"name": "SYSJOBID",
"ok": true,
"scope": "GLOBAL",
"value": "25218",
"version": 1,
}
mockedAxios.get.mockImplementation(() =>
Promise.resolve({ data: sampleResponse })
)
const expectedResponse = { etag: '', result: sampleResponse }
const expectedResponse = { etag: '', result: sampleResponse, log: sampleLogResponse}
await expect(
sessionManager.getVariable(