sylvia_iot_broker/models/
unit.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 Unit {
12 pub unit_id: String,
13 pub code: String,
14 pub created_at: DateTime<Utc>,
15 pub modified_at: DateTime<Utc>,
16 pub owner_id: String,
17 pub member_ids: Vec<String>,
18 pub name: String,
19 pub info: Map<String, Value>,
20}
21
22pub enum SortKey {
24 CreatedAt,
25 ModifiedAt,
26 Code,
27 Name,
28}
29
30pub struct SortCond {
32 pub key: SortKey,
33 pub asc: bool,
34}
35
36pub struct ListOptions<'a> {
38 pub cond: &'a ListQueryCond<'a>,
40 pub offset: Option<u64>,
42 pub limit: Option<u64>,
44 pub sort: Option<&'a [SortCond]>,
46 pub cursor_max: Option<u64>,
50}
51
52#[derive(Default)]
54pub struct QueryCond<'a> {
55 pub unit_id: Option<&'a str>,
56 pub code: Option<&'a str>,
57 pub owner_id: Option<&'a str>,
58 pub member_id: Option<&'a str>,
59}
60
61#[derive(Default)]
63pub struct ListQueryCond<'a> {
64 pub owner_id: Option<&'a str>,
66 pub member_id: Option<&'a str>,
68 pub unit_id: Option<&'a str>,
70 pub code_contains: Option<&'a str>,
72 pub name_contains: Option<&'a str>,
74}
75
76pub struct UpdateQueryCond<'a> {
78 pub unit_id: &'a str,
80}
81
82#[derive(Default)]
84pub struct Updates<'a> {
85 pub modified_at: Option<DateTime<Utc>>,
86 pub owner_id: Option<&'a str>,
87 pub member_ids: Option<&'a Vec<String>>,
88 pub name: Option<&'a str>,
89 pub info: Option<&'a Map<String, Value>>,
90}
91
92#[async_trait]
94pub trait UnitModel: Sync {
95 async fn init(&self) -> Result<(), Box<dyn StdError>>;
97
98 async fn count(&self, cond: &ListQueryCond) -> Result<u64, Box<dyn StdError>>;
102
103 async fn list(
111 &self,
112 opts: &ListOptions,
113 cursor: Option<Box<dyn Cursor>>,
114 ) -> Result<(Vec<Unit>, Option<Box<dyn Cursor>>), Box<dyn StdError>>;
115
116 async fn get(&self, cond: &QueryCond) -> Result<Option<Unit>, Box<dyn StdError>>;
118
119 async fn add(&self, unit: &Unit) -> Result<(), Box<dyn StdError>>;
121
122 async fn del(&self, cond: &QueryCond) -> Result<(), Box<dyn StdError>>;
124
125 async fn update(
127 &self,
128 cond: &UpdateQueryCond,
129 updates: &Updates,
130 ) -> Result<(), Box<dyn StdError>>;
131}
132
133#[async_trait]
138pub trait Cursor: Send {
139 async fn try_next(&mut self) -> Result<Option<Unit>, Box<dyn StdError>>;
140
141 fn offset(&self) -> u64;
142}