API was finished

This commit is contained in:
2026-03-25 20:58:53 -04:00
parent 6bffd594c0
commit c6fd432ac1
6 changed files with 166 additions and 42 deletions

72
did_router/Cargo.lock generated
View File

@@ -65,7 +65,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb"
dependencies = [ dependencies = [
"quote", "quote",
"syn", "syn 2.0.117",
] ]
[[package]] [[package]]
@@ -182,7 +182,7 @@ dependencies = [
"actix-router", "actix-router",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn", "syn 2.0.117",
] ]
[[package]] [[package]]
@@ -365,7 +365,7 @@ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"strsim", "strsim",
"syn", "syn 2.0.117",
] ]
[[package]] [[package]]
@@ -376,7 +376,7 @@ checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81"
dependencies = [ dependencies = [
"darling_core", "darling_core",
"quote", "quote",
"syn", "syn 2.0.117",
] ]
[[package]] [[package]]
@@ -407,7 +407,7 @@ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"rustc_version", "rustc_version",
"syn", "syn 2.0.117",
"unicode-xid", "unicode-xid",
] ]
@@ -421,6 +421,8 @@ dependencies = [
"dotenvy", "dotenvy",
"serde", "serde",
"serde_json", "serde_json",
"strum",
"strum_macros",
"xml-builder", "xml-builder",
] ]
@@ -447,7 +449,7 @@ dependencies = [
"heck 0.4.1", "heck 0.4.1",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn", "syn 2.0.117",
] ]
[[package]] [[package]]
@@ -460,7 +462,7 @@ dependencies = [
"dsl_auto_type", "dsl_auto_type",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn", "syn 2.0.117",
] ]
[[package]] [[package]]
@@ -469,7 +471,7 @@ version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fe2444076b48641147115697648dc743c2c00b61adade0f01ce67133c7babe8c" checksum = "fe2444076b48641147115697648dc743c2c00b61adade0f01ce67133c7babe8c"
dependencies = [ dependencies = [
"syn", "syn 2.0.117",
] ]
[[package]] [[package]]
@@ -490,7 +492,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn", "syn 2.0.117",
] ]
[[package]] [[package]]
@@ -516,7 +518,7 @@ dependencies = [
"heck 0.5.0", "heck 0.5.0",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn", "syn 2.0.117",
] ]
[[package]] [[package]]
@@ -1117,6 +1119,12 @@ dependencies = [
"semver", "semver",
] ]
[[package]]
name = "rustversion"
version = "1.0.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
[[package]] [[package]]
name = "ryu" name = "ryu"
version = "1.0.23" version = "1.0.23"
@@ -1162,7 +1170,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn", "syn 2.0.117",
] ]
[[package]] [[package]]
@@ -1267,6 +1275,36 @@ version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 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]] [[package]]
name = "syn" name = "syn"
version = "2.0.117" version = "2.0.117"
@@ -1286,7 +1324,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn", "syn 2.0.117",
] ]
[[package]] [[package]]
@@ -1379,7 +1417,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn", "syn 2.0.117",
] ]
[[package]] [[package]]
@@ -1585,7 +1623,7 @@ checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn", "syn 2.0.117",
"synstructure", "synstructure",
] ]
@@ -1606,7 +1644,7 @@ checksum = "0e8bc7269b54418e7aeeef514aa68f8690b8c0489a06b0136e5f57c4c5ccab89"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn", "syn 2.0.117",
] ]
[[package]] [[package]]
@@ -1626,7 +1664,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn", "syn 2.0.117",
"synstructure", "synstructure",
] ]
@@ -1660,7 +1698,7 @@ checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn", "syn 2.0.117",
] ]
[[package]] [[package]]

View File

@@ -11,3 +11,5 @@ dotenvy = "0.15"
serde = { version = "1.0.228", features = ["derive"] } serde = { version = "1.0.228", features = ["derive"] }
serde_json = "1.0.149" serde_json = "1.0.149"
diesel-derive-enum = { version = "3.0.0-beta.1", features = ["postgres"] } diesel-derive-enum = { version = "3.0.0-beta.1", features = ["postgres"] }
strum = "0.24"
strum_macros = "0.24"

View File

