Skip to content

Commit 0b563ea

Browse files
add queryusers endpoint (#40)
1 parent 341ef2a commit 0b563ea

File tree

2 files changed

+198
-1
lines changed

2 files changed

+198
-1
lines changed

lib/Authsignal/Authsignal.php

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,48 @@ public static function deleteUser(array $params)
112112
return $response;
113113
}
114114

115+
/**
116+
* Query users
117+
* @param array $params An associative array of parameters:
118+
* - string 'username': Filter by username (optional)
119+
* - string 'email': Filter by email (optional)
120+
* - string 'phoneNumber': Filter by phone number (optional)
121+
* - string 'token': Filter by token (optional)
122+
* - int 'limit': Maximum number of users to return (optional)
123+
* - string 'lastEvaluatedUserId': For pagination, the last userId from previous response (optional)
124+
* @return array The authsignal response containing users array and pagination info
125+
*/
126+
public static function queryUsers(array $params = [])
127+
{
128+
$request = new AuthsignalClient();
129+
130+
$queryData = [];
131+
if (isset($params['username'])) {
132+
$queryData['username'] = $params['username'];
133+
}
134+
if (isset($params['email'])) {
135+
$queryData['email'] = $params['email'];
136+
}
137+
if (isset($params['phoneNumber'])) {
138+
$queryData['phoneNumber'] = $params['phoneNumber'];
139+
}
140+
if (isset($params['token'])) {
141+
$queryData['token'] = $params['token'];
142+
}
143+
if (isset($params['limit'])) {
144+
$queryData['limit'] = $params['limit'];
145+
}
146+
if (isset($params['lastEvaluatedUserId'])) {
147+
$queryData['lastEvaluatedUserId'] = $params['lastEvaluatedUserId'];
148+
}
149+
150+
$query = http_build_query($queryData);
151+
$path = "/users" . ($query ? "?{$query}" : "");
152+
153+
list($response, $request) = $request->send($path, null, 'get');
154+
return $response;
155+
}
156+
115157

