Merge branch 'dev-main' into dev-kartik

This commit is contained in:
Kartik Datrika
2026-03-27 16:57:22 +05:30
18 changed files with 855 additions and 16 deletions

View File

@@ -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;
}