Setup scaffold of call routing
This commit is contained in:
@@ -49,10 +49,12 @@
|
|||||||
<permission name="extended-data" value="false"/>
|
<permission name="extended-data" value="false"/>
|
||||||
<permission name="execute-apps" value="true">
|
<permission name="execute-apps" value="true">
|
||||||
<!-- default to "deny" or "allow" -->
|
<!-- 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 -->
|
<!-- 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="info"/>
|
||||||
<application name="hangup"/>
|
<application name="hangup"/>
|
||||||
|
-->
|
||||||
</application-list>
|
</application-list>
|
||||||
</permission>
|
</permission>
|
||||||
<permission name="expand-vars-in-tag-body" value="false">
|
<permission name="expand-vars-in-tag-body" value="false">
|
||||||
|
|||||||
@@ -46,7 +46,7 @@
|
|||||||
</extension>
|
</extension>
|
||||||
|
|
||||||
<extension name="did-route">
|
<extension name="did-route">
|
||||||
<condition field="destination_number" expression="^8598989002$">
|
<condition field="destination_number" expression="^1\d{10}$">
|
||||||
<action application="httapi" data="{method=POST}" />
|
<action application="httapi" data="{method=POST}" />
|
||||||
</condition>
|
</condition>
|
||||||
</extension>
|
</extension>
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ pub enum DidTargetType {
|
|||||||
CustomMessage
|
CustomMessage
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Queryable, Selectable, Serialize, AsChangeset)]
|
#[derive(Debug, Queryable, Selectable, Serialize, AsChangeset)]
|
||||||
#[diesel(table_name = crate::schema::dids)]
|
#[diesel(table_name = crate::schema::dids)]
|
||||||
#[diesel(check_for_backend(diesel::pg::Pg))]
|
#[diesel(check_for_backend(diesel::pg::Pg))]
|
||||||
pub struct Did {
|
pub struct Did {
|
||||||
@@ -62,6 +62,16 @@ pub fn get_did(a_id :i32) -> Result<Did, Error> {
|
|||||||
Ok(result)
|
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> {
|
pub fn delete_did(i: i32) -> Result<(), Error> {
|
||||||
use crate::schema::dids;
|
use crate::schema::dids;
|
||||||
use crate::schema::dids::columns::id;
|
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 database;
|
||||||
|
pub mod httapi;
|
||||||
pub mod schema;
|
pub mod schema;
|
||||||
|
|
||||||
use std::ops::Deref;
|
use std::ops::Deref;
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
use xml_builder::{XMLBuilder, XMLElement, XMLVersion};
|
|
||||||
use actix_web::{web, App,
|
use actix_web::{web, App,
|
||||||
HttpResponse,
|
HttpResponse,
|
||||||
HttpServer,
|
HttpServer,
|
||||||
@@ -29,34 +29,11 @@ struct JsonDid {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async fn route_did(data: web::Form<RouteData>) -> impl Responder {
|
async fn route_did(data: web::Form<RouteData>) -> impl Responder {
|
||||||
let _dest_did = data.dest_did.clone();
|
let did = data.dest_did.clone();
|
||||||
let mut xml = XMLBuilder::new()
|
let xml = httapi::route_call(did);
|
||||||
.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();
|
|
||||||
|
|
||||||
HttpResponse::Ok()
|
HttpResponse::Ok()
|
||||||
.content_type(ContentType::xml())
|
.content_type(ContentType::xml())
|
||||||
.body(writer)
|
.body(xml)
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn did_post(d: web::Json<JsonDid>) -> impl Responder {
|
async fn did_post(d: web::Json<JsonDid>) -> impl Responder {
|
||||||
|
|||||||
Reference in New Issue
Block a user