From acf875ed336ee5cc6272ca5ecac25210c8d1fdda Mon Sep 17 00:00:00 2001 From: Lee Smet Date: Wed, 20 Aug 2025 14:04:08 +0200 Subject: [PATCH] Add basic models Signed-off-by: Lee Smet --- src/lib.rs | 2 ++ src/models.rs | 15 +++++++++++ src/models/actor.rs | 15 +++++++++++ src/models/context.rs | 17 ++++++++++++ src/models/flow.rs | 33 ++++++++++++++++++++++++ src/models/job.rs | 38 +++++++++++++++++++++++++++ src/models/message.rs | 54 +++++++++++++++++++++++++++++++++++++++ src/models/runner.rs | 28 ++++++++++++++++++++ src/models/script_type.rs | 9 +++++++ src/time.rs | 14 ++++++++++ 10 files changed, 225 insertions(+) create mode 100644 src/lib.rs create mode 100644 src/models.rs create mode 100644 src/models/actor.rs create mode 100644 src/models/context.rs create mode 100644 src/models/flow.rs create mode 100644 src/models/job.rs create mode 100644 src/models/message.rs create mode 100644 src/models/runner.rs create mode 100644 src/models/script_type.rs create mode 100644 src/time.rs diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..057f82b --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,2 @@ +pub mod models; +mod time; diff --git a/src/models.rs b/src/models.rs new file mode 100644 index 0000000..6d59bb4 --- /dev/null +++ b/src/models.rs @@ -0,0 +1,15 @@ +mod actor; +mod context; +mod flow; +mod job; +mod message; +mod runner; +mod script_type; + +pub use actor::Actor; +pub use context::Context; +pub use flow::Flow; +pub use job::Job; +pub use message::Message; +pub use runner::Runner; +pub use script_type::ScriptType; diff --git a/src/models/actor.rs b/src/models/actor.rs new file mode 100644 index 0000000..6d5ab09 --- /dev/null +++ b/src/models/actor.rs @@ -0,0 +1,15 @@ +use std::net::IpAddr; + +use serde::{Deserialize, Serialize}; + +use crate::time::Timestamp; + +#[derive(Serialize, Deserialize)] +pub struct Actor { + id: u32, + pubkey: String, + /// IP where the actor is reachable, can be mycelium but that is not mandatory + address: Vec, + created_at: Timestamp, + updated_at: Timestamp, +} diff --git a/src/models/context.rs b/src/models/context.rs new file mode 100644 index 0000000..ae1b236 --- /dev/null +++ b/src/models/context.rs @@ -0,0 +1,17 @@ +use serde::{Deserialize, Serialize}; + +use crate::time::Timestamp; + +#[derive(Serialize, Deserialize)] +pub struct Context { + /// Redis DB to use + id: u32, + /// Actor ids which have admin rights on this context + admins: Vec, + /// Actor ids which can read the context info + readers: Vec, + /// Actor ids which can execute jobs in this context + executors: Vec, + created_at: Timestamp, + upddated_at: Timestamp, +} diff --git a/src/models/flow.rs b/src/models/flow.rs new file mode 100644 index 0000000..b5ad9f2 --- /dev/null +++ b/src/models/flow.rs @@ -0,0 +1,33 @@ +use std::collections::HashMap; + +use serde::{Deserialize, Serialize}; + +use crate::time::Timestamp; + +#[derive(Serialize, Deserialize)] +pub struct Flow { + /// Job Id set tby the actor which created it + id: u32, + /// Actor Id who created this job + caller_id: u32, + /// The context in which this job is executed + context_id: u32, + /// List of jobs which make up the flow + jobs: Vec, + /// Environment variables, passed to every job when executed + env_vars: HashMap, + /// The result of the flow + result: HashMap, + created_at: Timestamp, + updated_at: Timestamp, + status: FlowStatus, +} + +/// The status of a flow +#[derive(Serialize, Deserialize)] +pub enum FlowStatus { + Dispatched, + Started, + Error, + Finished, +} diff --git a/src/models/job.rs b/src/models/job.rs new file mode 100644 index 0000000..b708451 --- /dev/null +++ b/src/models/job.rs @@ -0,0 +1,38 @@ +use std::collections::HashMap; + +use serde::{Deserialize, Serialize}; + +use crate::{models::ScriptType, time::Timestamp}; + +#[derive(Serialize, Deserialize)] +pub struct Job { + /// Job Id, this is given by the actor who created the job + id: u32, + /// Actor ID which created this job + caller_id: u32, + /// Context in which the job is executed + context_id: u32, + script: String, + script_type: ScriptType, + /// Timeout in seconds for this job + timeout: u32, + /// Max amount of times to retry this job + retries: u8, + env_vars: HashMap, + result: HashMap, + prerequisites: Vec, + /// Ids of jobs this job depends on, i.e. this job can't start until those have finished + depends: Vec, + created_at: Timestamp, + updated_at: Timestamp, + status: JobStatus, +} + +#[derive(Serialize, Deserialize)] +pub enum JobStatus { + Dispatched, + WaitingForPrerequisites, + Started, + Error, + Finished, +} diff --git a/src/models/message.rs b/src/models/message.rs new file mode 100644 index 0000000..e4036d0 --- /dev/null +++ b/src/models/message.rs @@ -0,0 +1,54 @@ +use serde::{Deserialize, Serialize}; + +use crate::{ + models::{Job, ScriptType}, + time::Timestamp, +}; + +#[derive(Serialize, Deserialize)] +pub struct Message { + /// Unique ID for the message, set by the caller + id: u32, + /// Id of the actor who sent this message + caller_id: u32, + /// Id of the context in which this message was sent + context_id: u32, + message: String, + message_type: ScriptType, + message_format_type: MessageFormatType, + /// Seconds for the message to arrive at the destination + timeout: u32, + /// Seconds for the receiver to acknowledge receipt of the message + timeout_ack: u32, + /// Seconds for the receiver to send us a reply + timeout_result: u32, + job: Vec, + logs: Vec, + created_at: Timestamp, + updated_at: Timestamp, + status: MessageStatus, +} + +#[derive(Serialize, Deserialize)] +pub enum MessageType { + Job, + Chat, + Mail, +} + +#[derive(Serialize, Deserialize)] +pub enum MessageStatus { + Dispatched, + Acknowledged, + Error, + Processed, +} + +#[derive(Serialize, Deserialize)] +pub enum MessageFormatType { + Html, + Text, + Md, +} + +type Log = String; diff --git a/src/models/runner.rs b/src/models/runner.rs new file mode 100644 index 0000000..47a069c --- /dev/null +++ b/src/models/runner.rs @@ -0,0 +1,28 @@ +use std::net::IpAddr; + +use serde::{Deserialize, Serialize}; + +use crate::time::Timestamp; + +#[derive(Serialize, Deserialize)] +pub struct Runner { + id: u32, + /// Mycelium public key + pubkey: String, + /// Mycelium address + address: IpAddr, + /// Needs to be set by the runner, usually `runner Timestamp { + let now = SystemTime::now(); + // A duration is always positive so this returns an unsigned integer, while a timestamp can + // predate the unix epoch so we must cast to a signed integer. + now.duration_since(UNIX_EPOCH) + .expect("Time moves forward") + .as_secs() as i64 +}