mirror of
https://github.com/jambonz/sbc-inbound.git
synced 2026-10-04 02:04:22 +00:00
Feature/sp limits (#49)
* add account and service provider call limits * add custom headers when rejecting calls due to max calls limit
This commit is contained in:
@@ -44,7 +44,8 @@ const {
|
|||||||
lookupAppByTeamsTenant,
|
lookupAppByTeamsTenant,
|
||||||
lookupAccountBySipRealm,
|
lookupAccountBySipRealm,
|
||||||
lookupAccountBySid,
|
lookupAccountBySid,
|
||||||
lookupAccountCapacitiesBySid
|
lookupAccountCapacitiesBySid,
|
||||||
|
queryCallLimits
|
||||||
} = require('@jambonz/db-helpers')({
|
} = require('@jambonz/db-helpers')({
|
||||||
host: process.env.JAMBONES_MYSQL_HOST,
|
host: process.env.JAMBONES_MYSQL_HOST,
|
||||||
user: process.env.JAMBONES_MYSQL_USER,
|
user: process.env.JAMBONES_MYSQL_USER,
|
||||||
@@ -88,7 +89,8 @@ srf.locals = {...srf.locals,
|
|||||||
lookupAppByTeamsTenant,
|
lookupAppByTeamsTenant,
|
||||||
lookupAccountBySid,
|
lookupAccountBySid,
|
||||||
lookupAccountBySipRealm,
|
lookupAccountBySipRealm,
|
||||||
lookupAccountCapacitiesBySid
|
lookupAccountCapacitiesBySid,
|
||||||
|
queryCallLimits
|
||||||
},
|
},
|
||||||
realtimeDbHelpers: {
|
realtimeDbHelpers: {
|
||||||
createSet,
|
createSet,
|
||||||
|
|||||||
@@ -309,8 +309,6 @@ class CallSession extends Emitter {
|
|||||||
const {account_sid, service_provider_sid} = this.req.locals;
|
const {account_sid, service_provider_sid} = this.req.locals;
|
||||||
const {writeCallCount, writeCallCountSP} = this.req.srf.locals;
|
const {writeCallCount, writeCallCountSP} = this.req.srf.locals;
|
||||||
|
|
||||||
this.logger.info('going to decrement call count');
|
|
||||||
|
|
||||||
Promise.all([
|
Promise.all([
|
||||||
this.decrKey(this.callCountKey),
|
this.decrKey(this.callCountKey),
|
||||||
this.decrKey(this.callCountKeySP)
|
this.decrKey(this.callCountKeySP)
|
||||||
|
|||||||
+49
-14
@@ -61,7 +61,8 @@ module.exports = function(srf, logger) {
|
|||||||
lookupAppByTeamsTenant,
|
lookupAppByTeamsTenant,
|
||||||
lookupAccountBySipRealm,
|
lookupAccountBySipRealm,
|
||||||
lookupAccountBySid,
|
lookupAccountBySid,
|
||||||
lookupAccountCapacitiesBySid
|
lookupAccountCapacitiesBySid,
|
||||||
|
queryCallLimits
|
||||||
} = srf.locals.dbHelpers;
|
} = srf.locals.dbHelpers;
|
||||||
const {stats, writeCdrs} = srf.locals;
|
const {stats, writeCdrs} = srf.locals;
|
||||||
const authenticator = require('@jambonz/http-authenticator')(lookupAuthHook, logger, {
|
const authenticator = require('@jambonz/http-authenticator')(lookupAuthHook, logger, {
|
||||||
@@ -303,26 +304,60 @@ module.exports = function(srf, logger) {
|
|||||||
logger.debug(`checkLimits: call count is now ${calls}, limit is ${minLimit}`);
|
logger.debug(`checkLimits: call count is now ${calls}, limit is ${minLimit}`);
|
||||||
if (calls <= minLimit) return next();
|
if (calls <= minLimit) return next();
|
||||||
|
|
||||||
const accountCapacities = await lookupAccountCapacitiesBySid(account_sid);
|
if (process.env.JAMBONES_HOSTING) {
|
||||||
const accountLimit = accountCapacities.find((c) => c.category == 'voice_call_session');
|
const accountCapacities = await lookupAccountCapacitiesBySid(account_sid);
|
||||||
if (accountLimit) {
|
const accountLimit = accountCapacities.find((c) => c.category == 'voice_call_session');
|
||||||
/* check account limit */
|
if (accountLimit) {
|
||||||
const limit_sessions = accountLimit.quantity;
|
/* check account limit */
|
||||||
if (calls > limit_sessions) {
|
const limit_sessions = accountLimit.quantity;
|
||||||
debug(`checkLimits: limits exceeded: call count ${calls}, limit ${limit_sessions}`);
|
if (calls > limit_sessions) {
|
||||||
logger.info({calls, limit_sessions}, 'checkLimits: limits exceeded');
|
debug(`checkLimits: limits exceeded: call count ${calls}, limit ${limit_sessions}`);
|
||||||
|
logger.info({calls, limit_sessions}, 'checkLimits: limits exceeded');
|
||||||
|
writeAlerts({
|
||||||
|
alert_type: AlertType.ACCOUNT_CALL_LIMIT,
|
||||||
|
service_provider_sid: account.service_provider_sid,
|
||||||
|
account_sid,
|
||||||
|
count: limit_sessions
|
||||||
|
}).catch((err) => logger.info({err}, 'checkLimits: error writing alert'));
|
||||||
|
res.send(503, 'Maximum Calls In Progress');
|
||||||
|
return req.srf.endSession(req);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (process.env.JAMBONES_TRACK_ACCOUNT_CALLS) {
|
||||||
|
const {account_limit, sp_limit} = await queryCallLimits(service_provider_sid, account_sid);
|
||||||
|
if (account_limit > 0 && calls > account_limit) {
|
||||||
|
logger.info({calls, account_limit}, 'checkLimits: account limits exceeded');
|
||||||
writeAlerts({
|
writeAlerts({
|
||||||
alert_type: AlertType.ACCOUNT_CALL_LIMIT,
|
alert_type: AlertType.ACCOUNT_CALL_LIMIT,
|
||||||
service_provider_sid: account.service_provider_sid,
|
service_provider_sid: service_provider_sid,
|
||||||
account_sid,
|
account_sid,
|
||||||
count: limit_sessions
|
count: calls
|
||||||
}).catch((err) => logger.info({err}, 'checkLimits: error writing alert'));
|
}).catch((err) => logger.info({err}, 'checkLimits: error writing alert'));
|
||||||
res.send(503, 'Maximum Calls In Progress');
|
res.send(503, 'Max Account Calls In Progress', {
|
||||||
|
headers: {
|
||||||
|
'X-Account-Sid': account_sid,
|
||||||
|
'X-Call-Limit': account_limit
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return req.srf.endSession(req);
|
||||||
|
}
|
||||||
|
if (sp_limit > 0 && callsSP > sp_limit) {
|
||||||
|
logger.info({callsSP, sp_limit}, 'checkLimits: service provider limits exceeded');
|
||||||
|
writeAlerts({
|
||||||
|
alert_type: AlertType.SP_CALL_LIMIT,
|
||||||
|
service_provider_sid: service_provider_sid,
|
||||||
|
count: callsSP
|
||||||
|
}).catch((err) => logger.info({err}, 'checkLimits: error writing alert'));
|
||||||
|
res.send(503, 'Max Service Provider Calls In Progress', {
|
||||||
|
headers: {
|
||||||
|
'X-Service-Provider-Sid': service_provider_sid,
|
||||||
|
'X-Call-Limit': sp_limit
|
||||||
|
}
|
||||||
|
});
|
||||||
return req.srf.endSession(req);
|
return req.srf.endSession(req);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO: implement service provider limits
|
|
||||||
next();
|
next();
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
stats.increment('sbc.terminations', ['sipStatus:500']);
|
stats.increment('sbc.terminations', ['sipStatus:500']);
|
||||||
|
|||||||
Generated
+7
-7
@@ -9,7 +9,7 @@
|
|||||||
"version": "v0.7.6",
|
"version": "v0.7.6",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@jambonz/db-helpers": "^0.6.18",
|
"@jambonz/db-helpers": "^0.6.19",
|
||||||
"@jambonz/http-authenticator": "^0.2.2",
|
"@jambonz/http-authenticator": "^0.2.2",
|
||||||
"@jambonz/http-health-check": "^0.0.1",
|
"@jambonz/http-health-check": "^0.0.1",
|
||||||
"@jambonz/realtimedb-helpers": "^0.4.29",
|
"@jambonz/realtimedb-helpers": "^0.4.29",
|
||||||
@@ -573,9 +573,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@jambonz/db-helpers": {
|
"node_modules/@jambonz/db-helpers": {
|
||||||
"version": "0.6.18",
|
"version": "0.6.19",
|
||||||
"resolved": "https://registry.npmjs.org/@jambonz/db-helpers/-/db-helpers-0.6.18.tgz",
|
"resolved": "https://registry.npmjs.org/@jambonz/db-helpers/-/db-helpers-0.6.19.tgz",
|
||||||
"integrity": "sha512-9wTkOxqIbNd95+0yznGFPPTRih/xPRnX7ajrJMxzKqzzHQ/CUQgOfjfGcxmOBx3UxaWBmxyHQeYA3oZMPPyX+Q==",
|
"integrity": "sha512-mR9PqPY4aEoeTtUuZI1+4r+k1BFKoe0Dl9pyeAEvm7KSlRMHCVWbOzVE8WfoifC9dZ9541iW5pseqqip3QMkyw==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"cidr-matcher": "^2.1.1",
|
"cidr-matcher": "^2.1.1",
|
||||||
"debug": "^4.3.3",
|
"debug": "^4.3.3",
|
||||||
@@ -5752,9 +5752,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"@jambonz/db-helpers": {
|
"@jambonz/db-helpers": {
|
||||||
"version": "0.6.18",
|
"version": "0.6.19",
|
||||||
"resolved": "https://registry.npmjs.org/@jambonz/db-helpers/-/db-helpers-0.6.18.tgz",
|
"resolved": "https://registry.npmjs.org/@jambonz/db-helpers/-/db-helpers-0.6.19.tgz",
|
||||||
"integrity": "sha512-9wTkOxqIbNd95+0yznGFPPTRih/xPRnX7ajrJMxzKqzzHQ/CUQgOfjfGcxmOBx3UxaWBmxyHQeYA3oZMPPyX+Q==",
|
"integrity": "sha512-mR9PqPY4aEoeTtUuZI1+4r+k1BFKoe0Dl9pyeAEvm7KSlRMHCVWbOzVE8WfoifC9dZ9541iW5pseqqip3QMkyw==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"cidr-matcher": "^2.1.1",
|
"cidr-matcher": "^2.1.1",
|
||||||
"debug": "^4.3.3",
|
"debug": "^4.3.3",
|
||||||
|
|||||||
+1
-1
@@ -25,7 +25,7 @@
|
|||||||
"jslint": "eslint app.js lib"
|
"jslint": "eslint app.js lib"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@jambonz/db-helpers": "^0.6.18",
|
"@jambonz/db-helpers": "^0.6.19",
|
||||||
"@jambonz/http-authenticator": "^0.2.2",
|
"@jambonz/http-authenticator": "^0.2.2",
|
||||||
"@jambonz/http-health-check": "^0.0.1",
|
"@jambonz/http-health-check": "^0.0.1",
|
||||||
"@jambonz/realtimedb-helpers": "^0.4.29",
|
"@jambonz/realtimedb-helpers": "^0.4.29",
|
||||||
|
|||||||
+79
-17
@@ -8,6 +8,8 @@ DROP TABLE IF EXISTS account_products;
|
|||||||
|
|
||||||
DROP TABLE IF EXISTS account_subscriptions;
|
DROP TABLE IF EXISTS account_subscriptions;
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS account_limits;
|
||||||
|
|
||||||
DROP TABLE IF EXISTS beta_invite_codes;
|
DROP TABLE IF EXISTS beta_invite_codes;
|
||||||
|
|
||||||
DROP TABLE IF EXISTS call_routes;
|
DROP TABLE IF EXISTS call_routes;
|
||||||
@@ -20,12 +22,16 @@ DROP TABLE IF EXISTS lcr_routes;
|
|||||||
|
|
||||||
DROP TABLE IF EXISTS predefined_sip_gateways;
|
DROP TABLE IF EXISTS predefined_sip_gateways;
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS predefined_smpp_gateways;
|
||||||
|
|
||||||
DROP TABLE IF EXISTS predefined_carriers;
|
DROP TABLE IF EXISTS predefined_carriers;
|
||||||
|
|
||||||
DROP TABLE IF EXISTS account_offers;
|
DROP TABLE IF EXISTS account_offers;
|
||||||
|
|
||||||
DROP TABLE IF EXISTS products;
|
DROP TABLE IF EXISTS products;
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS schema_version;
|
||||||
|
|
||||||
DROP TABLE IF EXISTS api_keys;
|
DROP TABLE IF EXISTS api_keys;
|
||||||
|
|
||||||
DROP TABLE IF EXISTS sbc_addresses;
|
DROP TABLE IF EXISTS sbc_addresses;
|
||||||
@@ -34,6 +40,8 @@ DROP TABLE IF EXISTS ms_teams_tenants;
|
|||||||
|
|
||||||
DROP TABLE IF EXISTS signup_history;
|
DROP TABLE IF EXISTS signup_history;
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS service_provider_limits;
|
||||||
|
|
||||||
DROP TABLE IF EXISTS smpp_addresses;
|
DROP TABLE IF EXISTS smpp_addresses;
|
||||||
|
|
||||||
DROP TABLE IF EXISTS speech_credentials;
|
DROP TABLE IF EXISTS speech_credentials;
|
||||||
@@ -84,6 +92,15 @@ pending_reason VARBINARY(52),
|
|||||||
PRIMARY KEY (account_subscription_sid)
|
PRIMARY KEY (account_subscription_sid)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
CREATE TABLE account_limits
|
||||||
|
(
|
||||||
|
account_limits_sid CHAR(36) NOT NULL UNIQUE ,
|
||||||
|
account_sid CHAR(36) NOT NULL,
|
||||||
|
category ENUM('api_rate','voice_call_session', 'device') NOT NULL,
|
||||||
|
quantity INTEGER NOT NULL,
|
||||||
|
PRIMARY KEY (account_limits_sid)
|
||||||
|
);
|
||||||
|
|
||||||
CREATE TABLE beta_invite_codes
|
CREATE TABLE beta_invite_codes
|
||||||
(
|
(
|
||||||
invite_code CHAR(6) NOT NULL UNIQUE ,
|
invite_code CHAR(6) NOT NULL UNIQUE ,
|
||||||
@@ -148,6 +165,20 @@ predefined_carrier_sid CHAR(36) NOT NULL,
|
|||||||
PRIMARY KEY (predefined_sip_gateway_sid)
|
PRIMARY KEY (predefined_sip_gateway_sid)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
CREATE TABLE predefined_smpp_gateways
|
||||||
|
(
|
||||||
|
predefined_smpp_gateway_sid CHAR(36) NOT NULL UNIQUE ,
|
||||||
|
ipv4 VARCHAR(128) NOT NULL COMMENT 'ip address or DNS name of the gateway. ',
|
||||||
|
port INTEGER NOT NULL DEFAULT 2775 COMMENT 'smpp signaling port',
|
||||||
|
inbound BOOLEAN NOT NULL COMMENT 'if true, whitelist this IP to allow inbound SMS from the gateway',
|
||||||
|
outbound BOOLEAN NOT NULL COMMENT 'i',
|
||||||
|
netmask INTEGER NOT NULL DEFAULT 32,
|
||||||
|
is_primary BOOLEAN NOT NULL DEFAULT 1,
|
||||||
|
use_tls BOOLEAN DEFAULT 0,
|
||||||
|
predefined_carrier_sid CHAR(36) NOT NULL,
|
||||||
|
PRIMARY KEY (predefined_smpp_gateway_sid)
|
||||||
|
);
|
||||||
|
|
||||||
CREATE TABLE products
|
CREATE TABLE products
|
||||||
(
|
(
|
||||||
product_sid CHAR(36) NOT NULL UNIQUE ,
|
product_sid CHAR(36) NOT NULL UNIQUE ,
|
||||||
@@ -174,6 +205,11 @@ stripe_product_id VARCHAR(56) NOT NULL,
|
|||||||
PRIMARY KEY (account_offer_sid)
|
PRIMARY KEY (account_offer_sid)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
CREATE TABLE schema_version
|
||||||
|
(
|
||||||
|
version VARCHAR(16)
|
||||||
|
);
|
||||||
|
|
||||||
CREATE TABLE api_keys
|
CREATE TABLE api_keys
|
||||||
(
|
(
|
||||||
api_key_sid CHAR(36) NOT NULL UNIQUE ,
|
api_key_sid CHAR(36) NOT NULL UNIQUE ,
|
||||||
@@ -213,6 +249,15 @@ signed_up_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|||||||
PRIMARY KEY (email)
|
PRIMARY KEY (email)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
CREATE TABLE service_provider_limits
|
||||||
|
(
|
||||||
|
service_provider_limits_sid CHAR(36) NOT NULL UNIQUE ,
|
||||||
|
service_provider_sid CHAR(36) NOT NULL,
|
||||||
|
category ENUM('api_rate','voice_call_session', 'device') NOT NULL,
|
||||||
|
quantity INTEGER NOT NULL,
|
||||||
|
PRIMARY KEY (service_provider_limits_sid)
|
||||||
|
);
|
||||||
|
|
||||||
CREATE TABLE smpp_addresses
|
CREATE TABLE smpp_addresses
|
||||||
(
|
(
|
||||||
smpp_address_sid CHAR(36) NOT NULL UNIQUE ,
|
smpp_address_sid CHAR(36) NOT NULL UNIQUE ,
|
||||||
@@ -395,6 +440,11 @@ disable_cdrs BOOLEAN NOT NULL DEFAULT 0,
|
|||||||
trial_end_date DATETIME,
|
trial_end_date DATETIME,
|
||||||
deactivated_reason VARCHAR(255),
|
deactivated_reason VARCHAR(255),
|
||||||
device_to_call_ratio INTEGER NOT NULL DEFAULT 5,
|
device_to_call_ratio INTEGER NOT NULL DEFAULT 5,
|
||||||
|
subspace_client_id VARCHAR(255),
|
||||||
|
subspace_client_secret VARCHAR(255),
|
||||||
|
subspace_sip_teleport_id VARCHAR(255),
|
||||||
|
subspace_sip_teleport_destinations VARCHAR(255),
|
||||||
|
siprec_hook_sid CHAR(36),
|
||||||
PRIMARY KEY (account_sid)
|
PRIMARY KEY (account_sid)
|
||||||
) COMMENT='An enterprise that uses the platform for comm services';
|
) COMMENT='An enterprise that uses the platform for comm services';
|
||||||
|
|
||||||
@@ -406,20 +456,27 @@ CREATE INDEX account_subscription_sid_idx ON account_subscriptions (account_subs
|
|||||||
CREATE INDEX account_sid_idx ON account_subscriptions (account_sid);
|
CREATE INDEX account_sid_idx ON account_subscriptions (account_sid);
|
||||||
ALTER TABLE account_subscriptions ADD FOREIGN KEY account_sid_idxfk_1 (account_sid) REFERENCES accounts (account_sid);
|
ALTER TABLE account_subscriptions ADD FOREIGN KEY account_sid_idxfk_1 (account_sid) REFERENCES accounts (account_sid);
|
||||||
|
|
||||||
|
CREATE INDEX account_sid_idx ON account_limits (account_sid);
|
||||||
|
ALTER TABLE account_limits ADD FOREIGN KEY account_sid_idxfk_2 (account_sid) REFERENCES accounts (account_sid) ON DELETE CASCADE;
|
||||||
|
|
||||||
CREATE INDEX invite_code_idx ON beta_invite_codes (invite_code);
|
CREATE INDEX invite_code_idx ON beta_invite_codes (invite_code);
|
||||||
CREATE INDEX call_route_sid_idx ON call_routes (call_route_sid);
|
CREATE INDEX call_route_sid_idx ON call_routes (call_route_sid);
|
||||||
ALTER TABLE call_routes ADD FOREIGN KEY account_sid_idxfk_2 (account_sid) REFERENCES accounts (account_sid);
|
ALTER TABLE call_routes ADD FOREIGN KEY account_sid_idxfk_3 (account_sid) REFERENCES accounts (account_sid);
|
||||||
|
|
||||||
ALTER TABLE call_routes ADD FOREIGN KEY application_sid_idxfk (application_sid) REFERENCES applications (application_sid);
|
ALTER TABLE call_routes ADD FOREIGN KEY application_sid_idxfk (application_sid) REFERENCES applications (application_sid);
|
||||||
|
|
||||||
CREATE INDEX dns_record_sid_idx ON dns_records (dns_record_sid);
|
CREATE INDEX dns_record_sid_idx ON dns_records (dns_record_sid);
|
||||||
ALTER TABLE dns_records ADD FOREIGN KEY account_sid_idxfk_3 (account_sid) REFERENCES accounts (account_sid);
|
ALTER TABLE dns_records ADD FOREIGN KEY account_sid_idxfk_4 (account_sid) REFERENCES accounts (account_sid);
|
||||||
|
|
||||||
CREATE INDEX predefined_carrier_sid_idx ON predefined_carriers (predefined_carrier_sid);
|
CREATE INDEX predefined_carrier_sid_idx ON predefined_carriers (predefined_carrier_sid);
|
||||||
CREATE INDEX predefined_sip_gateway_sid_idx ON predefined_sip_gateways (predefined_sip_gateway_sid);
|
CREATE INDEX predefined_sip_gateway_sid_idx ON predefined_sip_gateways (predefined_sip_gateway_sid);
|
||||||
CREATE INDEX predefined_carrier_sid_idx ON predefined_sip_gateways (predefined_carrier_sid);
|
CREATE INDEX predefined_carrier_sid_idx ON predefined_sip_gateways (predefined_carrier_sid);
|
||||||
ALTER TABLE predefined_sip_gateways ADD FOREIGN KEY predefined_carrier_sid_idxfk (predefined_carrier_sid) REFERENCES predefined_carriers (predefined_carrier_sid);
|
ALTER TABLE predefined_sip_gateways ADD FOREIGN KEY predefined_carrier_sid_idxfk (predefined_carrier_sid) REFERENCES predefined_carriers (predefined_carrier_sid);
|
||||||
|
|
||||||
|
CREATE INDEX predefined_smpp_gateway_sid_idx ON predefined_smpp_gateways (predefined_smpp_gateway_sid);
|
||||||
|
CREATE INDEX predefined_carrier_sid_idx ON predefined_smpp_gateways (predefined_carrier_sid);
|
||||||
|
ALTER TABLE predefined_smpp_gateways ADD FOREIGN KEY predefined_carrier_sid_idxfk_1 (predefined_carrier_sid) REFERENCES predefined_carriers (predefined_carrier_sid);
|
||||||
|
|
||||||
CREATE INDEX product_sid_idx ON products (product_sid);
|
CREATE INDEX product_sid_idx ON products (product_sid);
|
||||||
CREATE INDEX account_product_sid_idx ON account_products (account_product_sid);
|
CREATE INDEX account_product_sid_idx ON account_products (account_product_sid);
|
||||||
CREATE INDEX account_subscription_sid_idx ON account_products (account_subscription_sid);
|
CREATE INDEX account_subscription_sid_idx ON account_products (account_subscription_sid);
|
||||||
@@ -429,14 +486,14 @@ ALTER TABLE account_products ADD FOREIGN KEY product_sid_idxfk (product_sid) REF
|
|||||||
|
|
||||||
CREATE INDEX account_offer_sid_idx ON account_offers (account_offer_sid);
|
CREATE INDEX account_offer_sid_idx ON account_offers (account_offer_sid);
|
||||||
CREATE INDEX account_sid_idx ON account_offers (account_sid);
|
CREATE INDEX account_sid_idx ON account_offers (account_sid);
|
||||||
ALTER TABLE account_offers ADD FOREIGN KEY account_sid_idxfk_4 (account_sid) REFERENCES accounts (account_sid);
|
ALTER TABLE account_offers ADD FOREIGN KEY account_sid_idxfk_5 (account_sid) REFERENCES accounts (account_sid);
|
||||||
|
|
||||||
CREATE INDEX product_sid_idx ON account_offers (product_sid);
|
CREATE INDEX product_sid_idx ON account_offers (product_sid);
|
||||||
ALTER TABLE account_offers ADD FOREIGN KEY product_sid_idxfk_1 (product_sid) REFERENCES products (product_sid);
|
ALTER TABLE account_offers ADD FOREIGN KEY product_sid_idxfk_1 (product_sid) REFERENCES products (product_sid);
|
||||||
|
|
||||||
CREATE INDEX api_key_sid_idx ON api_keys (api_key_sid);
|
CREATE INDEX api_key_sid_idx ON api_keys (api_key_sid);
|
||||||
CREATE INDEX account_sid_idx ON api_keys (account_sid);
|
CREATE INDEX account_sid_idx ON api_keys (account_sid);
|
||||||
ALTER TABLE api_keys ADD FOREIGN KEY account_sid_idxfk_5 (account_sid) REFERENCES accounts (account_sid);
|
ALTER TABLE api_keys ADD FOREIGN KEY account_sid_idxfk_6 (account_sid) REFERENCES accounts (account_sid);
|
||||||
|
|
||||||
CREATE INDEX service_provider_sid_idx ON api_keys (service_provider_sid);
|
CREATE INDEX service_provider_sid_idx ON api_keys (service_provider_sid);
|
||||||
ALTER TABLE api_keys ADD FOREIGN KEY service_provider_sid_idxfk (service_provider_sid) REFERENCES service_providers (service_provider_sid);
|
ALTER TABLE api_keys ADD FOREIGN KEY service_provider_sid_idxfk (service_provider_sid) REFERENCES service_providers (service_provider_sid);
|
||||||
@@ -450,41 +507,44 @@ ALTER TABLE sbc_addresses ADD FOREIGN KEY service_provider_sid_idxfk_1 (service_
|
|||||||
CREATE INDEX ms_teams_tenant_sid_idx ON ms_teams_tenants (ms_teams_tenant_sid);
|
CREATE INDEX ms_teams_tenant_sid_idx ON ms_teams_tenants (ms_teams_tenant_sid);
|
||||||
ALTER TABLE ms_teams_tenants ADD FOREIGN KEY service_provider_sid_idxfk_2 (service_provider_sid) REFERENCES service_providers (service_provider_sid);
|
ALTER TABLE ms_teams_tenants ADD FOREIGN KEY service_provider_sid_idxfk_2 (service_provider_sid) REFERENCES service_providers (service_provider_sid);
|
||||||
|
|
||||||
ALTER TABLE ms_teams_tenants ADD FOREIGN KEY account_sid_idxfk_6 (account_sid) REFERENCES accounts (account_sid);
|
ALTER TABLE ms_teams_tenants ADD FOREIGN KEY account_sid_idxfk_7 (account_sid) REFERENCES accounts (account_sid);
|
||||||
|
|
||||||
ALTER TABLE ms_teams_tenants ADD FOREIGN KEY application_sid_idxfk_1 (application_sid) REFERENCES applications (application_sid);
|
ALTER TABLE ms_teams_tenants ADD FOREIGN KEY application_sid_idxfk_1 (application_sid) REFERENCES applications (application_sid);
|
||||||
|
|
||||||
CREATE INDEX tenant_fqdn_idx ON ms_teams_tenants (tenant_fqdn);
|
CREATE INDEX tenant_fqdn_idx ON ms_teams_tenants (tenant_fqdn);
|
||||||
CREATE INDEX email_idx ON signup_history (email);
|
CREATE INDEX email_idx ON signup_history (email);
|
||||||
|
CREATE INDEX service_provider_sid_idx ON service_provider_limits (service_provider_sid);
|
||||||
|
ALTER TABLE service_provider_limits ADD FOREIGN KEY service_provider_sid_idxfk_3 (service_provider_sid) REFERENCES service_providers (service_provider_sid) ON DELETE CASCADE;
|
||||||
|
|
||||||
CREATE INDEX smpp_address_sid_idx ON smpp_addresses (smpp_address_sid);
|
CREATE INDEX smpp_address_sid_idx ON smpp_addresses (smpp_address_sid);
|
||||||
CREATE INDEX service_provider_sid_idx ON smpp_addresses (service_provider_sid);
|
CREATE INDEX service_provider_sid_idx ON smpp_addresses (service_provider_sid);
|
||||||
ALTER TABLE smpp_addresses ADD FOREIGN KEY service_provider_sid_idxfk_3 (service_provider_sid) REFERENCES service_providers (service_provider_sid);
|
ALTER TABLE smpp_addresses ADD FOREIGN KEY service_provider_sid_idxfk_4 (service_provider_sid) REFERENCES service_providers (service_provider_sid);
|
||||||
|
|
||||||
CREATE UNIQUE INDEX speech_credentials_idx_1 ON speech_credentials (vendor,account_sid);
|
CREATE UNIQUE INDEX speech_credentials_idx_1 ON speech_credentials (vendor,account_sid);
|
||||||
|
|
||||||
CREATE INDEX speech_credential_sid_idx ON speech_credentials (speech_credential_sid);
|
CREATE INDEX speech_credential_sid_idx ON speech_credentials (speech_credential_sid);
|
||||||
CREATE INDEX service_provider_sid_idx ON speech_credentials (service_provider_sid);
|
CREATE INDEX service_provider_sid_idx ON speech_credentials (service_provider_sid);
|
||||||
ALTER TABLE speech_credentials ADD FOREIGN KEY service_provider_sid_idxfk_4 (service_provider_sid) REFERENCES service_providers (service_provider_sid);
|
ALTER TABLE speech_credentials ADD FOREIGN KEY service_provider_sid_idxfk_5 (service_provider_sid) REFERENCES service_providers (service_provider_sid);
|
||||||
|
|
||||||
CREATE INDEX account_sid_idx ON speech_credentials (account_sid);
|
CREATE INDEX account_sid_idx ON speech_credentials (account_sid);
|
||||||
ALTER TABLE speech_credentials ADD FOREIGN KEY account_sid_idxfk_7 (account_sid) REFERENCES accounts (account_sid);
|
ALTER TABLE speech_credentials ADD FOREIGN KEY account_sid_idxfk_8 (account_sid) REFERENCES accounts (account_sid);
|
||||||
|
|
||||||
CREATE INDEX user_sid_idx ON users (user_sid);
|
CREATE INDEX user_sid_idx ON users (user_sid);
|
||||||
CREATE INDEX email_idx ON users (email);
|
CREATE INDEX email_idx ON users (email);
|
||||||
CREATE INDEX phone_idx ON users (phone);
|
CREATE INDEX phone_idx ON users (phone);
|
||||||
CREATE INDEX account_sid_idx ON users (account_sid);
|
CREATE INDEX account_sid_idx ON users (account_sid);
|
||||||
ALTER TABLE users ADD FOREIGN KEY account_sid_idxfk_8 (account_sid) REFERENCES accounts (account_sid);
|
ALTER TABLE users ADD FOREIGN KEY account_sid_idxfk_9 (account_sid) REFERENCES accounts (account_sid);
|
||||||
|
|
||||||
CREATE INDEX service_provider_sid_idx ON users (service_provider_sid);
|
CREATE INDEX service_provider_sid_idx ON users (service_provider_sid);
|
||||||
ALTER TABLE users ADD FOREIGN KEY service_provider_sid_idxfk_5 (service_provider_sid) REFERENCES service_providers (service_provider_sid);
|
ALTER TABLE users ADD FOREIGN KEY service_provider_sid_idxfk_6 (service_provider_sid) REFERENCES service_providers (service_provider_sid);
|
||||||
|
|
||||||
CREATE INDEX email_activation_code_idx ON users (email_activation_code);
|
CREATE INDEX email_activation_code_idx ON users (email_activation_code);
|
||||||
CREATE INDEX voip_carrier_sid_idx ON voip_carriers (voip_carrier_sid);
|
CREATE INDEX voip_carrier_sid_idx ON voip_carriers (voip_carrier_sid);
|
||||||
CREATE INDEX account_sid_idx ON voip_carriers (account_sid);
|
CREATE INDEX account_sid_idx ON voip_carriers (account_sid);
|
||||||
ALTER TABLE voip_carriers ADD FOREIGN KEY account_sid_idxfk_9 (account_sid) REFERENCES accounts (account_sid);
|
ALTER TABLE voip_carriers ADD FOREIGN KEY account_sid_idxfk_10 (account_sid) REFERENCES accounts (account_sid);
|
||||||
|
|
||||||
CREATE INDEX service_provider_sid_idx ON voip_carriers (service_provider_sid);
|
CREATE INDEX service_provider_sid_idx ON voip_carriers (service_provider_sid);
|
||||||
ALTER TABLE voip_carriers ADD FOREIGN KEY service_provider_sid_idxfk_6 (service_provider_sid) REFERENCES service_providers (service_provider_sid);
|
ALTER TABLE voip_carriers ADD FOREIGN KEY service_provider_sid_idxfk_7 (service_provider_sid) REFERENCES service_providers (service_provider_sid);
|
||||||
|
|
||||||
ALTER TABLE voip_carriers ADD FOREIGN KEY application_sid_idxfk_2 (application_sid) REFERENCES applications (application_sid);
|
ALTER TABLE voip_carriers ADD FOREIGN KEY application_sid_idxfk_2 (application_sid) REFERENCES applications (application_sid);
|
||||||
|
|
||||||
@@ -497,12 +557,12 @@ CREATE INDEX number_idx ON phone_numbers (number);
|
|||||||
CREATE INDEX voip_carrier_sid_idx ON phone_numbers (voip_carrier_sid);
|
CREATE INDEX voip_carrier_sid_idx ON phone_numbers (voip_carrier_sid);
|
||||||
ALTER TABLE phone_numbers ADD FOREIGN KEY voip_carrier_sid_idxfk_1 (voip_carrier_sid) REFERENCES voip_carriers (voip_carrier_sid);
|
ALTER TABLE phone_numbers ADD FOREIGN KEY voip_carrier_sid_idxfk_1 (voip_carrier_sid) REFERENCES voip_carriers (voip_carrier_sid);
|
||||||
|
|
||||||
ALTER TABLE phone_numbers ADD FOREIGN KEY account_sid_idxfk_10 (account_sid) REFERENCES accounts (account_sid);
|
ALTER TABLE phone_numbers ADD FOREIGN KEY account_sid_idxfk_11 (account_sid) REFERENCES accounts (account_sid);
|
||||||
|
|
||||||
ALTER TABLE phone_numbers ADD FOREIGN KEY application_sid_idxfk_3 (application_sid) REFERENCES applications (application_sid);
|
ALTER TABLE phone_numbers ADD FOREIGN KEY application_sid_idxfk_3 (application_sid) REFERENCES applications (application_sid);
|
||||||
|
|
||||||
CREATE INDEX service_provider_sid_idx ON phone_numbers (service_provider_sid);
|
CREATE INDEX service_provider_sid_idx ON phone_numbers (service_provider_sid);
|
||||||
ALTER TABLE phone_numbers ADD FOREIGN KEY service_provider_sid_idxfk_7 (service_provider_sid) REFERENCES service_providers (service_provider_sid);
|
ALTER TABLE phone_numbers ADD FOREIGN KEY service_provider_sid_idxfk_8 (service_provider_sid) REFERENCES service_providers (service_provider_sid);
|
||||||
|
|
||||||
CREATE INDEX sip_gateway_idx_hostport ON sip_gateways (ipv4,port);
|
CREATE INDEX sip_gateway_idx_hostport ON sip_gateways (ipv4,port);
|
||||||
|
|
||||||
@@ -518,10 +578,10 @@ CREATE UNIQUE INDEX applications_idx_name ON applications (account_sid,name);
|
|||||||
|
|
||||||
CREATE INDEX application_sid_idx ON applications (application_sid);
|
CREATE INDEX application_sid_idx ON applications (application_sid);
|
||||||
CREATE INDEX service_provider_sid_idx ON applications (service_provider_sid);
|
CREATE INDEX service_provider_sid_idx ON applications (service_provider_sid);
|
||||||
ALTER TABLE applications ADD FOREIGN KEY service_provider_sid_idxfk_8 (service_provider_sid) REFERENCES service_providers (service_provider_sid);
|
ALTER TABLE applications ADD FOREIGN KEY service_provider_sid_idxfk_9 (service_provider_sid) REFERENCES service_providers (service_provider_sid);
|
||||||
|
|
||||||
CREATE INDEX account_sid_idx ON applications (account_sid);
|
CREATE INDEX account_sid_idx ON applications (account_sid);
|
||||||
ALTER TABLE applications ADD FOREIGN KEY account_sid_idxfk_11 (account_sid) REFERENCES accounts (account_sid);
|
ALTER TABLE applications ADD FOREIGN KEY account_sid_idxfk_12 (account_sid) REFERENCES accounts (account_sid);
|
||||||
|
|
||||||
ALTER TABLE applications ADD FOREIGN KEY call_hook_sid_idxfk (call_hook_sid) REFERENCES webhooks (webhook_sid);
|
ALTER TABLE applications ADD FOREIGN KEY call_hook_sid_idxfk (call_hook_sid) REFERENCES webhooks (webhook_sid);
|
||||||
|
|
||||||
@@ -537,7 +597,7 @@ ALTER TABLE service_providers ADD FOREIGN KEY registration_hook_sid_idxfk (regis
|
|||||||
CREATE INDEX account_sid_idx ON accounts (account_sid);
|
CREATE INDEX account_sid_idx ON accounts (account_sid);
|
||||||
CREATE INDEX sip_realm_idx ON accounts (sip_realm);
|
CREATE INDEX sip_realm_idx ON accounts (sip_realm);
|
||||||
CREATE INDEX service_provider_sid_idx ON accounts (service_provider_sid);
|
CREATE INDEX service_provider_sid_idx ON accounts (service_provider_sid);
|
||||||
ALTER TABLE accounts ADD FOREIGN KEY service_provider_sid_idxfk_9 (service_provider_sid) REFERENCES service_providers (service_provider_sid);
|
ALTER TABLE accounts ADD FOREIGN KEY service_provider_sid_idxfk_10 (service_provider_sid) REFERENCES service_providers (service_provider_sid);
|
||||||
|
|
||||||
ALTER TABLE accounts ADD FOREIGN KEY registration_hook_sid_idxfk_1 (registration_hook_sid) REFERENCES webhooks (webhook_sid);
|
ALTER TABLE accounts ADD FOREIGN KEY registration_hook_sid_idxfk_1 (registration_hook_sid) REFERENCES webhooks (webhook_sid);
|
||||||
|
|
||||||
@@ -545,4 +605,6 @@ ALTER TABLE accounts ADD FOREIGN KEY queue_event_hook_sid_idxfk (queue_event_hoo
|
|||||||
|
|
||||||
ALTER TABLE accounts ADD FOREIGN KEY device_calling_application_sid_idxfk (device_calling_application_sid) REFERENCES applications (application_sid);
|
ALTER TABLE accounts ADD FOREIGN KEY device_calling_application_sid_idxfk (device_calling_application_sid) REFERENCES applications (application_sid);
|
||||||
|
|
||||||
|
ALTER TABLE accounts ADD FOREIGN KEY siprec_hook_sid_idxfk (siprec_hook_sid) REFERENCES applications (application_sid);
|
||||||
|
|
||||||
SET FOREIGN_KEY_CHECKS=1;
|
SET FOREIGN_KEY_CHECKS=1;
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ insert into webhooks(webhook_sid, url, username, password) values('90dda62e-0ea2
|
|||||||
|
|
||||||
insert into service_providers (service_provider_sid, name, root_domain, registration_hook_sid)
|
insert into service_providers (service_provider_sid, name, root_domain, registration_hook_sid)
|
||||||
values ('3f35518f-5a0d-4c2e-90a5-2407bb3b36f0', 'SP A', 'jambonz.org', '90dda62e-0ea2-47d1-8164-5bd49003476c');
|
values ('3f35518f-5a0d-4c2e-90a5-2407bb3b36f0', 'SP A', 'jambonz.org', '90dda62e-0ea2-47d1-8164-5bd49003476c');
|
||||||
|
insert into service_provider_limits (service_provider_limits_sid, service_provider_sid, category, quantity) VALUES ('a79d3ade-e0da-4461-80f3-7c73f01e18b4', '3f35518f-5a0d-4c2e-90a5-2407bb3b36f0', 'voice_call_session', 1);
|
||||||
|
|
||||||
insert into accounts(account_sid, service_provider_sid, name, sip_realm, registration_hook_sid, webhook_secret)
|
insert into accounts(account_sid, service_provider_sid, name, sip_realm, registration_hook_sid, webhook_secret)
|
||||||
values ('ed649e33-e771-403a-8c99-1780eabbc803', '3f35518f-5a0d-4c2e-90a5-2407bb3b36f0', 'test account', 'jambonz.org', '90dda62e-0ea2-47d1-8164-5bd49003476c', 'foobar');
|
values ('ed649e33-e771-403a-8c99-1780eabbc803', '3f35518f-5a0d-4c2e-90a5-2407bb3b36f0', 'test account', 'jambonz.org', '90dda62e-0ea2-47d1-8164-5bd49003476c', 'foobar');
|
||||||
@@ -38,6 +39,7 @@ insert into account_subscriptions(account_subscription_sid, account_sid, pending
|
|||||||
values ('73bbcc5d-512f-4cea-8535-9a6e3d2bd19d','d7cc37cb-d152-49ef-a51b-485f6e917089',0);
|
values ('73bbcc5d-512f-4cea-8535-9a6e3d2bd19d','d7cc37cb-d152-49ef-a51b-485f6e917089',0);
|
||||||
insert into account_products(account_product_sid, account_subscription_sid, product_sid,quantity)
|
insert into account_products(account_product_sid, account_subscription_sid, product_sid,quantity)
|
||||||
values ('92f137f7-4bc3-4157-b096-6817e54b1874', '73bbcc5d-512f-4cea-8535-9a6e3d2bd19d', 'c4403cdb-8e75-4b27-9726-7d8315e3216d', 0);
|
values ('92f137f7-4bc3-4157-b096-6817e54b1874', '73bbcc5d-512f-4cea-8535-9a6e3d2bd19d', 'c4403cdb-8e75-4b27-9726-7d8315e3216d', 0);
|
||||||
|
insert into account_limits(account_limits_sid, account_sid, category, quantity) values('a1b2c3d4-e5f6-7a8b-9c0d-1e2f3a4b5c6d', 'd7cc37cb-d152-49ef-a51b-485f6e917089', 'voice_call_session', 0);
|
||||||
|
|
||||||
insert into voip_carriers (voip_carrier_sid, name, account_sid) values ('9b1abdc7-0220-4964-bc66-32b5c70cd9ab', 'westco', 'd7cc37cb-d152-49ef-a51b-485f6e917089');
|
insert into voip_carriers (voip_carrier_sid, name, account_sid) values ('9b1abdc7-0220-4964-bc66-32b5c70cd9ab', 'westco', 'd7cc37cb-d152-49ef-a51b-485f6e917089');
|
||||||
insert into sip_gateways (sip_gateway_sid, voip_carrier_sid, ipv4, inbound, outbound)
|
insert into sip_gateways (sip_gateway_sid, voip_carrier_sid, ipv4, inbound, outbound)
|
||||||
|
|||||||
+3
-2
@@ -24,6 +24,7 @@ function waitFor(ms) {
|
|||||||
test('incoming call tests', async(t) => {
|
test('incoming call tests', async(t) => {
|
||||||
const {srf} = require('../app');
|
const {srf} = require('../app');
|
||||||
const { queryCdrs } = srf.locals;
|
const { queryCdrs } = srf.locals;
|
||||||
|
let res;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await connect(srf);
|
await connect(srf);
|
||||||
@@ -35,7 +36,7 @@ test('incoming call tests', async(t) => {
|
|||||||
|
|
||||||
await sippUac('uac-pcap-carrier-success.xml', '172.38.0.20');
|
await sippUac('uac-pcap-carrier-success.xml', '172.38.0.20');
|
||||||
t.pass('incoming call from carrier completed successfully');
|
t.pass('incoming call from carrier completed successfully');
|
||||||
|
|
||||||
await sippUac('uac-pcap-pbx-success.xml', '172.38.0.21');
|
await sippUac('uac-pcap-pbx-success.xml', '172.38.0.21');
|
||||||
t.pass('incoming call from account-level carrier completed successfully');
|
t.pass('incoming call from account-level carrier completed successfully');
|
||||||
|
|
||||||
@@ -60,7 +61,7 @@ test('incoming call tests', async(t) => {
|
|||||||
await sippUac('uac-pcap-carrier-max-call-limit.xml', '172.38.0.20');
|
await sippUac('uac-pcap-carrier-max-call-limit.xml', '172.38.0.20');
|
||||||
t.pass('rejects incoming call with 503 when max calls per account reached')
|
t.pass('rejects incoming call with 503 when max calls per account reached')
|
||||||
|
|
||||||
await waitFor(10);
|
await waitFor(12);
|
||||||
const res = await queryCdrs({account_sid: 'ed649e33-e771-403a-8c99-1780eabbc803'});
|
const res = await queryCdrs({account_sid: 'ed649e33-e771-403a-8c99-1780eabbc803'});
|
||||||
console.log(`cdrs: ${JSON.stringify(res)}`);
|
console.log(`cdrs: ${JSON.stringify(res)}`);
|
||||||
t.ok(7 === res.total, 'successfully wrote 7 cdrs for calls');
|
t.ok(7 === res.total, 'successfully wrote 7 cdrs for calls');
|
||||||
|
|||||||
Reference in New Issue
Block a user