-- Database: "oBrand"

DROP DATABASE "oBrand";

-- Role: obrand

DROP ROLE obrand;

CREATE ROLE obrand LOGIN
  ENCRYPTED PASSWORD 'md51e16472d06fb312d14e3001f44e9460e'
  NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;

CREATE DATABASE "oBrand"
  WITH OWNER = postgres
       ENCODING = 'UTF8'
       TABLESPACE = pg_default
       LC_COLLATE = 'C'
       LC_CTYPE = 'C'
       CONNECTION LIMIT = -1;
GRANT ALL ON DATABASE "oBrand" TO postgres;


GRANT CONNECT ON DATABASE "oBrand" TO obrand;
REVOKE ALL ON DATABASE "oBrand" FROM public;

ALTER DEFAULT PRIVILEGES
    GRANT INSERT, SELECT, UPDATE ON TABLES
    TO public;

ALTER DEFAULT PRIVILEGES
    GRANT INSERT, SELECT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER ON TABLES
    TO postgres;



--




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";


-- SEQUENCES


-- Sequence: public.billing_id_seq

-- DROP SEQUENCE public.billing_id_seq;

CREATE SEQUENCE public.billing_id_seq
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 1
  CACHE 1;
ALTER TABLE public.billing_id_seq
  OWNER TO postgres;



-- Sequence: public.company_id_seq

-- DROP SEQUENCE public.company_id_seq;

CREATE SEQUENCE public.company_id_seq
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 2
  CACHE 1;
ALTER TABLE public.company_id_seq
  OWNER TO postgres;
GRANT ALL ON SEQUENCE public.company_id_seq TO postgres;
GRANT SELECT, UPDATE ON SEQUENCE public.company_id_seq TO obrand;




-- Sequence: public.logins_id_seq

-- DROP SEQUENCE public.logins_id_seq;

CREATE SEQUENCE public.logins_id_seq
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 4
  CACHE 1;
ALTER TABLE public.logins_id_seq
  OWNER TO postgres;
GRANT ALL ON SEQUENCE public.logins_id_seq TO postgres;
GRANT SELECT, UPDATE ON SEQUENCE public.logins_id_seq TO obrand;




-- Sequence: public.pages_id_seq

-- DROP SEQUENCE public.pages_id_seq;

CREATE SEQUENCE public.pages_id_seq
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 35
  CACHE 1;
ALTER TABLE public.pages_id_seq
  OWNER TO postgres;
GRANT ALL ON SEQUENCE public.pages_id_seq TO postgres;
GRANT SELECT, UPDATE ON SEQUENCE public.pages_id_seq TO obrand;




-- Sequence: public.profile_id_seq

-- DROP SEQUENCE public.profile_id_seq;

CREATE SEQUENCE public.profile_id_seq
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 2
  CACHE 1;
ALTER TABLE public.profile_id_seq
  OWNER TO postgres;
GRANT ALL ON SEQUENCE public.profile_id_seq TO postgres;
GRANT SELECT, UPDATE ON SEQUENCE public.profile_id_seq TO obrand;





-- Sequence: public.venue_id_seq

-- DROP SEQUENCE public.venue_id_seq;

CREATE SEQUENCE public.venue_id_seq
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 1
  CACHE 1;
ALTER TABLE public.venue_id_seq
  OWNER TO postgres;




-- ----





-- Table: public.company

-- DROP TABLE public.company;

