|
@@ -1,10 +1,10 @@
|
|
|
-use crate::AppState;
|
|
|
|
|
|
|
+use crate::{AppState,Debug, log};
|
|
|
use super::{JsonBack, errcode0, token};
|
|
use super::{JsonBack, errcode0, token};
|
|
|
use super::{token_fail,check_token};
|
|
use super::{token_fail,check_token};
|
|
|
use crate::datasource::Datasource;
|
|
use crate::datasource::Datasource;
|
|
|
|
|
|
|
|
use serde::{Serialize, Deserialize};
|
|
use serde::{Serialize, Deserialize};
|
|
|
-use axum::{Json,extract::{State, Query}, http::HeaderMap};
|
|
|
|
|
|
|
+use axum::{Json,extract::{State}, http::HeaderMap};
|
|
|
|
|
|
|
|
|
|
|
|
|
#[derive(Deserialize)]
|
|
#[derive(Deserialize)]
|
|
@@ -19,22 +19,30 @@ pub struct UrlBack{
|
|
|
errmsg: Option<String>,
|
|
errmsg: Option<String>,
|
|
|
url: Option<String>,
|
|
url: Option<String>,
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+#[allow(unused_variables)]
|
|
|
pub async fn new_flow_task_share_device(
|
|
pub async fn new_flow_task_share_device(
|
|
|
headers: HeaderMap,
|
|
headers: HeaderMap,
|
|
|
State(state): State<AppState>,
|
|
State(state): State<AppState>,
|
|
|
Json(u): axum::extract::Json<TaskOfDeviceShareOrTransfer>
|
|
Json(u): axum::extract::Json<TaskOfDeviceShareOrTransfer>
|
|
|
) -> Json<UrlBack> {
|
|
) -> Json<UrlBack> {
|
|
|
- match check_token(&state, u.token).await {
|
|
|
|
|
- Ok(_) => {},
|
|
|
|
|
|
|
+ let uid=match check_token(&state, u.token).await {
|
|
|
|
|
+ Ok(id) => {id},
|
|
|
Err(_) => {
|
|
Err(_) => {
|
|
|
return Json(UrlBack{errcode: 3000, errmsg: Some(format!("鉴权失败: token失效")),url:None});
|
|
return Json(UrlBack{errcode: 3000, errmsg: Some(format!("鉴权失败: token失效")),url:None});
|
|
|
}
|
|
}
|
|
|
|
|
+ };
|
|
|
|
|
+ match u.r#type{
|
|
|
|
|
+ 0|1|2 => {},
|
|
|
|
|
+ _ => {
|
|
|
|
|
+ return Json(UrlBack{errcode: 3000, errmsg: Some(format!("参数错误: type应为0、1、2")),url:None});
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
let mut tryno=0;
|
|
let mut tryno=0;
|
|
|
- let ticket = token();
|
|
|
|
|
|
|
+ let linkrand = token();
|
|
|
while tryno<5 && match state.db_lite.execute(
|
|
while tryno<5 && match state.db_lite.execute(
|
|
|
- "insert into flow_task_share (did, typo, ticket)values (?,?,?)",
|
|
|
|
|
- (u.id,u.r#type,ticket.clone())).await{
|
|
|
|
|
|
|
+ "insert into flow_task_share (did, typo, ticket,createby)values (?,?,?,?)",
|
|
|
|
|
+ (u.id,u.r#type,linkrand.clone(),uid)).await{
|
|
|
Ok(_) => false,
|
|
Ok(_) => false,
|
|
|
Err(e) =>
|
|
Err(e) =>
|
|
|
if e==""{true} // execute时如果遇到Unique异常时会将异常处理为空字符串
|
|
if e==""{true} // execute时如果遇到Unique异常时会将异常处理为空字符串
|
|
@@ -48,23 +56,29 @@ pub async fn new_flow_task_share_device(
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 获取主机名
|
|
// 获取主机名
|
|
|
- let host = headers.get("host")
|
|
|
|
|
- .and_then(|hv| hv.to_str().ok())
|
|
|
|
|
- .unwrap_or("localhost:3000");
|
|
|
|
|
-
|
|
|
|
|
- Json(UrlBack{errcode: 0, errmsg: None,url:Some(format!("http://{host}/api/flow/share/checkout?ticket={ticket}"))})
|
|
|
|
|
|
|
+ // let host = format!("https://{}",headers.get("host")
|
|
|
|
|
+ // .and_then(|hv| hv.to_str().ok())
|
|
|
|
|
+ // .unwrap_or("localhost:3000"));
|
|
|
|
|
+ let host = crate::WEBP;
|
|
|
|
|
+ Json(UrlBack{errcode: 0, errmsg: None,url:Some(format!("{host}?linkrand={linkrand}"))})
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+// #[derive(Deserialize)]
|
|
|
|
|
+// pub struct QueryParams {
|
|
|
|
|
+// linkrand: String,
|
|
|
|
|
+// }
|
|
|
|
|
+
|
|
|
#[derive(Deserialize)]
|
|
#[derive(Deserialize)]
|
|
|
-pub struct QueryParams {
|
|
|
|
|
- ticket: String,
|
|
|
|
|
|
|
+pub struct CheckoutShare {
|
|
|
|
|
+token: String,
|
|
|
|
|
+ linkrand: String,
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
pub async fn checkout_flow_task_of_share_device(
|
|
pub async fn checkout_flow_task_of_share_device(
|
|
|
State(state): State<AppState>,
|
|
State(state): State<AppState>,
|
|
|
- Query(params): Query<QueryParams>,
|
|
|
|
|
- Json(u): Json<super::Ident>
|
|
|
|
|
|
|
+ // Query(params): Query<QueryParams>,
|
|
|
|
|
+ Json(u): Json<CheckoutShare>
|
|
|
) -> Json<JsonBack> {
|
|
) -> Json<JsonBack> {
|
|
|
let uid = match check_token(&state, u.token).await {
|
|
let uid = match check_token(&state, u.token).await {
|
|
|
Ok(id) => id,
|
|
Ok(id) => id,
|
|
@@ -72,9 +86,12 @@ pub async fn checkout_flow_task_of_share_device(
|
|
|
return token_fail();
|
|
return token_fail();
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
|
- let (id, typo,interval) = match state.db_lite.query(
|
|
|
|
|
- "select id,typo,strftime('%s','now')-strftime('%s',createtime) from flow_task_share where ticket=? and isdelete=0",
|
|
|
|
|
- [params.ticket.clone()], |r|Ok((r.get::<usize, u64>(0)?,r.get::<usize, u8>(1)?,r.get::<usize, u64>(1)?))).await{
|
|
|
|
|
|
|
+ let (id, typo,interval, createby) = match state.db_lite.query(
|
|
|
|
|
+ "select did,typo,strftime('%s','now')-strftime('%s',createtime),createby from flow_task_share where ticket=? and isdelete=0",
|
|
|
|
|
+ [
|
|
|
|
|
+ // params.linkrand.clone()
|
|
|
|
|
+ u.linkrand.clone()
|
|
|
|
|
+ ], |r|Ok((r.get::<usize, u64>(0)?,r.get::<usize, u8>(1)?,r.get::<usize, u64>(2)?,r.get::<usize, u64>(3)?))).await{
|
|
|
Ok(a) => a,
|
|
Ok(a) => a,
|
|
|
Err(_) => return Json(JsonBack{errcode: 3000, errmsg: Some(
|
|
Err(_) => return Json(JsonBack{errcode: 3000, errmsg: Some(
|
|
|
"未找到分享流程".to_string()
|
|
"未找到分享流程".to_string()
|
|
@@ -85,29 +102,66 @@ pub async fn checkout_flow_task_of_share_device(
|
|
|
match state.db_lite.execute(
|
|
match state.db_lite.execute(
|
|
|
"delete from flow_task_share where ticket=?",
|
|
"delete from flow_task_share where ticket=?",
|
|
|
// "update flow_task_share set isdelete=1 where ticket=?",
|
|
// "update flow_task_share set isdelete=1 where ticket=?",
|
|
|
- [params.ticket.clone()]).await{
|
|
|
|
|
|
|
+ [u.linkrand.clone()]).await{
|
|
|
Ok(_) => {},
|
|
Ok(_) => {},
|
|
|
Err(e) => return Json(JsonBack{errcode: 3001, errmsg: Some(format!("删除分享流程失败: {e}"))}),
|
|
Err(e) => return Json(JsonBack{errcode: 3001, errmsg: Some(format!("删除分享流程失败: {e}"))}),
|
|
|
};
|
|
};
|
|
|
return Json(JsonBack{errcode: 3001, errmsg: Some("分享流程已过期".to_string())});
|
|
return Json(JsonBack{errcode: 3001, errmsg: Some("分享流程已过期".to_string())});
|
|
|
}
|
|
}
|
|
|
|
|
+ // 为2时转让设备,需要移除原用户与设备的关系
|
|
|
|
|
+ if typo == 2{
|
|
|
|
|
+ if let Err(e) = state.db_lite.execute("delete from map_user_device where uid=? and did=?", (createby, id)).await{
|
|
|
|
|
+ return Json(JsonBack{errcode: 3001, errmsg: Some(format!("转让时删除设备关系失败: {e}"))});
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 为0时分享区域
|
|
|
if typo == 0{
|
|
if typo == 0{
|
|
|
match state.db_lite.execute("insert into map_user_area(uid,aid)values(?,?)", [uid, id]).await{
|
|
match state.db_lite.execute("insert into map_user_area(uid,aid)values(?,?)", [uid, id]).await{
|
|
|
- Ok(_) => {
|
|
|
|
|
|
|
+ Ok(i) => {
|
|
|
|
|
+ log(Debug, format!("影响一级区域数量{i}个"));
|
|
|
|
|
+ },
|
|
|
|
|
+ Err(e) => if e==""{/*Unique异常跳过 */} else {return Json(JsonBack{errcode: 3002, errmsg: Some(format!("添加区域分享关系失败: {e}"))});},
|
|
|
|
|
+ };
|
|
|
|
|
+ match state.db_lite.execute("insert into map_user_area(uid,aid) select ?,id from area where sup=? and id not in (select aid from map_user_area where uid=?)", [uid, id,uid]).await{
|
|
|
|
|
+ Ok(i) => {
|
|
|
|
|
+ log(Debug, format!("影响二级区域数量{i}个"));
|
|
|
|
|
+ },
|
|
|
|
|
+ Err(e) => if e==""{/*Unique异常跳过 */} else {return Json(JsonBack{errcode: 3002, errmsg: Some(format!("添加区域下级分享关系失败: {e}"))})},
|
|
|
|
|
+ };
|
|
|
|
|
+ match state.db_lite.execute("insert into map_user_device(uid,did) select ?,device.id from device where area in (select id from area where area.sup=?) and device.id not in (select did from map_user_device where uid=?)", [uid, id,uid]).await{
|
|
|
|
|
+ Ok(i) => {
|
|
|
|
|
+ log(Debug, format!("影响设备数量{i}个"));
|
|
|
},
|
|
},
|
|
|
- Err(e) => return Json(JsonBack{errcode: 3002, errmsg: Some(format!("添加设备分享关系失败: {e}"))}),
|
|
|
|
|
|
|
+ Err(e) =>if e==""{/*Unique异常跳过 */} else { return Json(JsonBack{errcode: 3002, errmsg: Some(format!("添加区域下全部设备关系失败: {e}"))})},
|
|
|
};
|
|
};
|
|
|
- }else if typo == 1 {
|
|
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+ // 为1时分享设备,为2时转让设备,此处添加设备与新用户的关系
|
|
|
|
|
+ else if typo == 1 || typo == 2 {
|
|
|
match state.db_lite.execute("insert into map_user_device(uid,did)values(?,?)", [uid, id]).await{
|
|
match state.db_lite.execute("insert into map_user_device(uid,did)values(?,?)", [uid, id]).await{
|
|
|
Ok(_) => {},
|
|
Ok(_) => {},
|
|
|
- Err(e) => return Json(JsonBack{errcode: 3002, errmsg: Some(format!("添加设备分享关系失败: {e}"))}),
|
|
|
|
|
|
|
+ Err(e) => if e==""{/*Unique异常跳过*/}else{ return Json(JsonBack{errcode: 3002, errmsg: Some(format!("添加设备分享关系失败: {e}"))});}
|
|
|
};
|
|
};
|
|
|
} else {
|
|
} else {
|
|
|
return Json(JsonBack{errcode: 3003, errmsg: Some("分享流程类型错误".to_string())});
|
|
return Json(JsonBack{errcode: 3003, errmsg: Some("分享流程类型错误".to_string())});
|
|
|
}
|
|
}
|
|
|
- match state.db_lite.execute("delete from flow_task_share where ticket=?", [params.ticket.clone()]).await{
|
|
|
|
|
|
|
+
|
|
|
|
|
+ // 转让设备需要将belongto更新
|
|
|
|
|
+ if typo == 2{
|
|
|
|
|
+ match state.db_lite.execute("update device set belongto=? where id=?", [uid, id]).await{
|
|
|
|
|
+ Ok(_) => {},
|
|
|
|
|
+ Err(e) => return Json(JsonBack{errcode: 3004, errmsg: Some(format!("更新设备分享关系失败: {e}"))}),
|
|
|
|
|
+ }
|
|
|
|
|
+ match state.db_lite.execute("delete from flow_task_share where ticket=?", [u.linkrand.clone()]).await{
|
|
|
|
|
+ Ok(_) => {},
|
|
|
|
|
+ Err(e) => {println!("when delete transform flow got error: {e}")}
|
|
|
|
|
+ }
|
|
|
|
|
+ } else {
|
|
|
|
|
+
|
|
|
|
|
+ match state.db_lite.execute("delete from flow_task_share where strftime('%s','now')-strftime('%s',createtime)>30*60", []).await{
|
|
|
Ok(_) => {},
|
|
Ok(_) => {},
|
|
|
- Err(_) => {}
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ Err(e) => {println!("when delete extra flow got error: {e}")}
|
|
|
|
|
+ }}
|
|
|
errcode0()
|
|
errcode0()
|
|
|
}
|
|
}
|