/** * rChats Automerge document schemas. * * Granularity: one directory doc per space + one doc per channel. * DocId format: {space}:chats:channels (directory) * {space}:chats:channel:{channelId} (messages) */ import type { DocSchema } from '../../shared/local-first/document'; // ── Document types ── export interface ChannelInfo { id: string; name: string; description: string; isPrivate: boolean; createdBy: string | null; createdAt: number; updatedAt: number; visibility?: import('../../shared/membrane').ObjectVisibility; } export interface ChatsDirectoryDoc { meta: { module: string; collection: string; version: number; spaceSlug: string; createdAt: number; }; channels: Record; } export interface Member { userId: string; displayName: string; joinedAt: number; } export interface ChatMessage { id: string; channelId: string; authorId: string; authorName: string; content: string; replyTo: string | null; editedAt: number | null; createdAt: number; visibility?: import('../../shared/membrane').ObjectVisibility; } export interface ChatChannelDoc { meta: { module: string; collection: string; version: number; spaceSlug: string; createdAt: number; }; channelId: string; messages: Record; members: Record; } // ── Schema registration ── export const chatsDirectorySchema: DocSchema = { module: 'chats', collection: 'channels', version: 1, init: (): ChatsDirectoryDoc => ({ meta: { module: 'chats', collection: 'channels', version: 1, spaceSlug: '', createdAt: Date.now(), }, channels: {}, }), }; export const chatChannelSchema: DocSchema = { module: 'chats', collection: 'channel', version: 1, init: (): ChatChannelDoc => ({ meta: { module: 'chats', collection: 'channel', version: 1, spaceSlug: '', createdAt: Date.now(), }, channelId: '', messages: {}, members: {}, }), }; // ── Helpers ── export function chatsDirectoryDocId(space: string) { return `${space}:chats:channels` as const; } export function chatChannelDocId(space: string, channelId: string) { return `${space}:chats:channel:${channelId}` as const; }