Setup scaffold of call routing
This commit is contained in:
@@ -49,10 +49,12 @@
|
||||
<permission name="extended-data" value="false"/>
|
||||
<permission name="execute-apps" value="true">
|
||||
<!-- default to "deny" or "allow" -->
|
||||
<application-list default="deny">
|
||||
<application-list default="allow">
|
||||
<!-- type attr can be "deny" or "allow" nothing defaults to opposite of the list default so allow in this case -->
|
||||
<!--
|
||||
<application name="info"/>
|
||||
<application name="hangup"/>
|
||||
-->
|
||||
</application-list>
|
||||
</permission>
|
||||
<permission name="expand-vars-in-tag-body" value="false">
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
</extension>
|
||||
|
||||
<extension name="did-route">
|
||||
<condition field="destination_number" expression="^8598989002$">
|
||||
<condition field="destination_number" expression="^1\d{10}$">
|
||||
<action application="httapi" data="{method=POST}" />
|
||||
</condition>
|
||||
</extension>
|
||||
|
||||
@@ -25,7 +25,7 @@ pub enum DidTargetType {
|
||||
CustomMessage
|
||||
}
|
||||
|
||||
#[derive(Queryable, Selectable, Serialize, AsChangeset)]
|
||||
#[derive(Debug, Queryable, Selectable, Serialize, AsChangeset)]
|
||||
#[diesel(table_name = crate::schema::dids)]
|
||||
#[diesel(check_for_backend(diesel::pg::Pg))]
|
||||
pub struct Did {
|
||||
@@ -62,6 +62,16 @@ pub fn get_did(a_id :i32) -> Result<Did, Error> {
|
||||
Ok(result)
|
||||
}
|
||||
|
||||
pub fn get_did_by(did: &str) -> Result<Did, Error> {
|
||||
use crate::schema::dids::dsl::*;
|
||||
let mut conn = connect();
|
||||
|
||||
let d = dids.filter(did_number.eq(did))
|
||||
.first::<Did>(&mut conn)?;
|
||||
|
||||
Ok(d)
|
||||
}
|
||||
|
||||
pub fn delete_did(i: i32) -> Result<(), Error> {
|
||||
use crate::schema::dids;
|
||||
use crate::schema::dids::columns::id;
|
||||
|
||||
82
did_router/src/httapi.rs
Normal file
82
did_router/src/httapi.rs
Normal file
@@ -0,0 +1,82 @@
|
||||
use xml_builder::{XMLBuilder, XMLElement, XMLVersion};
|
||||
use super::database as db;
|
||||
use super::database::{DidTargetType, Did};
|
||||
|
||||
pub fn url(_did: Did) -> XMLElement {
|
||||
let work = XMLElement::new("work");
|
||||
work
|
||||
}
|
||||
|
||||
pub fn moh(_did: Did) -> XMLElement {
|
||||
let work = XMLElement::new("work");
|
||||
work
|
||||
}
|
||||
|
||||
pub fn external_number(_did: Did) -> XMLElement {
|
||||
let work = XMLElement::new("work");
|
||||
work
|
||||
}
|
||||
|
||||
pub fn no_service(_did: Did) -> XMLElement {
|
||||
let mut work = XMLElement::new("work");
|
||||
let mut playback = XMLElement::new("playback");
|
||||
playback.add_attribute("name", "exten");
|
||||
playback.add_attribute("file", "ivr/ivr-welcome_to_freeswitch.wav");
|
||||
|
||||
work.add_child(playback).unwrap();
|
||||
work
|
||||
}
|
||||
|
||||
pub fn night_mode(_did: Did) -> XMLElement {
|
||||
let work = XMLElement::new("work");
|
||||
work
|
||||
}
|
||||
|
||||
pub fn custom_message(_did: Did) -> XMLElement {
|
||||
let work = XMLElement::new("work");
|
||||
work
|
||||
}
|
||||
|
||||
pub fn route_call(did: String) -> Vec<u8> {
|
||||
let d = db::get_did_by(&did).unwrap();
|
||||
let mut xml = XMLBuilder::new()
|
||||
.version(XMLVersion::XML1_1)
|
||||
.encoding("UTF-8".into())
|
||||
.build();
|
||||
|
||||
let mut doc = XMLElement::new("document");
|
||||
doc.add_attribute("type", "xml/freeswitch-httapi");
|
||||
|
||||
let params = XMLElement::new("params");
|
||||
let work = match d.target_type {
|
||||
DidTargetType::Url => {
|
||||
url(d)
|
||||
},
|
||||
DidTargetType::Moh => {
|
||||
moh(d)
|
||||
},
|
||||
DidTargetType::ExternalNumber => {
|
||||
external_number(d)
|
||||
},
|
||||
DidTargetType::NoService => {
|
||||
no_service(d)
|
||||
},
|
||||
DidTargetType::NightMode => {
|
||||
night_mode(d)
|
||||
},
|
||||
DidTargetType::CustomMessage => {
|
||||
custom_message(d)
|
||||
}
|
||||
};
|
||||
|
||||
doc.add_child(params).unwrap();
|
||||
doc.add_child(work).unwrap();
|
||||
|
||||
xml.set_root_element(doc);
|
||||
|
||||
let mut writer: Vec<u8> = Vec::new();
|
||||
xml.generate(&mut writer).unwrap();
|
||||
|
||||
writer
|
||||
|
||||
}
|
||||
@@ -1,9 +1,9 @@
|
||||
pub mod database;
|
||||
pub mod httapi;
|
||||
pub mod schema;
|
||||
|
||||
use std::ops::Deref;
|
||||
use std::str::FromStr;
|
||||
use xml_builder::{XMLBuilder, XMLElement, XMLVersion};
|
||||
use actix_web::{web, App,
|
||||
HttpResponse,
|
||||
HttpServer,
|
||||
@@ -29,34 +29,11 @@ struct JsonDid {
|
||||
}
|
||||
|
||||
async fn route_did(data: web::Form<RouteData>) -> impl Responder {
|
||||
let _dest_did = data.dest_did.clone();
|
||||
let mut xml = XMLBuilder::new()
|
||||
.version(XMLVersion::XML1_1)
|
||||
.encoding("UTF-8".into())
|
||||
.build();
|
||||
|
||||
let mut doc = XMLElement::new("document");
|
||||
doc.add_attribute("type", "xml/freeswitch-httapi");
|
||||
|
||||
let params = XMLElement::new("params");
|
||||
let mut work = XMLElement::new("work");
|
||||
|
||||
let mut playback = XMLElement::new("playback");
|
||||
playback.add_attribute("name", "exten");
|
||||
playback.add_attribute("file", "ivr/ivr-welcome_to_freeswitch.wav");
|
||||
work.add_child(playback).unwrap();
|
||||
|
||||
doc.add_child(params).unwrap();
|
||||
doc.add_child(work).unwrap();
|
||||
|
||||
xml.set_root_element(doc);
|
||||
|
||||
let mut writer: Vec<u8> = Vec::new();
|
||||
xml.generate(&mut writer).unwrap();
|
||||
|
||||
let did = data.dest_did.clone();
|
||||
let xml = httapi::route_call(did);
|
||||
HttpResponse::Ok()
|
||||
.content_type(ContentType::xml())
|
||||
.body(writer)
|
||||
.body(xml)
|
||||
}
|
||||
|
||||
async fn did_post(d: web::Json<JsonDid>) -> impl Responder {
|
||||
|
||||
Reference in New Issue
Block a user