-- migrate:up

create table "emailVerifications" (
    "id" serial primary key,
    "secret" varchar(255) unique not null,
    "expires" timestamp not null
);

alter table "emails" add "verification" integer unique references "emailVerifications" on delete cascade;

insert into "emailVerifications" ("secret", "expires")
    select "verificationSecret", (localtimestamp + '7 days') as "expires" from "emails"
        where "verificationSecret" is not null;

update "emails" set
    "verification" = (select "id" from "emailVerifications" where "secret" = "verificationSecret");

alter table "emails" drop "verificationSecret" cascade;

create unique index "emails_uid_verified" on "emails" ("uid", ("verification" is not null));
-- at most one verified and one pending email per user

-- migrate:down

alter table "emails" add "verificationSecret" varchar(255) unique;

update "emails" set
    "verificationSecret" = (select "secret" from "emailVerifications"
        where "emailVerifications"."id" = "emails"."verification");

alter table "emails" drop "verification";

drop table "emailVerifications";

create unique index "emails_uid_verified" on "emails" ("uid", ("verificationSecret" is not null));
-- at most one verified and one pending email per user
