Добавить источник
Как перенести записи нового провайдера в общее хранилище в виде записей источников, которые cli-core свяжет с людьми, событиями и документами.
У вас есть сервис — календарь, приложение для встреч, хранилище файлов, — и вы хотите, чтобы его записи были в общем хранилище WireCat и ими пользовались поиск и все остальные инструменты. Эта страница показывает шаги: выбрать сущность, которую питают ваши записи, записать их как записи источников, дать cli-core их связать и не пустить внутрь секреты. Она предполагает, что вы знаете основы.
Шаги
- Выберите сущность. Решите, что владелец имеет в виду под вашими записями: человека, событие или документ. Ваши записи — записи источников этой сущности. Если ничего не подходит, это новая общая сущность, и она требует изменения в cli-core, а не своей таблицы.
- Пишите через cli-core. Сохраняйте записи через области хранилища cli-core и никогда своим SQL (WC-STORE-5). Если в области нет нужного метода, добавьте его в cli-core вместе с тестом.
- Ключ — id провайдера. У каждой записи есть
account_idи id провайдера вexternal_id. Повторное сохранение той же записи обновляет её, а не добавляет копию. - Используйте стандартные имена. Поле, по которому фильтруют, сортируют, соединяют или которое показывают в списке,
— колонка со стандартным именем:
title,url,starts_at,ends_at,external_updated_at. Время — в миллисекундах UTC. Всё остальное — вmetadata, по списку разрешённых полей (WC-DATA-4, WC-DATA-5). - Дайте сопоставлению их связать. cli-core связывает вашу запись с сущностью по правилу: тот же ключ, общий id
вроде
ical_uidкалендаря, ссылка для входа или точный хеш содержимого. Два равных кандидата не дают связи. - Мягко удаляйте то, что исчезло. Когда провайдер перестаёт возвращать запись, она получает
deleted_at. Её сущность и связи владельца остаются (WC-DATA-7).
Пример: встречи Zoom
Инструмент zm уже сейчас так переносит встречи Zoom в хранилище:
- каждая встреча — строка
meetings, запись источника, сохранённая через хранилище встреч cli-core; account_id— аккаунт Zoom,external_id— id встречи в Zoom, вместе они уникальны;event_idуказывает на событие — сущность — и выставляется при связывании событий;- участники — учётные записи, поэтому участник Zoom и тот же человек в Telegram могут сойтись в одном человеке.
Запись разговора, пришедшая позже, находит ту же строку по ключу и обновляет её.
Никогда не хранить
- токены, пароли и ключи (правила безопасности);
- коды доступа к встречам, PIN-коды и параметры запроса в ссылке для входа;
- сырой ответ провайдера; храните только разрешённые поля.
Зарегистрируйте провайдера
При каждом запуске ваш инструмент записывает своего провайдера в хранилище: имя, вид, псевдонимы и команду. Тогда все остальные инструменты узнают о новом источнике без выпуска cli-core. Строки провайдера, которого ни один инструмент не записал, пропускаются с пояснением и никогда не ищутся как сообщения.
import { openStore } from "@wirecat/cli-core/store"
const store = await openStore()
await store.accounts.registerProvider({ name: "acme", kind: "meetings", aliases: ["acme"], command: "acme" })kind — как поиск читает ваши записи: messages, mail, notes, documents, meetings или events.
Что сломается, если это пропустить
Без external_id каждая синхронизация добавляет ту же запись снова. Без мягкого удаления неудачная синхронизация стирает
то, что владелец связал или написал. Без общих областей хранилища следующая миграция cli-core ломает ваш инструмент.
Дальше: Хранить свои данные.
Основы за пять минут
Сущности, записи источников, external_id, связи и список на проверку: модель, которой следует каждый инструмент на общем хранилище WireCat.
Хранить свои данные
Где инструмент держит таблицы, которые не нужны другим, — контрольные точки синхронизации и кэши, — и как они ссылаются на общие записи.