SpaceManager
Файл:
backend/src/spaces/manager.rs
Управление пространствами (spaces) — логическими контейнерами для файлов, предназначенных для синхронизации и расшаривания. Включает CRUD пространств, управление файлами, обработку полученных пространств, конфликтов и tombstones.
SpaceName
Имя пространства валидируется на границе через newtype SpaceName (файл: commands/spaces.rs):
#[derive(Debug, Clone, Serialize, Deserialize, Type)]
#[serde(try_from = "String")]
pub struct SpaceName(String);
impl SpaceName {
pub fn new(name: &str) -> Result<Self, String> {
// trim, non-empty, ≤255 символов
}
}- При десериализации из JSON автоматически вызывается
TryFrom<String>, валидируя данные на входе create_spaceпринимает&SpaceNameвместо&str
Структура
| Поле | Тип | Описание |
|---|---|---|
db | Arc<Mutex<Connection>> | SQLite соединение |
Методы
| Метод | Сигнатура | Описание |
|---|---|---|
| CRUD | ||
create_space | fn(&self, identity_id, name: &SpaceName, ...) -> Result<Space> | Создать пространство |
get_space | fn(&self, space_id) -> Result<Option<Space>> | Получить по ID |
list_spaces | fn(&self, identity_id) -> Result<Vec<Space>> | Список по identity |
list_all_spaces | fn(&self) -> Result<Vec<Space>> | Все пространства |
update_space | fn(&self, space_id, ...) -> Result<()> | Обновить поля |
delete_space | fn(&self, space_id) -> Result<()> | Удалить + каскад |
| Files | ||
add_files | fn(&self, space_id, paths) -> Result<Vec<SpaceFile>> | Добавить файлы |
remove_file | fn(&self, file_id) -> Result<()> | Удалить файл |
list_files | fn(&self, space_id) -> Result<Vec<SpaceFile>> | Список файлов |
| Received | ||
save_received_space | fn(&self, space, files, ...) -> Result<()> | Сохранить полученное |
accept_received_space | fn(&self, space_id) -> Result<()> | Принять |
reject_received_space | fn(&self, space_id) -> Result<()> | Отклонить |
list_received_spaces | fn(&self) -> Result<Vec<ReceivedSpace>> | Список полученных |
| Conflicts | ||
add_conflict | fn(&self, ...) -> Result<String> | Добавить конфликт |
list_conflicts | fn(&self) -> Result<Vec<FileConflict>> | Список конфликтов |
resolve_conflict | fn(&self, id, resolution) -> Result<()> | Разрешить конфликт |
| Tombstones | ||
add_tombstone | fn(&self, type, id, device_id) -> Result<()> | Пометить удалённым |
list_tombstones | fn(&self) -> Result<Vec<Tombstone>> | Список tombstones |
has_tombstone | fn(&self, type, id) -> Result<bool> | Проверить наличие |
delete_space_authorized | fn(&self, space_id, proof: &IdentityProof) -> Result<()> | Удалить с проверкой владельца |
update_space_authorized | fn(&self, space_id, proof: &IdentityProof, ...) -> Result<()> | Обновить с проверкой владельца |
store_tombstones | fn(&self, tombstones) -> Result<()> | Batch insert |
gc_tombstones | fn(&self) -> Result<u64> | Удалить expired |
Зависимости
- SQLite — таблицы
spaces,space_files,received_spaces,sync_tombstones,sync_conflicts - blake3 — хеширование файлов и генерация ID
create_space
fn create_space(&self, identity_id: &str, name: &SpaceName, ...) -> Result<Space>
Создаёт новое пространство с опциональными настройками. Имя валидируется через SpaceName на границе сервиса.
Параметры
| Имя | Тип | Описание |
|---|---|---|
identity_id | &str | ID владельца |
name | &SpaceName | Имя пространства (валидированное) |
description | Option<&str> | Описание |
icon | Option<&str> | Иконка |
color | Option<&str> | Цвет |
sync_mode | Option<&str> | Режим синхронизации |
encryption | Option<bool> | Шифрование |
versioning | Option<bool> | Версионирование |
notifications | Option<bool> | Уведомления |
Логика
- Генерирует UUID v4 для space_id
- INSERT INTO spaces со всеми полями
Используется в:
create_space_svc
add_files
fn add_files(&self, space_id: &str, file_paths: &[String]) -> Result<Vec<SpaceFile>>
Добавляет файлы в пространство. Для каждого файла вычисляется blake3 hash.
Логика
- Для каждого файла:
- Читает метаданные (size, name)
- Вычисляет blake3 hash содержимого
- file_id = blake3(space_id + file_path)
- INSERT OR REPLACE INTO space_files
Используется в:
add_files_to_space_svc
save_received_space
fn save_received_space(&self, space: Space, files: Vec<SpaceFile>, from_identity_id: &str, from_identity_name: &str, share_type: &str) -> Result<()>
Сохраняет пространство, полученное от другого пользователя через P2P sharing.
Логика
- Проверяет тип: «shared» имеет приоритет над «published»
- INSERT OR REPLACE INTO spaces (обновляет если space_id уже существует)
- INSERT OR REPLACE файлы
- INSERT OR REPLACE INTO received_spaces (метаданные получения)
Используется в: внутренне в
SharingManagerпри получении Publish/Share сообщений
list_spaces / list_all_spaces / get_space
Запросы пространств:
list_spaces(identity_id)— SELECT WHERE identity_id = ?list_all_spaces()— SELECT * FROM spacesget_space(space_id)— SELECT WHERE id = ?
Используется в:
list_user_spaces_svc,get_user_space_svc,publish_space_svc
accept_received_space / reject_received_space
accept_received_space— UPDATE received_spaces SET accepted = 1reject_received_space— DELETE FROM spaces + space_files + received_spaces (каскад)
Используется в:
accept_space_svc,reject_space_svc
Conflict Management
add_conflict
Создаёт запись о конфликте при синхронизации (разные версии одного файла на разных устройствах).
resolve_conflict
Разрешает конфликт: UPDATE SET resolved = 1, resolution = ?, resolved_at = now
Используется в: внутренне в
SharingManagerпри синхронизации
Tombstone Management
Tombstones — маркеры удалённых сущностей для корректной синхронизации между устройствами.
add_tombstone(entity_type, entity_id, device_id)— INSERT OR IGNOREhas_tombstone(entity_type, entity_id) -> Result<bool>— проверка перед применением remote операций (пропагирует ошибки БД вместо тихогоunwrap_or(false))store_tombstones(tombstones)— batch insert из snapshot синхронизацииgc_tombstones()— удаление tombstones старше TTL (предотвращает неограниченный рост)
Используется в: внутренне в
SharingManagerпри синхронизации
Авторизованные операции (Capability-Based Security)
Деструктивные операции с пространствами защищены через IdentityProof — capability token, доступный только при наличии активной identity.
delete_space_authorized
fn delete_space_authorized(&self, space_id: &str, proof: &IdentityProof) -> Result<()>
Удаляет пространство с проверкой владельца. Если space.identity_id != proof.identity_id() — возвращает ошибку авторизации.
update_space_authorized
fn update_space_authorized(&self, space_id: &str, proof: &IdentityProof, ...) -> Result<()>
Обновляет пространство с проверкой владельца. Аналогичная проверка identity.
Используется в:
delete_space_svc,publish_space_svc,share_space_svc