Skip to main content

systemprompt_models/documents/
sharing_events.rs

1//! Payloads of the sharing events.
2//!
3//! A document shared with someone (by a grant or by a mention), an access
4//! request, and an ownership transfer each name their recipient and reach
5//! only them, never the document's live topic.
6//!
7//! Copyright (c) systemprompt.io — Business Source License 1.1.
8//! See <https://systemprompt.io> for licensing details.
9
10use chrono::{DateTime, Utc};
11use schemars::JsonSchema;
12use serde::{Deserialize, Serialize};
13use systemprompt_identifiers::{
14    AgentName, DocumentAccessRequestId, DocumentCommentId, DocumentId, UserId,
15};
16
17use super::access::AccessLevel;
18
19#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
20pub struct DocumentSharedEvent {
21    pub document_id: DocumentId,
22    pub document_name: String,
23    pub recipient_user_id: UserId,
24    pub subject_kind: String,
25    pub subject_value: String,
26    pub level: AccessLevel,
27    pub by: UserId,
28    pub shared_by: String,
29    #[serde(default, skip_serializing_if = "Option::is_none")]
30    pub message: Option<String>,
31    #[serde(default)]
32    pub v: u32,
33    #[serde(default, skip_serializing_if = "Option::is_none")]
34    pub via_agent: Option<AgentName>,
35    #[serde(default, skip_serializing_if = "Option::is_none")]
36    pub comment_id: Option<DocumentCommentId>,
37    #[serde(default, skip_serializing_if = "Option::is_none")]
38    pub created_at: Option<DateTime<Utc>>,
39}
40
41pub const SHARED_EVENT_VERSION: u32 = 1;
42
43impl DocumentSharedEvent {
44    pub const NAME: &'static str = "document.shared";
45}
46
47#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
48pub struct DocumentAccessRequestedEvent {
49    pub document_id: DocumentId,
50    pub document_name: String,
51    pub request_id: DocumentAccessRequestId,
52    pub requester_user_id: UserId,
53    pub requester_display: String,
54    pub level: AccessLevel,
55    #[serde(default, skip_serializing_if = "Option::is_none")]
56    pub message: Option<String>,
57}
58
59impl DocumentAccessRequestedEvent {
60    pub const NAME: &'static str = "document.access_requested";
61}
62
63#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
64pub struct DocumentOwnershipTransferredEvent {
65    pub document_id: DocumentId,
66    pub from: UserId,
67    pub to: UserId,
68}
69
70impl DocumentOwnershipTransferredEvent {
71    pub const NAME: &'static str = "document.ownership_transferred";
72}