synd_client/client/graphql/
timeline.rs1use tracing::instrument;
2
3use super::GraphqlRequest;
4use crate::{
5 Client, SyndApiError,
6 payload::{TimelineChangesPayload, TimelineEntryConnection},
7};
8
9const TIMELINE_CHANGES_QUERY: &str = include_str!("query/timeline_changes.gql");
10const TIMELINE_ENTRIES_QUERY: &str = include_str!("query/timeline_entries.gql");
11
12#[derive(Debug, serde::Serialize)]
13struct TimelineEntriesVariables {
14 after: Option<String>,
15 first: i64,
16}
17
18#[derive(Debug, serde::Deserialize)]
19struct TimelineEntriesData {
20 output: TimelineEntriesOutput,
21}
22
23#[derive(Debug, serde::Deserialize)]
24struct TimelineEntriesOutput {
25 timeline: TimelineEntries,
26}
27
28#[derive(Debug, serde::Deserialize)]
29struct TimelineEntries {
30 entries: TimelineEntryConnection,
31}
32
33impl From<TimelineEntriesData> for TimelineEntryConnection {
34 fn from(data: TimelineEntriesData) -> Self {
35 data.output.timeline.entries
36 }
37}
38
39#[derive(Debug, serde::Serialize)]
40struct TimelineChangesVariables {
41 since: i64,
42 first: i64,
43}
44
45#[derive(Debug, serde::Deserialize)]
46struct TimelineChangesData {
47 output: TimelineChangesOutput,
48}
49
50#[derive(Debug, serde::Deserialize)]
51struct TimelineChangesOutput {
52 timeline: TimelineChanges,
53}
54
55#[derive(Debug, serde::Deserialize)]
56struct TimelineChanges {
57 changes: TimelineChangesPayload,
58}
59
60impl From<TimelineChangesData> for TimelineChangesPayload {
61 fn from(data: TimelineChangesData) -> Self {
62 data.output.timeline.changes
63 }
64}
65
66impl Client {
67 #[instrument(skip(self))]
68 pub async fn fetch_timeline_entries(
69 &self,
70 after: Option<String>,
71 first: i64,
72 ) -> Result<TimelineEntryConnection, SyndApiError> {
73 let outcome = self
74 .execute_graphql::<_, TimelineEntriesData>(&GraphqlRequest::new(
75 TIMELINE_ENTRIES_QUERY,
76 TimelineEntriesVariables { after, first },
77 ))
78 .await?
79 .accept_partial()?;
80 outcome.warn_partial_errors();
81 Ok(outcome.into_data().into())
82 }
83
84 #[instrument(skip(self))]
85 pub async fn fetch_timeline_changes(
86 &self,
87 since: i64,
88 first: i64,
89 ) -> Result<TimelineChangesPayload, SyndApiError> {
90 let outcome = self
91 .execute_graphql::<_, TimelineChangesData>(&GraphqlRequest::new(
92 TIMELINE_CHANGES_QUERY,
93 TimelineChangesVariables { since, first },
94 ))
95 .await?
96 .accept_partial()?;
97 outcome.warn_partial_errors();
98 Ok(outcome.into_data().into())
99 }
100}