kod-temp
Version:
Workano Communications SDK
159 lines (158 loc) • 6.79 kB
JavaScript
import { generateExtens } from "../../utils/exten";
import workano from "../../lib/index";
function randomString(length, options = {}) {
let chars = "abcdefghijklmnopqrstuvwxyz";
if (options.uppercase)
chars += "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
if (options.numbers)
chars += "0123456789";
let result = "";
for (let i = 0; i < length; i++) {
result += chars.charAt(Math.floor(Math.random() * chars.length));
}
return result;
}
function randomNumericString(length) {
let chars = "0123456789";
let result = "";
for (let i = 0; i < length; i++) {
result += chars.charAt(Math.floor(Math.random() * chars.length));
}
return result;
}
export default class {
static async addUser(user) {
try {
// Fetch templates
const templates = await workano.confd.listTemplates();
const globalTemplateUUID = templates.items.find((template) => template.label === "global")?.uuid;
const webrtcTemplateUUID = templates.items.find((template) => template.label === "webrtc")?.uuid;
let selectedTemplateUUID = user.subscription_type === 0 ? globalTemplateUUID : webrtcTemplateUUID;
if (!selectedTemplateUUID) {
throw new Error("Template UUID not found for the given subscription type");
}
const caller_id = `"${user.firstname_english} ${user.lastname_english}"`;
// Build auth data
const authData = {
firstname: user.firstname,
lastname: user.lastname,
email_address: user.email,
username: user.email,
enabled: true,
purpose: "user",
password: user.password,
};
// Build lines
let lines = [];
if (user.lines && user.lines.length > 0) {
lines = user.lines.map((line) => {
const lineName = randomString(8, { uppercase: false, numbers: true });
const randomCode = randomNumericString(6);
return {
...line,
name: lineName,
provisioning_extension: randomCode,
provisioning_code: randomCode,
caller_id_name: `${user.firstname} ${user.lastname}`,
context: line.extensions[0].context,
caller_id_num: line.extensions?.[0].exten,
registrar: "default",
protocol: "sip",
endpoint_sip: {
templates: [{ uuid: selectedTemplateUUID }],
label: lineName,
name: lineName,
auth_section_options: [
[
"password",
randomString(8, { uppercase: true, numbers: true }),
],
["username", lineName],
],
},
extensions: line.extensions.map((ext) => ({
...ext,
})),
};
});
}
// Adjust selectedTemplateUUID for new line if necessary
if (lines.length > 0) {
const lastLineTemplateUUID = lines[lines.length - 1].endpoint_sip.templates[0].uuid;
selectedTemplateUUID =
lastLineTemplateUUID === globalTemplateUUID
? webrtcTemplateUUID
: globalTemplateUUID;
}
// If subscription_type is 1, add a new line
const additionalLinesCount = user.subscription_type >= 1 && user.subscription_type <= 3
? user.subscription_type
: 0;
if (additionalLinesCount) {
const lineName = randomString(8, { uppercase: false, numbers: true });
const randomCode = randomNumericString(6);
const newLine = {
...lines[0], // Copy properties from the first line if exists
name: lineName,
provisioning_extension: randomCode,
provisioning_code: randomCode,
position: 2,
endpoint_sip: {
...lines[0]?.endpoint_sip,
label: lineName,
name: lineName,
auth_section_options: [
["password", randomString(8, { uppercase: true, numbers: true })],
["username", lineName],
],
templates: [{ uuid: selectedTemplateUUID }],
},
};
lines.push(newLine);
}
// Prepare the requestData
const requestData = {
auth: authData,
caller_id: caller_id,
subscription_type: user.subscription_type,
firstname: user.firstname,
lastname: user.lastname,
language: user.language,
email: user.email,
username: user.email,
mobile_phone_number: user.mobile_phone_number,
lines: lines,
call_transfer_enabled: true,
dtmf_hangup_enabled: true,
enabled: true,
};
// Create the user
const confUserSubmitResult = await workano.confd.addUser(requestData);
// // Assign ACL policies to the user
// if (user.acl_policies && user.acl_policies.length > 0) {
// for (const aclPolicyUUID of user.acl_policies) {
// await workano.auth.addUserPolicy(
// confUserSubmitResult.uuid,
// aclPolicyUUID
// );
// }
// }
return confUserSubmitResult;
}
catch (error) {
throw error;
}
}
static async getExtensions() {
const contextsResponse = await workano.confd.listContexts();
const extensionsResponse = await workano.confd.listExtensions();
const contexts = contextsResponse.items;
const extensions = extensionsResponse.items;
const result = contexts.map((context) => ({
context: context.name,
contextLabel: context.label,
numbers: generateExtens(context, "user", extensions),
}));
return result;
}
}