@@ -2,7 +2,7 @@
CREATE TYPE did_target_type AS ENUM ('URL', 'MOH', 'EXTERNAL_NUMBER', 'NO_SERVICE', 'NIGHT_MODE', 'CUSTOME_MESSAGE'); CREATE TYPE did_target_type AS ENUM ('URL', 'MOH', 'EXTERNAL_NUMBER', 'NO_SERVICE', 'NIGHT_MODE', 'CUSTOME_MESSAGE');
CREATE TABLE dids ( CREATE TABLE dids (
id SERIAL PRIMARY KEY, 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_type DID_TARGET_TYPE NOT NULL DEFAULT 'NO_SERVICE',
target VARCHAR(512), target VARCHAR(512),
active BOOLEAN NOT NULL DEFAULT TRUE active BOOLEAN NOT NULL DEFAULT TRUE

View File

@@ -5,9 +5,10 @@ use dotenvy::dotenv;
use std::env; use std::env;
use serde::{Serialize}; use serde::{Serialize};
use diesel_derive_enum::DbEnum; use diesel_derive_enum::DbEnum;
use std::str::FromStr;
use strum_macros::EnumString;
#[derive(Debug, PartialEq, DbEnum, Serialize, EnumString)]
#[derive(Debug, PartialEq, DbEnum, Serialize)]
#[db_enum(existing_type_path = "crate::schema::sql_types::DidTargetType")] #[db_enum(existing_type_path = "crate::schema::sql_types::DidTargetType")]
pub enum DidTargetType { pub enum DidTargetType {
#[db_enum(rename ="URL")] #[db_enum(rename ="URL")]
@@ -24,12 +25,12 @@ pub enum DidTargetType {
CustomMessage CustomMessage
} }
#[derive(Queryable, Selectable, Serialize)] #[derive(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 {
pub id: i32, pub id: i32,
pub did: String, pub did_number: String,
pub target_type: DidTargetType, pub target_type: DidTargetType,
pub target: Option<String>, pub target: Option<String>,
pub active: bool pub active: bool
@@ -38,7 +39,7 @@ pub struct Did {
#[derive(Insertable)] #[derive(Insertable)]
#[diesel(table_name = crate::schema::dids)] #[diesel(table_name = crate::schema::dids)]
pub struct NewDid<'a> { pub struct NewDid<'a> {
pub did: &'a str, pub did_number: &'a str,
pub target_type: DidTargetType, pub target_type: DidTargetType,
pub target: Option<&'a str>, pub target: Option<&'a str>,
pub active: bool pub active: bool
@@ -52,15 +53,51 @@ pub fn connect() -> PgConnection {
.unwrap_or_else(|_| panic!("Error connecting to database")) .unwrap_or_else(|_| panic!("Error connecting to database"))
} }
pub fn add_did() -> Result<Did, Error> { pub fn get_did(a_id :i32) -> Result<Did, Error> {
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<Did, Error> {
use crate::schema::dids; use crate::schema::dids;
let mut conn = connect(); let mut conn = connect();
let new_did = NewDid { let new_did = NewDid {
did: "123456", did_number: did_number,
target_type: DidTargetType::Url, target_type: DidTargetType::from_str(target_type).unwrap(),
target: Some("123456"), target: Some(target),
active: true active: active
}; };
let did = diesel::insert_into(dids::table) let did = diesel::insert_into(dids::table)

View File

@@ -1,19 +1,35 @@
pub mod database; pub mod database;
pub mod schema; pub mod schema;
use std::ops::Deref;
use std::str::FromStr;
use xml_builder::{XMLBuilder, XMLElement, XMLVersion}; use xml_builder::{XMLBuilder, XMLElement, XMLVersion};
use actix_web::{get, post, web, App, use actix_web::{web, App,
HttpResponse, HttpResponse,
HttpServer, HttpServer,
http::header::ContentType, http::header::ContentType,
Responder, Responder,
}; };
use serde::Deserialize;
use database as db;
use database::DidTargetType;
use database::{ add_did, #[derive(Debug, Deserialize)]
list_did 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<RouteData>) -> impl Responder {
let _dest_did = data.dest_did.clone();
let mut xml = XMLBuilder::new() let mut xml = XMLBuilder::new()
.version(XMLVersion::XML1_1) .version(XMLVersion::XML1_1)
.encoding("UTF-8".into()) .encoding("UTF-8".into())
@@ -43,29 +59,60 @@ async fn route_did() -> impl Responder {
.body(writer) .body(writer)
} }
async fn did_post() -> impl Responder { async fn did_post(d: web::Json<JsonDid>) -> impl Responder {
add_did().unwrap(); let did = d.deref();
db::add_did(&did.did_number, &did.target_type, &did.target, did.active).unwrap();
HttpResponse::Ok().body("DID added.") HttpResponse::Ok().body("DID added.")
} }
async fn did_index() -> impl Responder { async fn did_index() -> impl Responder {
let dids = list_did().unwrap(); let dids = db::list_did().unwrap();
HttpResponse::Ok().json(dids) HttpResponse::Ok().json(dids)
} }
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()),
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.")
}
fn api_config(cfg: &mut web::ServiceConfig) { fn api_config(cfg: &mut web::ServiceConfig) {
cfg.service( cfg.service(
web::resource("/fs") web::resource("/fs")
.route(web::get().to(did_index)) .route(web::get().to(did_index))
.route(web::post().to(did_post)) .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( cfg.service(
web::resource("/fs/{id}") web::resource("/fs/{id}")
.route(web::get().to(|| async { HttpResponse::Ok().body("did get")})) .route(web::get().to(did_get))
.route(web::patch().to(|| async { HttpResponse::Ok().body("did patch")})) .route(web::patch().to(did_patch))
.route(web::delete().to(|| async { HttpResponse::Ok().body("did delete")})) .route(web::delete().to(did_delete))
); );
cfg.service( cfg.service(
web::resource("/route_did") web::resource("/route_did")

View File

@@ -13,7 +13,7 @@ diesel::table! {
dids (id) { dids (id) {
id -> Int4, id -> Int4,
#[max_length = 64] #[max_length = 64]
did -> Varchar, did_number -> Varchar,
target_type -> DidTargetType, target_type -> DidTargetType,
#[max_length = 512] #[max_length = 512]
target -> Nullable<Varchar>, target -> Nullable<Varchar>,