Модель Raw#
Назначение#
Raw выделен в отдельный домен, потому что часть пользовательских данных должна храниться в неструктурированном виде до последующей обработки.Raw обеспечивает быстрый capture без обязательной классификации и без немедленного размещения в Library.
Контракт#
- Реализация core ДОЛЖНА включать
Raw как домен хранения уровня аккаунта для неструктурированного capture. Raw ДОЛЖЕН поддерживать быстрое сохранение без выбора активной библиотеки.Raw ДОЛЖЕН поддерживать разбор и отложенную обработку сохраненных элементов.- Элементы
Raw ДОЛЖНЫ поддерживать явный последующий перенос в Library.
Поддерживаемые payload-типы#
Raw ДОЛЖЕН поддерживать payload-типы text, link, mixed.Raw МОЖЕТ поддерживать file_ref как reference-only payload.- Типы
image, video, audio не входят в обязательный baseline scope.
Модель хранения Raw Item#
- Хранение ДОЛЖНО быть ориентировано на typed-columns-first для горячих read-path.
- Реализация НЕ ДОЛЖНА опираться на JSON-only хранение для горячих list/filter-path.
- Каждый
RawItem ДОЛЖЕН содержать: id, account_id, payload_type, status, created_at, updated_at. - Реализация ДОЛЖНА/РЕКОМЕНДУЕТСЯ хранить легкие поля для быстрых списков (
title_preview, source/type/status).
Каналы записи (capture)#
Raw ДОЛЖЕН принимать capture из ручного ввода и буфера обмена/paste.Raw ДОЛЖЕН/МОЖЕТ принимать external share/import при поддержке клиентом/рантаймом.- Capture НЕ ДОЛЖЕН зависеть от сетевой доступности.
Обогащение метаданными#
- Для
link metadata enrichment МОЖЕТ выполняться асинхронно после capture. - Ошибки получения метаданных НЕ ДОЛЖНЫ блокировать завершение capture.
- Если метаданные недоступны, реализация ДОЛЖНА использовать детерминированный fallback-preview.
Lifecycle и операции#
- Реализация ДОЛЖНА поддерживать состояния, эквивалентные
new | triaged | promoted | archived. - Реализация ДОЛЖНА поддерживать list и смену статусов для triage.
- Реализация ДОЛЖНА поддерживать явную операцию
promote из Raw в Library.
promote ДОЛЖЕН валидировать, что target_library_id принадлежит тому же account_id.promote ДОЛЖЕН быть идемпотентным для одного RawItem и НЕ ДОЛЖЕН создавать дубли при retry.promote ДОЛЖЕН сохранять связь с созданной сущностью библиотеки (promoted_content_id или эквивалент origin-link).
Raw:text
- Целевой тип по умолчанию:
misc (или тип, явно выбранный пользователем). title маппится из raw-заголовка при наличии; fallback использует preview/начало текста.summary маппится из текстового payload.
Raw:link
- Целевой тип по умолчанию:
resource с подтипом по умолчанию site. title маппится из metadata title; fallback использует host/URL.source_url маппится из URL ссылки.summary может маппиться из metadata description при наличии.
Raw:mixed
- Целевой тип по умолчанию:
misc (или тип, явно выбранный пользователем). title маппится по правилам текстового payload.summary маппится из текстовой части mixed payload.- Если ссылка одна, она может маппиться в
source_url; дополнительные ссылки сохраняются в связанных notes/attachments.
Raw:file_ref
- Целевой тип по умолчанию:
resource с подтипом по умолчанию document. title маппится из имени файла или basename uri.- Ссылка на файл маппится в dataset вложений (
uri, name, mime, size при наличии).
- Успешный promote ДОЛЖЕН устанавливать
RawItem.status в promoted. - Успешный promote ДОЛЖЕН устанавливать или сохранять
promoted_content_id. - Повторный promote для того же
RawItem ДОЛЖЕН возвращать существующую связь и НЕ ДОЛЖЕН создавать дубликаты контента.
Scope синхронизации#
Raw относится к account-scoped уровню и ДОЛЖЕН синхронизироваться между устройствами при включенном sync-режиме.- Синхронизация
Raw ДОЛЖНА быть асинхронной и НЕ ДОЛЖНА блокировать локальные оффлайн-операции. - Передача данных sync ДОЛЖНА выполняться по защищенному каналу.
Инварианты#
- Cross-account доступ к
Raw в одной активной сессии ДОЛЖЕН отклоняться. - Операции записи ДОЛЖНЫ отклоняться, пока сессия заблокирована.
- Перенос в библиотеку вне границ активного аккаунта ДОЛЖЕН отклоняться.