use chrono::Utc;
use serde_json::{Value, json};
use uuid::Uuid;
use super::types::{CredentialStatus, DppAccessCredential, DppCredentialSubject};
const VC_BASE_CONTEXT: &str = "https://www.w3.org/ns/credentials/v2";
fn dpp_terms() -> Value {
json!({
"dpp": "https://schema.odal-node.io/dpp#",
"DppAccessCredential": "dpp:DppAccessCredential",
"name": "dpp:name",
"role": "dpp:role",
"country": "dpp:country",
"product_groups": "dpp:product_groups",
"productCategories": "dpp:productCategories",
})
}
pub struct CredentialBuilder {
issuer_did: String,
subject: DppCredentialSubject,
expiration: chrono::DateTime<Utc>,
status: Option<CredentialStatus>,
}
impl CredentialBuilder {
#[must_use]
pub fn new(issuer_did: String, subject: DppCredentialSubject) -> Self {
Self {
issuer_did,
subject,
expiration: Utc::now() + chrono::Duration::days(365),
status: None,
}
}
#[must_use]
pub fn expires_at(mut self, expiration: chrono::DateTime<Utc>) -> Self {
self.expiration = expiration;
self
}
#[must_use]
pub fn expires_in_days(mut self, days: i64) -> Self {
self.expiration = Utc::now() + chrono::Duration::days(days);
self
}
#[must_use]
pub fn with_status(mut self, status: CredentialStatus) -> Self {
self.status = Some(status);
self
}
#[must_use]
pub fn build(self) -> DppAccessCredential {
DppAccessCredential {
context: vec![json!(VC_BASE_CONTEXT), dpp_terms()],
credential_type: vec!["VerifiableCredential".into(), "DppAccessCredential".into()],
id: format!("urn:uuid:{}", Uuid::now_v7()),
issuer: self.issuer_did,
valid_from: Utc::now(),
valid_until: self.expiration,
credential_subject: self.subject,
credential_status: self.status,
}
}
}