-- create table for users
create table kandimat_data.person
(
    row_id     serial primary key,
    first_name character varying(200) check (first_name <> ''),
    last_name  character varying(200) check (last_name <> ''),
    about      character varying(2000),
    created_at timestamp                   default now(),
    role       kandimat_data.role not null default 'kandimat_person'
);
grant select, update, delete on table kandimat_data.person to kandimat_person;
-- the following is only necessary as long as anonymous should be able to view candidates and editors
grant select on table kandimat_data.person to kandimat_anonymous;

-- create table for accounts
create table kandimat_data_privat.person_account
(
    person_row_id integer primary key references kandimat_data.person (row_id) on delete cascade,
    email         character varying(320) not null unique check (email ~* '^.+@.+\..+$'),
    password_hash character varying(256) not null
);

alter table kandimat_data.person
    enable row level security;
create policy update_person on kandimat_data.person for update to kandimat_person
    with check (row_id = nullif(current_setting('jwt.claims.person_row_id', true), '')::integer);
create policy delete_person on kandimat_data.person for delete to kandimat_person
    using (row_id = nullif(current_setting('jwt.claims.person_row_id', true), '')::integer);

-- The following enables viewing candidates and editors information for every person.
-- This may be changed to only enable registered (and verified) persons.
create policy select_person_public
    on kandimat_data.person
    for select
    to kandimat_anonymous, kandimat_person -- maybe change to kandimat_person only in the future
    using (role in ('kandimat_editor', 'kandimat_candidate'));

-- Editors can see all registered persons in order to elevate their privileges
create policy select_person_editor
    on kandimat_data.person
    for select
    to kandimat_editor
    using (true);
