- Create @reviq/virtual-authenticator package with cryptographically valid WebAuthn credential generation for testing - Add e2e tests for WebAuthn registration, authentication, passkey management - Add unit tests for passkey-helpers and VirtualAuthenticator - Add security tests for counter replay and tampered responses - Configure test database environment in devenv.nix - Add turbo.json test tasks and workspace configuration Test results: 98 tests passing (54 virtual-authenticator, 25 e2e, 19 unit) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1081 lines
25 KiB
SQL
1081 lines
25 KiB
SQL
\restrict Trg340CgUaHnQsqUDFepZ6WnV8O2lwkEMfhS9CGxBAJbWOA8qTnig08shTgrMcE
|
|
|
|
-- Dumped from database version 17.7
|
|
-- Dumped by pg_dump version 17.7
|
|
|
|
SET statement_timeout = 0;
|
|
SET lock_timeout = 0;
|
|
SET idle_in_transaction_session_timeout = 0;
|
|
SET transaction_timeout = 0;
|
|
SET client_encoding = 'UTF8';
|
|
SET standard_conforming_strings = on;
|
|
SELECT pg_catalog.set_config('search_path', '', false);
|
|
SET check_function_bodies = false;
|
|
SET xmloption = content;
|
|
SET client_min_messages = warning;
|
|
SET row_security = off;
|
|
|
|
--
|
|
-- Name: org_role; Type: TYPE; Schema: public; Owner: -
|
|
--
|
|
|
|
CREATE TYPE public.org_role AS ENUM (
|
|
'owner',
|
|
'admin',
|
|
'member'
|
|
);
|
|
|
|
|
|
--
|
|
-- Name: passkey_device_type; Type: TYPE; Schema: public; Owner: -
|
|
--
|
|
|
|
CREATE TYPE public.passkey_device_type AS ENUM (
|
|
'singleDevice',
|
|
'multiDevice'
|
|
);
|
|
|
|
|
|
SET default_tablespace = '';
|
|
|
|
SET default_table_access_method = heap;
|
|
|
|
--
|
|
-- Name: api_tokens; Type: TABLE; Schema: public; Owner: -
|
|
--
|
|
|
|
CREATE TABLE public.api_tokens (
|
|
id bigint NOT NULL,
|
|
user_id integer NOT NULL,
|
|
name text NOT NULL,
|
|
token_hash text NOT NULL,
|
|
last_used_at timestamp with time zone,
|
|
expires_at timestamp with time zone NOT NULL,
|
|
created_at timestamp with time zone DEFAULT now() NOT NULL
|
|
);
|
|
|
|
|
|
--
|
|
-- Name: api_tokens_id_seq; Type: SEQUENCE; Schema: public; Owner: -
|
|
--
|
|
|
|
CREATE SEQUENCE public.api_tokens_id_seq
|
|
START WITH 1
|
|
INCREMENT BY 1
|
|
NO MINVALUE
|
|
NO MAXVALUE
|
|
CACHE 1;
|
|
|
|
|
|
--
|
|
-- Name: api_tokens_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER SEQUENCE public.api_tokens_id_seq OWNED BY public.api_tokens.id;
|
|
|
|
|
|
--
|
|
-- Name: email_verifications; Type: TABLE; Schema: public; Owner: -
|
|
--
|
|
|
|
CREATE TABLE public.email_verifications (
|
|
id bigint NOT NULL,
|
|
user_id integer NOT NULL,
|
|
token text NOT NULL,
|
|
expires_at timestamp with time zone NOT NULL,
|
|
created_at timestamp with time zone DEFAULT now() NOT NULL
|
|
);
|
|
|
|
|
|
--
|
|
-- Name: email_verifications_id_seq; Type: SEQUENCE; Schema: public; Owner: -
|
|
--
|
|
|
|
CREATE SEQUENCE public.email_verifications_id_seq
|
|
START WITH 1
|
|
INCREMENT BY 1
|
|
NO MINVALUE
|
|
NO MAXVALUE
|
|
CACHE 1;
|
|
|
|
|
|
--
|
|
-- Name: email_verifications_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER SEQUENCE public.email_verifications_id_seq OWNED BY public.email_verifications.id;
|
|
|
|
|
|
--
|
|
-- Name: login_requests; Type: TABLE; Schema: public; Owner: -
|
|
--
|
|
|
|
CREATE TABLE public.login_requests (
|
|
id bigint NOT NULL,
|
|
user_id integer NOT NULL,
|
|
email text NOT NULL,
|
|
token text,
|
|
device_fingerprint text,
|
|
ip_address text,
|
|
city text,
|
|
region text,
|
|
country text,
|
|
user_agent text,
|
|
completed_at timestamp with time zone,
|
|
expires_at timestamp with time zone NOT NULL,
|
|
created_at timestamp with time zone DEFAULT now() NOT NULL
|
|
);
|
|
|
|
|
|
--
|
|
-- Name: login_requests_id_seq; Type: SEQUENCE; Schema: public; Owner: -
|
|
--
|
|
|
|
CREATE SEQUENCE public.login_requests_id_seq
|
|
START WITH 1
|
|
INCREMENT BY 1
|
|
NO MINVALUE
|
|
NO MAXVALUE
|
|
CACHE 1;
|
|
|
|
|
|
--
|
|
-- Name: login_requests_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER SEQUENCE public.login_requests_id_seq OWNED BY public.login_requests.id;
|
|
|
|
|
|
--
|
|
-- Name: org_invites; Type: TABLE; Schema: public; Owner: -
|
|
--
|
|
|
|
CREATE TABLE public.org_invites (
|
|
id integer NOT NULL,
|
|
org_id integer NOT NULL,
|
|
email text NOT NULL,
|
|
role public.org_role DEFAULT 'member'::public.org_role NOT NULL,
|
|
invited_by integer NOT NULL,
|
|
token text NOT NULL,
|
|
expires_at timestamp with time zone NOT NULL,
|
|
created_at timestamp with time zone DEFAULT now() NOT NULL
|
|
);
|
|
|
|
|
|
--
|
|
-- Name: org_invites_id_seq; Type: SEQUENCE; Schema: public; Owner: -
|
|
--
|
|
|
|
CREATE SEQUENCE public.org_invites_id_seq
|
|
AS integer
|
|
START WITH 1
|
|
INCREMENT BY 1
|
|
NO MINVALUE
|
|
NO MAXVALUE
|
|
CACHE 1;
|
|
|
|
|
|
--
|
|
-- Name: org_invites_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER SEQUENCE public.org_invites_id_seq OWNED BY public.org_invites.id;
|
|
|
|
|
|
--
|
|
-- Name: org_members; Type: TABLE; Schema: public; Owner: -
|
|
--
|
|
|
|
CREATE TABLE public.org_members (
|
|
id integer NOT NULL,
|
|
org_id integer NOT NULL,
|
|
user_id integer NOT NULL,
|
|
role public.org_role DEFAULT 'member'::public.org_role NOT NULL,
|
|
created_at timestamp with time zone DEFAULT now() NOT NULL
|
|
);
|
|
|
|
|
|
--
|
|
-- Name: org_members_id_seq; Type: SEQUENCE; Schema: public; Owner: -
|
|
--
|
|
|
|
CREATE SEQUENCE public.org_members_id_seq
|
|
AS integer
|
|
START WITH 1
|
|
INCREMENT BY 1
|
|
NO MINVALUE
|
|
NO MAXVALUE
|
|
CACHE 1;
|
|
|
|
|
|
--
|
|
-- Name: org_members_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER SEQUENCE public.org_members_id_seq OWNED BY public.org_members.id;
|
|
|
|
|
|
--
|
|
-- Name: org_sites; Type: TABLE; Schema: public; Owner: -
|
|
--
|
|
|
|
CREATE TABLE public.org_sites (
|
|
id integer NOT NULL,
|
|
org_id integer NOT NULL,
|
|
domain text NOT NULL,
|
|
created_at timestamp with time zone DEFAULT now() NOT NULL
|
|
);
|
|
|
|
|
|
--
|
|
-- Name: org_sites_id_seq; Type: SEQUENCE; Schema: public; Owner: -
|
|
--
|
|
|
|
CREATE SEQUENCE public.org_sites_id_seq
|
|
AS integer
|
|
START WITH 1
|
|
INCREMENT BY 1
|
|
NO MINVALUE
|
|
NO MAXVALUE
|
|
CACHE 1;
|
|
|
|
|
|
--
|
|
-- Name: org_sites_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER SEQUENCE public.org_sites_id_seq OWNED BY public.org_sites.id;
|
|
|
|
|
|
--
|
|
-- Name: orgs; Type: TABLE; Schema: public; Owner: -
|
|
--
|
|
|
|
CREATE TABLE public.orgs (
|
|
id integer NOT NULL,
|
|
slug text NOT NULL,
|
|
display_name text NOT NULL,
|
|
logo_url text,
|
|
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
|
updated_at timestamp with time zone DEFAULT now() NOT NULL
|
|
);
|
|
|
|
|
|
--
|
|
-- Name: orgs_id_seq; Type: SEQUENCE; Schema: public; Owner: -
|
|
--
|
|
|
|
CREATE SEQUENCE public.orgs_id_seq
|
|
AS integer
|
|
START WITH 1
|
|
INCREMENT BY 1
|
|
NO MINVALUE
|
|
NO MAXVALUE
|
|
CACHE 1;
|
|
|
|
|
|
--
|
|
-- Name: orgs_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER SEQUENCE public.orgs_id_seq OWNED BY public.orgs.id;
|
|
|
|
|
|
--
|
|
-- Name: passkeys; Type: TABLE; Schema: public; Owner: -
|
|
--
|
|
|
|
CREATE TABLE public.passkeys (
|
|
id bigint NOT NULL,
|
|
user_id integer NOT NULL,
|
|
credential_id bytea NOT NULL,
|
|
public_key bytea NOT NULL,
|
|
webauthn_user_id text NOT NULL,
|
|
counter bigint DEFAULT 0 NOT NULL,
|
|
device_type public.passkey_device_type NOT NULL,
|
|
backup_eligible boolean NOT NULL,
|
|
backup_status boolean NOT NULL,
|
|
transports jsonb,
|
|
rpid text NOT NULL,
|
|
name text NOT NULL,
|
|
last_used_at timestamp with time zone,
|
|
created_at timestamp with time zone DEFAULT now() NOT NULL
|
|
);
|
|
|
|
|
|
--
|
|
-- Name: passkeys_id_seq; Type: SEQUENCE; Schema: public; Owner: -
|
|
--
|
|
|
|
CREATE SEQUENCE public.passkeys_id_seq
|
|
START WITH 1
|
|
INCREMENT BY 1
|
|
NO MINVALUE
|
|
NO MAXVALUE
|
|
CACHE 1;
|
|
|
|
|
|
--
|
|
-- Name: passkeys_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER SEQUENCE public.passkeys_id_seq OWNED BY public.passkeys.id;
|
|
|
|
|
|
--
|
|
-- Name: password_resets; Type: TABLE; Schema: public; Owner: -
|
|
--
|
|
|
|
CREATE TABLE public.password_resets (
|
|
id bigint NOT NULL,
|
|
user_id integer NOT NULL,
|
|
token text NOT NULL,
|
|
expires_at timestamp with time zone NOT NULL,
|
|
used_at timestamp with time zone,
|
|
created_at timestamp with time zone DEFAULT now() NOT NULL
|
|
);
|
|
|
|
|
|
--
|
|
-- Name: password_resets_id_seq; Type: SEQUENCE; Schema: public; Owner: -
|
|
--
|
|
|
|
CREATE SEQUENCE public.password_resets_id_seq
|
|
START WITH 1
|
|
INCREMENT BY 1
|
|
NO MINVALUE
|
|
NO MAXVALUE
|
|
CACHE 1;
|
|
|
|
|
|
--
|
|
-- Name: password_resets_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER SEQUENCE public.password_resets_id_seq OWNED BY public.password_resets.id;
|
|
|
|
|
|
--
|
|
-- Name: schema_migrations; Type: TABLE; Schema: public; Owner: -
|
|
--
|
|
|
|
CREATE TABLE public.schema_migrations (
|
|
version character varying NOT NULL
|
|
);
|
|
|
|
|
|
--
|
|
-- Name: sessions; Type: TABLE; Schema: public; Owner: -
|
|
--
|
|
|
|
CREATE TABLE public.sessions (
|
|
id bigint NOT NULL,
|
|
user_id integer NOT NULL,
|
|
device_id bigint,
|
|
token_hash text NOT NULL,
|
|
trusted_mode boolean NOT NULL,
|
|
ip_address text,
|
|
city text,
|
|
region text,
|
|
country text,
|
|
user_agent text,
|
|
expires_at timestamp with time zone NOT NULL,
|
|
revoked_at timestamp with time zone,
|
|
created_at timestamp with time zone DEFAULT now() NOT NULL
|
|
);
|
|
|
|
|
|
--
|
|
-- Name: sessions_id_seq; Type: SEQUENCE; Schema: public; Owner: -
|
|
--
|
|
|
|
CREATE SEQUENCE public.sessions_id_seq
|
|
START WITH 1
|
|
INCREMENT BY 1
|
|
NO MINVALUE
|
|
NO MAXVALUE
|
|
CACHE 1;
|
|
|
|
|
|
--
|
|
-- Name: sessions_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER SEQUENCE public.sessions_id_seq OWNED BY public.sessions.id;
|
|
|
|
|
|
--
|
|
-- Name: user_devices; Type: TABLE; Schema: public; Owner: -
|
|
--
|
|
|
|
CREATE TABLE public.user_devices (
|
|
id bigint NOT NULL,
|
|
user_id integer NOT NULL,
|
|
device_fingerprint text NOT NULL,
|
|
name text,
|
|
is_trusted boolean DEFAULT false NOT NULL,
|
|
user_agent text NOT NULL,
|
|
ip_address text,
|
|
city text,
|
|
region text,
|
|
country text,
|
|
last_used_at timestamp with time zone DEFAULT now() NOT NULL,
|
|
created_at timestamp with time zone DEFAULT now() NOT NULL
|
|
);
|
|
|
|
|
|
--
|
|
-- Name: user_devices_id_seq; Type: SEQUENCE; Schema: public; Owner: -
|
|
--
|
|
|
|
CREATE SEQUENCE public.user_devices_id_seq
|
|
START WITH 1
|
|
INCREMENT BY 1
|
|
NO MINVALUE
|
|
NO MAXVALUE
|
|
CACHE 1;
|
|
|
|
|
|
--
|
|
-- Name: user_devices_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER SEQUENCE public.user_devices_id_seq OWNED BY public.user_devices.id;
|
|
|
|
|
|
--
|
|
-- Name: users; Type: TABLE; Schema: public; Owner: -
|
|
--
|
|
|
|
CREATE TABLE public.users (
|
|
id integer NOT NULL,
|
|
email text NOT NULL,
|
|
email_verified_at timestamp with time zone,
|
|
full_name text,
|
|
display_name text,
|
|
phone_number text,
|
|
avatar_url text,
|
|
password_hash text,
|
|
require_passkey boolean DEFAULT false NOT NULL,
|
|
is_superuser boolean DEFAULT false NOT NULL,
|
|
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
|
updated_at timestamp with time zone DEFAULT now() NOT NULL
|
|
);
|
|
|
|
|
|
--
|
|
-- Name: users_id_seq; Type: SEQUENCE; Schema: public; Owner: -
|
|
--
|
|
|
|
CREATE SEQUENCE public.users_id_seq
|
|
AS integer
|
|
START WITH 1
|
|
INCREMENT BY 1
|
|
NO MINVALUE
|
|
NO MAXVALUE
|
|
CACHE 1;
|
|
|
|
|
|
--
|
|
-- Name: users_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER SEQUENCE public.users_id_seq OWNED BY public.users.id;
|
|
|
|
|
|
--
|
|
-- Name: webauthn_challenges; Type: TABLE; Schema: public; Owner: -
|
|
--
|
|
|
|
CREATE TABLE public.webauthn_challenges (
|
|
id bigint NOT NULL,
|
|
options jsonb NOT NULL,
|
|
created_at timestamp with time zone DEFAULT now() NOT NULL
|
|
);
|
|
|
|
|
|
--
|
|
-- Name: webauthn_challenges_id_seq; Type: SEQUENCE; Schema: public; Owner: -
|
|
--
|
|
|
|
CREATE SEQUENCE public.webauthn_challenges_id_seq
|
|
START WITH 1
|
|
INCREMENT BY 1
|
|
NO MINVALUE
|
|
NO MAXVALUE
|
|
CACHE 1;
|
|
|
|
|
|
--
|
|
-- Name: webauthn_challenges_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER SEQUENCE public.webauthn_challenges_id_seq OWNED BY public.webauthn_challenges.id;
|
|
|
|
|
|
--
|
|
-- Name: api_tokens id; Type: DEFAULT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.api_tokens ALTER COLUMN id SET DEFAULT nextval('public.api_tokens_id_seq'::regclass);
|
|
|
|
|
|
--
|
|
-- Name: email_verifications id; Type: DEFAULT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.email_verifications ALTER COLUMN id SET DEFAULT nextval('public.email_verifications_id_seq'::regclass);
|
|
|
|
|
|
--
|
|
-- Name: login_requests id; Type: DEFAULT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.login_requests ALTER COLUMN id SET DEFAULT nextval('public.login_requests_id_seq'::regclass);
|
|
|
|
|
|
--
|
|
-- Name: org_invites id; Type: DEFAULT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.org_invites ALTER COLUMN id SET DEFAULT nextval('public.org_invites_id_seq'::regclass);
|
|
|
|
|
|
--
|
|
-- Name: org_members id; Type: DEFAULT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.org_members ALTER COLUMN id SET DEFAULT nextval('public.org_members_id_seq'::regclass);
|
|
|
|
|
|
--
|
|
-- Name: org_sites id; Type: DEFAULT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.org_sites ALTER COLUMN id SET DEFAULT nextval('public.org_sites_id_seq'::regclass);
|
|
|
|
|
|
--
|
|
-- Name: orgs id; Type: DEFAULT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.orgs ALTER COLUMN id SET DEFAULT nextval('public.orgs_id_seq'::regclass);
|
|
|
|
|
|
--
|
|
-- Name: passkeys id; Type: DEFAULT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.passkeys ALTER COLUMN id SET DEFAULT nextval('public.passkeys_id_seq'::regclass);
|
|
|
|
|
|
--
|
|
-- Name: password_resets id; Type: DEFAULT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.password_resets ALTER COLUMN id SET DEFAULT nextval('public.password_resets_id_seq'::regclass);
|
|
|
|
|
|
--
|
|
-- Name: sessions id; Type: DEFAULT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.sessions ALTER COLUMN id SET DEFAULT nextval('public.sessions_id_seq'::regclass);
|
|
|
|
|
|
--
|
|
-- Name: user_devices id; Type: DEFAULT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.user_devices ALTER COLUMN id SET DEFAULT nextval('public.user_devices_id_seq'::regclass);
|
|
|
|
|
|
--
|
|
-- Name: users id; Type: DEFAULT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.users ALTER COLUMN id SET DEFAULT nextval('public.users_id_seq'::regclass);
|
|
|
|
|
|
--
|
|
-- Name: webauthn_challenges id; Type: DEFAULT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.webauthn_challenges ALTER COLUMN id SET DEFAULT nextval('public.webauthn_challenges_id_seq'::regclass);
|
|
|
|
|
|
--
|
|
-- Name: api_tokens api_tokens_pkey; Type: CONSTRAINT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.api_tokens
|
|
ADD CONSTRAINT api_tokens_pkey PRIMARY KEY (id);
|
|
|
|
|
|
--
|
|
-- Name: api_tokens api_tokens_token_hash_key; Type: CONSTRAINT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.api_tokens
|
|
ADD CONSTRAINT api_tokens_token_hash_key UNIQUE (token_hash);
|
|
|
|
|
|
--
|
|
-- Name: email_verifications email_verifications_pkey; Type: CONSTRAINT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.email_verifications
|
|
ADD CONSTRAINT email_verifications_pkey PRIMARY KEY (id);
|
|
|
|
|
|
--
|
|
-- Name: email_verifications email_verifications_token_key; Type: CONSTRAINT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.email_verifications
|
|
ADD CONSTRAINT email_verifications_token_key UNIQUE (token);
|
|
|
|
|
|
--
|
|
-- Name: login_requests login_requests_pkey; Type: CONSTRAINT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.login_requests
|
|
ADD CONSTRAINT login_requests_pkey PRIMARY KEY (id);
|
|
|
|
|
|
--
|
|
-- Name: login_requests login_requests_token_key; Type: CONSTRAINT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.login_requests
|
|
ADD CONSTRAINT login_requests_token_key UNIQUE (token);
|
|
|
|
|
|
--
|
|
-- Name: org_invites org_invites_org_id_email_key; Type: CONSTRAINT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.org_invites
|
|
ADD CONSTRAINT org_invites_org_id_email_key UNIQUE (org_id, email);
|
|
|
|
|
|
--
|
|
-- Name: org_invites org_invites_pkey; Type: CONSTRAINT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.org_invites
|
|
ADD CONSTRAINT org_invites_pkey PRIMARY KEY (id);
|
|
|
|
|
|
--
|
|
-- Name: org_invites org_invites_token_key; Type: CONSTRAINT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.org_invites
|
|
ADD CONSTRAINT org_invites_token_key UNIQUE (token);
|
|
|
|
|
|
--
|
|
-- Name: org_members org_members_org_id_user_id_key; Type: CONSTRAINT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.org_members
|
|
ADD CONSTRAINT org_members_org_id_user_id_key UNIQUE (org_id, user_id);
|
|
|
|
|
|
--
|
|
-- Name: org_members org_members_pkey; Type: CONSTRAINT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.org_members
|
|
ADD CONSTRAINT org_members_pkey PRIMARY KEY (id);
|
|
|
|
|
|
--
|
|
-- Name: org_sites org_sites_domain_key; Type: CONSTRAINT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.org_sites
|
|
ADD CONSTRAINT org_sites_domain_key UNIQUE (domain);
|
|
|
|
|
|
--
|
|
-- Name: org_sites org_sites_pkey; Type: CONSTRAINT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.org_sites
|
|
ADD CONSTRAINT org_sites_pkey PRIMARY KEY (id);
|
|
|
|
|
|
--
|
|
-- Name: orgs orgs_pkey; Type: CONSTRAINT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.orgs
|
|
ADD CONSTRAINT orgs_pkey PRIMARY KEY (id);
|
|
|
|
|
|
--
|
|
-- Name: orgs orgs_slug_key; Type: CONSTRAINT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.orgs
|
|
ADD CONSTRAINT orgs_slug_key UNIQUE (slug);
|
|
|
|
|
|
--
|
|
-- Name: passkeys passkeys_credential_id_key; Type: CONSTRAINT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.passkeys
|
|
ADD CONSTRAINT passkeys_credential_id_key UNIQUE (credential_id);
|
|
|
|
|
|
--
|
|
-- Name: passkeys passkeys_pkey; Type: CONSTRAINT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.passkeys
|
|
ADD CONSTRAINT passkeys_pkey PRIMARY KEY (id);
|
|
|
|
|
|
--
|
|
-- Name: passkeys passkeys_webauthn_user_id_key; Type: CONSTRAINT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.passkeys
|
|
ADD CONSTRAINT passkeys_webauthn_user_id_key UNIQUE (webauthn_user_id);
|
|
|
|
|
|
--
|
|
-- Name: password_resets password_resets_pkey; Type: CONSTRAINT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.password_resets
|
|
ADD CONSTRAINT password_resets_pkey PRIMARY KEY (id);
|
|
|
|
|
|
--
|
|
-- Name: password_resets password_resets_token_key; Type: CONSTRAINT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.password_resets
|
|
ADD CONSTRAINT password_resets_token_key UNIQUE (token);
|
|
|
|
|
|
--
|
|
-- Name: schema_migrations schema_migrations_pkey; Type: CONSTRAINT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.schema_migrations
|
|
ADD CONSTRAINT schema_migrations_pkey PRIMARY KEY (version);
|
|
|
|
|
|
--
|
|
-- Name: sessions sessions_pkey; Type: CONSTRAINT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.sessions
|
|
ADD CONSTRAINT sessions_pkey PRIMARY KEY (id);
|
|
|
|
|
|
--
|
|
-- Name: sessions sessions_token_hash_key; Type: CONSTRAINT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.sessions
|
|
ADD CONSTRAINT sessions_token_hash_key UNIQUE (token_hash);
|
|
|
|
|
|
--
|
|
-- Name: user_devices user_devices_pkey; Type: CONSTRAINT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.user_devices
|
|
ADD CONSTRAINT user_devices_pkey PRIMARY KEY (id);
|
|
|
|
|
|
--
|
|
-- Name: user_devices user_devices_user_id_device_fingerprint_key; Type: CONSTRAINT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.user_devices
|
|
ADD CONSTRAINT user_devices_user_id_device_fingerprint_key UNIQUE (user_id, device_fingerprint);
|
|
|
|
|
|
--
|
|
-- Name: users users_email_key; Type: CONSTRAINT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.users
|
|
ADD CONSTRAINT users_email_key UNIQUE (email);
|
|
|
|
|
|
--
|
|
-- Name: users users_pkey; Type: CONSTRAINT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.users
|
|
ADD CONSTRAINT users_pkey PRIMARY KEY (id);
|
|
|
|
|
|
--
|
|
-- Name: webauthn_challenges webauthn_challenges_pkey; Type: CONSTRAINT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.webauthn_challenges
|
|
ADD CONSTRAINT webauthn_challenges_pkey PRIMARY KEY (id);
|
|
|
|
|
|
--
|
|
-- Name: idx_api_tokens_expires; Type: INDEX; Schema: public; Owner: -
|
|
--
|
|
|
|
CREATE INDEX idx_api_tokens_expires ON public.api_tokens USING btree (expires_at);
|
|
|
|
|
|
--
|
|
-- Name: idx_api_tokens_user; Type: INDEX; Schema: public; Owner: -
|
|
--
|
|
|
|
CREATE INDEX idx_api_tokens_user ON public.api_tokens USING btree (user_id);
|
|
|
|
|
|
--
|
|
-- Name: idx_email_verifications_expires; Type: INDEX; Schema: public; Owner: -
|
|
--
|
|
|
|
CREATE INDEX idx_email_verifications_expires ON public.email_verifications USING btree (expires_at);
|
|
|
|
|
|
--
|
|
-- Name: idx_login_requests_expires; Type: INDEX; Schema: public; Owner: -
|
|
--
|
|
|
|
CREATE INDEX idx_login_requests_expires ON public.login_requests USING btree (expires_at);
|
|
|
|
|
|
--
|
|
-- Name: idx_login_requests_user; Type: INDEX; Schema: public; Owner: -
|
|
--
|
|
|
|
CREATE INDEX idx_login_requests_user ON public.login_requests USING btree (user_id);
|
|
|
|
|
|
--
|
|
-- Name: idx_org_invites_email; Type: INDEX; Schema: public; Owner: -
|
|
--
|
|
|
|
CREATE INDEX idx_org_invites_email ON public.org_invites USING btree (email);
|
|
|
|
|
|
--
|
|
-- Name: idx_org_invites_expires; Type: INDEX; Schema: public; Owner: -
|
|
--
|
|
|
|
CREATE INDEX idx_org_invites_expires ON public.org_invites USING btree (expires_at);
|
|
|
|
|
|
--
|
|
-- Name: idx_org_members_org; Type: INDEX; Schema: public; Owner: -
|
|
--
|
|
|
|
CREATE INDEX idx_org_members_org ON public.org_members USING btree (org_id);
|
|
|
|
|
|
--
|
|
-- Name: idx_org_members_user; Type: INDEX; Schema: public; Owner: -
|
|
--
|
|
|
|
CREATE INDEX idx_org_members_user ON public.org_members USING btree (user_id);
|
|
|
|
|
|
--
|
|
-- Name: idx_org_sites_org; Type: INDEX; Schema: public; Owner: -
|
|
--
|
|
|
|
CREATE INDEX idx_org_sites_org ON public.org_sites USING btree (org_id);
|
|
|
|
|
|
--
|
|
-- Name: idx_passkeys_user; Type: INDEX; Schema: public; Owner: -
|
|
--
|
|
|
|
CREATE INDEX idx_passkeys_user ON public.passkeys USING btree (user_id);
|
|
|
|
|
|
--
|
|
-- Name: idx_password_resets_expires; Type: INDEX; Schema: public; Owner: -
|
|
--
|
|
|
|
CREATE INDEX idx_password_resets_expires ON public.password_resets USING btree (expires_at);
|
|
|
|
|
|
--
|
|
-- Name: idx_password_resets_user; Type: INDEX; Schema: public; Owner: -
|
|
--
|
|
|
|
CREATE INDEX idx_password_resets_user ON public.password_resets USING btree (user_id);
|
|
|
|
|
|
--
|
|
-- Name: idx_sessions_active; Type: INDEX; Schema: public; Owner: -
|
|
--
|
|
|
|
CREATE INDEX idx_sessions_active ON public.sessions USING btree (token_hash) WHERE (revoked_at IS NULL);
|
|
|
|
|
|
--
|
|
-- Name: idx_sessions_device; Type: INDEX; Schema: public; Owner: -
|
|
--
|
|
|
|
CREATE INDEX idx_sessions_device ON public.sessions USING btree (device_id);
|
|
|
|
|
|
--
|
|
-- Name: idx_sessions_user; Type: INDEX; Schema: public; Owner: -
|
|
--
|
|
|
|
CREATE INDEX idx_sessions_user ON public.sessions USING btree (user_id);
|
|
|
|
|
|
--
|
|
-- Name: idx_user_devices_fingerprint; Type: INDEX; Schema: public; Owner: -
|
|
--
|
|
|
|
CREATE INDEX idx_user_devices_fingerprint ON public.user_devices USING btree (device_fingerprint);
|
|
|
|
|
|
--
|
|
-- Name: idx_user_devices_user; Type: INDEX; Schema: public; Owner: -
|
|
--
|
|
|
|
CREATE INDEX idx_user_devices_user ON public.user_devices USING btree (user_id);
|
|
|
|
|
|
--
|
|
-- Name: idx_webauthn_challenges_created; Type: INDEX; Schema: public; Owner: -
|
|
--
|
|
|
|
CREATE INDEX idx_webauthn_challenges_created ON public.webauthn_challenges USING btree (created_at);
|
|
|
|
|
|
--
|
|
-- Name: api_tokens api_tokens_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.api_tokens
|
|
ADD CONSTRAINT api_tokens_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.users(id) ON DELETE CASCADE;
|
|
|
|
|
|
--
|
|
-- Name: email_verifications email_verifications_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.email_verifications
|
|
ADD CONSTRAINT email_verifications_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.users(id) ON DELETE CASCADE;
|
|
|
|
|
|
--
|
|
-- Name: login_requests login_requests_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.login_requests
|
|
ADD CONSTRAINT login_requests_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.users(id) ON DELETE CASCADE;
|
|
|
|
|
|
--
|
|
-- Name: org_invites org_invites_invited_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.org_invites
|
|
ADD CONSTRAINT org_invites_invited_by_fkey FOREIGN KEY (invited_by) REFERENCES public.users(id) ON DELETE CASCADE;
|
|
|
|
|
|
--
|
|
-- Name: org_invites org_invites_org_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.org_invites
|
|
ADD CONSTRAINT org_invites_org_id_fkey FOREIGN KEY (org_id) REFERENCES public.orgs(id) ON DELETE CASCADE;
|
|
|
|
|
|
--
|
|
-- Name: org_members org_members_org_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.org_members
|
|
ADD CONSTRAINT org_members_org_id_fkey FOREIGN KEY (org_id) REFERENCES public.orgs(id) ON DELETE CASCADE;
|
|
|
|
|
|
--
|
|
-- Name: org_members org_members_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.org_members
|
|
ADD CONSTRAINT org_members_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.users(id) ON DELETE CASCADE;
|
|
|
|
|
|
--
|
|
-- Name: org_sites org_sites_org_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.org_sites
|
|
ADD CONSTRAINT org_sites_org_id_fkey FOREIGN KEY (org_id) REFERENCES public.orgs(id) ON DELETE CASCADE;
|
|
|
|
|
|
--
|
|
-- Name: passkeys passkeys_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.passkeys
|
|
ADD CONSTRAINT passkeys_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.users(id) ON DELETE CASCADE;
|
|
|
|
|
|
--
|
|
-- Name: password_resets password_resets_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.password_resets
|
|
ADD CONSTRAINT password_resets_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.users(id) ON DELETE CASCADE;
|
|
|
|
|
|
--
|
|
-- Name: sessions sessions_device_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.sessions
|
|
ADD CONSTRAINT sessions_device_id_fkey FOREIGN KEY (device_id) REFERENCES public.user_devices(id) ON DELETE SET NULL;
|
|
|
|
|
|
--
|
|
-- Name: sessions sessions_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.sessions
|
|
ADD CONSTRAINT sessions_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.users(id) ON DELETE CASCADE;
|
|
|
|
|
|
--
|
|
-- Name: user_devices user_devices_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
|
|
--
|
|
|
|
ALTER TABLE ONLY public.user_devices
|
|
ADD CONSTRAINT user_devices_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.users(id) ON DELETE CASCADE;
|
|
|
|
|
|
--
|
|
-- PostgreSQL database dump complete
|
|
--
|
|
|
|
\unrestrict Trg340CgUaHnQsqUDFepZ6WnV8O2lwkEMfhS9CGxBAJbWOA8qTnig08shTgrMcE
|
|
|
|
|
|
--
|
|
-- Dbmate schema migrations
|
|
--
|
|
|
|
INSERT INTO public.schema_migrations (version) VALUES
|
|
('001');
|