|
@@ -93,15 +93,24 @@ pub async fn d_cancel_share(
|
|
|
State(state): State<AppState>,
|
|
State(state): State<AppState>,
|
|
|
Json(d): axum::extract::Json<Dshare>
|
|
Json(d): axum::extract::Json<Dshare>
|
|
|
) -> Json<JsonBack> {
|
|
) -> Json<JsonBack> {
|
|
|
- let (uid,mqid) = match check_token(&state, d.token).await {
|
|
|
|
|
|
|
+ let (uid,_) = match check_token(&state, d.token).await {
|
|
|
Ok(id) => {id},
|
|
Ok(id) => {id},
|
|
|
Err(_) => {
|
|
Err(_) => {
|
|
|
return token_fail();
|
|
return token_fail();
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
|
|
|
+ let mut sqls = Vec::new();
|
|
|
|
|
+ let mut users = if let Ok(users) = state.db_lite.query_rows(
|
|
|
|
|
+ "select u.mqid from map_user_device m left join user u on m.uid=u.id where did in (select id from device where belongto=?) and did=?",
|
|
|
|
|
+ (uid,d.id), |r|{r.get::<usize,String>(0)}).await{
|
|
|
|
|
+ sqls.push("?");
|
|
|
|
|
+ users
|
|
|
|
|
+ }else{
|
|
|
|
|
+ Vec::new()
|
|
|
|
|
+ };
|
|
|
if let Ok(n) = state.db_lite.execute(
|
|
if let Ok(n) = state.db_lite.execute(
|
|
|
- "delete from map_user_device where did in (select id from device where belongto=?) and did=?",
|
|
|
|
|
- [uid,d.id]).await {
|
|
|
|
|
|
|
+ "delete from map_user_device where did in (select id from device where belongto=?) and did=? and uid!=?",
|
|
|
|
|
+ [uid,d.id,uid]).await {
|
|
|
if n ==0 {
|
|
if n ==0 {
|
|
|
return Json(JsonBack{errcode: 3000, errmsg: Some(format!("取消分享失败: 该设备不属于当前用户"))});
|
|
return Json(JsonBack{errcode: 3000, errmsg: Some(format!("取消分享失败: 该设备不属于当前用户"))});
|
|
|
} else if let Some(s) = state.mq_detail {
|
|
} else if let Some(s) = state.mq_detail {
|
|
@@ -110,14 +119,30 @@ pub async fn d_cancel_share(
|
|
|
[d.id,uid], |r|{r.get::<usize,String>(0)}).await{
|
|
[d.id,uid], |r|{r.get::<usize,String>(0)}).await{
|
|
|
sn
|
|
sn
|
|
|
}else{
|
|
}else{
|
|
|
- return Json(JsonBack{errcode: 3000, errmsg: Some(format!("删除设备失败: 设备不存在"))});
|
|
|
|
|
|
|
+ return Json(JsonBack{errcode: 3000, errmsg: Some(format!("删除设备失败0: 设备不存在"))});
|
|
|
};
|
|
};
|
|
|
- if let Err(e)=s.db_mq_map.execute("delete from pub where clientid=? and topic in (?,?)", (mqid.clone(),format!("{sn}/cmd",),format!("/wf/Iot/device/{sn}",))).await{
|
|
|
|
|
- log(Error, format!("删除设备失败: {e}"));
|
|
|
|
|
|
|
+ if !users.is_empty(){
|
|
|
|
|
+ if let Err(e)=s.db_mq_map.execute(format!("delete from pub where clientid in ({}) and topic in (?,?)",sqls.join(",")).as_str(), rusqlite::params_from_iter({
|
|
|
|
|
+ let mut u = users.clone();
|
|
|
|
|
+ // mqid.clone(),format!("{sn}/cmd",),format!("/wf/Iot/device/{sn}",)
|
|
|
|
|
+ u.push(format!("{sn}/cmd",));
|
|
|
|
|
+ u.push(format!("/wf/Iot/device/{sn}",));
|
|
|
|
|
+ log(Debuging, format!("{:?}",u));
|
|
|
|
|
+ u
|
|
|
|
|
+ })).await{
|
|
|
|
|
+ log(Error, format!("删除设备失败1: {e}"));
|
|
|
|
|
+ }
|
|
|
|
|
+ if let Err(e)=s.db_mq_map.execute(format!("delete from pub where clientid in ({}) and topic in (?,?)",sqls.join(",")).as_str(), rusqlite::params_from_iter({
|
|
|
|
|
+ // let mut u = users.clone();
|
|
|
|
|
+ // (mqid,format!("{sn}/state",),format!("/wf/Iot/client/{sn}",))
|
|
|
|
|
+ users.push(format!("{sn}/state",));
|
|
|
|
|
+ users.push(format!("/wf/Iot/client/{sn}",));
|
|
|
|
|
+ log(Debuging, format!("{:?}",users));
|
|
|
|
|
+ users
|
|
|
|
|
+ })).await{
|
|
|
|
|
+ log(Error, format!("删除设备失败2: {e}"));
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
- if let Err(e)=s.db_mq_map.execute("delete from sub where clientid=? and topic in (?,?)", (mqid,format!("{sn}/state",),format!("/wf/Iot/client/{sn}",))).await{
|
|
|
|
|
- log(Error, format!("删除设备失败: {e}"));
|
|
|
|
|
- }
|
|
|
|
|
}
|
|
}
|
|
|
}else {
|
|
}else {
|
|
|
return Json(JsonBack{errcode: 3000, errmsg: Some(format!("删除用户设备关系失败"))});
|
|
return Json(JsonBack{errcode: 3000, errmsg: Some(format!("删除用户设备关系失败"))});
|
|
@@ -138,10 +163,10 @@ pub async fn d_remove(
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
|
let sn = if let Ok(sn)= state.db_lite.query(
|
|
let sn = if let Ok(sn)= state.db_lite.query(
|
|
|
- "select sn from device where id=? and belongto=?", [d.id,uid], |r|{r.get::<usize,String>(0)}).await{
|
|
|
|
|
|
|
+ "select d.sn from map_user_device m left join device d on d.id=m.did where d.id=? and m.uid=?", [d.id,uid], |r|{r.get::<usize,String>(0)}).await{
|
|
|
sn
|
|
sn
|
|
|
}else{
|
|
}else{
|
|
|
- return Json(JsonBack{errcode: 3000, errmsg: Some(format!("删除设备失败: 设备不存在"))});
|
|
|
|
|
|
|
+ return Json(JsonBack{errcode: 3000, errmsg: Some(format!("删除设备失败c: 设备不存在"))});
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
if let Err(e) = state.db_lite.execute(
|
|
if let Err(e) = state.db_lite.execute(
|
|
@@ -151,11 +176,11 @@ pub async fn d_remove(
|
|
|
}
|
|
}
|
|
|
if let Some(s)=state.mq_detail{
|
|
if let Some(s)=state.mq_detail{
|
|
|
// 移除旧关系
|
|
// 移除旧关系
|
|
|
- if let Err(e)=s.db_mq_map.execute("delete from pub where clientid=? and topic in (?,?)", (mqid.clone(),format!("{sn}/cmd",),format!("/wf/Iot/device/{sn}",))).await{
|
|
|
|
|
- log(Error, format!("删除设备失败: {e}"));
|
|
|
|
|
|
|
+ if let Err(e)=s.db_mq_map.execute("delete from pub where clientid=? and topic in (?,?)", (mqid.clone(),format!("{sn}/cmd",),format!("/wf/Iot/device/{sn}"))).await{
|
|
|
|
|
+ log(Error, format!("删除设备失败a: {e}"));
|
|
|
}
|
|
}
|
|
|
- if let Err(e)=s.db_mq_map.execute("delete from sub where clientid=? and topic in (?,?)", (mqid,format!("{sn}/state",),format!("/wf/Iot/client/{sn}",))).await{
|
|
|
|
|
- log(Error, format!("删除设备失败: {e}"));
|
|
|
|
|
|
|
+ if let Err(e)=s.db_mq_map.execute("delete from sub where clientid=? and topic in (?,?)", (mqid,format!("{sn}/state",),format!("/wf/Iot/client/{sn}"))).await{
|
|
|
|
|
+ log(Error, format!("删除设备失败b: {e}"));
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -288,7 +313,9 @@ pub struct UTokenBack{
|
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
|
pub area: Option<Vec<Area>>,
|
|
pub area: Option<Vec<Area>>,
|
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
|
- pub latest: Option<Vec<DV>>
|
|
|
|
|
|
|
+ pub latest: Option<Vec<DV>>,
|
|
|
|
|
+ #[serde(skip_serializing_if = "Option::is_none")]
|
|
|
|
|
+ pub uinfo: Option<UInfo>
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// #[derive(serde::Deserialize)]
|
|
// #[derive(serde::Deserialize)]
|
|
@@ -330,6 +357,17 @@ pub struct UTokenBack{
|
|
|
// errcode0()
|
|
// errcode0()
|
|
|
// }
|
|
// }
|
|
|
|
|
|
|
|
|
|
+#[derive(serde::Serialize)]
|
|
|
|
|
+pub struct UInfo{
|
|
|
|
|
+ errcode: u32,
|
|
|
|
|
+ #[serde(skip_serializing_if = "Option::is_none")]
|
|
|
|
|
+ errmsg: Option<String>,
|
|
|
|
|
+ #[serde(skip_serializing_if = "Option::is_none")]
|
|
|
|
|
+ nickname: Option<String>,
|
|
|
|
|
+ #[serde(skip_serializing_if = "Option::is_none")]
|
|
|
|
|
+ headimgurl: Option<String>
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
pub async fn d_all(
|
|
pub async fn d_all(
|
|
|
State(state): State<AppState>,
|
|
State(state): State<AppState>,
|
|
|
Json(u): axum::extract::Json<super::Ident>
|
|
Json(u): axum::extract::Json<super::Ident>
|
|
@@ -337,7 +375,7 @@ pub async fn d_all(
|
|
|
let uid = if let Ok( (id,_)) = check_token(&state, u.token).await {
|
|
let uid = if let Ok( (id,_)) = check_token(&state, u.token).await {
|
|
|
id
|
|
id
|
|
|
} else {
|
|
} else {
|
|
|
- return Json(UTokenBack{errcode: 2000, errmsg: Some("鉴权失败: token无效".to_string()),devices: None,area: None,latest:None})
|
|
|
|
|
|
|
+ return Json(UTokenBack{errcode: 2000, errmsg: Some("鉴权失败: token无效".to_string()),devices: None,area: None,latest:None,uinfo:None})
|
|
|
};
|
|
};
|
|
|
let mut sqls = Vec::new();
|
|
let mut sqls = Vec::new();
|
|
|
let mut devices: Vec<String> = Vec::new();
|
|
let mut devices: Vec<String> = Vec::new();
|
|
@@ -345,6 +383,29 @@ pub async fn d_all(
|
|
|
Json(UTokenBack{
|
|
Json(UTokenBack{
|
|
|
errcode: 0,
|
|
errcode: 0,
|
|
|
errmsg: None,
|
|
errmsg: None,
|
|
|
|
|
+ uinfo: match state.db_lite.query("select nickname, headimgurl from user where id=?", [uid], |r| {
|
|
|
|
|
+ Ok(
|
|
|
|
|
+ UInfo{
|
|
|
|
|
+ errcode: 0,
|
|
|
|
|
+ errmsg: None,
|
|
|
|
|
+ nickname: Some(r.get(0)?),
|
|
|
|
|
+ headimgurl: Some(r.get(1)?)
|
|
|
|
|
+ }
|
|
|
|
|
+ )
|
|
|
|
|
+ }).await{
|
|
|
|
|
+ Ok(u) => {Some(u)},
|
|
|
|
|
+ Err(e) => {
|
|
|
|
|
+ log(Warning, format!("fail to take user info {e}"));
|
|
|
|
|
+ return Json(UTokenBack{
|
|
|
|
|
+ errcode: 3000,
|
|
|
|
|
+ errmsg: Some(format!("设备信息获取失败")),
|
|
|
|
|
+ devices: None,
|
|
|
|
|
+ area: None,
|
|
|
|
|
+ latest: None,
|
|
|
|
|
+ uinfo: None
|
|
|
|
|
+ })
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
devices: Some(
|
|
devices: Some(
|
|
|
match state.db_lite.query_rows(
|
|
match state.db_lite.query_rows(
|
|
|
"select d.id,d.name,d.sn,d.area,d.belongto,d.info from device d left join map_user_device m on d.id=m.did where d.isdelete=0 and m.uid=?",
|
|
"select d.id,d.name,d.sn,d.area,d.belongto,d.info from device d left join map_user_device m on d.id=m.did where d.isdelete=0 and m.uid=?",
|
|
@@ -369,7 +430,8 @@ pub async fn d_all(
|
|
|
errmsg: Some(format!("设备信息获取失败")),
|
|
errmsg: Some(format!("设备信息获取失败")),
|
|
|
devices: None,
|
|
devices: None,
|
|
|
area: None,
|
|
area: None,
|
|
|
- latest: None
|
|
|
|
|
|
|
+ latest: None,
|
|
|
|
|
+ uinfo: None
|
|
|
})
|
|
})
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -392,7 +454,8 @@ pub async fn d_all(
|
|
|
errmsg: Some(format!("设备信息获取失败")),
|
|
errmsg: Some(format!("设备信息获取失败")),
|
|
|
devices: None,
|
|
devices: None,
|
|
|
area: None,
|
|
area: None,
|
|
|
- latest: None
|
|
|
|
|
|
|
+ latest: None,
|
|
|
|
|
+ uinfo: None
|
|
|
})
|
|
})
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -426,9 +489,10 @@ pub async fn d_all(
|
|
|
beep: r.get(17)?,
|
|
beep: r.get(17)?,
|
|
|
})
|
|
})
|
|
|
}).await.ok()
|
|
}).await.ok()
|
|
|
- },
|
|
|
|
|
- None =>None
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ },
|
|
|
|
|
+ None =>None
|
|
|
|
|
+ },
|
|
|
|
|
+
|
|
|
}
|
|
}
|
|
|
)
|
|
)
|
|
|
}
|
|
}
|