diff --git a/bun.lockb b/bun.lockb index cb32c781b3..22de1295d3 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/package.json b/package.json index e29626ced9..034075fe14 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,8 @@ }, "devDependencies": { "@eslint/js": "^9.15.0", + "@types/bun": "^1.1.14", + "bun-types": "^1.1.38", "eslint": "^9.15.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-prettier": "^5.2.1", diff --git a/packages/cockroach/migrations/01_message.sql b/packages/cockroach/migrations/01_message.sql new file mode 100644 index 0000000000..1236df5ae2 --- /dev/null +++ b/packages/cockroach/migrations/01_message.sql @@ -0,0 +1,24 @@ +CREATE TABLE IF NOT EXISTS message +( + id UUID NOT NULL DEFAULT gen_random_uuid(), + content TEXT NOT NULL, + creator VARCHAR(255) NOT NULL, + created TIMESTAMPTZ NOT NULL, + + PRIMARY KEY (id) +); + +CREATE TABLE IF NOT EXISTS message_place +( + workspace_id UUID NOT NULL, + card_id UUID NOT NULL, + message_id UUID NOT NULL, + + PRIMARY KEY (workspace_id, card_id, message_id), + FOREIGN KEY (message_id) REFERENCES message (id) ON DELETE CASCADE +); + + + +CREATE INDEX idx_message_place_workspace_card ON message_place (workspace_id, card_id); +CREATE INDEX idx_message_place_message_id ON message_place (message_id); diff --git a/packages/cockroach/migrations/02_patch.sql b/packages/cockroach/migrations/02_patch.sql new file mode 100644 index 0000000000..0f3baa5731 --- /dev/null +++ b/packages/cockroach/migrations/02_patch.sql @@ -0,0 +1,13 @@ +CREATE TABLE IF NOT EXISTS patch +( + id INT8 NOT NULL DEFAULT unique_rowid(), + message_id UUID NOT NULL, + content TEXT NOT NULL, + creator VARCHAR(255) NOT NULL, + created TIMESTAMPTZ NOT NULL, + + PRIMARY KEY (id), + FOREIGN KEY (message_id) REFERENCES message (id) ON DELETE CASCADE +); + +CREATE INDEX idx_patch_message_id ON patch (message_id); \ No newline at end of file diff --git a/packages/postgres/migrations/02_attachment.sql b/packages/cockroach/migrations/03_attachment.sql similarity index 62% rename from packages/postgres/migrations/02_attachment.sql rename to packages/cockroach/migrations/03_attachment.sql index b74d0ec0ed..6f73204548 100644 --- a/packages/postgres/migrations/02_attachment.sql +++ b/packages/cockroach/migrations/03_attachment.sql @@ -1,11 +1,12 @@ CREATE TABLE IF NOT EXISTS attachment ( - message_id INT8 NOT NULL, + message_id UUID NOT NULL, card_id UUID NOT NULL, creator VARCHAR(255) NOT NULL, created TIMESTAMPTZ NOT NULL DEFAULT now(), - PRIMARY KEY (message_id, card_id) + PRIMARY KEY (message_id, card_id), + FOREIGN KEY (message_id) REFERENCES message (id) ON DELETE CASCADE ); CREATE INDEX IF NOT EXISTS attachment_message_idx ON attachment (message_id); diff --git a/packages/cockroach/migrations/04_reaction.sql b/packages/cockroach/migrations/04_reaction.sql new file mode 100644 index 0000000000..3d3af2c087 --- /dev/null +++ b/packages/cockroach/migrations/04_reaction.sql @@ -0,0 +1,12 @@ +CREATE TABLE IF NOT EXISTS reaction +( + message_id UUID NOT NULL, + reaction VARCHAR(100) NOT NULL, + creator VARCHAR(255) NOT NULL, + created TIMESTAMPTZ NOT NULL DEFAULT now(), + + PRIMARY KEY (message_id, creator, reaction), + FOREIGN KEY (message_id) REFERENCES message (id) ON DELETE CASCADE +); + +CREATE INDEX IF NOT EXISTS reaction_message_idx ON reaction (message_id); diff --git a/packages/cockroach/migrations/05_notificationContext.sql b/packages/cockroach/migrations/05_notificationContext.sql new file mode 100644 index 0000000000..b461c45fc5 --- /dev/null +++ b/packages/cockroach/migrations/05_notificationContext.sql @@ -0,0 +1,15 @@ +CREATE TABLE IF NOT EXISTS notification_context +( + id UUID NOT NULL DEFAULT gen_random_uuid(), + workspace_id UUID NOT NULL, + card_id UUID NOT NULL, + + person_workspace UUID NOT NULL, + + archived_from TIMESTAMPTZ, + last_view TIMESTAMPTZ, + last_update TIMESTAMPTZ, + + PRIMARY KEY (id), + UNIQUE (workspace_id, card_id, person_workspace) +); diff --git a/packages/cockroach/migrations/06_notification.sql b/packages/cockroach/migrations/06_notification.sql new file mode 100644 index 0000000000..df4bcce202 --- /dev/null +++ b/packages/cockroach/migrations/06_notification.sql @@ -0,0 +1,9 @@ +CREATE TABLE IF NOT EXISTS notification +( + message_id UUID NOT NULL, + context UUID NOT NULL, + + PRIMARY KEY (message_id, context), + FOREIGN KEY (message_id) REFERENCES message (id) ON DELETE CASCADE, + FOREIGN KEY (context) REFERENCES notification_context (id) ON DELETE CASCADE +); diff --git a/packages/postgres/package.json b/packages/cockroach/package.json similarity index 80% rename from packages/postgres/package.json rename to packages/cockroach/package.json index 3a7faecac7..ac6244f46b 100644 --- a/packages/postgres/package.json +++ b/packages/cockroach/package.json @@ -1,10 +1,10 @@ { - "name": "@communication/postgres", + "name": "@communication/cockroach", "version": "0.1.0", "module": "src/index.ts", "type": "module", "devDependencies": { - "@types/bun": "^1.1.13" + "@types/bun": "^1.1.14" }, "dependencies": { "@communication/types": "workspace:*", diff --git a/packages/postgres/tsconfig.json b/packages/cockroach/tsconfig.json similarity index 100% rename from packages/postgres/tsconfig.json rename to packages/cockroach/tsconfig.json diff --git a/packages/types/package.json b/packages/types/package.json index b13a82c8f1..9c80d98093 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,10 +1,11 @@ { "name": "@communication/types", "version": "0.1.0", + "main": "src/index.ts", "module": "src/index.ts", "type": "module", "devDependencies": { - "@types/bun": "^1.1.13" + "@types/bun": "^1.1.14" }, "peerDependencies": { "typescript": "^5.6.3" diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts index 7a82e8d8a0..0d1134f9e2 100644 --- a/packages/types/src/index.ts +++ b/packages/types/src/index.ts @@ -1,2 +1,3 @@ export * from './message.ts' export * from './notification.ts' +export * from './query.ts' diff --git a/packages/types/src/message.ts b/packages/types/src/message.ts index e9b7fe9736..5641439e2e 100644 --- a/packages/types/src/message.ts +++ b/packages/types/src/message.ts @@ -1,9 +1,8 @@ -//TODO: Import from @platform export type CardID = string export type SocialID = string export type RichText = string -export type ID = bigint +export type ID = string export type MessageID = ID & { message: true } interface Object { @@ -14,14 +13,19 @@ interface Object { export interface Message extends Object { id: MessageID content: RichText - version: number + edited: Date reactions: Reaction[] attachments: Attachment[] } +export interface Patch extends Object { + message: MessageID + content: RichText +} + export interface Reaction extends Object { message: MessageID - reaction: number + reaction: string } export interface Attachment extends Object { diff --git a/packages/types/src/notification.ts b/packages/types/src/notification.ts index 5bfd1c2062..79b9b83a5e 100644 --- a/packages/types/src/notification.ts +++ b/packages/types/src/notification.ts @@ -1,14 +1,26 @@ -import type { Message, SocialID, CardID } from './message' +import type { Message, CardID, ID } from './message' + +export type ContextID = ID & { context: true } export interface Notification { message: Message - socialId: SocialID + context: ContextID read: boolean archived: boolean } export interface NotificationContext { + id: ContextID card: CardID - lastView: Date - lastUpdate: Date + workspace: string + personWorkspace: string + archivedFrom?: Date + lastView?: Date + lastUpdate?: Date +} + +export interface NotificationContextUpdate { + archivedFrom?: Date + lastView?: Date + lastUpdate?: Date } diff --git a/packages/types/src/query.ts b/packages/types/src/query.ts new file mode 100644 index 0000000000..302893542a --- /dev/null +++ b/packages/types/src/query.ts @@ -0,0 +1,47 @@ +import type { CardID, MessageID } from './message' +import type { ContextID } from './notification' + +export enum SortOrder { + Asc = 1, + Desc = -1 +} + +export enum Direction { + Backward = 1, + Forward = -1 +} + +export interface Window { + getResult(): T[] + + loadNextPage(): Promise + loadPrevPage(): Promise + + hasNextPage(): boolean + hasPrevPage(): boolean +} + +interface FindParams { + from?: Date + excluded?: boolean + direction?: Direction + sort?: SortOrder + limit?: number +} + +export interface FindMessagesParams extends FindParams { + id?: MessageID + card?: CardID +} + +export interface FindNotificationsParams extends FindParams { + context?: ContextID + message?: MessageID + read?: boolean + archived?: boolean +} + +export interface FindNotificationContextParams extends FindParams { + id?: ContextID + card?: CardID +}