go-htmx-gsd #1
2 changed files with 89 additions and 0 deletions
47
backend/internal/db/queries/discussion.sql
Normal file
47
backend/internal/db/queries/discussion.sql
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
-- name: ListDiscussionMessagesByTablo :many
|
||||
SELECT discussion_messages.id,
|
||||
discussion_messages.tablo_id,
|
||||
discussion_messages.author_user_id,
|
||||
users.email AS author_email,
|
||||
discussion_messages.body,
|
||||
discussion_messages.created_at,
|
||||
discussion_messages.updated_at,
|
||||
discussion_messages.edited_at,
|
||||
discussion_messages.edited_by_user_id,
|
||||
discussion_messages.deleted_at,
|
||||
discussion_messages.deleted_by_user_id
|
||||
FROM discussion_messages
|
||||
JOIN users ON users.id = discussion_messages.author_user_id
|
||||
WHERE discussion_messages.tablo_id = $1
|
||||
ORDER BY discussion_messages.created_at, discussion_messages.id;
|
||||
|
||||
-- name: CreateDiscussionMessage :one
|
||||
INSERT INTO discussion_messages (tablo_id, author_user_id, body)
|
||||
VALUES ($1, $2, $3)
|
||||
RETURNING id, tablo_id, author_user_id, body, created_at, updated_at, edited_at, edited_by_user_id, deleted_at, deleted_by_user_id;
|
||||
|
||||
-- name: GetDiscussionMessageWithAuthor :one
|
||||
SELECT discussion_messages.id,
|
||||
discussion_messages.tablo_id,
|
||||
discussion_messages.author_user_id,
|
||||
users.email AS author_email,
|
||||
discussion_messages.body,
|
||||
discussion_messages.created_at,
|
||||
discussion_messages.updated_at,
|
||||
discussion_messages.edited_at,
|
||||
discussion_messages.edited_by_user_id,
|
||||
discussion_messages.deleted_at,
|
||||
discussion_messages.deleted_by_user_id
|
||||
FROM discussion_messages
|
||||
JOIN users ON users.id = discussion_messages.author_user_id
|
||||
WHERE discussion_messages.id = $1
|
||||
AND discussion_messages.tablo_id = $2;
|
||||
|
||||
-- name: UpsertDiscussionReadState :one
|
||||
INSERT INTO discussion_read_states (tablo_id, user_id, last_read_message_id, last_read_at)
|
||||
VALUES ($1, $2, $3, now())
|
||||
ON CONFLICT (tablo_id, user_id)
|
||||
DO UPDATE SET last_read_message_id = EXCLUDED.last_read_message_id,
|
||||
last_read_at = now(),
|
||||
updated_at = now()
|
||||
RETURNING tablo_id, user_id, last_read_message_id, last_read_at, created_at, updated_at;
|
||||
42
backend/migrations/0009_discussion.sql
Normal file
42
backend/migrations/0009_discussion.sql
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
-- migrations/0009_discussion.sql
|
||||
-- Phase 12: Native Tablo Chat
|
||||
|
||||
-- +goose Up
|
||||
|
||||
CREATE TABLE discussion_messages (
|
||||
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
tablo_id uuid NOT NULL REFERENCES tablos(id) ON DELETE CASCADE,
|
||||
author_user_id uuid NOT NULL REFERENCES users(id) ON DELETE RESTRICT,
|
||||
body text NOT NULL,
|
||||
created_at timestamptz NOT NULL DEFAULT now(),
|
||||
updated_at timestamptz NOT NULL DEFAULT now(),
|
||||
edited_at timestamptz,
|
||||
edited_by_user_id uuid REFERENCES users(id) ON DELETE SET NULL,
|
||||
deleted_at timestamptz,
|
||||
deleted_by_user_id uuid REFERENCES users(id) ON DELETE SET NULL,
|
||||
CONSTRAINT discussion_messages_body_not_blank CHECK (length(trim(body)) > 0),
|
||||
CONSTRAINT discussion_messages_body_max_length CHECK (char_length(body) <= 10000)
|
||||
);
|
||||
|
||||
CREATE INDEX discussion_messages_tablo_created_idx ON discussion_messages(tablo_id, created_at, id);
|
||||
CREATE INDEX discussion_messages_author_idx ON discussion_messages(author_user_id);
|
||||
|
||||
CREATE TABLE discussion_read_states (
|
||||
tablo_id uuid NOT NULL REFERENCES tablos(id) ON DELETE CASCADE,
|
||||
user_id uuid NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
last_read_message_id uuid REFERENCES discussion_messages(id) ON DELETE SET NULL,
|
||||
last_read_at timestamptz NOT NULL DEFAULT now(),
|
||||
created_at timestamptz NOT NULL DEFAULT now(),
|
||||
updated_at timestamptz NOT NULL DEFAULT now(),
|
||||
PRIMARY KEY (tablo_id, user_id)
|
||||
);
|
||||
|
||||
CREATE INDEX discussion_read_states_user_idx ON discussion_read_states(user_id, tablo_id);
|
||||
|
||||
-- +goose Down
|
||||
|
||||
DROP INDEX IF EXISTS discussion_read_states_user_idx;
|
||||
DROP TABLE IF EXISTS discussion_read_states;
|
||||
DROP INDEX IF EXISTS discussion_messages_author_idx;
|
||||
DROP INDEX IF EXISTS discussion_messages_tablo_created_idx;
|
||||
DROP TABLE IF EXISTS discussion_messages;
|
||||
Loading…
Reference in a new issue