diff --git a/package-lock.json b/package-lock.json index bc793b8f7e..c045a74cf2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5276,8 +5276,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "optional": true + "dev": true }, "aproba": { "version": "1.2.0", @@ -5301,15 +5300,13 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true, - "optional": true + "dev": true }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -5326,22 +5323,19 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true, - "optional": true + "dev": true }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true, - "optional": true + "dev": true }, "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true, - "optional": true + "dev": true }, "core-util-is": { "version": "1.0.2", @@ -5472,8 +5466,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true, - "optional": true + "dev": true }, "ini": { "version": "1.3.5", @@ -5487,7 +5480,6 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, - "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -5504,7 +5496,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, - "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -5513,15 +5504,13 @@ "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true, - "optional": true + "dev": true }, "minipass": { "version": "2.3.5", "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", "dev": true, - "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -5542,7 +5531,6 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, - "optional": true, "requires": { "minimist": "0.0.8" } @@ -5631,8 +5619,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true, - "optional": true + "dev": true }, "object-assign": { "version": "4.1.1", @@ -5646,7 +5633,6 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, - "optional": true, "requires": { "wrappy": "1" } @@ -5742,8 +5728,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "optional": true + "dev": true }, "safer-buffer": { "version": "2.1.2", @@ -5785,7 +5770,6 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, - "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -5807,7 +5791,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, - "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -5856,15 +5839,13 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true, - "optional": true + "dev": true }, "yallist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "dev": true, - "optional": true + "dev": true } } }, diff --git a/packages/arcgis-rest-portal/src/groups/get.ts b/packages/arcgis-rest-portal/src/groups/get.ts index 84bb37deeb..bb68b1a1b6 100644 --- a/packages/arcgis-rest-portal/src/groups/get.ts +++ b/packages/arcgis-rest-portal/src/groups/get.ts @@ -1,9 +1,12 @@ /* Copyright (c) 2017-2018 Environmental Systems Research Institute, Inc. * Apache-2.0 */ -import { request, IRequestOptions } from "@esri/arcgis-rest-request"; -import { IPagingParams, IGroup, IItem } from "@esri/arcgis-rest-types"; - +import { + request, + IRequestOptions, + appendCustomParams +} from "@esri/arcgis-rest-request"; +import { IPagingParams, IGroup, IItem, IUser } from "@esri/arcgis-rest-types"; import { getPortalUrl } from "../util/get-portal-url"; export interface IGetGroupContentOptions extends IRequestOptions { @@ -97,3 +100,49 @@ export function getGroupUsers( }; return request(url, options); } + +export interface ISearchGroupUsersOptions + extends IRequestOptions, + IPagingParams { + name?: string; + sortField?: string; + sortOrder?: string; + [key: string]: any; +} + +export interface ISearchGroupUsersResult { + total: number; + start: number; + num: number; + nextStart: number; + owner: IUser; + users: any[]; +} + +/** + * ```js + * import { searchGroupUsers } from "@esri/arcgis-rest-portal"; + * // + * searchGroupUsers('abc123') + * .then(response) + * ``` + * Search the users in a group. See the [REST Documentation](https://developers.arcgis.com/rest/users-groups-and-items/group-users-list.htm) for more information. + * + * @param id - The group id + * @param searchOptions - Options for the request, including paging parameters. + * @returns A Promise that will resolve with the data from the response. + */ +export function searchGroupUsers( + id: string, + searchOptions: ISearchGroupUsersOptions +): Promise { + const url = `${getPortalUrl(searchOptions)}/community/groups/${id}/userlist`; + const options = appendCustomParams( + searchOptions, + ["name", "num", "start", "sortField", "sortOrder"], + { + httpMethod: "GET" + } + ); + return request(url, options); +} diff --git a/packages/arcgis-rest-portal/test/groups/get.test.ts b/packages/arcgis-rest-portal/test/groups/get.test.ts index 51568fd570..ed379c547e 100644 --- a/packages/arcgis-rest-portal/test/groups/get.test.ts +++ b/packages/arcgis-rest-portal/test/groups/get.test.ts @@ -1,12 +1,18 @@ /* Copyright (c) 2018 Environmental Systems Research Institute, Inc. * Apache-2.0 */ -import { getGroup, getGroupContent, getGroupUsers } from "../../src/groups/get"; +import { + getGroup, + getGroupContent, + getGroupUsers, + searchGroupUsers +} from "../../src/groups/get"; import { GroupResponse, GroupContentResponse, - GroupUsersResponse + GroupUsersResponse, + SearchGroupUsersResponse } from "../mocks/groups/responses"; import * as fetchMock from "fetch-mock"; @@ -97,5 +103,32 @@ describe("groups", () => { fail(e); }); }); + + it("should search group users", done => { + fetchMock.once("*", SearchGroupUsersResponse); + + searchGroupUsers("5bc", { + params: { + name: "jupe", + sortField: "fullname", + sortOrder: "asc", + num: 2, + start: 2 + }, + ...MOCK_REQOPTS + }) + .then(response => { + expect(fetchMock.called()).toEqual(true); + const [url, options]: [string, RequestInit] = fetchMock.lastCall("*"); + expect(url).toEqual( + "https://myorg.maps.arcgis.com/sharing/rest/community/groups/5bc/userlist?f=json&name=jupe&sortField=fullname&sortOrder=asc&num=2&start=2&token=fake-token" + ); + expect(options.method).toBe("GET"); + done(); + }) + .catch(e => { + fail(e); + }); + }); }); }); diff --git a/packages/arcgis-rest-portal/test/mocks/groups/responses.ts b/packages/arcgis-rest-portal/test/mocks/groups/responses.ts index 97edab0d51..6b64f6b551 100644 --- a/packages/arcgis-rest-portal/test/mocks/groups/responses.ts +++ b/packages/arcgis-rest-portal/test/mocks/groups/responses.ts @@ -4,7 +4,8 @@ import { ISearchResult } from "../../../src/util/search"; import { IGroupContentResult, - IGroupUsersResult + IGroupUsersResult, + ISearchGroupUsersResult } from "../../../src/groups/get"; import { IGroup } from "@esri/arcgis-rest-types"; @@ -142,3 +143,30 @@ export const GroupContentResponse: IGroupContentResult = { export const GroupNotificationResponse: any = { success: true }; + +export const SearchGroupUsersResponse: ISearchGroupUsersResult = { + total: 4, + start: 1, + num: 2, + nextStart: 3, + owner: { + username: "Vulcan", + fullName: "Spock Vulcan" + }, + users: [ + { + username: "mjuniper5", + fullName: "Mike Juniper", + memberType: "member", + thumbnail: "ArcGIS-Hub-Glyph-gray.png", + joined: 1561555887000 + }, + { + username: "mjuniper50", + fullName: "Mike Juniper", + memberType: "member", + thumbnail: null, + joined: 1561555863000 + } + ] +};