operation.rs (5761B)
1 //! Scoped operation records never masquerade as legacy draft mutation inputs. 2 3 use crate::{ 4 FfiComposerDraftRecord, FfiDraftMediaRecord, FfiOperationSettlementRecord, FfiOutboxState, 5 FfiPreparedMediaInput, FfiSubmissionReservationRequest, MOBILE_FFI_SCHEMA_VERSION, 6 }; 7 use tera_core::runtime::product_surface::{PublicationDeliveryState, SubmissionOperationStatus}; 8 9 #[derive(Clone, Copy, Debug, Eq, PartialEq, uniffi::Enum)] 10 pub enum FfiPublicationDeliveryState { 11 NotIssued, 12 Unknown, 13 PartiallyAccepted, 14 Accepted, 15 } 16 17 #[derive(Clone, Debug, Eq, PartialEq, uniffi::Record)] 18 pub struct FfiPublicationDeliveryEvidence { 19 pub state: FfiPublicationDeliveryState, 20 pub stop_requested_at_unix_ms: Option<u64>, 21 pub scheduling_revision: u64, 22 pub retained_facts: u32, 23 pub recorded_attempts: u32, 24 pub unresolved_claims: bool, 25 } 26 27 impl From<tera_core::runtime::product_surface::PublicationDeliveryEvidence> 28 for FfiPublicationDeliveryEvidence 29 { 30 fn from(value: tera_core::runtime::product_surface::PublicationDeliveryEvidence) -> Self { 31 Self { 32 state: match value.state { 33 PublicationDeliveryState::NotIssued => FfiPublicationDeliveryState::NotIssued, 34 PublicationDeliveryState::Unknown => FfiPublicationDeliveryState::Unknown, 35 PublicationDeliveryState::PartiallyAccepted => { 36 FfiPublicationDeliveryState::PartiallyAccepted 37 } 38 PublicationDeliveryState::Accepted => FfiPublicationDeliveryState::Accepted, 39 }, 40 stop_requested_at_unix_ms: value.stop_requested_at_unix_ms, 41 scheduling_revision: value.scheduling_revision, 42 retained_facts: value.retained_facts, 43 recorded_attempts: value.recorded_attempts, 44 unresolved_claims: value.unresolved_claims, 45 } 46 } 47 } 48 49 #[derive(Clone, Debug, Eq, PartialEq, uniffi::Record)] 50 pub struct FfiSubmissionMediaRecord { 51 pub opaque_reference: String, 52 pub progress: FfiDraftMediaRecord, 53 pub authorizations: Vec<FfiUploadAttemptIdentity>, 54 } 55 56 #[derive(Clone, Debug, Eq, PartialEq, uniffi::Record)] 57 pub struct FfiUploadAttemptIdentity { 58 pub operation_id: String, 59 pub revision: Option<u64>, 60 pub expiration_unix_s: u64, 61 } 62 63 #[derive(Clone, Eq, PartialEq, uniffi::Record)] 64 pub struct FfiSubmissionOperationRecord { 65 pub schema_version: u16, 66 pub request: FfiSubmissionReservationRequest, 67 pub intent_id: String, 68 pub operation_id: String, 69 pub revision: u64, 70 pub captured: FfiComposerDraftRecord, 71 pub state: FfiOutboxState, 72 pub committed_at_unix_ms: u64, 73 pub updated_at_unix_ms: u64, 74 pub media: Vec<FfiSubmissionMediaRecord>, 75 pub settlement: FfiOperationSettlementRecord, 76 pub delivery: FfiPublicationDeliveryEvidence, 77 pub target_details: super::FfiPublicationTargetDetails, 78 pub retry: super::FfiPublicationRetryDecision, 79 } 80 81 impl std::fmt::Debug for FfiSubmissionOperationRecord { 82 fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { 83 formatter 84 .debug_struct("FfiSubmissionOperationRecord") 85 .field("state", &self.state) 86 .finish_non_exhaustive() 87 } 88 } 89 90 impl From<&SubmissionOperationStatus> for FfiSubmissionOperationRecord { 91 fn from(value: &SubmissionOperationStatus) -> Self { 92 Self { 93 schema_version: MOBILE_FFI_SCHEMA_VERSION, 94 request: value.receipt().request().into(), 95 intent_id: hex::encode(value.receipt().intent_id().as_bytes()), 96 operation_id: hex::encode(value.receipt().operation_id().as_bytes()), 97 revision: value.intent().revision().get(), 98 captured: value.captured().into(), 99 state: value.state().into(), 100 committed_at_unix_ms: value.receipt().committed_at_unix_ms(), 101 updated_at_unix_ms: value.intent().updated_at_unix_ms(), 102 media: value 103 .media() 104 .iter() 105 .map(|media| FfiSubmissionMediaRecord { 106 opaque_reference: media.local_reference().to_owned(), 107 progress: media.into(), 108 authorizations: media 109 .upload_authorizations() 110 .into_iter() 111 .map(|value| FfiUploadAttemptIdentity { 112 operation_id: hex::encode(value.operation_id), 113 revision: value.revision, 114 expiration_unix_s: value.expiration_unix_s, 115 }) 116 .collect(), 117 }) 118 .collect(), 119 settlement: value.push().settlement().into(), 120 delivery: value.delivery_evidence().into(), 121 target_details: value.target_details().into(), 122 retry: value.retry_decision().into(), 123 } 124 } 125 } 126 127 #[derive(Clone, uniffi::Record)] 128 pub struct FfiSubmissionMediaInput { 129 pub schema_version: u16, 130 pub request: FfiSubmissionReservationRequest, 131 pub expected_revision: u64, 132 pub media: FfiPreparedMediaInput, 133 } 134 135 #[derive(Clone, uniffi::Record)] 136 pub struct FfiSubmissionUploadJobRecord { 137 pub schema_version: u16, 138 pub submission: FfiSubmissionOperationRecord, 139 pub operation_id: String, 140 pub remote_url: String, 141 pub upload_url: String, 142 pub authorization_header: String, 143 pub expected_sha256: String, 144 pub media_type: String, 145 pub byte_size: u64, 146 } 147 148 #[derive(Clone, uniffi::Record)] 149 pub struct FfiSubmissionUploadResponse { 150 pub schema_version: u16, 151 pub status_code: u16, 152 pub media_type: Option<String>, 153 pub content_encoding: Option<String>, 154 pub body: Vec<u8>, 155 }