use super::identity::SidecarId;
use crate::internal::domain::LocalUserId;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use time::{Duration, OffsetDateTime};
use uuid::Uuid;
#[derive(Clone, Debug, Eq, PartialEq, Hash, Serialize, Deserialize, JsonSchema)]
pub struct PairingId(String);
impl PairingId {
#[must_use]
pub fn new() -> Self {
Self(format!("pairing-{}", Uuid::now_v7()))
}
#[must_use]
pub fn as_str(&self) -> &str {
&self.0
}
}
impl Default for PairingId {
fn default() -> Self {
Self::new()
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum PairingStatus {
Pending,
Active,
Revoked,
Expired,
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct PairingRecord {
pub pairing_id: PairingId,
pub remote_instance_id: String,
pub sidecar_id: SidecarId,
pub user_id: LocalUserId,
#[schemars(with = "String")]
#[serde(with = "time::serde::rfc3339")]
pub created_at: OffsetDateTime,
#[schemars(with = "String")]
#[serde(with = "time::serde::rfc3339")]
pub expires_at: OffsetDateTime,
pub status: PairingStatus,
}
#[must_use]
pub fn create_pairing(
remote_instance_id: impl Into<String>,
sidecar_id: SidecarId,
user_id: LocalUserId,
ttl_seconds: i64,
) -> PairingRecord {
let created_at = OffsetDateTime::now_utc();
PairingRecord {
pairing_id: PairingId::new(),
remote_instance_id: remote_instance_id.into(),
sidecar_id,
user_id,
created_at,
expires_at: created_at + Duration::seconds(ttl_seconds.max(1)),
status: PairingStatus::Active,
}
}