1#![allow(clippy::too_many_arguments)]
13
14use crate::client::Ghl;
15use crate::error::Result;
16use ghl_models::v2::knowledge_base as models;
17
18#[derive(Debug, Clone)]
21pub struct KnowledgeBaseService {
22 pub(crate) client: Ghl,
23}
24
25impl KnowledgeBaseService {
26 pub(crate) fn new(client: Ghl) -> Self {
27 Self { client }
28 }
29}
30
31#[derive(Debug, Clone, Default)]
33pub struct GetKnowledgeBasesParams {
34 pub location_id: String,
37 pub query: Option<String>,
39 pub limit: Option<f64>,
41 pub last_knowledge_base_id: Option<String>,
43}
44
45impl GetKnowledgeBasesParams {
46 pub fn new(location_id: impl Into<String>) -> Self {
48 Self {
49 location_id: location_id.into(),
50 ..Default::default()
51 }
52 }
53
54 pub fn query(mut self, v: impl Into<String>) -> Self {
56 self.query = Some(v.into());
57 self
58 }
59
60 pub fn limit(mut self, v: f64) -> Self {
62 self.limit = Some(v);
63 self
64 }
65
66 pub fn last_knowledge_base_id(mut self, v: impl Into<String>) -> Self {
68 self.last_knowledge_base_id = Some(v.into());
69 self
70 }
71
72 fn to_query(&self) -> Vec<(String, String)> {
73 let mut q: Vec<(String, String)> = vec![("locationId".into(), self.location_id.clone())];
74 if let Some(v) = &self.query {
75 q.push(("query".into(), v.to_string()));
76 }
77 if let Some(v) = &self.limit {
78 q.push(("limit".into(), v.to_string()));
79 }
80 if let Some(v) = &self.last_knowledge_base_id {
81 q.push(("lastKnowledgeBaseId".into(), v.to_string()));
82 }
83 q
84 }
85}
86
87#[derive(Debug, Clone, Default)]
90pub struct GetAllTrainedPageLinksByKnowledgeBaseParams {
91 pub knowledge_base_id: String,
94 pub location_id: String,
97 pub page: Option<f64>,
99 pub page_length: Option<f64>,
101 pub query: Option<String>,
103}
104
105impl GetAllTrainedPageLinksByKnowledgeBaseParams {
106 pub fn new(knowledge_base_id: impl Into<String>, location_id: impl Into<String>) -> Self {
108 Self {
109 knowledge_base_id: knowledge_base_id.into(),
110 location_id: location_id.into(),
111 ..Default::default()
112 }
113 }
114
115 pub fn page(mut self, v: f64) -> Self {
117 self.page = Some(v);
118 self
119 }
120
121 pub fn page_length(mut self, v: f64) -> Self {
123 self.page_length = Some(v);
124 self
125 }
126
127 pub fn query(mut self, v: impl Into<String>) -> Self {
129 self.query = Some(v.into());
130 self
131 }
132
133 fn to_query(&self) -> Vec<(String, String)> {
134 let mut q: Vec<(String, String)> = vec![
135 ("knowledgeBaseId".into(), self.knowledge_base_id.clone()),
136 ("locationId".into(), self.location_id.clone()),
137 ];
138 if let Some(v) = &self.page {
139 q.push(("page".into(), v.to_string()));
140 }
141 if let Some(v) = &self.page_length {
142 q.push(("pageLength".into(), v.to_string()));
143 }
144 if let Some(v) = &self.query {
145 q.push(("query".into(), v.to_string()));
146 }
147 q
148 }
149}
150
151#[derive(Debug, Clone, Default)]
154pub struct GetCrawlingStatusForTheLatestOperationParams {
155 pub location_id: String,
158 pub operation_id: String,
161 pub knowledge_base_id: String,
164}
165
166impl GetCrawlingStatusForTheLatestOperationParams {
167 pub fn new(
169 location_id: impl Into<String>,
170 operation_id: impl Into<String>,
171 knowledge_base_id: impl Into<String>,
172 ) -> Self {
173 Self {
174 location_id: location_id.into(),
175 operation_id: operation_id.into(),
176 knowledge_base_id: knowledge_base_id.into(),
177 }
178 }
179
180 fn to_query(&self) -> Vec<(String, String)> {
181 let q: Vec<(String, String)> = vec![
182 ("locationId".into(), self.location_id.clone()),
183 ("operationId".into(), self.operation_id.clone()),
184 ("knowledgeBaseId".into(), self.knowledge_base_id.clone()),
185 ];
186 q
187 }
188}
189
190#[derive(Debug, Clone, Default)]
193pub struct GetAllFaQsByKnowledgeBaseWithPaginationSupportParams {
194 pub knowledge_base_id: String,
197 pub location_id: String,
200 pub limit: Option<f64>,
202 pub last_faq_id: Option<String>,
204}
205
206impl GetAllFaQsByKnowledgeBaseWithPaginationSupportParams {
207 pub fn new(knowledge_base_id: impl Into<String>, location_id: impl Into<String>) -> Self {
209 Self {
210 knowledge_base_id: knowledge_base_id.into(),
211 location_id: location_id.into(),
212 ..Default::default()
213 }
214 }
215
216 pub fn limit(mut self, v: f64) -> Self {
218 self.limit = Some(v);
219 self
220 }
221
222 pub fn last_faq_id(mut self, v: impl Into<String>) -> Self {
224 self.last_faq_id = Some(v.into());
225 self
226 }
227
228 fn to_query(&self) -> Vec<(String, String)> {
229 let mut q: Vec<(String, String)> = vec![
230 ("knowledgeBaseId".into(), self.knowledge_base_id.clone()),
231 ("locationId".into(), self.location_id.clone()),
232 ];
233 if let Some(v) = &self.limit {
234 q.push(("limit".into(), v.to_string()));
235 }
236 if let Some(v) = &self.last_faq_id {
237 q.push(("lastFaqId".into(), v.to_string()));
238 }
239 q
240 }
241}
242
243impl KnowledgeBaseService {
244 pub async fn get_knowledge_bases(
248 &self,
249 params: &GetKnowledgeBasesParams,
250 ) -> Result<models::GetAllKnowledgeBasesPaginatedResponseDTO> {
251 let query = params.to_query();
252 self.client
253 .send_versioned(
254 reqwest::Method::GET,
255 "/knowledge-bases/",
256 &query,
257 None::<&()>,
258 Some("2021-04-15"),
259 )
260 .await
261 }
262
263 pub async fn post_knowledge_bases(
267 &self,
268 body: &models::CreateKnowledgeBaseDTO,
269 ) -> Result<models::CreateKnowledgeBaseResponseDTO> {
270 let query = Vec::new();
271 self.client
272 .send_versioned(
273 reqwest::Method::POST,
274 "/knowledge-bases/",
275 &query,
276 Some(body),
277 Some("2021-04-15"),
278 )
279 .await
280 }
281
282 pub async fn delete_trained_pages(
286 &self,
287 body: &models::DeleteWebsiteUrlRequestDTO,
288 ) -> Result<models::DeleteWebsiteUrlResponseDTO> {
289 let query = Vec::new();
290 self.client
291 .send_versioned(
292 reqwest::Method::DELETE,
293 "/knowledge-bases/crawler",
294 &query,
295 Some(body),
296 Some("2021-04-15"),
297 )
298 .await
299 }
300
301 pub async fn get_all_trained_page_links_by_knowledge_base(
305 &self,
306 params: &GetAllTrainedPageLinksByKnowledgeBaseParams,
307 ) -> Result<models::GetAllUrlsByKnowledgeBaseResponseDTO> {
308 let query = params.to_query();
309 self.client
310 .send_versioned(
311 reqwest::Method::GET,
312 "/knowledge-bases/crawler",
313 &query,
314 None::<&()>,
315 Some("2021-04-15"),
316 )
317 .await
318 }
319
320 pub async fn start_crawling_and_discover_pages_for_training(
324 &self,
325 body: &models::DiscoverWebsiteRequestDTO,
326 ) -> Result<models::DiscoverWebsiteResponseDTO> {
327 let query = Vec::new();
328 self.client
329 .send_versioned(
330 reqwest::Method::POST,
331 "/knowledge-bases/crawler",
332 &query,
333 Some(body),
334 Some("2021-04-15"),
335 )
336 .await
337 }
338
339 pub async fn get_crawling_status_for_the_latest_operation(
343 &self,
344 params: &GetCrawlingStatusForTheLatestOperationParams,
345 ) -> Result<models::CrawlingStatusResponseDTO> {
346 let query = params.to_query();
347 self.client
348 .send_versioned(
349 reqwest::Method::GET,
350 "/knowledge-bases/crawler/status",
351 &query,
352 None::<&()>,
353 Some("2021-04-15"),
354 )
355 .await
356 }
357
358 pub async fn post_knowledge_bases_crawler_train(
362 &self,
363 body: &models::TrainDiscoveredUrlsDTO,
364 ) -> Result<models::TrainDiscoveredUrlsResponseDTO> {
365 let query = Vec::new();
366 self.client
367 .send_versioned(
368 reqwest::Method::POST,
369 "/knowledge-bases/crawler/train",
370 &query,
371 Some(body),
372 Some("2021-04-15"),
373 )
374 .await
375 }
376
377 pub async fn get_all_fa_qs_by_knowledge_base_with_pagination_support(
384 &self,
385 params: &GetAllFaQsByKnowledgeBaseWithPaginationSupportParams,
386 ) -> Result<models::ListFaqsResponseDTO> {
387 let query = params.to_query();
388 self.client
389 .send_versioned(
390 reqwest::Method::GET,
391 "/knowledge-bases/faqs",
392 &query,
393 None::<&()>,
394 Some("2021-04-15"),
395 )
396 .await
397 }
398
399 pub async fn create_a_new_faq_inside_knowledge_base(
403 &self,
404 body: &models::AddFaqDTO,
405 ) -> Result<models::CreateFaqResponseDTO> {
406 let query = Vec::new();
407 self.client
408 .send_versioned(
409 reqwest::Method::POST,
410 "/knowledge-bases/faqs",
411 &query,
412 Some(body),
413 Some("2021-04-15"),
414 )
415 .await
416 }
417
418 pub async fn delete_an_existing_knowledge_base_faq(
422 &self,
423 id: &str,
424 ) -> Result<models::DeleteFaqResponseDTO> {
425 let path = format!("/knowledge-bases/faqs/{}", crate::services::encode(id));
426 let query = Vec::new();
427 self.client
428 .send_versioned(
429 reqwest::Method::DELETE,
430 &path,
431 &query,
432 None::<&()>,
433 Some("2021-04-15"),
434 )
435 .await
436 }
437
438 pub async fn update_an_existing_knowledge_base_faq(
442 &self,
443 id: &str,
444 body: &models::UpdateFaqBodyDTO,
445 ) -> Result<models::UpdateFaqResponseDTO> {
446 let path = format!("/knowledge-bases/faqs/{}", crate::services::encode(id));
447 let query = Vec::new();
448 self.client
449 .send_versioned(
450 reqwest::Method::PUT,
451 &path,
452 &query,
453 Some(body),
454 Some("2021-04-15"),
455 )
456 .await
457 }
458
459 pub async fn update_a_knowledge_base(
463 &self,
464 id: &str,
465 body: &models::UpdateKnowledgeBaseDTO,
466 ) -> Result<models::UpdateKnowledgeBaseResponseDTO> {
467 let path = format!("/knowledge-bases/{}", crate::services::encode(id));
468 let query = Vec::new();
469 self.client
470 .send_versioned(
471 reqwest::Method::PUT,
472 &path,
473 &query,
474 Some(body),
475 Some("2021-04-15"),
476 )
477 .await
478 }
479
480 pub async fn delete_a_knowledge_base(
484 &self,
485 knowledge_base_id: &str,
486 ) -> Result<models::DeleteKnowledgeBaseResponseDTO> {
487 let path = format!(
488 "/knowledge-bases/{}",
489 crate::services::encode(knowledge_base_id)
490 );
491 let query = Vec::new();
492 self.client
493 .send_versioned(
494 reqwest::Method::DELETE,
495 &path,
496 &query,
497 None::<&()>,
498 Some("2021-04-15"),
499 )
500 .await
501 }
502
503 pub async fn get_knowledge_base_by_id(
507 &self,
508 knowledge_base_id: &str,
509 ) -> Result<models::GetKnowledgeBaseByIdResponseDTO> {
510 let path = format!(
511 "/knowledge-bases/{}",
512 crate::services::encode(knowledge_base_id)
513 );
514 let query = Vec::new();
515 self.client
516 .send_versioned(
517 reqwest::Method::GET,
518 &path,
519 &query,
520 None::<&()>,
521 Some("2021-04-15"),
522 )
523 .await
524 }
525}