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::{DocumentAccessRequestId, DocumentCommentId, DocumentId, UserId};
14
15use super::access::AccessLevel;
16
17#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
18pub struct DocumentSharedEvent {
19    pub document_id: DocumentId,
20    pub document_name: String,
21    pub recipient_user_id: UserId,
22    pub subject_kind: String,
23    pub subject_value: String,
24    pub level: AccessLevel,
25    pub by: UserId,
26    pub shared_by: String,
27    #[serde(default, skip_serializing_if = "Option::is_none")]
28    pub message: Option<String>,
29    #[serde(default)]
30    pub v: u32,
31    #[serde(default, skip_serializing_if = "Option::is_none")]
32    pub via_agent: Option<String>,
33    #[serde(default, skip_serializing_if = "Option::is_none")]
34    pub comment_id: Option<DocumentCommentId>,
35    #[serde(default, skip_serializing_if = "Option::is_none")]
36    pub created_at: Option<DateTime<Utc>>,
37}
38
39pub const SHARED_EVENT_VERSION: u32 = 1;
40
41impl DocumentSharedEvent {
42    pub const NAME: &'static str = "document.shared";
43}
44
45#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
46pub struct DocumentAccessRequestedEvent {
47    pub document_id: DocumentId,
48    pub document_name: String,
49    pub request_id: DocumentAccessRequestId,
50    pub requester_user_id: UserId,
51    pub requester_display: String,
52    pub level: AccessLevel,
53    #[serde(default, skip_serializing_if = "Option::is_none")]
54    pub message: Option<String>,
55}
56
57impl DocumentAccessRequestedEvent {
58    pub const NAME: &'static str = "document.access_requested";
59}
60
61#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
62pub struct DocumentOwnershipTransferredEvent {
63    pub document_id: DocumentId,
64    pub from: UserId,
65    pub to: UserId,
66}
67
68impl DocumentOwnershipTransferredEvent {
69    pub const NAME: &'static str = "document.ownership_transferred";
70}