mirror of
https://github.com/meilisearch/MeiliSearch
synced 2024-09-22 08:31:45 +02:00
140 lines
5.6 KiB
Rust
140 lines
5.6 KiB
Rust
|
use serde::Serialize;
|
||
|
use time::{Duration, OffsetDateTime};
|
||
|
|
||
|
use crate::error::ResponseError;
|
||
|
use crate::settings::{Settings, Unchecked};
|
||
|
use crate::tasks::{serialize_duration, Details, IndexSwap, Kind, Status, Task, TaskId};
|
||
|
|
||
|
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
|
||
|
#[serde(rename_all = "camelCase")]
|
||
|
pub struct TaskView {
|
||
|
pub uid: TaskId,
|
||
|
#[serde(default)]
|
||
|
pub index_uid: Option<String>,
|
||
|
pub status: Status,
|
||
|
#[serde(rename = "type")]
|
||
|
pub kind: Kind,
|
||
|
pub canceled_by: Option<TaskId>,
|
||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||
|
pub details: Option<DetailsView>,
|
||
|
pub error: Option<ResponseError>,
|
||
|
#[serde(serialize_with = "serialize_duration", default)]
|
||
|
pub duration: Option<Duration>,
|
||
|
#[serde(with = "time::serde::rfc3339")]
|
||
|
pub enqueued_at: OffsetDateTime,
|
||
|
#[serde(with = "time::serde::rfc3339::option", default)]
|
||
|
pub started_at: Option<OffsetDateTime>,
|
||
|
#[serde(with = "time::serde::rfc3339::option", default)]
|
||
|
pub finished_at: Option<OffsetDateTime>,
|
||
|
}
|
||
|
|
||
|
impl TaskView {
|
||
|
pub fn from_task(task: &Task) -> TaskView {
|
||
|
TaskView {
|
||
|
uid: task.uid,
|
||
|
index_uid: task.index_uid().map(ToOwned::to_owned),
|
||
|
status: task.status,
|
||
|
kind: task.kind.as_kind(),
|
||
|
canceled_by: task.canceled_by,
|
||
|
details: task.details.clone().map(DetailsView::from),
|
||
|
error: task.error.clone(),
|
||
|
duration: task.started_at.zip(task.finished_at).map(|(start, end)| end - start),
|
||
|
enqueued_at: task.enqueued_at,
|
||
|
started_at: task.started_at,
|
||
|
finished_at: task.finished_at,
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#[derive(Default, Debug, PartialEq, Eq, Clone, Serialize)]
|
||
|
#[serde(rename_all = "camelCase")]
|
||
|
pub struct DetailsView {
|
||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||
|
pub received_documents: Option<u64>,
|
||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||
|
pub indexed_documents: Option<Option<u64>>,
|
||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||
|
pub primary_key: Option<Option<String>>,
|
||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||
|
pub provided_ids: Option<usize>,
|
||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||
|
pub deleted_documents: Option<Option<u64>>,
|
||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||
|
pub matched_tasks: Option<u64>,
|
||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||
|
pub canceled_tasks: Option<Option<u64>>,
|
||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||
|
pub deleted_tasks: Option<Option<u64>>,
|
||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||
|
pub original_filter: Option<Option<String>>,
|
||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||
|
pub dump_uid: Option<Option<String>>,
|
||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||
|
#[serde(flatten)]
|
||
|
pub settings: Option<Box<Settings<Unchecked>>>,
|
||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||
|
pub swaps: Option<Vec<IndexSwap>>,
|
||
|
}
|
||
|
|
||
|
impl From<Details> for DetailsView {
|
||
|
fn from(details: Details) -> Self {
|
||
|
match details {
|
||
|
Details::DocumentAdditionOrUpdate { received_documents, indexed_documents } => {
|
||
|
DetailsView {
|
||
|
received_documents: Some(received_documents),
|
||
|
indexed_documents: Some(indexed_documents),
|
||
|
..DetailsView::default()
|
||
|
}
|
||
|
}
|
||
|
Details::SettingsUpdate { settings } => {
|
||
|
DetailsView { settings: Some(settings), ..DetailsView::default() }
|
||
|
}
|
||
|
Details::IndexInfo { primary_key } => {
|
||
|
DetailsView { primary_key: Some(primary_key), ..DetailsView::default() }
|
||
|
}
|
||
|
Details::DocumentDeletion {
|
||
|
provided_ids: received_document_ids,
|
||
|
deleted_documents,
|
||
|
} => DetailsView {
|
||
|
provided_ids: Some(received_document_ids),
|
||
|
deleted_documents: Some(deleted_documents),
|
||
|
original_filter: Some(None),
|
||
|
..DetailsView::default()
|
||
|
},
|
||
|
Details::DocumentDeletionByFilter { original_filter, deleted_documents } => {
|
||
|
DetailsView {
|
||
|
provided_ids: Some(0),
|
||
|
original_filter: Some(Some(original_filter)),
|
||
|
deleted_documents: Some(deleted_documents),
|
||
|
..DetailsView::default()
|
||
|
}
|
||
|
}
|
||
|
Details::ClearAll { deleted_documents } => {
|
||
|
DetailsView { deleted_documents: Some(deleted_documents), ..DetailsView::default() }
|
||
|
}
|
||
|
Details::TaskCancelation { matched_tasks, canceled_tasks, original_filter } => {
|
||
|
DetailsView {
|
||
|
matched_tasks: Some(matched_tasks),
|
||
|
canceled_tasks: Some(canceled_tasks),
|
||
|
original_filter: Some(Some(original_filter)),
|
||
|
..DetailsView::default()
|
||
|
}
|
||
|
}
|
||
|
Details::TaskDeletion { matched_tasks, deleted_tasks, original_filter } => {
|
||
|
DetailsView {
|
||
|
matched_tasks: Some(matched_tasks),
|
||
|
deleted_tasks: Some(deleted_tasks),
|
||
|
original_filter: Some(Some(original_filter)),
|
||
|
..DetailsView::default()
|
||
|
}
|
||
|
}
|
||
|
Details::Dump { dump_uid } => {
|
||
|
DetailsView { dump_uid: Some(dump_uid), ..DetailsView::default() }
|
||
|
}
|
||
|
Details::IndexSwap { swaps } => {
|
||
|
DetailsView { swaps: Some(swaps), ..Default::default() }
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|