Skip to main content

vdsl_sync/infra/
topology_file_store.rs

1//! TopologyFileStore — TopologyFile永続化トレイト。
2//!
3//! TopologyFile(ファイル身元 / inode)のCRUD + ハッシュ検索。
4
5use async_trait::async_trait;
6
7use crate::domain::file_type::FileType;
8use crate::domain::topology_file::TopologyFile;
9use crate::infra::error::InfraError;
10
11/// TopologyFile永続化。
12///
13/// Topology上のファイル身元情報(canonical_hash, relative_path, file_type等)を管理する。
14/// LocationFile(各Locationでの実体情報)は [`LocationFileStore`] が管理する。
15#[async_trait]
16pub trait TopologyFileStore: Send + Sync {
17    /// TopologyFileを保存(新規 or 更新)。
18    ///
19    /// idが既存の場合はUPDATE、なければINSERT。
20    async fn upsert(&self, file: &TopologyFile) -> Result<(), InfraError>;
21
22    /// IDでTopologyFileを取得。
23    async fn get_by_id(&self, id: &str) -> Result<Option<TopologyFile>, InfraError>;
24
25    /// relative_pathでTopologyFileを取得(deleted除外)。
26    async fn get_by_path(&self, relative_path: &str) -> Result<Option<TopologyFile>, InfraError>;
27
28    /// canonical_hashでTopologyFileを検索(deleted除外)。
29    ///
30    /// rename検出で使用: スキャン結果のcontent_hashがTopologyFileのcanonical_hashに一致
31    /// すれば同一Entity。
32    async fn find_by_canonical_hash(&self, hash: &str) -> Result<Option<TopologyFile>, InfraError>;
33
34    /// 生存中(deleted_at IS NULL)のTopologyFile一覧。
35    async fn list_active(
36        &self,
37        file_type: Option<FileType>,
38        limit: Option<usize>,
39    ) -> Result<Vec<TopologyFile>, InfraError>;
40
41    /// 削除済み(deleted_at IS NOT NULL)のTopologyFile一覧。
42    ///
43    /// distribute_delete_actions()で使用: 削除済みファイルのLocationFileを掃除する。
44    async fn list_deleted(&self) -> Result<Vec<TopologyFile>, InfraError>;
45
46    /// 生存中ファイル数。
47    async fn count_active(&self) -> Result<usize, InfraError>;
48
49    /// 全TopologyFileのrelative_path一覧(deleted除外)。
50    ///
51    /// スキャン結果との差分でVanished検出に使用。
52    async fn list_active_paths(&self) -> Result<Vec<String>, InfraError>;
53}