CREATE TABLE public.company
(
  id integer NOT NULL DEFAULT nextval('company_id_seq'::regclass),
  cid character varying(22) NOT NULL,
  company_name character varying(100) NOT NULL,
  address1 character varying(150) NOT NULL,
  address2 character varying(150),
  address3 character varying(150),
  town character varying(150) NOT NULL,
  county character varying(150),
  postcode character varying(12) NOT NULL,
  country integer,
  pcontact character varying(20) NOT NULL,
  ocontact character varying(20),
  mobile character varying(20),
  email character varying(150) NOT NULL,
  CONSTRAINT company_pk PRIMARY KEY (id)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE public.company
  OWNER TO postgres;
GRANT SELECT, UPDATE, INSERT ON TABLE public.company TO public;
GRANT ALL ON TABLE public.company TO postgres;





-- Table: public.billing

-- DROP TABLE public.billing;

CREATE TABLE public.billing
(
  id integer NOT NULL DEFAULT nextval('billing_id_seq'::regclass),
  company_id integer NOT NULL,
  CONSTRAINT billing_pk PRIMARY KEY (id),
  CONSTRAINT billing_fk0 FOREIGN KEY (company_id)
      REFERENCES public.company (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
  OIDS=FALSE
);
ALTER TABLE public.billing
  OWNER TO postgres;
GRANT SELECT, UPDATE, INSERT ON TABLE public.billing TO public;
GRANT ALL ON TABLE public.billing TO postgres;








-- Table: public.logins

-- DROP TABLE public.logins;

CREATE TABLE public.logins
(
  id integer NOT NULL DEFAULT nextval('logins_id_seq'::regclass),
  username character varying(100) NOT NULL,
  email character varying(150) NOT NULL,
  password_hash character varying(78) NOT NULL,
  password_reset_token character varying(128),
  uid character varying(22),
  CONSTRAINT logins_pk PRIMARY KEY (id),
  CONSTRAINT logins_email_key UNIQUE (email),
  CONSTRAINT logins_password_reset_token_key UNIQUE (password_reset_token),
  CONSTRAINT logins_uid_key UNIQUE (uid),
  CONSTRAINT logins_username_key UNIQUE (username)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE public.logins
  OWNER TO postgres;
GRANT SELECT, UPDATE, INSERT ON TABLE public.logins TO public;
GRANT ALL ON TABLE public.logins TO postgres;
GRANT SELECT, UPDATE, INSERT, DELETE, TRIGGER ON TABLE public.logins TO obrand;




-- Table: public.master_beacons

-- DROP TABLE public.master_beacons;

CREATE TABLE public.master_beacons
(
  id bigint NOT NULL,
  uid uuid NOT NULL,
  CONSTRAINT master_beacons_pk PRIMARY KEY (id)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE public.master_beacons
  OWNER TO postgres;
GRANT SELECT, UPDATE, INSERT ON TABLE public.master_beacons TO public;
GRANT ALL ON TABLE public.master_beacons TO postgres;





-- Table: public.pages

-- DROP TABLE public.pages;

CREATE TABLE public.pages
(
  id integer NOT NULL DEFAULT nextval('pages_id_seq'::regclass),
  cid character varying(22),
  vid character varying(22),
  pid character varying(22),
  content integer,
  title character varying(100) NOT NULL,
  data json NOT NULL,
  CONSTRAINT pages_pk PRIMARY KEY (id)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE public.pages
  OWNER TO postgres;
GRANT SELECT, UPDATE, INSERT ON TABLE public.pages TO public;
GRANT ALL ON TABLE public.pages TO postgres;




-- Table: public.profile

-- DROP TABLE public.profile;

CREATE TABLE public.profile
(
  id integer NOT NULL DEFAULT nextval('profile_id_seq'::regclass),
  uid character varying(22) NOT NULL,
  forename character varying(75) NOT NULL,
  surname character varying(75) NOT NULL,
  gender integer NOT NULL,
  dob date NOT NULL,
  bio text NOT NULL,
  member_of character varying(22),
  CONSTRAINT profile_pk PRIMARY KEY (id),
  CONSTRAINT profile_fk0 FOREIGN KEY (uid)
      REFERENCES public.logins (uid) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
  OIDS=FALSE
);
ALTER TABLE public.profile
  OWNER TO postgres;
GRANT SELECT, UPDATE, INSERT ON TABLE public.profile TO public;
GRANT ALL ON TABLE public.profile TO postgres;




--



-- Table: public.venue

-- DROP TABLE public.venue;

CREATE TABLE public.venue
(
  id integer NOT NULL DEFAULT nextval('venue_id_seq'::regclass),
  venue_name character varying(100) NOT NULL,
  address1 character varying(150) NOT NULL,
  address2 character varying(150),
  address3 character varying(150),
  town character varying(150) NOT NULL,
  county character varying(150),
  postcode character varying(12) NOT NULL,
  country integer,
  pcontact character varying(20) NOT NULL,
  ocontact character varying(20),
  mobile character varying(20),
  email character varying(150) NOT NULL,
  company_id integer NOT NULL,
  CONSTRAINT venue_pk PRIMARY KEY (id),
  CONSTRAINT venue_fk0 FOREIGN KEY (company_id)
      REFERENCES public.company (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
  OIDS=FALSE
);
ALTER TABLE public.venue
  OWNER TO postgres;
GRANT SELECT, UPDATE, INSERT ON TABLE public.venue TO public;
GRANT ALL ON TABLE public.venue TO postgres;




--




--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;





-- functions


-- Function: public.getaccountdetails(character varying)

-- DROP FUNCTION public.getaccountdetails(character varying);

CREATE OR REPLACE FUNCTION public.getaccountdetails(IN _uid character varying)
  RETURNS TABLE(id integer, email character varying, uid character varying, forename character varying, surname character varying, member_of character varying) AS
$BODY$

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;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100
  ROWS 1000;
ALTER FUNCTION public.getaccountdetails(character varying)
  OWNER TO postgres;


--


-- Function: public.insert_user(character varying, character varying, character varying, character varying)

-- DROP FUNCTION public.insert_user(character varying, character varying, character varying, character varying);

CREATE OR REPLACE FUNCTION public.insert_user(
    _username character varying,
    _email character varying,
    _passwordhash character varying,
    _uid character varying)
  RETURNS void AS
$BODY$

BEGIN
  INSERT into logins(username, email, password_hash, uid) Values(_username,_email,_passwordHash,_uid);
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION public.insert_user(character varying, character varying, character varying, character varying)
  OWNER TO postgres;



--

-- Function: public.makememberof(character varying, character varying)

-- DROP FUNCTION public.makememberof(character varying, character varying);

CREATE OR REPLACE FUNCTION public.makememberof(
    _uid character varying,
    _cid character varying)
  RETURNS void AS
$BODY$

BEGIN
  UPDATE profile SET member_of = _cid WHERE uid = _uid;


END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION public.makememberof(character varying, character varying)
  OWNER TO postgres;


--





-- Function: public.upsert_company(character varying, character varying, character varying, character varying, character varying, character varying, character varying, character varying, integer, character varying, character varying, character varying, character varying)

-- DROP FUNCTION public.upsert_company(character varying, character varying, character varying, character varying, character varying, character varying, character varying, character varying, integer, character varying, character varying, character varying, character varying);

CREATE OR REPLACE FUNCTION public.upsert_company(
    _cid character varying,
    _company_name character varying,
    _address1 character varying,
    _address2 character varying,
    _address3 character varying,
    _town character varying,
    _county character varying,
    _postcode character varying,
    _country integer,
    _pcontact character varying,
    _ocontact character varying,
    _mobile character varying,
    _email character varying)
  RETURNS void AS
$BODY$

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;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION public.upsert_company(character varying, character varying, character varying, character varying, character varying, character varying, character varying, character varying, integer, character varying, character varying, character varying, character varying)
  OWNER TO postgres;




--



-- Function: public.upsert_page(character varying, character varying, character varying, integer, character varying, json)

-- DROP FUNCTION public.upsert_page(character varying, character varying, character varying, integer, character varying, json);

CREATE OR REPLACE FUNCTION public.upsert_page(
    _cid character varying,
    _vid character varying,
    _pid character varying,
    _content integer,
    _title character varying,
    _data json)
  RETURNS void AS
$BODY$

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;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION public.upsert_page(character varying, character varying, character varying, integer, character varying, json)
  OWNER TO postgres;




--


-- Function: public.upsert_profile(character varying, character varying, character varying, integer, date, text)

-- DROP FUNCTION public.upsert_profile(character varying, character varying, character varying, integer, date, text);

CREATE OR REPLACE FUNCTION public.upsert_profile(
    _uid character varying,
    _forename character varying,
    _surname character varying,
    _gender integer,
    _dob date,
    _bio text)
  RETURNS void AS
$BODY$

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;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION public.upsert_profile(character varying, character varying, character varying, integer, date, text)
  OWNER TO postgres;
