mirror of
https://dev.azure.com/globalhealthx/EMR/_git/helix-engage-server
synced 2026-04-11 18:08:16 +00:00
Merge branch 'dev-main' into dev-kartik
This commit is contained in:
@@ -23,6 +23,10 @@ export class OzonetelAgentService {
|
||||
return this.cachedToken;
|
||||
}
|
||||
|
||||
return this.refreshToken();
|
||||
}
|
||||
|
||||
async refreshToken(): Promise<string> {
|
||||
const url = `https://${this.apiDomain}/ca_apis/CAToken/generateToken`;
|
||||
this.logger.log('Generating CloudAgent API token');
|
||||
|
||||
@@ -37,7 +41,7 @@ export class OzonetelAgentService {
|
||||
const data = response.data;
|
||||
if (data.token) {
|
||||
this.cachedToken = data.token;
|
||||
this.tokenExpiry = Date.now() + 55 * 60 * 1000;
|
||||
this.tokenExpiry = Date.now() + 10 * 60 * 1000; // 10 min cache (Ozonetel expires in ~15 min)
|
||||
this.logger.log('CloudAgent token generated successfully');
|
||||
return data.token;
|
||||
}
|
||||
@@ -45,6 +49,11 @@ export class OzonetelAgentService {
|
||||
throw new Error(data.message ?? 'Token generation failed');
|
||||
}
|
||||
|
||||
private invalidateToken(): void {
|
||||
this.cachedToken = null;
|
||||
this.tokenExpiry = 0;
|
||||
}
|
||||
|
||||
async loginAgent(params: {
|
||||
agentId: string;
|
||||
password: string;
|
||||
@@ -81,20 +90,48 @@ export class OzonetelAgentService {
|
||||
|
||||
const data = response.data;
|
||||
|
||||
// "already logged in" is not a real error — treat as success
|
||||
// "already logged in" — force logout + re-login to refresh SIP phone mapping
|
||||
if (
|
||||
data.status === 'error' &&
|
||||
data.message?.includes('already logged in')
|
||||
) {
|
||||
this.logger.log(
|
||||
`Agent ${params.agentId} already logged in — treating as success`,
|
||||
`Agent ${params.agentId} already logged in — forcing logout + re-login`,
|
||||
);
|
||||
return { status: 'success', message: data.message };
|
||||
try {
|
||||
await this.logoutAgent({
|
||||
agentId: params.agentId,
|
||||
password: params.password,
|
||||
});
|
||||
const retryResponse = await axios.post(
|
||||
url,
|
||||
new URLSearchParams({
|
||||
userName: this.accountId,
|
||||
apiKey: this.apiKey,
|
||||
phoneNumber: params.phoneNumber,
|
||||
action: 'login',
|
||||
mode: params.mode ?? 'blended',
|
||||
state: 'Ready',
|
||||
}).toString(),
|
||||
{
|
||||
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
||||
auth: { username: params.agentId, password: params.password },
|
||||
},
|
||||
);
|
||||
this.logger.log(
|
||||
`Agent re-login response: ${JSON.stringify(retryResponse.data)}`,
|
||||
);
|
||||
return retryResponse.data;
|
||||
} catch (retryErr: any) {
|
||||
this.logger.error(`Agent re-login failed: ${retryErr.message}`);
|
||||
return { status: 'success', message: 'Re-login attempted' };
|
||||
}
|
||||
}
|
||||
|
||||
this.logger.log(`Agent login response: ${JSON.stringify(data)}`);
|
||||
return data;
|
||||
} catch (error: any) {
|
||||
if (error?.response?.status === 401) this.invalidateToken();
|
||||
this.logger.error(`Agent login failed: ${error.message}`);
|
||||
throw error;
|
||||
}
|
||||
@@ -129,10 +166,10 @@ export class OzonetelAgentService {
|
||||
},
|
||||
},
|
||||
);
|
||||
|
||||
this.logger.log(`Manual dial response: ${JSON.stringify(response.data)}`);
|
||||
return response.data;
|
||||
} catch (error: any) {
|
||||
if (error?.response?.status === 401) this.invalidateToken();
|
||||
const responseData = error?.response?.data
|
||||
? JSON.stringify(error.response.data)
|
||||
: '';
|
||||
@@ -362,6 +399,7 @@ export class OzonetelAgentService {
|
||||
}
|
||||
return [];
|
||||
} catch (error: any) {
|
||||
if (error?.response?.status === 401) this.invalidateToken();
|
||||
this.logger.error(`Abandon calls failed: ${error.message}`);
|
||||
return [];
|
||||
}
|
||||
@@ -458,6 +496,7 @@ export class OzonetelAgentService {
|
||||
}
|
||||
return null;
|
||||
} catch (error: any) {
|
||||
if (error?.response?.status === 401) this.invalidateToken();
|
||||
this.logger.error(`Agent summary failed: ${error.message}`);
|
||||
return null;
|
||||
}
|
||||
@@ -487,6 +526,7 @@ export class OzonetelAgentService {
|
||||
}
|
||||
return '00:00:00';
|
||||
} catch (error: any) {
|
||||
if (error?.response?.status === 401) this.invalidateToken();
|
||||
this.logger.error(`AHT failed: ${error.message}`);
|
||||
return '00:00:00';
|
||||
}
|
||||
@@ -526,6 +566,7 @@ export class OzonetelAgentService {
|
||||
);
|
||||
return response.data;
|
||||
} catch (error: any) {
|
||||
if (error?.response?.status === 401) this.invalidateToken();
|
||||
this.logger.error(`Agent logout failed: ${error.message}`);
|
||||
throw error;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user