feat(server): complete domain service modules (keys, channels, users, blobs, devices, p2p, account)
This commit is contained in:
76
crates/quicproquo-server/src/domain/devices.rs
Normal file
76
crates/quicproquo-server/src/domain/devices.rs
Normal file
@@ -0,0 +1,76 @@
|
||||
//! Device registry domain logic — register, list, revoke devices.
|
||||
|
||||
use std::sync::Arc;
|
||||
|
||||
use crate::storage::Store;
|
||||
|
||||
use super::types::*;
|
||||
|
||||
const MAX_DEVICES_PER_IDENTITY: usize = 5;
|
||||
|
||||
/// Domain service for multi-device management.
|
||||
pub struct DeviceService {
|
||||
pub store: Arc<dyn Store>,
|
||||
}
|
||||
|
||||
impl DeviceService {
|
||||
pub fn register_device(
|
||||
&self,
|
||||
req: RegisterDeviceReq,
|
||||
caller_identity_key: &[u8],
|
||||
) -> Result<RegisterDeviceResp, DomainError> {
|
||||
if req.device_id.is_empty() {
|
||||
return Err(DomainError::BadParams(
|
||||
"device_id must not be empty".into(),
|
||||
));
|
||||
}
|
||||
|
||||
let count = self.store.device_count(caller_identity_key)?;
|
||||
if count >= MAX_DEVICES_PER_IDENTITY {
|
||||
return Err(DomainError::DeviceLimit(MAX_DEVICES_PER_IDENTITY));
|
||||
}
|
||||
|
||||
let success =
|
||||
self.store
|
||||
.register_device(caller_identity_key, &req.device_id, &req.device_name)?;
|
||||
|
||||
Ok(RegisterDeviceResp { success })
|
||||
}
|
||||
|
||||
pub fn list_devices(
|
||||
&self,
|
||||
caller_identity_key: &[u8],
|
||||
) -> Result<ListDevicesResp, DomainError> {
|
||||
let raw = self.store.list_devices(caller_identity_key)?;
|
||||
let devices = raw
|
||||
.into_iter()
|
||||
.map(|(device_id, device_name, registered_at)| DeviceInfo {
|
||||
device_id,
|
||||
device_name,
|
||||
registered_at,
|
||||
})
|
||||
.collect();
|
||||
Ok(ListDevicesResp { devices })
|
||||
}
|
||||
|
||||
pub fn revoke_device(
|
||||
&self,
|
||||
req: RevokeDeviceReq,
|
||||
caller_identity_key: &[u8],
|
||||
) -> Result<RevokeDeviceResp, DomainError> {
|
||||
if req.device_id.is_empty() {
|
||||
return Err(DomainError::BadParams(
|
||||
"device_id must not be empty".into(),
|
||||
));
|
||||
}
|
||||
|
||||
let success = self
|
||||
.store
|
||||
.revoke_device(caller_identity_key, &req.device_id)?;
|
||||
if !success {
|
||||
return Err(DomainError::DeviceNotFound);
|
||||
}
|
||||
|
||||
Ok(RevokeDeviceResp { success })
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user