audit_trails/core/
trail.rs1use iota_interaction::{IotaKeySignature, OptionalSync};
7use iota_sdk_types::{ObjectId, ProgrammableTransaction};
8use product_common::core_client::{CoreClient, CoreClientReadOnly};
9use product_common::transaction::transaction_builder::TransactionBuilder;
10use secret_storage::Signer;
11use serde::de::DeserializeOwned;
12
13use crate::core::access::TrailAccess;
14use crate::core::internal::trail as trail_reader;
15use crate::core::locking::TrailLocking;
16use crate::core::records::TrailRecords;
17use crate::core::tags::TrailTags;
18use crate::core::types::{Data, OnChainAuditTrail};
19use crate::error::Error;
20
21mod operations;
22mod transactions;
23
24pub use transactions::{DeleteAuditTrail, Migrate, UpdateMetadata};
25
26#[doc(hidden)]
28#[cfg_attr(not(feature = "send-sync"), async_trait::async_trait(?Send))]
29#[cfg_attr(feature = "send-sync", async_trait::async_trait)]
30pub trait AuditTrailReadOnly: CoreClientReadOnly + OptionalSync {
31 async fn execute_read_only_transaction<T: DeserializeOwned>(&self, tx: ProgrammableTransaction)
33 -> Result<T, Error>;
34}
35
36#[doc(hidden)]
38pub trait AuditTrailFull: AuditTrailReadOnly {}
39
40#[derive(Debug, Clone)]
45pub struct AuditTrailHandle<'a, C> {
46 pub(crate) client: &'a C,
47 pub(crate) trail_id: ObjectId,
48 pub(crate) selected_capability_id: Option<ObjectId>,
49}
50
51impl<'a, C> AuditTrailHandle<'a, C> {
52 pub(crate) fn new(client: &'a C, trail_id: ObjectId) -> Self {
53 Self {
54 client,
55 trail_id,
56 selected_capability_id: None,
57 }
58 }
59
60 pub fn using_capability(mut self, capability_id: ObjectId) -> Self {
62 self.selected_capability_id = Some(capability_id);
63 self
64 }
65
66 pub async fn get(&self) -> Result<OnChainAuditTrail, Error>
70 where
71 C: AuditTrailReadOnly,
72 {
73 trail_reader::get_audit_trail(self.trail_id, self.client).await
74 }
75
76 pub fn update_metadata<S>(&self, metadata: Option<String>) -> TransactionBuilder<UpdateMetadata>
80 where
81 C: AuditTrailFull + CoreClient<S>,
82 S: Signer<IotaKeySignature> + OptionalSync,
83 {
84 let owner = self.client.sender_address();
85 TransactionBuilder::new(UpdateMetadata::new(
86 self.trail_id,
87 owner,
88 metadata,
89 self.selected_capability_id,
90 ))
91 }
92
93 pub fn migrate<S>(&self) -> TransactionBuilder<Migrate>
95 where
96 C: AuditTrailFull + CoreClient<S>,
97 S: Signer<IotaKeySignature> + OptionalSync,
98 {
99 let owner = self.client.sender_address();
100 TransactionBuilder::new(Migrate::new(self.trail_id, owner, self.selected_capability_id))
101 }
102
103 pub fn delete_audit_trail<S>(&self) -> TransactionBuilder<DeleteAuditTrail>
109 where
110 C: AuditTrailFull + CoreClient<S>,
111 S: Signer<IotaKeySignature> + OptionalSync,
112 {
113 let owner = self.client.sender_address();
114 TransactionBuilder::new(DeleteAuditTrail::new(self.trail_id, owner, self.selected_capability_id))
115 }
116
117 pub fn records(&self) -> TrailRecords<'a, C, Data> {
121 TrailRecords::new(self.client, self.trail_id, self.selected_capability_id)
122 }
123
124 pub fn locking(&self) -> TrailLocking<'a, C> {
128 TrailLocking::new(self.client, self.trail_id, self.selected_capability_id)
129 }
130
131 pub fn access(&self) -> TrailAccess<'a, C> {
135 TrailAccess::new(self.client, self.trail_id, self.selected_capability_id)
136 }
137
138 pub fn tags(&self) -> TrailTags<'a, C> {
142 TrailTags::new(self.client, self.trail_id, self.selected_capability_id)
143 }
144}