Skip to main content

greentic_types/messaging/
universal_dto.rs

1//! Shared DTOs for the universal messaging operator-provider protocol.
2
3use alloc::{collections::BTreeMap, string::String, vec::Vec};
4
5#[cfg(feature = "schemars")]
6use schemars::JsonSchema;
7#[cfg(feature = "serde")]
8use serde::{Deserialize, Serialize};
9use serde_json::Value;
10
11use crate::ChannelMessageEnvelope;
12
13/// HTTP header name/value pair.
14#[derive(Clone, Debug, PartialEq)]
15#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
16#[cfg_attr(feature = "schemars", derive(JsonSchema))]
17pub struct Header {
18    /// Header name.
19    pub name: String,
20    /// Header value.
21    pub value: String,
22}
23
24/// Normalized HTTP ingress payload (v1).
25#[derive(Clone, Debug, PartialEq)]
26#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
27#[cfg_attr(feature = "schemars", derive(JsonSchema))]
28pub struct HttpInV1 {
29    /// HTTP method.
30    pub method: String,
31    /// Request path.
32    pub path: String,
33    /// Optional raw query string.
34    #[cfg_attr(feature = "serde", serde(default))]
35    pub query: Option<String>,
36    /// Request headers.
37    #[cfg_attr(feature = "serde", serde(default))]
38    pub headers: Vec<Header>,
39    /// Base64-encoded request body.
40    #[cfg_attr(feature = "serde", serde(default))]
41    pub body_b64: String,
42    /// Optional route hint for dispatching.
43    #[cfg_attr(feature = "serde", serde(default))]
44    pub route_hint: Option<String>,
45    /// Optional binding identifier for routing.
46    #[cfg_attr(feature = "serde", serde(default))]
47    pub binding_id: Option<String>,
48    /// Optional provider configuration payload.
49    #[cfg_attr(feature = "serde", serde(default))]
50    pub config: Option<Value>,
51}
52
53/// Normalized HTTP egress response (v1).
54#[derive(Clone, Debug, PartialEq)]
55#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
56#[cfg_attr(feature = "schemars", derive(JsonSchema))]
57pub struct HttpOutV1 {
58    /// Response status code.
59    pub status: u16,
60    /// Response headers.
61    #[cfg_attr(feature = "serde", serde(default))]
62    pub headers: Vec<Header>,
63    /// Base64-encoded response body.
64    #[cfg_attr(feature = "serde", serde(default))]
65    pub body_b64: String,
66    /// Emitted inbound events.
67    #[cfg_attr(feature = "serde", serde(default))]
68    pub events: Vec<ChannelMessageEnvelope>,
69}
70
71/// Render planning input for provider payloads.
72#[derive(Clone, Debug, PartialEq)]
73#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
74#[cfg_attr(feature = "schemars", derive(JsonSchema))]
75pub struct RenderPlanInV1 {
76    /// Message to be rendered.
77    pub message: ChannelMessageEnvelope,
78    /// Optional metadata for renderer hints.
79    #[cfg_attr(feature = "serde", serde(default))]
80    pub metadata: BTreeMap<String, Value>,
81}
82
83/// Render planning output containing the serialized plan.
84#[derive(Clone, Debug, PartialEq)]
85#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
86#[cfg_attr(feature = "schemars", derive(JsonSchema))]
87pub struct RenderPlanOutV1 {
88    /// Serialized plan JSON.
89    pub plan_json: String,
90}
91
92/// Provider-encoded payload plus metadata.
93#[derive(Clone, Debug, PartialEq)]
94#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
95#[cfg_attr(feature = "schemars", derive(JsonSchema))]
96pub struct ProviderPayloadV1 {
97    /// MIME content type of the payload.
98    pub content_type: String,
99    /// Base64-encoded payload body.
100    #[cfg_attr(feature = "serde", serde(default))]
101    pub body_b64: String,
102    /// Provider-specific metadata.
103    #[cfg_attr(feature = "serde", serde(default))]
104    pub metadata: BTreeMap<String, Value>,
105}
106
107/// Encode request combining the message and render plan.
108#[derive(Clone, Debug, PartialEq)]
109#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
110#[cfg_attr(feature = "schemars", derive(JsonSchema))]
111pub struct EncodeInV1 {
112    /// Message to be encoded.
113    pub message: ChannelMessageEnvelope,
114    /// Render plan to apply.
115    pub plan: RenderPlanInV1,
116}
117
118/// Authenticated user reference used for provider operations.
119#[derive(Clone, Debug, Default, PartialEq, Eq)]
120#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
121#[cfg_attr(feature = "schemars", derive(JsonSchema))]
122pub struct AuthUserRefV1 {
123    /// Provider user identifier.
124    pub user_id: String,
125    /// Token key reference.
126    pub token_key: String,
127    /// Optional tenant identifier.
128    #[cfg_attr(feature = "serde", serde(default))]
129    pub tenant_id: Option<String>,
130    /// Optional user email address.
131    #[cfg_attr(feature = "serde", serde(default))]
132    pub email: Option<String>,
133    /// Optional display name.
134    #[cfg_attr(feature = "serde", serde(default))]
135    pub display_name: Option<String>,
136}
137
138/// Send request for a provider payload.
139#[derive(Clone, Debug, PartialEq)]
140#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
141#[cfg_attr(feature = "schemars", derive(JsonSchema))]
142pub struct SendPayloadInV1 {
143    /// Provider type identifier.
144    pub provider_type: String,
145    /// Optional tenant identifier override.
146    #[cfg_attr(feature = "serde", serde(default))]
147    pub tenant_id: Option<String>,
148    /// Optional auth user reference.
149    #[cfg_attr(feature = "serde", serde(default))]
150    pub auth_user: Option<AuthUserRefV1>,
151    /// Provider payload to deliver.
152    pub payload: ProviderPayloadV1,
153}
154
155/// Send result status and retry hint.
156#[derive(Clone, Debug, PartialEq)]
157#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
158#[cfg_attr(feature = "schemars", derive(JsonSchema))]
159pub struct SendPayloadResultV1 {
160    /// Whether the send succeeded.
161    pub ok: bool,
162    /// Optional error or status message.
163    #[cfg_attr(feature = "serde", serde(default))]
164    pub message: Option<String>,
165    /// Whether the operation is retryable.
166    #[cfg_attr(feature = "serde", serde(default))]
167    pub retryable: bool,
168}
169
170/// Subscription ensure request (v1).
171#[derive(Clone, Debug, PartialEq)]
172#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
173#[cfg_attr(feature = "schemars", derive(JsonSchema))]
174pub struct SubscriptionEnsureInV1 {
175    /// Protocol version.
176    pub v: u32,
177    /// Provider identifier.
178    pub provider: String,
179    /// Optional tenant hint.
180    #[cfg_attr(feature = "serde", serde(default))]
181    pub tenant_hint: Option<String>,
182    /// Optional team hint.
183    #[cfg_attr(feature = "serde", serde(default))]
184    pub team_hint: Option<String>,
185    /// Optional binding identifier.
186    #[cfg_attr(feature = "serde", serde(default))]
187    pub binding_id: Option<String>,
188    /// Resource to subscribe to.
189    pub resource: String,
190    /// Change types to subscribe to.
191    #[cfg_attr(feature = "serde", serde(default))]
192    pub change_types: Vec<String>,
193    /// Notification URL for callbacks.
194    pub notification_url: String,
195    /// Optional expiration in minutes.
196    #[cfg_attr(feature = "serde", serde(default))]
197    pub expiration_minutes: Option<u32>,
198    /// Optional target expiration timestamp (ms since epoch).
199    #[cfg_attr(feature = "serde", serde(default))]
200    pub expiration_target_unix_ms: Option<u64>,
201    /// Optional client state token.
202    #[cfg_attr(feature = "serde", serde(default))]
203    pub client_state: Option<String>,
204    /// Optional provider metadata.
205    #[cfg_attr(feature = "serde", serde(default))]
206    pub metadata: Option<Value>,
207    /// Authenticated user reference.
208    #[cfg_attr(feature = "serde", serde(default))]
209    pub user: AuthUserRefV1,
210}
211
212/// Subscription ensure response (v1).
213#[derive(Clone, Debug, PartialEq)]
214#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
215#[cfg_attr(feature = "schemars", derive(JsonSchema))]
216pub struct SubscriptionEnsureOutV1 {
217    /// Protocol version.
218    pub v: u32,
219    /// Provider subscription identifier.
220    pub subscription_id: String,
221    /// Expiration timestamp (ms since epoch).
222    pub expiration_unix_ms: u64,
223    /// Resource subscribed to.
224    pub resource: String,
225    /// Change types in the subscription.
226    pub change_types: Vec<String>,
227    /// Optional client state token.
228    #[cfg_attr(feature = "serde", serde(default))]
229    pub client_state: Option<String>,
230    /// Optional provider metadata.
231    #[cfg_attr(feature = "serde", serde(default))]
232    pub metadata: Option<Value>,
233    /// Optional binding identifier.
234    #[cfg_attr(feature = "serde", serde(default))]
235    pub binding_id: Option<String>,
236    /// Authenticated user reference.
237    #[cfg_attr(feature = "serde", serde(default))]
238    pub user: AuthUserRefV1,
239}
240
241/// Subscription renewal request (v1).
242#[derive(Clone, Debug, PartialEq)]
243#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
244#[cfg_attr(feature = "schemars", derive(JsonSchema))]
245pub struct SubscriptionRenewInV1 {
246    /// Protocol version.
247    pub v: u32,
248    /// Provider identifier.
249    pub provider: String,
250    /// Subscription identifier.
251    pub subscription_id: String,
252    /// Optional expiration in minutes.
253    #[cfg_attr(feature = "serde", serde(default))]
254    pub expiration_minutes: Option<u32>,
255    /// Optional target expiration timestamp (ms since epoch).
256    #[cfg_attr(feature = "serde", serde(default))]
257    pub expiration_target_unix_ms: Option<u64>,
258    /// Optional provider metadata.
259    #[cfg_attr(feature = "serde", serde(default))]
260    pub metadata: Option<Value>,
261    /// Authenticated user reference.
262    #[cfg_attr(feature = "serde", serde(default))]
263    pub user: AuthUserRefV1,
264}
265
266/// Subscription renewal response (v1).
267#[derive(Clone, Debug, PartialEq)]
268#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
269#[cfg_attr(feature = "schemars", derive(JsonSchema))]
270pub struct SubscriptionRenewOutV1 {
271    /// Protocol version.
272    pub v: u32,
273    /// Subscription identifier.
274    pub subscription_id: String,
275    /// Expiration timestamp (ms since epoch).
276    pub expiration_unix_ms: u64,
277    /// Optional provider metadata.
278    #[cfg_attr(feature = "serde", serde(default))]
279    pub metadata: Option<Value>,
280    /// Authenticated user reference.
281    #[cfg_attr(feature = "serde", serde(default))]
282    pub user: AuthUserRefV1,
283}
284
285/// Subscription deletion request (v1).
286#[derive(Clone, Debug, PartialEq, Eq)]
287#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
288#[cfg_attr(feature = "schemars", derive(JsonSchema))]
289pub struct SubscriptionDeleteInV1 {
290    /// Protocol version.
291    pub v: u32,
292    /// Provider identifier.
293    pub provider: String,
294    /// Subscription identifier.
295    pub subscription_id: String,
296    /// Authenticated user reference.
297    #[cfg_attr(feature = "serde", serde(default))]
298    pub user: AuthUserRefV1,
299}
300
301/// Subscription deletion response (v1).
302#[derive(Clone, Debug, PartialEq, Eq)]
303#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
304#[cfg_attr(feature = "schemars", derive(JsonSchema))]
305pub struct SubscriptionDeleteOutV1 {
306    /// Protocol version.
307    pub v: u32,
308    /// Subscription identifier.
309    pub subscription_id: String,
310    /// Authenticated user reference.
311    #[cfg_attr(feature = "serde", serde(default))]
312    pub user: AuthUserRefV1,
313}
314
315/// Result alias for subscription ensure calls.
316pub type SubscriptionEnsureResultV1 = SubscriptionEnsureOutV1;
317/// Result alias for subscription delete calls.
318pub type SubscriptionDeleteResultV1 = SubscriptionDeleteOutV1;
319/// Alias for subscription renewal input.
320pub type SubscriptionRenewalInV1 = SubscriptionRenewInV1;
321/// Alias for subscription renewal output.
322pub type SubscriptionRenewalOutV1 = SubscriptionRenewOutV1;