create table
  public."Users" (
    id bigint generated by default as identity not null,
    created_at timestamp with time zone not null default now(),
    address text not null,
    username text null,
    idc text null,
    public_key text null,
    constraint Users_pkey primary key (id),
    constraint Users_address_key unique (address),
    constraint Users_username_key unique (username)
  ) tablespace pg_default;

create table
  public."Blogs" (
    id uuid not null default gen_random_uuid (),
    created_at timestamp with time zone not null default now(),
    title text not null,
    description text null,
    slug text not null,
    constraint Blogs_pkey primary key (id),
    constraint Blogs_slug_key unique (slug),
    constraint Blogs_title_key unique (title),
    constraint Blogs_slug_check check ((length(slug) < 500))
  ) tablespace pg_default;

create table
  public."BlogPosts" (
    id bigint generated by default as identity not null,
    created_at timestamp with time zone not null default now(),
    blog_id uuid not null,
    current_version bigint null,
    status public.post_status not null default 'draft'::post_status,
    constraint BlogPosts_pkey primary key (id),
    constraint BlogPosts_blog_id_fkey foreign key (blog_id) references "Blogs" (id) on update cascade on delete cascade,
    constraint BlogPosts_current_version_fkey foreign key (current_version) references "BlogPostVersions" (id) on update cascade on delete cascade
  ) tablespace pg_default;

create table
  public."BlogPostVersions" (
    id bigint generated by default as identity not null,
    created_at timestamp with time zone not null default now(),
    post_id bigint not null,
    title text not null,
    content text not null,
    version text not null,
    proof json not null,
    slug text not null,
    published_at timestamp with time zone null,
    status public.post_status not null default 'draft'::post_status,
    constraint BlogPostVersions_pkey primary key (id),
    constraint BlogPostVersions_post_id_fkey foreign key (post_id) references "BlogPosts" (id) on update cascade on delete cascade
  ) tablespace pg_default;

create table
  public."BlogPostVersionReview" (
    id bigint generated by default as identity not null,
    created_at timestamp with time zone not null default now(),
    post_version_id bigint not null,
    approved boolean not null default false,
    proof json not null,
    comment text null,
    constraint BlogPostVersionReview_pkey primary key (id),
    constraint BlogPostVersionReview_post_version_id_fkey foreign key (post_version_id) references "BlogPostVersions" (id) on update cascade on delete cascade
  ) tablespace pg_default;

create table
  public."BlogOwners" (
    id bigint generated by default as identity not null,
    created_at timestamp with time zone not null default now(),
    blog_id uuid not null,
    owner_id bigint not null,
    constraint BlogOwners_pkey primary key (id),
    constraint BlogOwners_blog_id_fkey foreign key (blog_id) references "Blogs" (id) on update cascade on delete cascade,
    constraint BlogOwners_owner_id_fkey foreign key (owner_id) references "Users" (id) on update cascade on delete cascade
  ) tablespace pg_default;

create table
  public."BlogAuthors" (
    id bigint generated by default as identity not null,
    created_at timestamp with time zone not null default now(),
    blog_id uuid not null,
    author_id bigint not null,
    constraint BlogAuthors_pkey primary key (id),
    constraint BlogAuthors_author_id_fkey foreign key (author_id) references "Users" (id) on update cascade on delete cascade,
    constraint BlogAuthors_blog_id_fkey foreign key (blog_id) references "Blogs" (id) on update cascade on delete cascade
  ) tablespace pg_default;

create table
  public."BlogReviewers" (
    id bigint generated by default as identity not null,
    created_at timestamp with time zone not null default now(),
    blog_id uuid not null,
    reviewer_id bigint not null,
    constraint BlogReviewers_pkey primary key (id),
    constraint BlogReviewers_blog_id_fkey foreign key (blog_id) references "Blogs" (id) on update cascade on delete cascade,
    constraint BlogReviewers_reviewer_id_fkey foreign key (reviewer_id) references "Users" (id) on update cascade on delete cascade
  ) tablespace pg_default;

public enum post_status	(draft, under_review, published, rejected)