use rustlavel::prelude::*;
#[derive(Model, Default, Debug, Clone)]
#[model(table = "user_tokens")]
pub struct UserToken {
#[model(primary_key, generated)]
pub id: i64,
pub user_id: i64,
pub purpose: String,
pub token_hash: String,
pub payload: Option<String>,
pub expires_at: String,
pub used_at: Option<String>,
}
pub const ACTIVATION: &str = "activation";
pub const PASSWORD_RESET: &str = "password_reset";
pub const EMAIL_CHANGE: &str = "email_change";
impl UserToken {
pub fn usable(purpose: &str, token: &str, now: &str) -> QueryBuilder {
UserToken::query()
.filter("purpose", purpose)
.filter("token_hash", hash_token(token))
.filter_null("used_at")
.filter_op("expires_at", ">", now)
}
}
pub fn hash_token(token: &str) -> String {
use rustlavel::auth::hashing::sha256_hex;
sha256_hex(token.as_bytes())
}