sylvia_iot_broker/models/
application.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 Application {
12 pub application_id: String,
13 pub code: String,
14 pub unit_id: String,
15 pub unit_code: String,
16 pub created_at: DateTime<Utc>,
17 pub modified_at: DateTime<Utc>,
18 pub host_uri: String,
19 pub name: String,
20 pub info: Map<String, Value>,
21}
22
23pub enum SortKey {
25 CreatedAt,
26 ModifiedAt,
27 Code,
28 Name,
29}
30
31pub struct SortCond {
33 pub key: SortKey,
34 pub asc: bool,
35}
36
37pub struct ListOptions<'a> {
39 pub cond: &'a ListQueryCond<'a>,
41 pub offset: Option<u64>,
43 pub limit: Option<u64>,
45 pub sort: Option<&'a [SortCond]>,
47 pub cursor_max: Option<u64>,
51}
52
53#[derive(Default)]
55pub struct QueryCond<'a> {
56 pub unit_id: Option<&'a str>,
57 pub application_id: Option<&'a str>,
58 pub code: Option<&'a str>,
59}
60
61#[derive(Default)]
63pub struct ListQueryCond<'a> {
64 pub unit_id: Option<&'a str>,
66 pub application_id: Option<&'a str>,
68 pub code: 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 application_id: &'a str,
80}
81
82#[derive(Default)]
84pub struct Updates<'a> {
85 pub modified_at: Option<DateTime<Utc>>,
86 pub host_uri: Option<&'a str>,
87 pub name: Option<&'a str>,
88 pub info: Option<&'a Map<String, Value>>,
89}
90
91#[async_trait]
93pub trait ApplicationModel: Sync {
94 async fn init(&self) -> Result<(), Box<dyn StdError>>;
96
97 async fn count(&self, cond: &ListQueryCond) -> Result<u64, Box<dyn StdError>>;
101
102 async fn list(
110 &self,
111 opts: &ListOptions,
112 cursor: Option<Box<dyn Cursor>>,
113 ) -> Result<(Vec<Application>, Option<Box<dyn Cursor>>), Box<dyn StdError>>;
114
115 async fn get(&self, cond: &QueryCond) -> Result<Option<Application>, Box<dyn StdError>>;
117
118 async fn add(&self, application: &Application) -> Result<(), Box<dyn StdError>>;
120
121 async fn del(&self, cond: &QueryCond) -> Result<(), Box<dyn StdError>>;
123
124 async fn update(
126 &self,
127 cond: &UpdateQueryCond,
128 updates: &Updates,
129 ) -> Result<(), Box<dyn StdError>>;
130}
131
132#[async_trait]
137pub trait Cursor: Send {
138 async fn try_next(&mut self) -> Result<Option<Application>, Box<dyn StdError>>;
139
140 fn offset(&self) -> u64;
141}