pub mod types;
use crate::types::SurrealJWTClaims;
use base64::{Engine, engine::general_purpose::URL_SAFE_NO_PAD};
use serde::Deserialize;
use serde::de::DeserializeOwned;
use serde::{Deserializer, Serialize, de::Error};
pub fn decode_payload_insecurely<T>(
token: &str,
) -> Result<SurrealJWTClaims<T>, Box<dyn std::error::Error>>
where
T: DeserializeOwned + Serialize,
{
let mut parts = token.split('.');
let payload_b64 = parts.nth(1).ok_or("Invalid JWT format: missing payload")?;
let decoded_payload_bytes = URL_SAFE_NO_PAD.decode(payload_b64)?;
let claims: SurrealJWTClaims<T> = serde_json::from_slice(&decoded_payload_bytes)?;
Ok(claims)
}
pub mod record_id_full {
use super::*;
use std::str::FromStr;
pub fn serialize<S>(id: &surrealdb::RecordId, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
serializer.serialize_str(&id.to_string())
}
pub fn serialize_opt<S>(
id: &Option<surrealdb::RecordId>,
serializer: S,
) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
match id {
Some(record_id) => serializer.serialize_str(&record_id.to_string()),
None => serializer.serialize_none(),
}
}
pub fn deserialize<'de, D>(deserializer: D) -> Result<surrealdb::RecordId, D::Error>
where
D: Deserializer<'de>,
{
let s = String::deserialize(deserializer)?;
surrealdb::RecordId::from_str(&s).map_err(D::Error::custom)
}
pub fn deserialize_opt<'de, D>(deserializer: D) -> Result<Option<surrealdb::RecordId>, D::Error>
where
D: Deserializer<'de>,
{
let opt = Option::<String>::deserialize(deserializer)?;
match opt {
Some(s) => {
let record_id = surrealdb::RecordId::from_str(&s).map_err(D::Error::custom)?;
Ok(Some(record_id))
}
None => Ok(None),
}
}
}
pub mod record_id_naked {
pub fn serialize<S>(id: &surrealdb::RecordId, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
let naked_id = id.key().to_string();
serializer.serialize_str(&naked_id)
}
pub fn serialize_opt<S>(
id: &Option<surrealdb::RecordId>,
serializer: S,
) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
match id {
Some(record_id) => {
let naked_id = record_id.key().to_string();
serializer.serialize_str(&naked_id)
}
None => serializer.serialize_none(),
}
}
}