Files
freeswitch_chris/did_router/src/main.rs

128 lines
3.4 KiB
Rust
Raw Normal View History

2026-03-24 22:40:08 -04:00
pub mod database;
2026-03-25 22:41:07 -04:00
pub mod httapi;
2026-03-24 22:40:08 -04:00
pub mod schema;
2026-03-21 22:03:03 -04:00
2026-03-25 20:58:53 -04:00
use std::ops::Deref;
use std::str::FromStr;
use actix_web::{web, App,
2026-03-24 22:40:08 -04:00
HttpResponse,
HttpServer,
http::header::ContentType,
2026-04-02 00:53:25 -04:00
Responder, Result
2026-03-24 22:40:08 -04:00
};
2026-04-01 22:17:59 -04:00
use actix_cors::Cors;
2026-04-02 00:53:25 -04:00
use actix_files::{Files, NamedFile};
2026-03-25 20:58:53 -04:00
use serde::Deserialize;
use database as db;
use database::DidTargetType;
2026-03-24 22:40:08 -04:00
2026-03-25 20:58:53 -04:00
#[derive(Debug, Deserialize)]
2026-04-01 22:17:59 -04:00
struct RouteRequest {
2026-03-25 20:58:53 -04:00
#[serde(rename = "Caller-Destination-Number")]
2026-04-01 22:17:59 -04:00
callee_number: String,
#[serde(rename = "Caller-Caller-ID-Number")]
caller_number: String,
2026-03-29 02:07:39 -04:00
#[serde(rename = "Caller-Network-Addr")]
caller_ipaddr: String
2026-03-25 20:58:53 -04:00
}
#[derive(Debug, Deserialize)]
struct JsonDid {
did_number: String,
target_type: String,
target: String,
2026-04-01 22:17:59 -04:00
trunk: String,
2026-03-25 20:58:53 -04:00
active: bool
}
2026-03-24 22:40:08 -04:00
2026-04-01 22:17:59 -04:00
async fn route_did(request: web::Form<RouteRequest>) -> impl Responder {
let callee_number = request.callee_number.clone();
let caller_number = request.caller_number.clone();
let caller_ipaddr = request.caller_ipaddr.clone();
let xml = httapi::route_call(callee_number, caller_number,caller_ipaddr);
2026-03-24 22:40:08 -04:00
HttpResponse::Ok()
.content_type(ContentType::xml())
2026-03-25 22:41:07 -04:00
.body(xml)
2026-03-24 22:40:08 -04:00
}
2026-03-25 20:58:53 -04:00
async fn did_post(d: web::Json<JsonDid>) -> impl Responder {
let did = d.deref();
2026-04-01 22:17:59 -04:00
db::add_did(&did.did_number, &did.target_type, &did.target, did.active ,&did.trunk).unwrap();
2026-03-24 22:40:08 -04:00
HttpResponse::Ok().body("DID added.")
2026-03-21 22:03:03 -04:00
}
2026-03-24 22:40:08 -04:00
async fn did_index() -> impl Responder {
2026-03-25 20:58:53 -04:00
let dids = db::list_did().unwrap();
2026-03-24 22:40:08 -04:00
HttpResponse::Ok().json(dids)
2026-03-21 22:03:03 -04:00
}
2026-03-25 20:58:53 -04:00
async fn did_get(path: web::Path<i32>) -> impl Responder {
let id = path.into_inner();
let did = db::get_did(id).unwrap();
HttpResponse::Ok().json(did)
}
async fn did_patch(d: web::Json<JsonDid>, path: web::Path<i32>) -> impl Responder {
let id = path.into_inner();
let d = d.deref();
let did = db::Did {
id: id,
did_number: d.did_number.clone(),
target_type: DidTargetType::from_str(&d.target_type).unwrap(),
target: Some(d.target.clone()),
2026-04-01 22:17:59 -04:00
trunk: d.trunk.clone(),
2026-03-25 20:58:53 -04:00
active: d.active
};
db::update_did(did).unwrap();
HttpResponse::Ok().body("DID updated")
}
async fn did_delete(path: web::Path<i32>) -> impl Responder {
let id = path.into_inner();
db::delete_did(id).unwrap();
HttpResponse::Ok().body("DID deleted.")
}
2026-03-24 22:40:08 -04:00
fn api_config(cfg: &mut web::ServiceConfig) {
cfg.service(
web::resource("/fs")
.route(web::get().to(did_index))
.route(web::post().to(did_post))
);
cfg.service(
web::resource("/fs/{id}")
2026-03-25 20:58:53 -04:00
.route(web::get().to(did_get))
.route(web::patch().to(did_patch))
.route(web::delete().to(did_delete))
2026-03-24 22:40:08 -04:00
);
cfg.service(
web::resource("/route_did")
.route(web::post().to(route_did))
);
2026-03-21 22:03:03 -04:00
}
2026-04-02 00:53:25 -04:00
async fn index() -> Result<NamedFile> {
Ok(NamedFile::open("/var/www/did_router/index.html")?)
}
2026-03-21 22:03:03 -04:00
#[actix_web::main]
async fn main() -> std::io::Result<()> {
HttpServer::new(|| {
2026-04-01 22:17:59 -04:00
let cors = Cors::permissive();
2026-03-21 22:03:03 -04:00
App::new()
2026-04-01 22:17:59 -04:00
.wrap(cors)
2026-04-02 00:53:25 -04:00
.service(Files::new("/admin", "/var/www/did_router/").index_file("index.html"))
2026-03-24 22:40:08 -04:00
.service(
web::scope("/api").configure(api_config))
2026-04-02 00:53:25 -04:00
.default_service(web::route().to(index))
2026-03-21 22:03:03 -04:00
})
2026-03-24 22:40:08 -04:00
.bind(("0.0.0.0", 3000))?
2026-03-21 22:03:03 -04:00
.run()
.await
}