tcloud_im_api/api/
account.rs

1use std::time::Duration;
2
3use serde::{Serialize, Deserialize};
4
5use crate::{client::Client, error::Error};
6
7#[derive(Debug, Serialize, Deserialize)]
8#[serde(rename_all = "PascalCase")]
9pub struct Account {
10    pub identifier: String,
11    #[serde(skip_serializing_if = "Option::is_none")]
12    pub nick: Option<String>,
13    #[serde(skip_serializing_if = "Option::is_none")]
14    pub face_url: Option<String>
15}
16
17
18#[derive(Debug, Serialize, Deserialize)]
19#[serde(rename_all = "PascalCase")]
20pub struct Accounts {
21    pub accounts: Vec<String>
22}
23impl From<Vec<String>> for Accounts {
24    fn from(source: Vec<String>) -> Self {
25        Self {accounts: source}
26    }
27}
28
29#[derive(Debug, Deserialize)]
30#[serde(rename_all = "PascalCase")]
31pub struct AccountsResp {
32    fail_accounts: Vec<String>
33}
34
35#[derive(Debug, Serialize, Deserialize)]
36struct UserIdItem {
37    #[serde(rename = "UserID")]
38    user_id: String
39}
40#[derive(Debug, Serialize, Deserialize)]
41#[serde(rename_all = "PascalCase")]
42pub struct DeleteAccounts {
43    delete_item: Vec<UserIdItem>
44}
45impl From<Vec<String>> for DeleteAccounts {
46    fn from(source: Vec<String>) -> Self {
47        let delete_item = source.into_iter()
48            .map(|user_id| UserIdItem{user_id})
49            .collect();
50        Self {delete_item}
51    }
52}
53
54#[derive(Debug, Deserialize)]
55#[serde(rename_all = "PascalCase")]
56pub struct DeleteRespItem {
57    result_code: u32,
58    result_info: String,
59    #[serde(rename = "UserID")]
60    user_id: String
61}
62
63#[derive(Debug, Deserialize)]
64pub struct DeleteResp {
65    #[serde(rename = "ResultItem")]
66    items: Vec<DeleteRespItem>
67}
68
69#[derive(Debug, Serialize, Deserialize)]
70pub struct CheckUsers {
71    #[serde(rename = "CheckItem")]
72    user_item: Vec<UserIdItem>
73}
74impl From<Vec<String>> for CheckUsers {
75    fn from(source: Vec<String>) -> Self {
76        let user_item = source.into_iter()
77            .map(|user_id| UserIdItem{user_id})
78            .collect();
79        Self {user_item}
80    }
81}
82#[derive(Debug, Deserialize)]
83#[serde(rename_all = "PascalCase")]
84pub struct CheckRespItem {
85    result_code: u32,
86    result_info: String,
87    #[serde(rename = "UserID")]
88    user_id: String,
89    account_status: String
90}
91
92#[derive(Debug, Deserialize)]
93pub struct CheckResp {
94    #[serde(rename = "ResultItem")]
95    items: Vec<CheckRespItem>
96}
97
98#[derive(Debug, Serialize, Deserialize)]
99#[serde(rename_all = "PascalCase")]
100pub struct Kick {
101    identifier: String  
102}
103
104impl From<String> for Kick {
105    fn from(source: String) -> Self {
106        Kick {identifier: source}
107    }
108}
109
110#[derive(Debug, Serialize, Deserialize)]
111pub struct OnlineStatus {
112    #[serde(rename = "IsNeedDetail")]
113    need_detail: u32,
114    #[serde(rename = "To_Account")]
115    to_account: Vec<String>
116}
117
118impl OnlineStatus {
119    pub fn new(need_detail: bool, accounts: Vec<String>) -> Self {
120        Self {need_detail: if need_detail {1} else {0}, to_account: accounts}
121    }
122}
123
124#[derive(Debug, Deserialize)]
125#[serde(rename_all = "PascalCase")]
126pub struct OnlineDetail {
127    platform: String,
128    status: String
129}
130
131#[derive(Debug, Deserialize)]
132#[serde(rename_all = "PascalCase")]
133pub struct OnlineState {
134    #[serde(rename = "To_Account")]
135    account: String,
136    status: String,
137    detail: Option<OnlineDetail>
138}
139
140#[derive(Debug, Deserialize)]
141pub struct QueryError {
142    #[serde(rename = "To_Account")]
143    account: String,
144    #[serde(rename = "ErrorCode")]
145    code: u32
146}
147
148#[derive(Debug, Deserialize)]
149pub struct QueryResp {
150    #[serde(rename = "QueryResult")]
151    result: Vec<OnlineState>,
152    #[serde(rename = "ErrorList")]
153    errors: Vec<QueryError>
154}
155
156pub struct AccountApi<'a> {
157    inner: &'a Client
158}
159
160impl<'a> AccountApi<'a> {
161    define_api!(import, "/v4/im_open_login_svc/account_import", Account, ());
162    define_api!(multi_import, "/v4/im_open_login_svc/multiaccount_import",Accounts, AccountsResp);
163    define_api!(delete, "/v4/im_open_login_svc/account_delete", DeleteAccounts, DeleteResp);
164    define_api!(check, "/v4/im_open_login_svc/account_check", CheckUsers, CheckResp);
165    define_api!(kick, "/v4/im_open_login_svc/kick", Kick, ());
166    define_api!(query_online_status, "/v4/openim/query_online_status", OnlineStatus, QueryResp);
167
168    pub fn gen_sign(&self, user_id: &str, expire: Duration) -> Result<String, Error> {
169        super::usersig::gen_usersig(
170            self.inner.sdkappid, 
171            self.inner.key.as_str(),
172            user_id, 
173            expire
174        )
175    }
176
177    pub fn new(client: &'a Client) -> Self {
178        AccountApi{inner: client}
179    }
180}