runbeam_sdk/runbeam_api/
resources.rs

1use serde::{Deserialize, Serialize};
2
3/// Paginated response wrapper
4#[derive(Debug, Clone, Serialize, Deserialize)]
5pub struct PaginatedResponse<T> {
6    pub data: Vec<T>,
7    #[serde(default)]
8    pub links: Option<PaginationLinks>,
9    #[serde(default)]
10    pub meta: Option<PaginationMeta>,
11}
12
13/// Pagination links
14#[derive(Debug, Clone, Serialize, Deserialize)]
15pub struct PaginationLinks {
16    pub first: Option<String>,
17    pub last: Option<String>,
18    pub prev: Option<String>,
19    pub next: Option<String>,
20}
21
22/// Pagination metadata
23#[derive(Debug, Clone, Serialize, Deserialize)]
24pub struct PaginationMeta {
25    pub current_page: u32,
26    pub from: Option<u32>,
27    pub last_page: u32,
28    #[serde(default)]
29    pub links: Option<Vec<serde_json::Value>>, // Laravel pagination links array
30    pub path: Option<String>,
31    pub per_page: u32,
32    pub to: Option<u32>,
33    pub total: u32,
34}
35
36/// Single resource response wrapper
37#[derive(Debug, Clone, Serialize, Deserialize)]
38pub struct ResourceResponse<T> {
39    pub data: T,
40}
41
42/// Gateway resource
43#[derive(Debug, Clone, Serialize, Deserialize)]
44pub struct Gateway {
45    #[serde(rename = "type")]
46    pub resource_type: String,
47    #[serde(default)]
48    pub id: Option<String>,
49    pub code: String,
50    pub name: String,
51    pub team_id: String,
52    pub enabled: Option<bool>,
53    #[serde(default)]
54    pub pipelines_path: Option<String>,
55    #[serde(default)]
56    pub transforms_path: Option<String>,
57    #[serde(default)]
58    pub jwks_cache_duration_hours: Option<u32>,
59    #[serde(default)]
60    pub management_enabled: Option<bool>,
61    #[serde(default)]
62    pub management_base_path: Option<String>,
63    #[serde(default)]
64    pub management_network_id: Option<String>,
65    #[serde(default)]
66    pub dns: Option<Vec<String>>,
67    #[serde(default)]
68    pub settings: Option<serde_json::Value>,
69    #[serde(default)]
70    pub created_at: Option<String>,
71    #[serde(default)]
72    pub updated_at: Option<String>,
73}
74
75/// User who authorized a gateway
76#[derive(Debug, Clone, Serialize, Deserialize)]
77pub struct AuthorizedByInfo {
78    pub id: String,
79    pub name: String,
80    pub email: String,
81}
82
83/// Service resource
84#[derive(Debug, Clone, Serialize, Deserialize)]
85pub struct Service {
86    #[serde(rename = "type")]
87    pub resource_type: String,
88    #[serde(default)]
89    pub id: Option<String>,
90    pub code: String,
91    pub name: String,
92    pub team_id: String,
93    pub gateway_id: String,
94    #[serde(default)]
95    pub description: Option<String>,
96    #[serde(default)]
97    pub created_at: Option<String>,
98    #[serde(default)]
99    pub updated_at: Option<String>,
100}
101
102/// Endpoint resource
103#[derive(Debug, Clone, Serialize, Deserialize)]
104pub struct Endpoint {
105    #[serde(rename = "type")]
106    pub resource_type: String,
107    #[serde(default)]
108    pub id: Option<String>,
109    pub code: String,
110    pub name: String,
111    pub team_id: String,
112    pub gateway_id: Option<String>,
113    #[serde(default)]
114    pub service_id: Option<String>,
115    #[serde(default)]
116    pub path: Option<String>,
117    #[serde(default)]
118    pub methods: Option<Vec<String>>,
119    #[serde(default)]
120    pub description: Option<String>,
121    #[serde(default)]
122    pub created_at: Option<String>,
123    #[serde(default)]
124    pub updated_at: Option<String>,
125}
126
127/// Backend resource
128#[derive(Debug, Clone, Serialize, Deserialize)]
129pub struct Backend {
130    #[serde(rename = "type")]
131    pub resource_type: String,
132    #[serde(default)]
133    pub id: Option<String>,
134    pub code: String,
135    pub name: String,
136    pub team_id: String,
137    pub gateway_id: Option<String>,
138    #[serde(default)]
139    pub service_id: Option<String>,
140    #[serde(default)]
141    pub url: Option<String>,
142    #[serde(default)]
143    pub timeout_seconds: Option<u32>,
144    #[serde(default)]
145    pub created_at: Option<String>,
146    #[serde(default)]
147    pub updated_at: Option<String>,
148}
149
150/// Pipeline resource
151#[derive(Debug, Clone, Serialize, Deserialize)]
152pub struct Pipeline {
153    #[serde(rename = "type")]
154    pub resource_type: String,
155    #[serde(default)]
156    pub id: Option<String>,
157    pub code: String,
158    pub name: String,
159    pub description: String,
160    pub team_id: String,
161    pub gateway_id: Option<String>,
162    #[serde(default)]
163    pub networks: Option<Vec<String>>,
164    #[serde(default)]
165    pub endpoints: Option<serde_json::Value>,
166    #[serde(default)]
167    pub backends: Option<serde_json::Value>,
168    #[serde(default)]
169    pub middleware: Option<serde_json::Value>,
170    #[serde(default)]
171    pub created_at: Option<String>,
172    #[serde(default)]
173    pub updated_at: Option<String>,
174}
175
176/// Middleware resource  
177#[derive(Debug, Clone, Serialize, Deserialize)]
178pub struct Middleware {
179    #[serde(rename = "type")]
180    pub resource_type: String,
181    #[serde(default)]
182    pub id: Option<String>,
183    pub code: String,
184    pub name: String,
185    pub team_id: String,
186    pub middleware_type: String,
187    #[serde(default)]
188    pub options: Option<serde_json::Value>,
189    #[serde(default)]
190    pub created_at: Option<String>,
191    #[serde(default)]
192    pub updated_at: Option<String>,
193}
194
195/// Transform resource
196#[derive(Debug, Clone, Serialize, Deserialize)]
197pub struct Transform {
198    #[serde(rename = "type")]
199    pub resource_type: String,
200    #[serde(default)]
201    pub id: Option<String>,
202    pub code: String,
203    pub name: String,
204    pub team_id: String,
205    pub gateway_id: String,
206    #[serde(default)]
207    pub options: Option<TransformOptions>,
208    #[serde(default)]
209    pub created_at: Option<String>,
210    #[serde(default)]
211    pub updated_at: Option<String>,
212}
213
214/// Transform options
215#[derive(Debug, Clone, Serialize, Deserialize)]
216pub struct TransformOptions {
217    pub instructions: Option<String>,
218}
219
220/// Policy resource
221#[derive(Debug, Clone, Serialize, Deserialize)]
222pub struct Policy {
223    #[serde(rename = "type")]
224    pub resource_type: String,
225    #[serde(default)]
226    pub id: Option<String>,
227    pub code: String,
228    pub name: String,
229    pub enabled: u32,
230    pub team_id: String,
231    pub gateway_id: String,
232    #[serde(default)]
233    pub rules: Option<serde_json::Value>,
234    #[serde(default)]
235    pub created_at: Option<String>,
236    #[serde(default)]
237    pub updated_at: Option<String>,
238}
239
240/// Network resource
241#[derive(Debug, Clone, Serialize, Deserialize)]
242pub struct Network {
243    #[serde(rename = "type")]
244    pub resource_type: String,
245    #[serde(default)]
246    pub id: Option<String>,
247    pub code: String,
248    pub name: String,
249    pub team_id: String,
250    pub gateway_id: Option<String>,
251    pub enable_wireguard: bool,
252    #[serde(default)]
253    pub interface: Option<String>,
254    #[serde(default, alias = "http")]
255    pub tcp_config: Option<TcpConfig>,
256    #[serde(default)]
257    pub created_at: Option<String>,
258    #[serde(default)]
259    pub updated_at: Option<String>,
260}
261
262/// TCP configuration for network - used by all protocol adapters (HTTP, DIMSE, etc.)
263#[derive(Debug, Clone, Serialize, Deserialize)]
264pub struct TcpConfig {
265    pub bind_address: Option<String>,
266    pub bind_port: Option<u16>,
267}
268
269/// Runbeam Cloud integration configuration
270#[derive(Debug, Clone, Serialize, Deserialize)]
271pub struct Runbeam {
272    #[serde(rename = "type")]
273    pub resource_type: String,
274    #[serde(default)]
275    pub id: Option<String>,
276    pub code: String,
277    pub name: String,
278    pub team_id: String,
279    pub gateway_id: Option<String>,
280    #[serde(default)]
281    pub enabled: Option<bool>,
282    #[serde(default)]
283    pub cloud_api_base_url: Option<String>,
284    #[serde(default)]
285    pub poll_interval_secs: Option<u32>,
286    #[serde(default)]
287    pub created_at: Option<String>,
288    #[serde(default)]
289    pub updated_at: Option<String>,
290}
291
292/// Authentication resource
293#[derive(Debug, Clone, Serialize, Deserialize)]
294pub struct Authentication {
295    #[serde(rename = "type")]
296    pub resource_type: String,
297    #[serde(default)]
298    pub id: Option<String>,
299    pub code: Option<String>,
300    pub name: String,
301    pub team_id: Option<String>,
302    pub gateway_id: Option<String>,
303    #[serde(default)]
304    pub options: Option<String>,
305    #[serde(default)]
306    pub created_at: Option<String>,
307    #[serde(default)]
308    pub updated_at: Option<String>,
309}
310
311/// Full gateway configuration (for downloading complete config)
312#[derive(Debug, Clone, Serialize, Deserialize)]
313pub struct GatewayConfiguration {
314    pub gateway: Gateway,
315    #[serde(default)]
316    pub services: Vec<Service>,
317    #[serde(default)]
318    pub endpoints: Vec<Endpoint>,
319    #[serde(default)]
320    pub backends: Vec<Backend>,
321    #[serde(default)]
322    pub pipelines: Vec<Pipeline>,
323    #[serde(default)]
324    pub middlewares: Vec<Middleware>,
325    #[serde(default)]
326    pub transforms: Vec<Transform>,
327    #[serde(default)]
328    pub policies: Vec<Policy>,
329    #[serde(default)]
330    pub networks: Vec<Network>,
331    #[serde(default)]
332    pub runbeam: Option<Runbeam>,
333}
334
335/// Change resource for configuration change tracking (API v1.0)
336///
337/// This represents a configuration change that needs to be applied to a gateway.
338/// The API returns two different levels of detail:
339///
340/// 1. ChangeMetadata (list view) - returned from `/api/harmony/changes` endpoints
341///    Contains: id, status, type, gateway_id, created_at
342///
343/// 2. ChangeResource (detail view) - returned from `/api/harmony/changes/{change}` endpoint  
344///    Contains all metadata fields plus: pipeline_id, toml_config, metadata, timestamps, error info
345#[derive(Debug, Clone, Serialize, Deserialize)]
346pub struct Change {
347    pub id: String,
348    #[serde(default)]
349    pub status: Option<String>,
350    #[serde(rename = "type")]
351    pub resource_type: String,
352    pub gateway_id: String,
353    #[serde(default)]
354    pub pipeline_id: Option<String>,
355    /// TOML configuration content (only present in detail view)
356    #[serde(default)]
357    pub toml_config: Option<String>,
358    /// Additional metadata (only present in detail view)
359    #[serde(default)]
360    pub metadata: Option<serde_json::Value>,
361    pub created_at: String,
362    #[serde(default)]
363    pub acknowledged_at: Option<String>,
364    #[serde(default)]
365    pub applied_at: Option<String>,
366    #[serde(default)]
367    pub failed_at: Option<String>,
368    #[serde(default)]
369    pub error_message: Option<String>,
370    #[serde(default)]
371    pub error_details: Option<serde_json::Value>,
372}
373
374/// Response from the base URL discovery endpoint
375#[derive(Debug, Clone, Serialize, Deserialize)]
376pub struct BaseUrlResponse {
377    /// Base URL for the Harmony API (e.g., https://runbeam.lndo.site/api)
378    pub base_url: String,
379    /// Optional path for changes API (e.g., "/")
380    #[serde(default)]
381    pub changes_path: Option<String>,
382    /// Optional fully resolved URL (base_url + changes_path)
383    #[serde(default)]
384    pub full_url: Option<String>,
385}
386
387/// Request payload for acknowledging multiple changes
388#[derive(Debug, Clone, Serialize, Deserialize)]
389pub struct AcknowledgeChangesRequest {
390    pub change_ids: Vec<String>,
391}
392
393/// Request payload for reporting a failed change
394#[derive(Debug, Clone, Serialize, Deserialize)]
395pub struct ChangeFailedRequest {
396    pub error: String,
397    #[serde(skip_serializing_if = "Option::is_none")]
398    pub details: Option<Vec<String>>,
399}
400
401/// Response from acknowledging multiple changes
402#[derive(Debug, Clone, Serialize, Deserialize)]
403pub struct AcknowledgeChangesResponse {
404    pub acknowledged: Vec<String>,
405    pub failed: Vec<String>,
406}
407
408/// Response from marking a change as applied or failed
409#[derive(Debug, Clone, Serialize, Deserialize)]
410pub struct ChangeStatusResponse {
411    pub success: bool,
412    pub message: String,
413}
414
415/// Type alias for change applied response
416pub type ChangeAppliedResponse = ChangeStatusResponse;
417
418/// Type alias for change failed response  
419pub type ChangeFailedResponse = ChangeStatusResponse;