1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
use reqwest::StatusCode;

use crate::api::{
    v2::token::models::*,
    context::BotXApiContext,
    result::*
};

/// ### /api/v2/botx/bots/:bot_id/token
/// Запрос токена авторизации (Bearer)
// Требуем write lock чтобы параллельно не шли запросы с инвалидной авторизацией
pub async fn token(context: &mut BotXApiContext) -> BotXApiResult<TokenResponse, TokenExpressError> {
    let url = (context.api.token_api_builder)(&context.cts_url, &context.bot_id, &context.secret_key);

    log::info!("Token v2 request url:[{url}]");

    let raw_response = context.client.get(url)
        .send()
        .await
        .map_err::<BotXApiError<TokenExpressError>, _>(|e| {
            log::error!("Token v2 request error:[{e:#?}]");
            e.into()
        })?;

    let status_code = raw_response.status();
    let response_body = raw_response.text()
        .await
        .map_err::<BotXApiError<TokenExpressError>, _>(|e| {
            log::error!("Token v2 read response error:[{e:#?}]");
            e.into()
        })?;

    if status_code == StatusCode::UNAUTHORIZED {
        log::debug!("Token v2 request Unauthorized: {response_body}");
        return Err(BotXApiError::Unauthorized);
    }

    let response = serde_json::from_str::<ExpressResult<TokenResponse, TokenExpressError>>(&*response_body)
        .map_err::<BotXApiError<TokenExpressError>, _>(|e| {
            log::error!("Token v2 response body deserialization error, error:[{e:#?}] response:[{response_body}]");
            e.into()
        })?;

    if !response.is_ok() {
        log::error!("Token v2 response status:[{status_code}] raw body:[{response_body}] deserialized body:[{response:#?}]");
    } else {
        log::debug!("Token v2 response status:[{status_code}] raw body:[{response_body}] deserialized body:[{response:#?}]");
    }

    response.into()
}