From a1c48cf912e02bf396bc1d37e7ab0fc0a1c53664 Mon Sep 17 00:00:00 2001 From: gbx-cyber2 Date: Mon, 31 Aug 2026 11:07:58 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=9003-Database=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- database/graphql/message.graphql | 12 +++++-- database/hasura/hasura_metadata.json | 25 ++++++++++++++- .../hasura/metadata/databases/databases.yaml | 4 +-- .../tables/public_message.yaml | 14 +++++++++ .../tables/public_room.yaml | 0 .../tables/public_user.yaml | 0 .../tables/public_user_room.yaml | 0 .../tables/tables.yaml | 0 database/sql/message.sql | 31 +++++++++++++++++++ 9 files changed, 81 insertions(+), 5 deletions(-) rename database/hasura/metadata/databases/{workshop => web-workshop}/tables/public_message.yaml (74%) rename database/hasura/metadata/databases/{workshop => web-workshop}/tables/public_room.yaml (100%) rename database/hasura/metadata/databases/{workshop => web-workshop}/tables/public_user.yaml (100%) rename database/hasura/metadata/databases/{workshop => web-workshop}/tables/public_user_room.yaml (100%) rename database/hasura/metadata/databases/{workshop => web-workshop}/tables/tables.yaml (100%) diff --git a/database/graphql/message.graphql b/database/graphql/message.graphql index 994647c..13b7906 100644 --- a/database/graphql/message.graphql +++ b/database/graphql/message.graphql @@ -1,5 +1,5 @@ -mutation addMessage($user_uuid: uuid!, $room_uuid: uuid!, $content: String!) { - insert_message_one(object: {user_uuid: $user_uuid, room_uuid: $room_uuid, content: $content}) { +mutation addMessage($user_uuid: uuid!, $room_uuid: uuid!, $content: String!, $reply_to: uuid) { + insert_message_one(object: {user_uuid: $user_uuid, room_uuid: $room_uuid, content: $content, reply_to: $reply_to}) { uuid } } @@ -13,5 +13,13 @@ subscription getMessagesByRoom($room_uuid: uuid!) { } content created_at + reply_to + replied_to { + uuid + content + user { + username + } + } } } diff --git a/database/hasura/hasura_metadata.json b/database/hasura/hasura_metadata.json index 8c4ac68..0600cf7 100644 --- a/database/hasura/hasura_metadata.json +++ b/database/hasura/hasura_metadata.json @@ -4,7 +4,7 @@ "version": 3, "sources": [ { - "name": "workshop", + "name": "web-workshop", "kind": "postgres", "tables": [ { @@ -13,6 +13,12 @@ "schema": "public" }, "object_relationships": [ + { + "name": "replied_to", + "using": { + "foreign_key_constraint_on": "reply_to" + } + }, { "name": "room", "using": { @@ -26,6 +32,20 @@ } } ], + "array_relationships": [ + { + "name": "replies", + "using": { + "foreign_key_constraint_on": { + "column": "reply_to", + "table": { + "name": "message", + "schema": "public" + } + } + } + } + ], "insert_permissions": [ { "role": "user", @@ -34,6 +54,7 @@ "columns": [ "content", "created_at", + "reply_to", "room_uuid", "user_uuid", "uuid" @@ -49,6 +70,7 @@ "columns": [ "content", "created_at", + "reply_to", "room_uuid", "user_uuid", "uuid" @@ -65,6 +87,7 @@ "columns": [ "content", "created_at", + "reply_to", "room_uuid", "user_uuid", "uuid" diff --git a/database/hasura/metadata/databases/databases.yaml b/database/hasura/metadata/databases/databases.yaml index 757562e..e62eb2a 100644 --- a/database/hasura/metadata/databases/databases.yaml +++ b/database/hasura/metadata/databases/databases.yaml @@ -1,4 +1,4 @@ -- name: workshop +- name: web-workshop kind: postgres configuration: connection_info: @@ -6,4 +6,4 @@ from_env: PG_DATABASE_URL isolation_level: read-committed use_prepared_statements: false - tables: "!include workshop/tables/tables.yaml" + tables: "!include web-workshop/tables/tables.yaml" diff --git a/database/hasura/metadata/databases/workshop/tables/public_message.yaml b/database/hasura/metadata/databases/web-workshop/tables/public_message.yaml similarity index 74% rename from database/hasura/metadata/databases/workshop/tables/public_message.yaml rename to database/hasura/metadata/databases/web-workshop/tables/public_message.yaml index 37ef42f..a84a15d 100644 --- a/database/hasura/metadata/databases/workshop/tables/public_message.yaml +++ b/database/hasura/metadata/databases/web-workshop/tables/public_message.yaml @@ -2,12 +2,23 @@ table: name: message schema: public object_relationships: + - name: replied_to + using: + foreign_key_constraint_on: reply_to - name: room using: foreign_key_constraint_on: room_uuid - name: user using: foreign_key_constraint_on: user_uuid +array_relationships: + - name: replies + using: + foreign_key_constraint_on: + column: reply_to + table: + name: message + schema: public insert_permissions: - role: user permission: @@ -15,6 +26,7 @@ insert_permissions: columns: - content - created_at + - reply_to - room_uuid - user_uuid - uuid @@ -25,6 +37,7 @@ select_permissions: columns: - content - created_at + - reply_to - room_uuid - user_uuid - uuid @@ -36,6 +49,7 @@ update_permissions: columns: - content - created_at + - reply_to - room_uuid - user_uuid - uuid diff --git a/database/hasura/metadata/databases/workshop/tables/public_room.yaml b/database/hasura/metadata/databases/web-workshop/tables/public_room.yaml similarity index 100% rename from database/hasura/metadata/databases/workshop/tables/public_room.yaml rename to database/hasura/metadata/databases/web-workshop/tables/public_room.yaml diff --git a/database/hasura/metadata/databases/workshop/tables/public_user.yaml b/database/hasura/metadata/databases/web-workshop/tables/public_user.yaml similarity index 100% rename from database/hasura/metadata/databases/workshop/tables/public_user.yaml rename to database/hasura/metadata/databases/web-workshop/tables/public_user.yaml diff --git a/database/hasura/metadata/databases/workshop/tables/public_user_room.yaml b/database/hasura/metadata/databases/web-workshop/tables/public_user_room.yaml similarity index 100% rename from database/hasura/metadata/databases/workshop/tables/public_user_room.yaml rename to database/hasura/metadata/databases/web-workshop/tables/public_user_room.yaml diff --git a/database/hasura/metadata/databases/workshop/tables/tables.yaml b/database/hasura/metadata/databases/web-workshop/tables/tables.yaml similarity index 100% rename from database/hasura/metadata/databases/workshop/tables/tables.yaml rename to database/hasura/metadata/databases/web-workshop/tables/tables.yaml diff --git a/database/sql/message.sql b/database/sql/message.sql index 51c8108..2f18adb 100644 --- a/database/sql/message.sql +++ b/database/sql/message.sql @@ -5,12 +5,38 @@ create table if not exists public.message ( room_uuid uuid not null, content text not null, created_at timestamp default current_timestamp not null, + reply_to uuid, primary key (uuid) ); alter table public.message add constraint message_user_uuid_fkey foreign key (user_uuid) references public.user (uuid) on update cascade on delete cascade; alter table public.message add constraint message_room_uuid_fkey foreign key (room_uuid) references public.room (uuid) on update cascade on delete cascade; +alter table public.message +add constraint message_reply_to_fkey foreign key (reply_to) references public.message (uuid) on update cascade on delete set null; +alter table public.message +add constraint message_no_self_reply check (reply_to is null or reply_to <> uuid); +alter table public.message +add constraint message_reply_to_unique unique (reply_to); + +create or replace function public.check_message_reply() returns trigger as $$ +begin + if new.reply_to is not null then + if exists ( + select 1 from public.message + where uuid = new.reply_to and reply_to is not null + ) then + raise exception 'cannot reply to a reply (multi-level reply is not allowed)'; + end if; + end if; + return new; +end; +$$ language plpgsql; + +drop trigger if exists message_reply_check on public.message; +create trigger message_reply_check +before insert or update of reply_to on public.message +for each row execute function public.check_message_reply(); insert into public.message (user_uuid, room_uuid, content) values ('00000000-0000-0000-0000-000000000001', '00000000-0000-0000-0000-100000000001', '大家好,我叫张三'), @@ -42,3 +68,8 @@ insert into public.message (user_uuid, room_uuid, content) values ('00000000-0000-0000-0000-000000000004', '00000000-0000-0000-0000-100000000003', '好了,今天就到这里吧'); update public.message set created_at = '2021-01-01 00:00:00' where room_uuid = '00000000-0000-0000-0000-100000000002'; + +insert into public.message (uuid, user_uuid, room_uuid, content) values +('00000000-0000-0000-0000-000000000101', '00000000-0000-0000-0000-000000000001', '00000000-0000-0000-0000-100000000001', '有谁能听到我说话吗?'); +insert into public.message (uuid, user_uuid, room_uuid, content, reply_to) values +('00000000-0000-0000-0000-000000000102', '00000000-0000-0000-0000-000000000002', '00000000-0000-0000-0000-100000000001', '我能听到,怎么啦?', '00000000-0000-0000-0000-000000000101');