1use crate::client::Auth;
2use crate::client::Client;
3use crate::httpc::Httpc;
4use anyhow::{anyhow, Result};
5use serde::Deserialize;
6use serde_json::json;
7
8pub struct Admin<'a> {
9 pub base_url: &'a str,
10}
11
12#[derive(Debug, Clone, Deserialize)]
13struct AuthSuccessResponse {
14 token: String,
15}
16
17impl<'a> Admin<'a> {
18 pub fn auth_with_password(&self, identifier: &str, secret: &str) -> Result<Client<Auth>> {
19 let url = format!("{}/api/admins/auth-with-password", self.base_url);
20 let credentials = json!({
21 "identity": identifier,
22 "password": secret,
23 });
24 let client = Client::new(self.base_url);
25 match Httpc::post(&client, &url, credentials.to_string()) {
26 Ok(response) => {
27 let raw_response = response.into_json::<AuthSuccessResponse>();
28 match raw_response {
29 Ok(AuthSuccessResponse { token }) => Ok(Client {
30 base_url: self.base_url.to_string(),
31 state: Auth,
32 auth_token: Some(token),
33 }),
34 Err(e) => Err(anyhow!("{}", e)),
35 }
36 }
37 Err(e) => Err(anyhow!("{}", e)),
38 }
39 }
40
41 pub fn new(base_url: &'a str) -> Admin<'a> {
42 Admin { base_url }
43 }
44}