Skip to content

Commit eb51131

Browse files
Merge pull request ibi-group#474 from ibi-group/improve-user-search
Filter datatool users using any substring
2 parents 0268b8e + d9fa9e1 commit eb51131

File tree

2 files changed

+39
-1
lines changed

2 files changed

+39
-1
lines changed

src/main/java/com/conveyal/datatools/manager/controllers/api/UserController.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ private static String getAllUsers(Request req, Response res) {
107107
private static String filterUserSearchQuery(Request req) {
108108
Auth0UserProfile userProfile = req.attribute("user");
109109
String queryString = req.queryParams("queryString");
110-
if(queryString != null) queryString = "email:" + queryString + "*";
110+
if(queryString != null) queryString = makeEmailFilterQuery(queryString);
111111

112112
if (userProfile.canAdministerApplication()) {
113113
// do not filter further based on permissions, proceed with search
@@ -206,6 +206,20 @@ private static Auth0UserSearchResult checkForExistingAuth0User(Request req, Stri
206206
}
207207
}
208208

209+
/**
210+
* Generates an email search query for the given base query string.
211+
*/
212+
public static String makeEmailFilterQuery(String queryString) {
213+
// Don't insert the "begins with" wildcard if the search term is less than 3 characters long.
214+
// per https://auth0.com/docs/manage-users/user-search/user-search-query-syntax#wildcards.
215+
boolean isAtLeast3Chars = queryString != null && queryString.length() >= 3;
216+
return String.format(
217+
"email:%s%s*",
218+
isAtLeast3Chars ? "*" : "",
219+
queryString
220+
);
221+
}
222+
209223
/**
210224
* Class to hold a user's profile and raw JSON permissions.
211225
*/

src/test/java/com/conveyal/datatools/manager/controllers/api/UserControllerTest.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,13 @@
1212
import org.junit.jupiter.api.BeforeAll;
1313
import org.junit.jupiter.api.BeforeEach;
1414
import org.junit.jupiter.api.Test;
15+
import org.junit.jupiter.params.ParameterizedTest;
16+
import org.junit.jupiter.params.provider.Arguments;
17+
import org.junit.jupiter.params.provider.MethodSource;
1518

1619
import java.io.IOException;
1720
import java.net.URLEncoder;
21+
import java.util.stream.Stream;
1822

1923
import static com.conveyal.datatools.TestUtils.parseJson;
2024
import static com.conveyal.datatools.manager.auth.Auth0Users.USERS_API_PATH;
@@ -464,6 +468,26 @@ public void updateUserFailsWhenApiTokenInvalid() throws IOException {
464468
setCachedApiToken(null);
465469
}
466470

471+
/**
472+
* Ensures that search wildcards are correctly inserted into search queries.
473+
*/
474+
@ParameterizedTest
475+
@MethodSource("createMakeEmailFilterQueryCases")
476+
public void shouldMakeEmailFilterQuery(String queryString, String result) {
477+
assertThat(
478+
"Auth0 email user queries should be valid.",
479+
UserController.makeEmailFilterQuery(queryString).equals(result)
480+
);
481+
}
482+
483+
private static Stream<Arguments> createMakeEmailFilterQueryCases() {
484+
return Stream.of(
485+
Arguments.of("Joe", "email:*Joe*"),
486+
// Don't insert the "begins with" wildcard if the search term is less than 3 characters long.
487+
Arguments.of("Jo", "email:Jo*")
488+
);
489+
}
490+
467491
private static void stubForApiToken(String bodyFile) {
468492
wireMockServer.stubFor(
469493
post(urlPathEqualTo("/oauth/token"))

0 commit comments

Comments
 (0)