diff --git a/ghost/admin/app/controllers/members.js b/ghost/admin/app/controllers/members.js index 3b54f9828e..31a7845dbe 100644 --- a/ghost/admin/app/controllers/members.js +++ b/ghost/admin/app/controllers/members.js @@ -216,9 +216,35 @@ export default class MembersController extends Controller { }); } + refineFilterParam(filterParam) { + // We have some crazy regex below, here's a breakdown of what it does: + // \\( - Matches an opening parenthesis "(" + // [^)]* - Matches zero or more characters that are NOT a closing parenthesis ")" + // [,+\\-]? - Matches an optional comma, plus, or minus sign + // email_disabled - Matches the exact string "email_disabled" + // [^)]* - Matches zero or more characters that are NOT a closing parenthesis ")" + // \\) - Matches a closing parenthesis ")" + // (?! + // [+\\-] - Negative lookahead: Asserts what directly follows is neither a plus "+" nor a minus "-" + // | - OR + // :\\'[^']*\\' - Negative lookahead: Asserts what follows is not a colon ":" followed by a string in single quotes + // | - OR + // :\\"[^"]*\\" - Negative lookahead: Asserts what follows is not a colon ":" followed by a string in double quotes + // ) + const regex = new RegExp(`\\(([^)]*[,+\\-]?email_disabled[^)]*)\\)(?![+\\-]|:\\'[^']*\\'|:\\"[^"]*\\")`, 'g'); + return filterParam.replace(regex, '$1'); + } + getApiQueryObject({params, extraFilters = []} = {}) { let {label, paidParam, searchParam, filterParam} = params ? params : this; + // NOTE: this is a temporary fix to help where the API isn't handling the parentheses correctly + // It's potentially a deeper issue with NQL. This should be removed once the API is fixed. + // refs https://ghost.slack.com/archives/C05EQPTMEP7/p1692025845788769 + if (filterParam) { + filterParam = this.refineFilterParam(filterParam); + } + let filters = []; filters = filters.concat(extraFilters);