apalis_core/backend/
expose.rs1use crate::{
2 backend::{Backend, BackendExt, TaskSink},
3 task::{Task, status::Status},
4};
5
6const DEFAULT_PAGE_SIZE: u32 = 10;
7pub trait Expose<Args> {}
9
10impl<B, Args> Expose<Args> for B where
11 B: Backend<Args = Args>
12 + Metrics
13 + ListWorkers
14 + ListQueues
15 + ListAllTasks
16 + ListTasks<Args>
17 + TaskSink<Args>
18{
19}
20
21pub trait ListQueues: Backend {
23 fn list_queues(&self) -> impl Future<Output = Result<Vec<QueueInfo>, Self::Error>> + Send;
25}
26
27pub trait ListWorkers: Backend {
29 fn list_workers(&self) -> impl Future<Output = Result<Vec<RunningWorker>, Self::Error>> + Send;
31
32 fn list_all_workers(
34 &self,
35 ) -> impl Future<Output = Result<Vec<RunningWorker>, Self::Error>> + Send;
36}
37pub trait ListTasks<Args>: Backend {
39 #[allow(clippy::type_complexity)]
41 fn list_tasks(
42 &self,
43 filter: &Filter,
44 ) -> impl Future<Output = Result<Vec<Task<Args, Self::Context, Self::IdType>>, Self::Error>> + Send;
45}
46
47pub trait ListAllTasks: BackendExt {
49 #[allow(clippy::type_complexity)]
51 fn list_all_tasks(
52 &self,
53 filter: &Filter,
54 ) -> impl Future<
55 Output = Result<Vec<Task<Self::Compact, Self::Context, Self::IdType>>, Self::Error>,
56 > + Send;
57}
58
59pub trait Metrics: Backend {
61 fn global(&self) -> impl Future<Output = Result<Vec<Statistic>, Self::Error>> + Send;
63
64 fn fetch_by_queue(&self) -> impl Future<Output = Result<Vec<Statistic>, Self::Error>> + Send;
66}
67
68#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
70#[derive(Debug, Clone)]
71pub struct QueueInfo {
72 pub name: String,
74 pub stats: Vec<Statistic>,
76 pub workers: Vec<String>,
78 pub activity: Vec<usize>,
80}
81
82#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
84#[derive(Debug, Clone)]
85pub struct RunningWorker {
86 pub id: String,
88 pub queue: String,
90 pub backend: String,
92 pub started_at: u64,
94 pub last_heartbeat: u64,
96 pub layers: String,
98}
99
100#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
101#[derive(Debug, Clone)]
102pub struct Filter {
104 #[cfg_attr(feature = "serde", serde(default))]
106 pub status: Option<Status>,
107 #[cfg_attr(feature = "serde", serde(default = "default_page"))]
108 pub page: u32,
110 #[cfg_attr(feature = "serde", serde(default))]
112 pub page_size: Option<u32>,
113}
114
115impl Filter {
116 #[must_use]
118 pub fn offset(&self) -> u32 {
119 (self.page - 1) * self.page_size.unwrap_or(DEFAULT_PAGE_SIZE)
120 }
121
122 #[must_use]
124 pub fn limit(&self) -> u32 {
125 self.page_size.unwrap_or(DEFAULT_PAGE_SIZE)
126 }
127}
128
129#[cfg(feature = "serde")]
130fn default_page() -> u32 {
131 1
132}
133#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
135#[derive(Debug, Clone)]
136pub struct Statistic {
137 pub title: String,
139 pub stat_type: StatType,
141 pub value: String,
143 pub priority: Option<u64>,
145}
146#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
148#[derive(Debug, Clone)]
149pub enum StatType {
150 Timestamp,
152 Number,
154 Decimal,
156 Percentage,
158}