diff --git a/conf/autoload_configs/httapi.conf.xml b/conf/autoload_configs/httapi.conf.xml index c4102e0..b412a74 100644 --- a/conf/autoload_configs/httapi.conf.xml +++ b/conf/autoload_configs/httapi.conf.xml @@ -49,10 +49,12 @@ - + - + diff --git a/conf/dialplan/default.xml b/conf/dialplan/default.xml index 5dbbed1..91741bb 100644 --- a/conf/dialplan/default.xml +++ b/conf/dialplan/default.xml @@ -46,7 +46,7 @@ - + diff --git a/did_router/src/database.rs b/did_router/src/database.rs index f200fb1..0f07c7e 100644 --- a/did_router/src/database.rs +++ b/did_router/src/database.rs @@ -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 { Ok(result) } +pub fn get_did_by(did: &str) -> Result { + use crate::schema::dids::dsl::*; + let mut conn = connect(); + + let d = dids.filter(did_number.eq(did)) + .first::(&mut conn)?; + + Ok(d) +} + pub fn delete_did(i: i32) -> Result<(), Error> { use crate::schema::dids; use crate::schema::dids::columns::id; diff --git a/did_router/src/httapi.rs b/did_router/src/httapi.rs new file mode 100644 index 0000000..4179e33 --- /dev/null +++ b/did_router/src/httapi.rs @@ -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 { + 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 = Vec::new(); + xml.generate(&mut writer).unwrap(); + + writer + +} diff --git a/did_router/src/main.rs b/did_router/src/main.rs index 15b6da8..bce2a7a 100644 --- a/did_router/src/main.rs +++ b/did_router/src/main.rs @@ -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) -> 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 = 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) -> impl Responder {