From c6fd432ac143872e3e4fe0f337335926475b9f8b Mon Sep 17 00:00:00 2001 From: Martin Yang Date: Wed, 25 Mar 2026 20:58:53 -0400 Subject: [PATCH] API was finished --- did_router/Cargo.lock | 72 +++++++++++++----- did_router/Cargo.toml | 2 + .../2026-03-23-013910-0000_create_dids/up.sql | 2 +- did_router/src/database.rs | 57 ++++++++++++--- did_router/src/main.rs | 73 +++++++++++++++---- did_router/src/schema.rs | 2 +- 6 files changed, 166 insertions(+), 42 deletions(-) diff --git a/did_router/Cargo.lock b/did_router/Cargo.lock index a559391..ec54397 100644 --- a/did_router/Cargo.lock +++ b/did_router/Cargo.lock @@ -65,7 +65,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -182,7 +182,7 @@ dependencies = [ "actix-router", "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -365,7 +365,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn", + "syn 2.0.117", ] [[package]] @@ -376,7 +376,7 @@ checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ "darling_core", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -407,7 +407,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn", + "syn 2.0.117", "unicode-xid", ] @@ -421,6 +421,8 @@ dependencies = [ "dotenvy", "serde", "serde_json", + "strum", + "strum_macros", "xml-builder", ] @@ -447,7 +449,7 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -460,7 +462,7 @@ dependencies = [ "dsl_auto_type", "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -469,7 +471,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe2444076b48641147115697648dc743c2c00b61adade0f01ce67133c7babe8c" dependencies = [ - "syn", + "syn 2.0.117", ] [[package]] @@ -490,7 +492,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -516,7 +518,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -1117,6 +1119,12 @@ dependencies = [ "semver", ] +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + [[package]] name = "ryu" version = "1.0.23" @@ -1162,7 +1170,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -1267,6 +1275,36 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +[[package]] +name = "strum" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" + +[[package]] +name = "strum_macros" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "quote", + "rustversion", + "syn 1.0.109", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "syn" version = "2.0.117" @@ -1286,7 +1324,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -1379,7 +1417,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -1585,7 +1623,7 @@ checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", "synstructure", ] @@ -1606,7 +1644,7 @@ checksum = "0e8bc7269b54418e7aeeef514aa68f8690b8c0489a06b0136e5f57c4c5ccab89" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -1626,7 +1664,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", "synstructure", ] @@ -1660,7 +1698,7 @@ checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] diff --git a/did_router/Cargo.toml b/did_router/Cargo.toml index 959ad4c..8a957fa 100644 --- a/did_router/Cargo.toml +++ b/did_router/Cargo.toml @@ -11,3 +11,5 @@ dotenvy = "0.15" serde = { version = "1.0.228", features = ["derive"] } serde_json = "1.0.149" diesel-derive-enum = { version = "3.0.0-beta.1", features = ["postgres"] } +strum = "0.24" +strum_macros = "0.24" \ No newline at end of file diff --git a/did_router/migrations/2026-03-23-013910-0000_create_dids/up.sql b/did_router/migrations/2026-03-23-013910-0000_create_dids/up.sql index 6956d71..bdb0328 100644 --- a/did_router/migrations/2026-03-23-013910-0000_create_dids/up.sql +++ b/did_router/migrations/2026-03-23-013910-0000_create_dids/up.sql @@ -2,7 +2,7 @@ CREATE TYPE did_target_type AS ENUM ('URL', 'MOH', 'EXTERNAL_NUMBER', 'NO_SERVICE', 'NIGHT_MODE', 'CUSTOME_MESSAGE'); CREATE TABLE dids ( id SERIAL PRIMARY KEY, - did VARCHAR(64) NOT NULL, + did_number VARCHAR(64) NOT NULL, target_type DID_TARGET_TYPE NOT NULL DEFAULT 'NO_SERVICE', target VARCHAR(512), active BOOLEAN NOT NULL DEFAULT TRUE diff --git a/did_router/src/database.rs b/did_router/src/database.rs index 61b5ca0..f200fb1 100644 --- a/did_router/src/database.rs +++ b/did_router/src/database.rs @@ -5,9 +5,10 @@ use dotenvy::dotenv; use std::env; use serde::{Serialize}; use diesel_derive_enum::DbEnum; +use std::str::FromStr; +use strum_macros::EnumString; - -#[derive(Debug, PartialEq, DbEnum, Serialize)] +#[derive(Debug, PartialEq, DbEnum, Serialize, EnumString)] #[db_enum(existing_type_path = "crate::schema::sql_types::DidTargetType")] pub enum DidTargetType { #[db_enum(rename ="URL")] @@ -24,12 +25,12 @@ pub enum DidTargetType { CustomMessage } -#[derive(Queryable, Selectable, Serialize)] +#[derive(Queryable, Selectable, Serialize, AsChangeset)] #[diesel(table_name = crate::schema::dids)] #[diesel(check_for_backend(diesel::pg::Pg))] pub struct Did { pub id: i32, - pub did: String, + pub did_number: String, pub target_type: DidTargetType, pub target: Option, pub active: bool @@ -38,7 +39,7 @@ pub struct Did { #[derive(Insertable)] #[diesel(table_name = crate::schema::dids)] pub struct NewDid<'a> { - pub did: &'a str, + pub did_number: &'a str, pub target_type: DidTargetType, pub target: Option<&'a str>, pub active: bool @@ -52,15 +53,51 @@ pub fn connect() -> PgConnection { .unwrap_or_else(|_| panic!("Error connecting to database")) } -pub fn add_did() -> Result { +pub fn get_did(a_id :i32) -> Result { + use crate::schema::dids::dsl::*; + + let mut conn = connect(); + let result = dids.find(a_id).first(&mut conn)?; + + Ok(result) +} + +pub fn delete_did(i: i32) -> Result<(), Error> { + use crate::schema::dids; + use crate::schema::dids::columns::id; + + let mut conn = connect(); + diesel::delete(dids::table) + .filter(id.eq(i)) + .execute(&mut conn)?; + + Ok(()) +} + +pub fn update_did(d: Did)-> Result<(), Error> { + use crate::schema::dids; + use crate::schema::dids::dsl::*; + + let mut conn = connect(); + + diesel::update(dids::table) + .filter(id.eq(d.id)) + .set(d) + .execute(&mut conn)?; + + Ok(()) +} + +pub fn add_did(did_number: &str, target_type: &str, target: &str, active: bool) + -> Result { use crate::schema::dids; let mut conn = connect(); let new_did = NewDid { - did: "123456", - target_type: DidTargetType::Url, - target: Some("123456"), - active: true + did_number: did_number, + target_type: DidTargetType::from_str(target_type).unwrap(), + target: Some(target), + active: active }; let did = diesel::insert_into(dids::table) diff --git a/did_router/src/main.rs b/did_router/src/main.rs index 85d067f..15b6da8 100644 --- a/did_router/src/main.rs +++ b/did_router/src/main.rs @@ -1,19 +1,35 @@ pub mod database; pub mod schema; +use std::ops::Deref; +use std::str::FromStr; use xml_builder::{XMLBuilder, XMLElement, XMLVersion}; -use actix_web::{get, post, web, App, +use actix_web::{web, App, HttpResponse, HttpServer, http::header::ContentType, Responder, }; +use serde::Deserialize; +use database as db; +use database::DidTargetType; -use database::{ add_did, - list_did -}; +#[derive(Debug, Deserialize)] +struct RouteData { + #[serde(rename = "Caller-Destination-Number")] + dest_did: String +} -async fn route_did() -> impl Responder { +#[derive(Debug, Deserialize)] +struct JsonDid { + did_number: String, + target_type: String, + target: String, + active: bool +} + +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()) @@ -43,29 +59,60 @@ async fn route_did() -> impl Responder { .body(writer) } -async fn did_post() -> impl Responder { - add_did().unwrap(); +async fn did_post(d: web::Json) -> impl Responder { + let did = d.deref(); + + db::add_did(&did.did_number, &did.target_type, &did.target, did.active).unwrap(); HttpResponse::Ok().body("DID added.") } async fn did_index() -> impl Responder { - let dids = list_did().unwrap(); + let dids = db::list_did().unwrap(); HttpResponse::Ok().json(dids) } +async fn did_get(path: web::Path) -> 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, path: web::Path) -> 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()), + active: d.active + }; + + db::update_did(did).unwrap(); + + HttpResponse::Ok().body("DID updated") +} + +async fn did_delete(path: web::Path) -> impl Responder { + let id = path.into_inner(); + + db::delete_did(id).unwrap(); + + HttpResponse::Ok().body("DID deleted.") +} + fn api_config(cfg: &mut web::ServiceConfig) { cfg.service( web::resource("/fs") .route(web::get().to(did_index)) .route(web::post().to(did_post)) - .route(web::patch().to(|| async { HttpResponse::Ok().body("did patch") })) - .route(web::delete().to(|| async { HttpResponse::Ok().body("did delete") })) ); cfg.service( web::resource("/fs/{id}") - .route(web::get().to(|| async { HttpResponse::Ok().body("did get")})) - .route(web::patch().to(|| async { HttpResponse::Ok().body("did patch")})) - .route(web::delete().to(|| async { HttpResponse::Ok().body("did delete")})) + .route(web::get().to(did_get)) + .route(web::patch().to(did_patch)) + .route(web::delete().to(did_delete)) ); cfg.service( web::resource("/route_did") diff --git a/did_router/src/schema.rs b/did_router/src/schema.rs index 3ad4696..1640db7 100644 --- a/did_router/src/schema.rs +++ b/did_router/src/schema.rs @@ -13,7 +13,7 @@ diesel::table! { dids (id) { id -> Int4, #[max_length = 64] - did -> Varchar, + did_number -> Varchar, target_type -> DidTargetType, #[max_length = 512] target -> Nullable,