refactor: decouple meta plugins from DB via SaveMetaFn callback, extract shared utilities
- Add SaveMetaFn callback pattern: meta plugins receive a closure instead of
&Connection, enabling the same plugin code to work in local, client, and
server contexts (collect-to-Vec, collect-to-HashMap, or direct DB write)
- Client save now runs meta plugins locally during streaming (smart client
sets meta=false, server skips its own plugins)
- Add POST /api/item/{id}/update endpoint for re-running plugins on stored
content without downloading compressed data
- Add client update mode (--update with --meta-plugin flags)
- Extract shared utilities: stream_copy, print_serialized, build_path_table,
ensure_default_tag to reduce duplication across modes
- Add upsert_tag for idempotent tag addition (INSERT OR IGNORE)
- Add warn logging on save_meta lock failure in BaseMetaPlugin and MetaService
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
use crate::common::status::PathInfo;
|
||||
use crate::compression_engine::CompressionType;
|
||||
/// Common utilities shared across different modes in the Keep application.
|
||||
///
|
||||
@@ -564,6 +565,28 @@ pub fn apply_color(mut cell: Cell, color: &config::TableColor, is_foreground: bo
|
||||
cell
|
||||
}
|
||||
|
||||
/// Ensures tags has at least one entry, adding "none" if empty.
|
||||
pub fn ensure_default_tag(tags: &mut Vec<String>) {
|
||||
if tags.is_empty() {
|
||||
tags.push("none".to_string());
|
||||
}
|
||||
}
|
||||
|
||||
/// Prints a serializable value in JSON or YAML format based on output format.
|
||||
///
|
||||
/// Only handles Json and Yaml variants; Table should be handled separately.
|
||||
pub fn print_serialized<T: serde::Serialize>(
|
||||
value: &T,
|
||||
format: &OutputFormat,
|
||||
) -> anyhow::Result<()> {
|
||||
match format {
|
||||
OutputFormat::Json => println!("{}", serde_json::to_string_pretty(value)?),
|
||||
OutputFormat::Yaml => println!("{}", serde_yaml::to_string(value)?),
|
||||
OutputFormat::Table => unreachable!(),
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Applies config TableAttribute to a comfy-table Cell.
|
||||
pub fn apply_table_attribute(mut cell: Cell, attribute: &config::TableAttribute) -> Cell {
|
||||
match attribute {
|
||||
@@ -580,3 +603,18 @@ pub fn apply_table_attribute(mut cell: Cell, attribute: &config::TableAttribute)
|
||||
|
||||
cell
|
||||
}
|
||||
|
||||
/// Builds a table showing data and database path information.
|
||||
pub fn build_path_table(path_info: &PathInfo, table_config: &config::TableConfig) -> Table {
|
||||
let mut path_table = create_table_with_config(table_config);
|
||||
|
||||
path_table.set_header(vec![
|
||||
Cell::new("Type").add_attribute(Attribute::Bold),
|
||||
Cell::new("Path").add_attribute(Attribute::Bold),
|
||||
]);
|
||||
|
||||
path_table.add_row(vec!["Data", &path_info.data]);
|
||||
path_table.add_row(vec!["Database", &path_info.database]);
|
||||
|
||||
path_table
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user