use crate::domain::crypto::{PublicKey, Signature};
use crate::domain::keys::{OneTimePreKey, SignedPreKey};
use time::OffsetDateTime;
use uuid::Uuid;
#[derive(Debug, sqlx::FromRow)]
pub struct IdentityKeyRecord {
#[sqlx(rename = "user_id")]
pub(crate) _user_id: Uuid,
#[sqlx(rename = "identity_key")]
pub(crate) key: Vec<u8>,
pub(crate) registration_id: i32,
}
impl TryFrom<IdentityKeyRecord> for PublicKey {
type Error = String;
fn try_from(record: IdentityKeyRecord) -> Result<Self, Self::Error> {
Self::try_from_bytes(&record.key)
}
}
#[derive(Debug, sqlx::FromRow)]
pub struct SignedPreKeyRecord {
pub(crate) id: i32,
#[sqlx(rename = "user_id")]
pub(crate) _user_id: Uuid,
pub(crate) public_key: Vec<u8>,
pub(crate) signature: Vec<u8>,
#[sqlx(rename = "created_at")]
pub(crate) _created_at: Option<OffsetDateTime>,
}
impl TryFrom<SignedPreKeyRecord> for SignedPreKey {
type Error = String;
fn try_from(record: SignedPreKeyRecord) -> Result<Self, Self::Error> {
let public_key = PublicKey::try_from(record.public_key)?;
let signature = Signature::try_from(record.signature)?;
Ok(Self { key_id: record.id, public_key, signature })
}
}
#[derive(Debug, sqlx::FromRow)]
pub struct OneTimePreKeyRecord {
pub(crate) id: i32,
#[sqlx(rename = "user_id")]
pub(crate) _user_id: Uuid,
pub(crate) public_key: Vec<u8>,
#[sqlx(rename = "created_at")]
pub(crate) _created_at: Option<OffsetDateTime>,
}
impl TryFrom<OneTimePreKeyRecord> for OneTimePreKey {
type Error = String;
fn try_from(record: OneTimePreKeyRecord) -> Result<Self, Self::Error> {
let public_key = PublicKey::try_from(record.public_key)?;
Ok(Self { key_id: record.id, public_key })
}
}