Initial commit
This commit is contained in:
@@ -0,0 +1,69 @@
|
||||
DROP TABLE IF EXISTS comment;
|
||||
DROP TYPE IF EXISTS comment_status;
|
||||
DROP TYPE IF EXISTS comment_context_type;
|
||||
|
||||
CREATE TYPE comment_context_type AS ENUM (
|
||||
'portal',
|
||||
'dictionary',
|
||||
'consultancy',
|
||||
'entry_dict_int',
|
||||
'entry_dict_ext',
|
||||
'entry_consult_int'
|
||||
-- 'entry_consult_ext'
|
||||
);
|
||||
|
||||
CREATE TYPE comment_status AS ENUM ('visible', 'hidden');
|
||||
|
||||
CREATE TABLE comment (
|
||||
id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
||||
message VARCHAR NOT NULL,
|
||||
author_id INT NOT NULL REFERENCES "user",
|
||||
time_created TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
context_type comment_context_type NOT NULL,
|
||||
context_id INT,
|
||||
status comment_status NOT NULL DEFAULT 'visible',
|
||||
quoted_comment_id INT REFERENCES comment,
|
||||
CHECK (
|
||||
CASE
|
||||
WHEN context_type IN (
|
||||
'portal',
|
||||
'consultancy'
|
||||
) THEN context_id IS NULL
|
||||
ELSE context_id IS NOT NULL
|
||||
END
|
||||
)
|
||||
);
|
||||
|
||||
CREATE OR REPLACE FUNCTION update_time_most_recent_comment()
|
||||
RETURNS TRIGGER AS $$
|
||||
BEGIN
|
||||
-- Disable trigger from updating time_modified.
|
||||
SET LOCAL term_portal.skip_update_time_modified TO 'TRUE';
|
||||
-- Disable trigger from creating version history snapshot.
|
||||
SET LOCAL term_portal.skip_create_version_history_snapshot TO 'TRUE';
|
||||
|
||||
UPDATE entry
|
||||
SET time_most_recent_comment =
|
||||
CASE
|
||||
WHEN TG_OP = 'INSERT' AND NEW.status = 'visible' THEN NEW.time_created
|
||||
ELSE (
|
||||
SELECT MAX(time_created)
|
||||
FROM comment
|
||||
WHERE
|
||||
context_type IN ('entry_dict_int', 'entry_dict_ext')
|
||||
AND context_id = NEW.context_id
|
||||
AND status = 'visible'
|
||||
)
|
||||
END
|
||||
WHERE id = NEW.context_id;
|
||||
|
||||
RETURN NULL;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
CREATE TRIGGER entry_update_time_most_recent_comment
|
||||
AFTER INSERT OR UPDATE
|
||||
ON comment
|
||||
FOR EACH ROW
|
||||
WHEN (NEW.context_type IN ('entry_dict_int', 'entry_dict_ext'))
|
||||
EXECUTE FUNCTION update_time_most_recent_comment();
|
||||
Reference in New Issue
Block a user