use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RegisterDeviceRequest {
pub email: String,
pub password: String,
#[serde(default)]
pub device_name: String,
#[serde(default)]
pub platform: String,
#[serde(default)]
pub machine_id: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RegisterDeviceResponse {
pub device_id: String,
pub token: String,
pub tenant_id: String,
pub user_id: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SignupRequest {
pub email: String,
pub password: String,
#[serde(default)]
pub display_name: String,
#[serde(default)]
pub device_name: String,
#[serde(default)]
pub platform: String,
#[serde(default)]
pub machine_id: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SignupResponse {
pub device_id: String,
pub token: String,
pub tenant_id: String,
pub user_id: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MeResponse {
pub tenant_id: String,
pub user_id: String,
pub device_id: String,
pub is_admin: bool,
pub default_access: String,
pub read_only: bool,
pub progress_sync_denied: bool,
#[serde(default)]
pub label: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DeviceDto {
pub id: String,
pub name: String,
pub platform: String,
pub default_access: String,
pub read_only: bool,
pub progress_sync_denied: bool,
pub revoked: bool,
pub created_at: i64,
pub last_seen_at: Option<i64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RevokeDeviceResponse {
pub revoked: String,
}
#[cfg(test)]
mod tests {
use super::*;
use serde_json::json;
#[test]
fn me_response_round_trips() {
let me = MeResponse {
tenant_id: "t".into(),
user_id: "u".into(),
device_id: "d".into(),
is_admin: false,
default_access: "read_write".into(),
read_only: false,
progress_sync_denied: false,
label: Some("Basic".into()),
};
let value = serde_json::to_value(&me).unwrap();
assert_eq!(value["is_admin"], json!(false));
assert_eq!(value["default_access"], "read_write");
assert_eq!(value["label"], "Basic");
let back: MeResponse = serde_json::from_value(value).unwrap();
assert!(!back.is_admin);
assert_eq!(back.label.as_deref(), Some("Basic"));
}
#[test]
fn me_response_without_a_label_deserialises() {
let plain: MeResponse = serde_json::from_value(json!({
"tenant_id": "t", "user_id": "u", "device_id": "d", "is_admin": true,
"default_access": "read", "read_only": true, "progress_sync_denied": false
}))
.unwrap();
assert_eq!(plain.label, None);
assert!(plain.is_admin);
}
}