Files
kvitt/server/crates/kvitt-server/src/wire/device.rs
T
jacobh2 8c607153c0 M12e: contract pass (pair invite kind, admin name in invite links, sync failed flag, rejection actor, device version name, template id, update check result, untouched accounts, D-027 re-stamp, PushEvent in :core:model, snackbar hosts)
Server: E-3 invite_kind; E-12 link ?from=<admin name>, E-4 passes it into kvitt://invite;
X-Kvitt-App-Version-Name stored in devices.app_version_name (migration 0003, schema 3);
OpenAPI and examples follow. Phone: :core:model, :core:fakes, :data, features and :app
updated together; goldens re-recorded for S-20 (version name) and new S-1/S-22 states.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TQd3pEP9UeN2uifbHknQ7B
2026-10-18 15:00:56 +02:00

44 lines
1.5 KiB
Rust

//! Device objects (SPEC §14.3.3, §14.3.4 E-15, E-17).
use serde::{Deserialize, Serialize};
use utoipa::ToSchema;
use uuid::Uuid;
use super::{TimestampSchema, UuidSchema};
/// Only in `/me`, `/devices` and `/invites/accept`.
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema)]
pub struct Device {
#[schema(value_type = UuidSchema)]
pub id: Uuid,
#[schema(value_type = UuidSchema)]
pub user_id: Uuid,
pub name: String,
#[schema(schema_with = super::nullable_int, required = true)]
pub app_version_code: Option<i64>,
/// The app's `versionName` from `X-Kvitt-App-Version-Name` (schema 3); null until a request carried it.
#[schema(required = true)]
pub app_version_name: Option<String>,
#[schema(value_type = TimestampSchema)]
pub created_at: String,
#[schema(value_type = TimestampSchema)]
pub last_seen_at: String,
#[schema(value_type = Option<TimestampSchema>, required = true)]
pub revoked_at: Option<String>,
pub is_current: bool,
}
/// E-15 `GET /devices`.
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema)]
pub struct DeviceList {
pub devices: Vec<Device>,
}
/// E-17 `PUT /devices/current/push-token`: the key is required, its value nullable (null clears).
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema)]
pub struct PushTokenRequest {
#[serde(deserialize_with = "super::required_nullable")]
#[schema(required = true)]
pub fcm_token: Option<String>,
}