-- Create the magic link tokens table. -- token_hash is the SHA-256 hash of the raw token sent to the user. -- Tokens are single-use: the `used` flag is set to true on first verification. CREATE TABLE magic_tokens ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), email TEXT NOT NULL, token_hash TEXT NOT NULL UNIQUE, created_at TIMESTAMPTZ NOT NULL DEFAULT now(), expires_at TIMESTAMPTZ NOT NULL, used BOOLEAN NOT NULL DEFAULT false ); CREATE INDEX idx_magic_tokens_email ON magic_tokens(email); CREATE INDEX idx_magic_tokens_expires ON magic_tokens(expires_at);