sylvia_iot_broker/models/
device.rs1use std::error::Error as StdError;
4
5use async_trait::async_trait;
6use chrono::{DateTime, Utc};
7use serde_json::{Map, Value};
8
9#[derive(Debug, PartialEq)]
11pub struct Device {
12 pub device_id: String,
13 pub unit_id: String, pub unit_code: Option<String>, pub network_id: String,
16 pub network_code: String,
17 pub network_addr: String,
18 pub created_at: DateTime<Utc>,
19 pub modified_at: DateTime<Utc>,
20 pub profile: String,
21 pub name: String,
22 pub info: Map<String, Value>,
23}
24
25#[derive(Clone)]
27pub struct DeviceCacheItem {
28 pub device_id: String,
29 pub profile: String,
30}
31
32pub enum SortKey {
34 CreatedAt,
35 ModifiedAt,
36 NetworkCode,
37 NetworkAddr,
38 Profile,
39 Name,
40}
41
42pub struct SortCond {
44 pub key: SortKey,
45 pub asc: bool,
46}
47
48pub struct ListOptions<'a> {
50 pub cond: &'a ListQueryCond<'a>,
52 pub offset: Option<u64>,
54 pub limit: Option<u64>,
56 pub sort: Option<&'a [SortCond]>,
58 pub cursor_max: Option<u64>,
62}
63
64#[derive(Default)]
66pub struct QueryCond<'a> {
67 pub unit_id: Option<&'a str>,
68 pub device_id: Option<&'a str>,
69 pub network_id: Option<&'a str>,
70 pub network_addrs: Option<&'a Vec<&'a str>>,
71 pub device: Option<QueryOneCond<'a>>,
72}
73
74#[derive(Clone)]
76pub struct QueryOneCond<'a> {
77 pub unit_code: Option<&'a str>,
78 pub network_code: &'a str,
79 pub network_addr: &'a str,
80}
81
82pub enum GetCacheQueryCond<'a> {
84 CodeAddr(QueryOneCond<'a>),
85}
86
87pub struct DelCacheQueryCond<'a> {
89 pub unit_code: &'a str,
91 pub network_code: Option<&'a str>,
93 pub network_addr: Option<&'a str>,
95}
96
97#[derive(Default)]
99pub struct ListQueryCond<'a> {
100 pub unit_id: Option<&'a str>,
102 pub device_id: Option<&'a str>,
104 pub network_id: Option<&'a str>,
106 pub network_code: Option<&'a str>,
108 pub network_addr: Option<&'a str>,
111 pub network_addrs: Option<&'a Vec<&'a str>>,
113 pub profile: Option<&'a str>,
115 pub name_contains: Option<&'a str>,
117}
118
119pub struct UpdateQueryCond<'a> {
121 pub device_id: &'a str,
123}
124
125#[derive(Default)]
127pub struct Updates<'a> {
128 pub network: Option<(&'a str, &'a str)>,
130 pub network_addr: Option<&'a str>,
131 pub modified_at: Option<DateTime<Utc>>,
132 pub profile: Option<&'a str>,
133 pub name: Option<&'a str>,
134 pub info: Option<&'a Map<String, Value>>,
135}
136
137#[async_trait]
139pub trait DeviceModel: Sync {
140 async fn init(&self) -> Result<(), Box<dyn StdError>>;
142
143 async fn count(&self, cond: &ListQueryCond) -> Result<u64, Box<dyn StdError>>;
147
148 async fn list(
156 &self,
157 opts: &ListOptions,
158 cursor: Option<Box<dyn Cursor>>,
159 ) -> Result<(Vec<Device>, Option<Box<dyn Cursor>>), Box<dyn StdError>>;
160
161 async fn get(&self, cond: &QueryCond) -> Result<Option<Device>, Box<dyn StdError>>;
163
164 async fn add(&self, device: &Device) -> Result<(), Box<dyn StdError>>;
166
167 async fn add_bulk(&self, devices: &Vec<Device>) -> Result<(), Box<dyn StdError>>;
169
170 async fn del(&self, cond: &QueryCond) -> Result<(), Box<dyn StdError>>;
172
173 async fn update(
175 &self,
176 cond: &UpdateQueryCond,
177 updates: &Updates,
178 ) -> Result<(), Box<dyn StdError>>;
179}
180
181#[async_trait]
186pub trait Cursor: Send {
187 async fn try_next(&mut self) -> Result<Option<Device>, Box<dyn StdError>>;
188
189 fn offset(&self) -> u64;
190}
191
192#[async_trait]
194pub trait DeviceCache: Sync {
195 async fn clear(&self) -> Result<(), Box<dyn StdError>>;
197
198 async fn get(
200 &self,
201 cond: &GetCacheQueryCond,
202 ) -> Result<Option<DeviceCacheItem>, Box<dyn StdError>>;
203
204 async fn set(
206 &self,
207 cond: &GetCacheQueryCond,
208 value: Option<&DeviceCacheItem>,
209 ) -> Result<(), Box<dyn StdError>>;
210
211 async fn del(&self, cond: &DelCacheQueryCond) -> Result<(), Box<dyn StdError>>;
213}