import { FSDB_COLLECTION } from '@andyburke/fsdb'; import { by_lurid } from '@andyburke/fsdb/organizers'; import { FSDB_INDEXER_SYMLINKS } from '@andyburke/fsdb/indexers'; /** * @typedef {object} WATCH_TIMESTAMPS * @property {string} created the created date of the watch * @property {string} updated the last updated date, usually coinciding with the last seen id being changed */ export type WATCH_TIMESTAMPS = { created: string; updated: string; }; /** * WATCH * * @property {string} id - lurid (stable) * @property {string} creator_id - user id of the watch creator * @property {string} [type] - a filter for event type * @property {string} [parent_id] - a filter for event parent_id * @property {string} [channel] - a filter for event channel * @property {string} [topic] - a filter for event topic * @property {string[]} [tags] - a filter for event tags * @property {Record} [data] - a filter on event data, each leaf should be a RegExp * @property {string} last_id_seen - the last id the user has seen for this watch * @property {string} [last_id_notified] - the last id the user was notified about for this watch * @property {Record} [meta] - optional metadata about the watch * @property {WATCH_TIMESTAMPS} timestamps - timestamps for the watch */ export type WATCH = { id: string; creator_id: string; type?: string; parent_id?: string; channel?: string; topic?: string; tags?: string[]; data?: Record; last_id_seen: string; last_id_notified?: string; meta?: Record; timestamps: WATCH_TIMESTAMPS; }; export const WATCHES = new FSDB_COLLECTION({ name: 'watches', id_field: 'id', organize: by_lurid, indexers: { creator_id: new FSDB_INDEXER_SYMLINKS({ name: 'creator_id', field: 'creator_id', to_many: true, organize: by_lurid }), type: new FSDB_INDEXER_SYMLINKS({ name: 'type', field: 'type', to_many: true, organize: (type: string) => [type], organize_id: by_lurid }), parent_id: new FSDB_INDEXER_SYMLINKS({ name: 'parent_id', field: 'parent_id', to_many: true, organize: by_lurid, organize_id: by_lurid }), channel: new FSDB_INDEXER_SYMLINKS({ name: 'channel', field: 'channel', to_many: true, organize: (channel: string) => channel.length > 3 ? [channel.substring(0, 3), channel] : [channel], organize_id: by_lurid }), topic: new FSDB_INDEXER_SYMLINKS({ name: 'topic', field: 'topic', to_many: true, organize: (topic: string) => topic.length > 3 ? [topic.substring(0, 3), topic] : [topic], organize_id: by_lurid }), tags: new FSDB_INDEXER_SYMLINKS({ name: 'tags', field: 'tags', to_many: true, organize: (tag: string) => tag.length > 3 ? [tag.substring(0, 3), tag] : [tag], organize_id: by_lurid }) } });