diff --git a/scripts/obrand.sql b/scripts/obrand.sql index a0fc7dc..ea1930e 100644 --- a/scripts/obrand.sql +++ b/scripts/obrand.sql @@ -33,3 +33,364 @@ ALTER DEFAULT PRIVILEGES +-- + + + + +ALTER TABLE "profile" DROP CONSTRAINT IF EXISTS "profile_fk0"; + +ALTER TABLE "profile" DROP CONSTRAINT IF EXISTS "profile_fk1"; + +ALTER TABLE "venue" DROP CONSTRAINT IF EXISTS "venue_fk0"; + +ALTER TABLE "billing" DROP CONSTRAINT IF EXISTS "billing_fk0"; + +DROP TABLE IF EXISTS "logins"; + +DROP TABLE IF EXISTS "profile"; + +DROP TABLE IF EXISTS "company"; + +DROP TABLE IF EXISTS "venue"; + +DROP TABLE IF EXISTS "billing"; + +DROP TABLE IF EXISTS "master_beacons"; + +DROP TABLE IF EXISTS "pages"; + + +CREATE TABLE "logins" ( + "id" serial NOT NULL, + "username" varchar(100) NOT NULL UNIQUE, + "email" varchar(150) NOT NULL UNIQUE, + "password_hash" varchar(78) NOT NULL, + "password_reset_token" varchar(128) UNIQUE, + "uid" varchar(22) UNIQUE, + CONSTRAINT logins_pk PRIMARY KEY ("id") +) WITH ( + OIDS=FALSE +); + + + +CREATE TABLE "profile" ( + "id" serial NOT NULL, + "uid" varchar(22) NOT NULL, + "forename" varchar(75) NOT NULL, + "surname" varchar(75) NOT NULL, + "gender" int NOT NULL, + "dob" DATE NOT NULL, + "bio" TEXT NOT NULL, + "member_of" varchar(22), + CONSTRAINT profile_pk PRIMARY KEY ("id") +) WITH ( + OIDS=FALSE +); + + + +CREATE TABLE "company" ( + "id" serial NOT NULL, + "cid" varchar(22) not null, + "company_name" varchar(100) NOT NULL, + "address1" varchar(150) NOT NULL, + "address2" varchar(150), + "address3" varchar(150), + "town" varchar(150) NOT NULL, + "county" varchar(150), + "postcode" varchar(12) NOT NULL, + "country" int , + "pcontact" varchar(20) NOT NULL, + "ocontact" varchar(20), + "mobile" varchar(20) , + "email" varchar(150) NOT NULL, + CONSTRAINT company_pk PRIMARY KEY ("id") +) WITH ( + OIDS=FALSE +); + + + +CREATE TABLE "venue" ( + "id" serial NOT NULL, + "venue_name" varchar(100) NOT NULL, + "address1" varchar(150) NOT NULL, + "address2" varchar(150), + "address3" varchar(150), + "town" varchar(150) NOT NULL, + "county" varchar(150) , + "postcode" varchar(12) NOT NULL, + "country" int , + "pcontact" varchar(20) NOT NULL, + "ocontact" varchar(20) , + "mobile" varchar(20) , + "email" varchar(150) NOT NULL, + "company_id" int NOT NULL, + CONSTRAINT venue_pk PRIMARY KEY ("id") +) WITH ( + OIDS=FALSE +); + + + +CREATE TABLE "billing" ( + "id" serial NOT NULL, + "company_id" int NOT NULL, + CONSTRAINT billing_pk PRIMARY KEY ("id") +) WITH ( + OIDS=FALSE +); + + + +CREATE TABLE "master_beacons" ( + "id" bigint NOT NULL, + "uid" uuid NOT NULL, + CONSTRAINT master_beacons_pk PRIMARY KEY ("id") +) WITH ( + OIDS=FALSE +); + +CREATE TABLE "pages" +( + id serial NOT NULL,, + cid VARCHAR(22), + vid VARCHAR(22), + pid VARCHAR(22), + content INTEGER, + title VARCHAR(100) NOT NULL, + data JSONB NOT NULL, + CONSTRAINT pages_pk PRIMARY KEY ("id") +) WITH ( + OIDS=FALSE +); + + + + +ALTER TABLE "profile" ADD CONSTRAINT "profile_fk0" FOREIGN KEY ("uid") REFERENCES "logins"("uid"); +--ALTER TABLE "profile" ADD CONSTRAINT "profile_fk1" FOREIGN KEY ("member_of") REFERENCES "company"("cid"); + +ALTER TABLE "venue" ADD CONSTRAINT "venue_fk0" FOREIGN KEY ("company_id") REFERENCES "company"("id"); + +ALTER TABLE "billing" ADD CONSTRAINT "billing_fk0" FOREIGN KEY ("company_id") REFERENCES "company"("id"); + +grant connect on database "oBrand" to obrand; + +GRANT SELECT, UPDATE, INSERT, DELETE, TRIGGER ON TABLE public.logins TO obrand; + +grant select, update on logins_id_seq to obrand; +grant select, update on profile_id_seq to obrand; +grant select, update on company_id_seq to obrand; +grant select, update on pages_pk to obrand; + + + + +-- Function Builder +--DROP FUNCTION insert_user(character varying,character varying,character varying,character varying); +DROP FUNCTION upsert_profile; + +CREATE OR REPLACE FUNCTION insert_user( _username VARCHAR(100), _email VARCHAR(150), + _passwordHash VARCHAR(78), _uid VARCHAR(22)) + RETURNS VOID AS +$$ + +BEGIN + INSERT into logins(username, email, password_hash, uid) Values(_username,_email,_passwordHash,_uid); +END; +$$ +LANGUAGE plpgsql; + + -- + +CREATE OR REPLACE FUNCTION upsert_profile(_uid VARCHAR(22), _forename VARCHAR(75), _surname VARCHAR(75), + _gender INTEGER, _dob DATE, _bio TEXT) + RETURNS VOID AS +$$ + +BEGIN + WITH upsert AS (UPDATE profile + SET forename = _forename, surname = _surname, gender = _gender, dob = _dob, bio = _bio + WHERE uid = _uid + RETURNING *) + INSERT INTO profile (uid, forename, surname, gender, dob, bio) SELECT + _uid, + _forename, + _surname, + _gender, + _dob, + _bio + WHERE NOT EXISTS(SELECT * + FROM upsert); + + +END; +$$ +LANGUAGE plpgsql; + +-- + +; + +--DROP FUNCTION upsert_profile(character varying,character varying,character varying,integer,date,text) ; + +CREATE OR REPLACE FUNCTION upsert_company( + _cid VARCHAR(22), + _company_name VARCHAR(100), + _address1 VARCHAR(150), + _address2 VARCHAR(150), + _address3 VARCHAR(150), + _town VARCHAR(150), + _county VARCHAR(150), + _postcode VARCHAR(12), + _country INTEGER, + _pcontact VARCHAR(20), + _ocontact VARCHAR(20), + _mobile VARCHAR(20), + _email VARCHAR(150)) + + RETURNS VOID AS +$$ + +BEGIN + WITH upsert AS (UPDATE company + SET cid = _cid, + company_name = _company_name, + address1 = _address1, + address2 = _address2, + address3 = _address3, + town = _town, + county = _county, + postcode = _postcode, + country = _country, + pcontact = _pcontact, + ocontact = _ocontact, + mobile = _mobile, + email = _email + + WHERE cid = _cid + RETURNING *) + INSERT INTO company ( + cid, + company_name, + address1, + address2, + address3, + town, + county, + postcode, + country, + pcontact, + ocontact, + mobile, + email + ) SELECT + _cid, + _company_name, + _address1, + _address2, + _address3, + _town, + _county, + _postcode, + _country, + _pcontact, + _ocontact, + _mobile, + _email + WHERE NOT EXISTS(SELECT * + FROM upsert); + + +END; +$$ +LANGUAGE plpgsql; + + + +-- + +; + + +CREATE OR REPLACE FUNCTION getAccountDetails( + _uid VARCHAR(22)) + + RETURNS TABLE(id INT, email VARCHAR(150), uid VARCHAR(22), forename VARCHAR(75), surname VARCHAR(75), member_of VARCHAR(22)) + +AS +$$ + +BEGIN + + RETURN QUERY + SELECT + + logins.id, + logins.email, + logins.uid, + profile.forename, + profile.surname, + profile.member_of + FROM logins + LEFT JOIN profile ON profile.uid = logins.uid + WHERE logins.uid = _uid; + +END; +$$ +LANGUAGE plpgsql; + + + +-- + +; + +CREATE OR REPLACE FUNCTION makeMemberOf(_uid VARCHAR(22), _cid VARCHAR(22)) + RETURNS VOID AS +$$ + +BEGIN + UPDATE profile + SET profile.member_of = _cid + WHERE profile.uid = _uid; + + +END; +$$ +LANGUAGE plpgsql; + + +-- + + +; + + +CREATE OR REPLACE FUNCTION upsert_page(_cid VARCHAR(22), + _vid VARCHAR(22), _pid VARCHAR(22), _content INTEGER, _title VARCHAR(100), _data JSONB) + RETURNS VOID AS +$$ + +BEGIN + WITH upsert AS (UPDATE pages + SET cid = _cid, vid = _vid, content = _content, title = _title, data = _data + WHERE pid = _pid + RETURNING *) + INSERT INTO pages (cid, vid, pid, content, title, data) SELECT + _cid, + _vid, + _pid, + _content, + _title, + _data + WHERE NOT EXISTS(SELECT * + FROM upsert); + + +END; +$$ +LANGUAGE plpgsql;