osentities 2.0.0

Shared library for Pica
Documentation
use super::{PicaError, DEFAULT_AUDIENCE, DEFAULT_ISSUER};
use crate::InternalError;
use chrono::Utc;
use jsonwebtoken::{EncodingKey, Header};
use serde::{Deserialize, Serialize};

#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq, Hash, Default)]
#[serde(rename_all = "camelCase")]
pub struct Claims {
    #[serde(rename = "_id")]
    pub id: String,
    pub email: String,
    pub username: String,
    pub user_key: String,
    pub first_name: String,
    pub last_name: String,
    pub buildable_id: String,
    pub container_id: String,
    pub pointers: Vec<String>,
    pub is_buildable_core: bool,
    pub iat: i64,
    pub exp: i64,
    pub aud: String,
    pub iss: String,
}

impl Claims {
    pub fn from_secret(secret: &str) -> Result<String, PicaError> {
        let now = Utc::now();

        let header = Header::default();
        let claims = Claims {
            is_buildable_core: true,
            iat: now.timestamp(),
            exp: now.timestamp() + 60,
            aud: DEFAULT_AUDIENCE.to_string(),
            iss: DEFAULT_ISSUER.to_string(),
            ..Default::default()
        };
        let key = EncodingKey::from_secret(secret.as_bytes());

        jsonwebtoken::encode(&header, &claims, &key).map_err(|e| {
            tracing::error!("Failed to encode token: {e}");
            InternalError::invalid_argument("Failed to encode token", None)
        })
    }
}