116158
/**
117159
* Get Authenticators
@@ -174,7 +216,7 @@ public static function deleteAuthenticator(array $params) {
174216
list($response, $request) = $request->send($path, null, 'delete');
175217
return $response;
176218
} catch (Exception $e) {
177-
throw new AuthsignalApiException($e->getMessage(), $path, $e);
219+
throw $e;
178220
}
179221
}
180222

test/AuthsignalTest.php

Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,161 @@ public function testDeleteUser() {
7272
$this->assertEquals($response["success"], true);
7373
}
7474

75+
public function testQueryUsers() {
76+
$mockedResponse = array(
77+
"users" => array(
78+
array(
79+
"userId" => "user-1",
80+
"email" => "test@example.com",
81+
"emailVerified" => true,
82+
"phoneNumber" => "+1234567890",
83+
"phoneNumberVerified" => false,
84+
"username" => "user1"
85+
)
86+
),
87+
"lastEvaluatedUserId" => "user-1"
88+
);
89+
90+
self::$server->setResponseOfPath("/users", new Response(json_encode($mockedResponse)));
91+
92+
// At least one of username, email, or phoneNumber is required by the API
93+
$params = array("email" => "test@example.com");
94+
$response = Authsignal::queryUsers($params);
95+
96+
$this->assertIsArray($response["users"]);
97+
$this->assertCount(1, $response["users"]);
98+
$this->assertEquals($response["users"][0]["userId"], "user-1");
99+
$this->assertEquals($response["users"][0]["email"], "test@example.com");
100+
$this->assertEquals($response["lastEvaluatedUserId"], "user-1");
101+
}
102+
103+
public function testQueryUsersWithPagination() {
104+
$mockedResponse = array(
105+
"users" => array(
106+
array(
107+
"userId" => "user-2",
108+
"email" => "test@example.com",
109+
"emailVerified" => true,
110+
"phoneNumber" => null,
111+
"phoneNumberVerified" => false,
112+
"username" => null
113+
)
114+
)
115+
);
116+
117+
self::$server->setResponseOfPath("/users", new Response(json_encode($mockedResponse)));
118+
119+
$params = array(
120+
"email" => "test@example.com",
121+
"limit" => 10,
122+
"lastEvaluatedUserId" => "user-1"
123+
);
124+
125+
$response = Authsignal::queryUsers($params);
126+
127+
$this->assertIsArray($response["users"]);
128+
$this->assertCount(1, $response["users"]);
129+
$this->assertEquals($response["users"][0]["email"], "test@example.com");
130+
}
131+
132+
public function testQueryUsersWithAllParams() {
133+
$mockedResponse = array(
134+
"users" => array(
135+
array(
136+
"userId" => "user-3",
137+
"email" => "test@example.com",
138+
"emailVerified" => true,
139+
"phoneNumber" => "+1234567890",
140+
"phoneNumberVerified" => true,
141+
"username" => "testuser"
142+
)
143+
),
144+
"lastEvaluatedUserId" => "user-3",
145+
"tokenPayload" => array("sub" => "user-3")
146+
);
147+
148+
self::$server->setResponseOfPath("/users", new Response(json_encode($mockedResponse)));
149+
150+
$params = array(
151+
"username" => "testuser",
152+
"email" => "test@example.com",
153+
"phoneNumber" => "+1234567890",
154+
"token" => "some-token",
155+
"limit" => 5,
156+
"lastEvaluatedUserId" => "user-2"
157+
);
158+
159+
$response = Authsignal::queryUsers($params);
160+
161+
$this->assertIsArray($response["users"]);
162+
$this->assertCount(1, $response["users"]);
163+
$this->assertEquals("user-3", $response["users"][0]["userId"]);
164+
$this->assertEquals("testuser", $response["users"][0]["username"]);
165+
$this->assertEquals("+1234567890", $response["users"][0]["phoneNumber"]);
166+
$this->assertTrue($response["users"][0]["phoneNumberVerified"]);
167+
$this->assertEquals("user-3", $response["lastEvaluatedUserId"]);
168+
$this->assertArrayHasKey("tokenPayload", $response);
169+
}
170+
171+
public function testQueryUsersEmptyResult() {
172+
$mockedResponse = array(
173+
"users" => array()
174+
);
175+
176+
self::$server->setResponseOfPath("/users", new Response(json_encode($mockedResponse)));
177+
178+
$params = array("email" => "nonexistent@example.com");
179+
$response = Authsignal::queryUsers($params);
180+
181+
$this->assertIsArray($response["users"]);
182+
$this->assertCount(0, $response["users"]);
183+
$this->assertArrayNotHasKey("lastEvaluatedUserId", $response);
184+
}
185+
186+
public function testQueryUsersMultipleResults() {
187+
$mockedResponse = array(
188+
"users" => array(
189+
array(
190+
"userId" => "user-1",
191+
"email" => "user1@example.com",
192+
"emailVerified" => true,
193+
"phoneNumber" => null,
194+
"phoneNumberVerified" => false,
195+
"username" => null
196+
),
197+
array(
198+
"userId" => "user-2",
199+
"email" => "user2@example.com",
200+
"emailVerified" => false,
201+
"phoneNumber" => "+9876543210",
202+
"phoneNumberVerified" => true,
203+
"username" => "user2"
204+
),
205+
array(
206+
"userId" => "user-3",
207+
"email" => "user3@example.com",
208+
"emailVerified" => true,
209+
"phoneNumber" => null,
210+
"phoneNumberVerified" => false,
211+
"username" => "user3"
212+
)
213+
),
214+
"lastEvaluatedUserId" => "user-3"
215+
);
216+
217+
self::$server->setResponseOfPath("/users", new Response(json_encode($mockedResponse)));
218+
219+
$params = array("email" => "example.com", "limit" => 3);
220+
$response = Authsignal::queryUsers($params);
221+
222+
$this->assertIsArray($response["users"]);
223+
$this->assertCount(3, $response["users"]);
224+
$this->assertEquals("user-1", $response["users"][0]["userId"]);
225+
$this->assertEquals("user-2", $response["users"][1]["userId"]);
226+
$this->assertEquals("user-3", $response["users"][2]["userId"]);
227+
$this->assertEquals("user-3", $response["lastEvaluatedUserId"]);
228+
}
229+
75230
public function testGetAuthenticators() {
76231
$mockedResponse = array(
77232
array(

0 commit comments

Comments
 (0)