collaboflow_rs/client/document/
document_one.rs1use crate::authorization::HEADER_KEY;
2use crate::client::document::RESOURCE_V1_DOCUMENTS;
3use crate::request::document::document_one::PutDocumentStatusRequest;
4use crate::response::document::document_one::{
5 DeleteDocumentResponse, GetDocumentResponse, GetDocumentResponseBody, PutDocumentStatusResponse,
6};
7use crate::response::error::{ErrorResponse, ErrorResponseBody};
8use crate::Query;
9use serde::Serialize;
10
11#[derive(Debug, Clone)]
12pub struct Document {
13 url: String,
14 authorization_header: String,
15}
16
17impl Document {
18 pub fn new(url: &str, authorization_header: &str) -> Self {
19 Self {
20 url: url.to_string() + RESOURCE_V1_DOCUMENTS,
21 authorization_header: authorization_header.to_string(),
22 }
23 }
24
25 pub async fn get(
26 &self,
27 document_id: i32,
28 query: Query,
29 ) -> Result<GetDocumentResponse, ErrorResponse> {
30 let request_url = format!("{}/{}", &self.url, document_id);
31
32 let http_client = reqwest::Client::new();
33 let result = http_client
34 .get(request_url)
35 .query(&query.to_queries())
36 .header(HEADER_KEY, &self.authorization_header)
37 .send()
38 .await;
39
40 match result {
41 Ok(resp) => {
42 let status = resp.status().as_u16();
43
44 if status == 200 {
45 match resp.json::<GetDocumentResponseBody>().await {
46 Ok(body) => Ok(GetDocumentResponse { status, body }),
47 Err(err) => {
48 let body = ErrorResponseBody {
49 error: true,
50 messages: vec![err.to_string()],
51 };
52 let error_response = ErrorResponse { status, body };
53 Err(error_response)
54 }
55 }
56 } else {
57 match resp.json::<ErrorResponseBody>().await {
58 Ok(body) => {
59 let error_response = ErrorResponse { status, body };
60 Err(error_response)
61 }
62 Err(err) => {
63 let body = ErrorResponseBody {
64 error: true,
65 messages: vec![err.to_string()],
66 };
67 let error_response = ErrorResponse { status, body };
68 Err(error_response)
69 }
70 }
71 }
72 }
73 Err(err) => {
74 let body = ErrorResponseBody {
75 error: true,
76 messages: vec![err.to_string()],
77 };
78 let error_response = ErrorResponse { status: 500, body };
79 Err(error_response)
80 }
81 }
82 }
83
84 pub async fn put<T: Serialize>(
85 &self,
86 document_id: i32,
87 query: Query,
88 request: PutDocumentStatusRequest<T>,
89 ) -> Result<PutDocumentStatusResponse, ErrorResponse> {
90 let request_url = format!("{}/{}", &self.url, document_id);
91
92 let http_client = reqwest::Client::new();
93 let result = http_client
94 .put(request_url)
95 .query(&query.to_queries())
96 .json(&request.document)
97 .header(HEADER_KEY, &self.authorization_header)
98 .send()
99 .await;
100
101 match result {
102 Ok(resp) => {
103 let status = resp.status().as_u16();
104
105 if status == 200 {
106 Ok(PutDocumentStatusResponse { status })
107 } else {
108 match resp.json::<ErrorResponseBody>().await {
109 Ok(body) => {
110 let error_response = ErrorResponse { status, body };
111 Err(error_response)
112 }
113 Err(err) => {
114 let body = ErrorResponseBody {
115 error: true,
116 messages: vec![err.to_string()],
117 };
118 let error_response = ErrorResponse { status, body };
119 Err(error_response)
120 }
121 }
122 }
123 }
124 Err(err) => {
125 let body = ErrorResponseBody {
126 error: true,
127 messages: vec![err.to_string()],
128 };
129 let error_response = ErrorResponse { status: 500, body };
130 Err(error_response)
131 }
132 }
133 }
134
135 pub async fn delete(
136 &self,
137 document_id: i32,
138 query: Query,
139 ) -> Result<DeleteDocumentResponse, ErrorResponse> {
140 let request_url = format!("{}/{}", &self.url, document_id);
141
142 let http_client = reqwest::Client::new();
143 let result = http_client
144 .delete(request_url)
145 .query(&query.to_queries())
146 .header(HEADER_KEY, &self.authorization_header)
147 .send()
148 .await;
149
150 match result {
151 Ok(resp) => {
152 let status = resp.status().as_u16();
153
154 if status == 200 {
155 Ok(DeleteDocumentResponse { status })
156 } else {
157 match resp.json::<ErrorResponseBody>().await {
158 Ok(body) => {
159 let error_response = ErrorResponse { status, body };
160 Err(error_response)
161 }
162 Err(err) => {
163 let body = ErrorResponseBody {
164 error: true,
165 messages: vec![err.to_string()],
166 };
167 let error_response = ErrorResponse { status, body };
168 Err(error_response)
169 }
170 }
171 }
172 }
173 Err(err) => {
174 let body = ErrorResponseBody {
175 error: true,
176 messages: vec![err.to_string()],
177 };
178 let error_response = ErrorResponse { status: 500, body };
179 Err(error_response)
180 }
181 }
182 }
183}