1use crate::types::*;
6use std::collections::HashMap;
7
8#[derive(Debug, thiserror::Error)]
10pub enum RepoError {
11 #[error("Item not found: {0}")]
12 NotFound(String),
13
14 #[error("Database error: {0}")]
15 Database(String),
16
17 #[error("IO error: {0}")]
18 Io(#[from] std::io::Error),
19
20 #[error("Parse error: {0}")]
21 Parse(#[from] ParseError),
22}
23
24pub type RepoResult<T> = Result<T, RepoError>;
26
27pub trait ItemsRepository {
29 fn init(&self) -> RepoResult<()>;
31
32 fn add_item(&self, serial: &str) -> RepoResult<()>;
36
37 fn get_item(&self, serial: &str) -> RepoResult<Option<Item>>;
39
40 fn update_item(&self, serial: &str, update: &ItemUpdate) -> RepoResult<()>;
42
43 fn list_items(&self, filter: &ItemFilter) -> RepoResult<Vec<Item>>;
45
46 fn delete_item(&self, serial: &str) -> RepoResult<bool>;
48
49 fn set_verification_status(
53 &self,
54 serial: &str,
55 status: VerificationStatus,
56 notes: Option<&str>,
57 ) -> RepoResult<()>;
58
59 fn set_legal(&self, serial: &str, legal: bool) -> RepoResult<()>;
61
62 fn set_all_legal(&self, legal: bool) -> RepoResult<usize>;
64
65 fn set_item_type(&self, serial: &str, item_type: &str) -> RepoResult<()>;
69
70 fn set_source(&self, serial: &str, source: &str) -> RepoResult<()>;
72
73 fn set_source_for_null(&self, source: &str) -> RepoResult<usize>;
75
76 fn set_source_where(&self, source: &str, condition: &str) -> RepoResult<usize>;
79
80 fn get_parts(&self, serial: &str) -> RepoResult<Vec<ItemPart>>;
84
85 #[allow(clippy::too_many_arguments)] fn set_value(
90 &self,
91 serial: &str,
92 field: &str,
93 value: &str,
94 source: ValueSource,
95 source_detail: Option<&str>,
96 confidence: Confidence,
97 ) -> RepoResult<()>;
98
99 fn get_values(&self, serial: &str, field: &str) -> RepoResult<Vec<ItemValue>>;
101
102 fn get_best_value(&self, serial: &str, field: &str) -> RepoResult<Option<ItemValue>>;
104
105 fn get_all_values(&self, serial: &str) -> RepoResult<Vec<ItemValue>>;
107
108 fn get_best_values(&self, serial: &str) -> RepoResult<HashMap<String, String>>;
110
111 fn get_all_items_best_values(&self) -> RepoResult<HashMap<String, HashMap<String, String>>>;
113
114 fn stats(&self) -> RepoResult<DbStats>;
118
119 fn migrate_column_values(&self, dry_run: bool) -> RepoResult<MigrationStats>;
123}
124
125#[cfg(feature = "attachments")]
127pub trait AttachmentsRepository {
128 #[allow(clippy::too_many_arguments)] fn add_attachment(
131 &self,
132 serial: &str,
133 name: &str,
134 mime_type: &str,
135 data: &[u8],
136 view: &str,
137 ) -> RepoResult<i64>;
138
139 fn get_attachments(&self, serial: &str) -> RepoResult<Vec<Attachment>>;
141
142 fn get_attachment_data(&self, id: i64) -> RepoResult<Option<Vec<u8>>>;
144
145 fn delete_attachment(&self, id: i64) -> RepoResult<bool>;
147}
148
149pub trait ImportExportRepository {
151 fn import_from_dir(&self, dir: &std::path::Path) -> RepoResult<String>;
153
154 fn export_to_dir(&self, serial: &str, dir: &std::path::Path) -> RepoResult<()>;
156}
157
158pub trait BulkRepository {
160 fn add_items_bulk(&self, serials: &[&str]) -> RepoResult<BulkResult>;
162
163 fn set_values_bulk(&self, values: &[BulkValueSet]) -> RepoResult<BulkResult>;
165}
166
167#[derive(Debug, Clone)]
169pub struct BulkValueSet {
170 pub serial: String,
171 pub field: String,
172 pub value: String,
173 pub source: ValueSource,
174 pub source_detail: Option<String>,
175 pub confidence: Confidence,
176}
177
178#[derive(Debug, Clone, Default)]
180pub struct BulkResult {
181 pub succeeded: usize,
182 pub failed: usize,
183 pub errors: Vec<(String, String)>, }