Setup scaffold of call routing

This commit is contained in:
2026-03-25 22:41:07 -04:00
parent c6fd432ac1
commit e2fb919b5b
5 changed files with 102 additions and 31 deletions

View File

@@ -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="info"/>
<application name="hangup"/>
-->
</application-list>
</permission>
<permission name="expand-vars-in-tag-body" value="false">

View File

@@ -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>

View File

@@ -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
View 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
}

View File

@@ -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 {