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 fn set_value(
89 &self,
90 serial: &str,
91 field: &str,
92 value: &str,
93 source: ValueSource,
94 source_detail: Option<&str>,
95 confidence: Confidence,
96 ) -> RepoResult<()>;
97
98 fn get_values(&self, serial: &str, field: &str) -> RepoResult<Vec<ItemValue>>;
100
101 fn get_best_value(&self, serial: &str, field: &str) -> RepoResult<Option<ItemValue>>;
103
104 fn get_all_values(&self, serial: &str) -> RepoResult<Vec<ItemValue>>;
106
107 fn get_best_values(&self, serial: &str) -> RepoResult<HashMap<String, String>>;
109
110 fn get_all_items_best_values(&self) -> RepoResult<HashMap<String, HashMap<String, String>>>;
112
113 fn stats(&self) -> RepoResult<DbStats>;
117
118 fn migrate_column_values(&self, dry_run: bool) -> RepoResult<MigrationStats>;
122}
123
124#[cfg(feature = "attachments")]
126pub trait AttachmentsRepository {
127 fn add_attachment(
129 &self,
130 serial: &str,
131 name: &str,
132 mime_type: &str,
133 data: &[u8],
134 view: &str,
135 ) -> RepoResult<i64>;
136
137 fn get_attachments(&self, serial: &str) -> RepoResult<Vec<Attachment>>;
139
140 fn get_attachment_data(&self, id: i64) -> RepoResult<Option<Vec<u8>>>;
142
143 fn delete_attachment(&self, id: i64) -> RepoResult<bool>;
145}
146
147pub trait ImportExportRepository {
149 fn import_from_dir(&self, dir: &std::path::Path) -> RepoResult<String>;
151
152 fn export_to_dir(&self, serial: &str, dir: &std::path::Path) -> RepoResult<()>;
154}
155
156pub trait BulkRepository {
158 fn add_items_bulk(&self, serials: &[&str]) -> RepoResult<BulkResult>;
160
161 fn set_values_bulk(&self, values: &[BulkValueSet]) -> RepoResult<BulkResult>;
163}
164
165#[derive(Debug, Clone)]
167pub struct BulkValueSet {
168 pub serial: String,
169 pub field: String,
170 pub value: String,
171 pub source: ValueSource,
172 pub source_detail: Option<String>,
173 pub confidence: Confidence,
174}
175
176#[derive(Debug, Clone, Default)]
178pub struct BulkResult {
179 pub succeeded: usize,
180 pub failed: usize,
181 pub errors: Vec<(String, String)>, }