|
@@ -0,0 +1,116 @@
|
|
|
|
|
+use crate::AppState;
|
|
|
|
|
+use super::{JsonBack, errcode0, token};
|
|
|
|
|
+use super::{token_fail,check_login};
|
|
|
|
|
+use crate::datasource::Datasource;
|
|
|
|
|
+
|
|
|
|
|
+use serde::{Serialize, Deserialize};
|
|
|
|
|
+use axum::{Json,extract::{State, Query}, http::HeaderMap};
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+#[derive(Deserialize)]
|
|
|
|
|
+pub struct TaskOfDeviceShareOrTransfer{
|
|
|
|
|
+ token: String,
|
|
|
|
|
+ id: u64,
|
|
|
|
|
+ r#type: u8,
|
|
|
|
|
+}
|
|
|
|
|
+#[derive(Serialize)]
|
|
|
|
|
+pub struct UrlBack{
|
|
|
|
|
+ errcode: u16,
|
|
|
|
|
+ errmsg: Option<String>,
|
|
|
|
|
+ url: Option<String>,
|
|
|
|
|
+}
|
|
|
|
|
+pub async fn new_flow_task_share_device(
|
|
|
|
|
+ headers: HeaderMap,
|
|
|
|
|
+ State(state): State<AppState>,
|
|
|
|
|
+ Json(u): axum::extract::Json<TaskOfDeviceShareOrTransfer>
|
|
|
|
|
+) -> Json<UrlBack> {
|
|
|
|
|
+ match check_login(&state, u.token).await {
|
|
|
|
|
+ Ok(_) => {},
|
|
|
|
|
+ Err(_) => {
|
|
|
|
|
+ return Json(UrlBack{errcode: 3000, errmsg: Some(format!("鉴权失败: token失效")),url:None});
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ let mut tryno=0;
|
|
|
|
|
+ let ticket = token();
|
|
|
|
|
+ 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{
|
|
|
|
|
+ Ok(_) => false,
|
|
|
|
|
+ Err(e) =>
|
|
|
|
|
+ if e==""{true} // execute时如果遇到Unique异常时会将异常处理为空字符串
|
|
|
|
|
+ else{return Json(UrlBack{errcode: 3000, errmsg: Some(format!("分享流程创建失败: {e}")),url:None})},
|
|
|
|
|
+ }
|
|
|
|
|
+ {
|
|
|
|
|
+ tryno+=1;
|
|
|
|
|
+ };
|
|
|
|
|
+ if tryno==5{
|
|
|
|
|
+ return Json(UrlBack{errcode: 3000, errmsg: Some(format!("分享流程创建失败: 反复重试失败")),url: None});
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 获取主机名
|
|
|
|
|
+ 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}"))})
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+#[derive(Deserialize)]
|
|
|
|
|
+pub struct QueryParams {
|
|
|
|
|
+ ticket: String,
|
|
|
|
|
+}
|
|
|
|
|
+#[derive(Deserialize)]
|
|
|
|
|
+pub struct Ident{
|
|
|
|
|
+ token: String
|
|
|
|
|
+}
|
|
|
|
|
+pub async fn checkout_flow_task_of_share_device(
|
|
|
|
|
+ State(state): State<AppState>,
|
|
|
|
|
+ Query(params): Query<QueryParams>,
|
|
|
|
|
+ Json(u): Json<Ident>
|
|
|
|
|
+) -> Json<JsonBack> {
|
|
|
|
|
+ let uid = match check_login(&state, u.token).await {
|
|
|
|
|
+ Ok(id) => id,
|
|
|
|
|
+ Err(_) => {
|
|
|
|
|
+ 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{
|
|
|
|
|
+ Ok(a) => a,
|
|
|
|
|
+ Err(_) => return Json(JsonBack{errcode: 3000, errmsg: Some(
|
|
|
|
|
+ "未找到分享流程".to_string()
|
|
|
|
|
+ // format!("未找到分享流程 {} {e}",params.ticket.clone())
|
|
|
|
|
+ )}),
|
|
|
|
|
+ };
|
|
|
|
|
+ if interval > 30*60 /* interval为当前时间减去createtime的秒数 */ {
|
|
|
|
|
+ match state.db_lite.execute(
|
|
|
|
|
+ "delete from flow_task_share where ticket=?",
|
|
|
|
|
+ // "update flow_task_share set isdelete=1 where ticket=?",
|
|
|
|
|
+ [params.ticket.clone()]).await{
|
|
|
|
|
+ Ok(_) => {},
|
|
|
|
|
+ Err(e) => return Json(JsonBack{errcode: 3001, errmsg: Some(format!("删除分享流程失败: {e}"))}),
|
|
|
|
|
+ };
|
|
|
|
|
+ return Json(JsonBack{errcode: 3001, errmsg: Some("分享流程已过期".to_string())});
|
|
|
|
|
+ }
|
|
|
|
|
+ if typo == 0{
|
|
|
|
|
+ match state.db_lite.execute("insert into map_user_area(uid,aid)values(?,?)", [uid, id]).await{
|
|
|
|
|
+ Ok(_) => {
|
|
|
|
|
+ },
|
|
|
|
|
+ Err(e) => return Json(JsonBack{errcode: 3002, errmsg: Some(format!("添加设备分享关系失败: {e}"))}),
|
|
|
|
|
+ };
|
|
|
|
|
+ }else if typo == 1 {
|
|
|
|
|
+ match state.db_lite.execute("insert into map_user_device(uid,did)values(?,?)", [uid, id]).await{
|
|
|
|
|
+ Ok(_) => {},
|
|
|
|
|
+ Err(e) => return Json(JsonBack{errcode: 3002, errmsg: Some(format!("添加设备分享关系失败: {e}"))}),
|
|
|
|
|
+ };
|
|
|
|
|
+ } else {
|
|
|
|
|
+ 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{
|
|
|
|
|
+ Ok(_) => {},
|
|
|
|
|
+ Err(_) => {}
|
|
|
|
|
+ }
|
|
|
|
|
+ errcode0()
|
|
|
|
|
+}
|