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
use jsonwebtoken::{encode, EncodingKey, Header};
use serde::{Deserialize, Serialize};

use crate::{errors::Error, utils::Snowflake};

pub fn generate_token(id: &Snowflake, email: String, jwt_key: &str) -> String {
    let claims = Claims::new(&email, id);

    build_token(&claims, jwt_key).unwrap()
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Claims {
    pub exp: i64,
    pub iat: i64,
    pub email: String,
    pub id: String,
}

impl Claims {
    pub fn new(user: &str, id: &Snowflake) -> Self {
        let unix = chrono::Utc::now().timestamp();
        Self {
            exp: unix + (60 * 60 * 24),
            id: id.to_string(),
            iat: unix,
            email: user.to_string(),
        }
    }
}

pub fn build_token(claims: &Claims, jwt_key: &str) -> Result<String, jsonwebtoken::errors::Error> {
    encode(
        &Header::default(),
        claims,
        &EncodingKey::from_secret(jwt_key.as_bytes()),
    )
}

/*pub fn decode_token(token: &str) -> Result<TokenData<Claims>, Error> {
    let mut validation = Validation::new(Algorithm::HS256);
    validation.sub = Some("quartzauth".to_string());
    decode(token, &DecodingKey::from_secret(JWT_SECRET), &validation)
}*/