Skip to main content

vdsl_sync/infra/
location_file_store.rs

1//! LocationFileStore — LocationFile永続化トレイト。
2//!
3//! LocationFile(各Locationでのファイル実体情報)のCRUD。
4//! TopologyFile(身元 / inode)は [`TopologyFileStore`] が管理する。
5
6use async_trait::async_trait;
7
8use crate::domain::location::LocationId;
9use crate::domain::location_file::LocationFile;
10use crate::infra::error::InfraError;
11
12/// LocationFile永続化。
13///
14/// `(file_id, location_id)` が一意キー。
15/// file_idはTopologyFile.idに対応する。
16#[async_trait]
17pub trait LocationFileStore: Send + Sync {
18    /// LocationFileを保存(新規 or 更新)。
19    ///
20    /// `(file_id, location_id)` が既存ならUPDATE、なければINSERT。
21    async fn upsert(&self, file: &LocationFile) -> Result<(), InfraError>;
22
23    /// `(file_id, location_id)` でLocationFileを取得。
24    async fn get(
25        &self,
26        file_id: &str,
27        location_id: &LocationId,
28    ) -> Result<Option<LocationFile>, InfraError>;
29
30    /// あるファイルの全Location分のLocationFileを取得。
31    ///
32    /// distribute_actions()の入力用: file_id → Vec<LocationFile>。
33    async fn list_by_file(&self, file_id: &str) -> Result<Vec<LocationFile>, InfraError>;
34
35    /// あるLocationの全LocationFileを取得。
36    ///
37    /// スキャン時の比較用: location_id → Vec<LocationFile>。
38    async fn list_by_location(
39        &self,
40        location_id: &LocationId,
41    ) -> Result<Vec<LocationFile>, InfraError>;
42
43    /// 複数ファイルの全LocationFileを一括取得。
44    ///
45    /// file_id → Vec<LocationFile> のマップを返す。
46    /// distribute_actions()のバッチ入力用。N+1回避。
47    async fn list_by_files(
48        &self,
49        file_ids: &[&str],
50    ) -> Result<std::collections::HashMap<String, Vec<LocationFile>>, InfraError>;
51
52    /// LocationFileを削除。削除した場合true。
53    async fn delete(&self, file_id: &str, location_id: &LocationId) -> Result<bool, InfraError>;
54
55    /// あるLocationのLocationFile数。
56    async fn count_by_location(&self, location_id: &LocationId) -> Result<usize, InfraError>;
57}