db: add initial postgresql schema
This commit is contained in:
parent
4504048f87
commit
cf572a6883
155
db/20180416163802-init-schema.sql
Normal file
155
db/20180416163802-init-schema.sql
Normal file
@ -0,0 +1,155 @@
|
||||
-- Initial PostgreSQL database schema
|
||||
|
||||
CREATE TABLE IF NOT EXISTS config (
|
||||
allowNewOwners BOOLEAN NOT NULL
|
||||
);
|
||||
|
||||
INSERT INTO
|
||||
config (allowNewOwners)
|
||||
VALUES (true);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS owners (
|
||||
ownerHex TEXT NOT NULL UNIQUE PRIMARY KEY ,
|
||||
email TEXT NOT NULL UNIQUE ,
|
||||
name TEXT NOT NULL ,
|
||||
passwordHash TEXT NOT NULL ,
|
||||
confirmedEmail TEXT NOT NULL DEFAULT false ,
|
||||
joinDate TIMESTAMP NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS ownerSessions (
|
||||
session TEXT NOT NULL UNIQUE PRIMARY KEY ,
|
||||
ownerHex TEXT NOT NULL ,
|
||||
loginDate TIMESTAMP NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS ownerConfirmHexes (
|
||||
confirmHex TEXT NOT NULL UNIQUE PRIMARY KEY ,
|
||||
ownerHex TEXT NOT NULL ,
|
||||
sendDate TEXT NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS ownerResetHexes (
|
||||
resetHex TEXT NOT NULL UNIQUE PRIMARY KEY ,
|
||||
ownerHex TEXT NOT NULL ,
|
||||
sendDate TEXT NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS domains (
|
||||
domain TEXT NOT NULL UNIQUE PRIMARY KEY ,
|
||||
ownerHex TEXT NOT NULL ,
|
||||
name TEXT NOT NULL ,
|
||||
creationDate TIMESTAMP NOT NULL ,
|
||||
state TEXT NOT NULL DEFAULT 'unfrozen' ,
|
||||
importedComments TEXT NOT NULL DEFAULT false ,
|
||||
autoSpamFilter BOOLEAN NOT NULL DEFAULT true ,
|
||||
requireModeration BOOLEAN NOT NULL DEFAULT false ,
|
||||
requireIdentification BOOLEAN NOT NULL DEFAULT true ,
|
||||
viewsThisMonth INTEGER NOT NULL DEFAULT 0
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS moderators (
|
||||
domain TEXT NOT NULL ,
|
||||
email TEXT NOT NULL ,
|
||||
addDate TIMESTAMP NOT NULL ,
|
||||
PRIMARY KEY (domain, email)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS commenters (
|
||||
commenterHex TEXT NOT NULL UNIQUE PRIMARY KEY ,
|
||||
email TEXT NOT NULL ,
|
||||
name TEXT NOT NULL ,
|
||||
link TEXT NOT NULL ,
|
||||
photo TEXT NOT NULL ,
|
||||
provider TEXT NOT NULL ,
|
||||
joinDate TIMESTAMP NOT NULL ,
|
||||
state TEXT NOT NULL DEFAULT 'ok'
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS commenterSessions (
|
||||
session TEXT NOT NULL UNIQUE PRIMARY KEY ,
|
||||
commenterHex TEXT NOT NULL DEFAULT 'none' ,
|
||||
creationDate TIMESTAMP NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS comments (
|
||||
commentHex TEXT NOT NULL UNIQUE PRIMARY KEY ,
|
||||
domain TEXT NOT NULL ,
|
||||
path TEXT NOT NULL ,
|
||||
commenterHex TEXT NOT NULL ,
|
||||
markdown TEXT NOT NULL ,
|
||||
html TEXT NOT NULL ,
|
||||
parentHex TEXT NOT NULL ,
|
||||
score INTEGER NOT NULL DEFAULT 0 ,
|
||||
state TEXT NOT NULL DEFAULT 'unapproved' , -- not a BOOLEAN because I expect more states in the future
|
||||
creationDate TIMESTAMP NOT NULL
|
||||
);
|
||||
|
||||
-- DELETEing a comment should recursively delete all children
|
||||
CREATE OR REPLACE FUNCTION commentsDeleteTriggerFunction() RETURNS TRIGGER AS $trigger$
|
||||
BEGIN
|
||||
DELETE FROM comments
|
||||
WHERE parentHex = old.commentHex;
|
||||
|
||||
RETURN NULL;
|
||||
END;
|
||||
$trigger$ LANGUAGE plpgsql;
|
||||
|
||||
CREATE TRIGGER commentsDeleteTrigger AFTER DELETE ON comments
|
||||
FOR EACH ROW EXECUTE PROCEDURE commentsDeleteTriggerFunction();
|
||||
|
||||
CREATE TABLE IF NOT EXISTS votes (
|
||||
commentHex TEXT NOT NULL ,
|
||||
commenterHex TEXT NOT NULL ,
|
||||
direction INTEGER NOT NULL ,
|
||||
voteDate TIMESTAMP NOT NULL
|
||||
);
|
||||
|
||||
CREATE UNIQUE INDEX votesUniqueIndex ON votes(commentHex, commenterHex);
|
||||
|
||||
CREATE OR REPLACE FUNCTION votesInsertTriggerFunction() RETURNS TRIGGER AS $trigger$
|
||||
BEGIN
|
||||
UPDATE comments
|
||||
SET score = score + new.direction
|
||||
WHERE commentHex = new.commentHex;
|
||||
|
||||
RETURN NEW;
|
||||
END;
|
||||
$trigger$ LANGUAGE plpgsql;
|
||||
|
||||
CREATE TRIGGER votesInsertTrigger AFTER INSERT ON votes
|
||||
FOR EACH ROW EXECUTE PROCEDURE votesInsertTriggerFunction();
|
||||
|
||||
CREATE OR REPLACE FUNCTION votesUpdateTriggerFunction() RETURNS TRIGGER AS $trigger$
|
||||
BEGIN
|
||||
UPDATE comments
|
||||
SET score = score - old.direction + new.direction
|
||||
WHERE commentHex = old.commentHex;
|
||||
|
||||
RETURN NEW;
|
||||
END;
|
||||
$trigger$ LANGUAGE plpgsql;
|
||||
|
||||
CREATE TRIGGER votesUpdateTrigger AFTER UPDATE ON votes
|
||||
FOR EACH ROW EXECUTE PROCEDURE votesUpdateTriggerFunction();
|
||||
|
||||
CREATE TABLE IF NOT EXISTS views (
|
||||
domain TEXT NOT NULL ,
|
||||
commenterHex TEXT NOT NULL ,
|
||||
viewDate TIMESTAMP NOT NULL
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS domainIndex ON views(domain);
|
||||
|
||||
CREATE OR REPLACE FUNCTION viewsInsertTriggerFunction() RETURNS TRIGGER AS $trigger$
|
||||
BEGIN
|
||||
UPDATE domains
|
||||
SET viewsThisMonth = viewsThisMonth + 1
|
||||
WHERE domain = new.domain;
|
||||
|
||||
RETURN NULL;
|
||||
END;
|
||||
$trigger$ LANGUAGE plpgsql;
|
||||
|
||||
CREATE TRIGGER viewsInsertTrigger AFTER INSERT ON views
|
||||
FOR EACH ROW EXECUTE PROCEDURE viewsInsertTriggerFunction();
|
Loading…
Reference in New Issue
Block a user