CREATE TABLE IF NOT EXISTS team_invitations ( id BIGSERIAL PRIMARY KEY, team_member_id BIGINT NOT NULL REFERENCES team_members(id) ON DELETE CASCADE, token VARCHAR(128) NOT NULL UNIQUE, status VARCHAR(20) NOT NULL DEFAULT 'pending' CHECK ( status IN ('pending', 'accepted', 'expired', 'revoked') ), expires_at TIMESTAMPTZ NOT NULL, invited_by BIGINT, accepted_at TIMESTAMPTZ, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), updated_at TIMESTAMPTZ ); CREATE INDEX IF NOT EXISTS idx_team_invitations_token ON team_invitations(token); CREATE INDEX IF NOT EXISTS idx_team_invitations_team_member_id ON team_invitations(team_member_id); CREATE INDEX IF NOT EXISTS idx_team_invitations_status ON team_invitations(status); CREATE INDEX IF NOT EXISTS idx_team_invitations_expires_at ON team_invitations(expires_at);