CREATE TYPE public.userlevel AS ENUM ('Admin', 'User', 'Devel');

CREATE TABLE public.user (	id SERIAL PRIMARY KEY,
    name character varying(250),
    email character varying(250),
    password character varying(255),
		ftp_user character varying(250),
    accesslevel public.userlevel,
		owner_id integer NOT NULL	REFERENCES public.user(id),
		UNIQUE(email)
);

CREATE TABLE public.access_groups (	id SERIAL PRIMARY KEY,
	name character varying(255) NOT NULL,
	owner_id integer NOT NULL	REFERENCES public.user(id)
);

CREATE TABLE public.user_access (	id SERIAL PRIMARY KEY,
    user_id integer NOT NULL					REFERENCES public.user(id),
    access_group_id integer NOT NULL	REFERENCES public.access_groups(id),
		UNIQUE(user_id, access_group_id)
);

CREATE TABLE public.map ( id SERIAL PRIMARY KEY,
    name character varying(50) NOT NULL,
		description character varying(50) NOT NULL,
		owner_id integer NOT NULL	REFERENCES public.user(id)
);

CREATE TABLE public.map_access ( id SERIAL PRIMARY KEY,
    map_id 						integer NOT NULL REFERENCES public.map(id),
    access_group_id 	integer NOT NULL REFERENCES public.access_groups(id),
		UNIQUE(map_id, access_group_id)
);

CREATE TABLE public.permalink (	id SERIAL PRIMARY KEY,
		description character varying(255),
		query character varying(255),
    map_id integer NOT NULL		REFERENCES public.map(id),
		created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
		expires TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP + interval '1 hour',
		visits			 integer NOT NULL DEFAULT 0,
		visits_limit integer NOT NULL DEFAULT 1,
		hash character varying(36) NOT NULL,
		owner_id integer NOT NULL	REFERENCES public.user(id)
);

CREATE TABLE public.signup ( id SERIAL PRIMARY KEY,
    name character varying(250),
    email character varying(250),
    password character varying(250),
    verify character varying(250),
		UNIQUE(email)
);
