etincidunt 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.prettierignore +2 -0
- package/.travis.yml +29 -0
- package/.vscode/launch.json +24 -0
- package/.vscode/settings.json +3 -0
- package/demos/ago-node-cli/README.md +29 -0
- package/demos/ago-node-cli/ago.js +32 -0
- package/demos/ago-node-cli/index.js +11 -0
- package/demos/ago-node-cli/lib/item-export-command.js +48 -0
- package/demos/ago-node-cli/lib/item-search-command.js +35 -0
- package/demos/ago-node-cli/package-lock.json +172 -0
- package/demos/ago-node-cli/package.json +30 -0
- package/demos/attachments/README.md +5 -0
- package/demos/attachments/index.html +164 -0
- package/demos/attachments/package-lock.json +182 -0
- package/demos/attachments/package.json +18 -0
- package/demos/batch-geocoder-node/NYC_Restaurant_Inspection_Results.csv +100 -0
- package/demos/batch-geocoder-node/README.md +14 -0
- package/demos/batch-geocoder-node/batch-geocode.js +112 -0
- package/demos/batch-geocoder-node/config-template.js +18 -0
- package/demos/batch-geocoder-node/package-lock.json +109 -0
- package/demos/batch-geocoder-node/package.json +37 -0
- package/demos/express/README.md +10 -0
- package/demos/express/config.json.template +3 -0
- package/demos/express/package-lock.json +388 -0
- package/demos/express/package.json +18 -0
- package/demos/express/server.js +28 -0
- package/demos/feature-service-browser/README.md +6 -0
- package/demos/feature-service-browser/index.html +122 -0
- package/demos/feature-service-browser/package-lock.json +182 -0
- package/demos/feature-service-browser/package.json +18 -0
- package/demos/geocoder-browser/README.md +10 -0
- package/demos/geocoder-browser/config.js.template +1 -0
- package/demos/geocoder-browser/index.html +131 -0
- package/demos/geocoder-browser/package-lock.json +163 -0
- package/demos/geocoder-browser/package.json +19 -0
- package/demos/geocoder-browser/post-sign-in.html +25 -0
- package/demos/jsapi-integration/README.md +8 -0
- package/demos/jsapi-integration/config.js +6 -0
- package/demos/jsapi-integration/index.html +79 -0
- package/demos/jsapi-integration/package-lock.json +184 -0
- package/demos/jsapi-integration/package.json +19 -0
- package/demos/oauth2-browser/README.md +12 -0
- package/demos/oauth2-browser/authenticate.html +32 -0
- package/demos/oauth2-browser/config.js.template +6 -0
- package/demos/oauth2-browser/index.html +202 -0
- package/demos/oauth2-browser/logo.svg +4 -0
- package/demos/oauth2-browser/package-lock.json +163 -0
- package/demos/oauth2-browser/package.json +18 -0
- package/demos/oauth2-browser/style.css +36 -0
- package/demos/vue/.babelrc +6 -0
- package/demos/vue/.env.example +8 -0
- package/demos/vue/README.md +17 -0
- package/demos/vue/index.html +21 -0
- package/demos/vue/package-lock.json +7236 -0
- package/demos/vue/package.json +39 -0
- package/demos/vue/src/assets/logo.svg +29 -0
- package/demos/vue/src/components/App.vue +302 -0
- package/demos/vue/src/components/Authenticate.vue +68 -0
- package/demos/vue/src/components/Loader.vue +216 -0
- package/demos/vue/src/main.js +75 -0
- package/demos/vue/webpack.config.js +84 -0
- package/docs/FAQ.md +28 -0
- package/docs/HISTORY.md +62 -0
- package/docs/acetate.config.js +214 -0
- package/docs/build-typedoc.js +301 -0
- package/docs/src/_layout.html +82 -0
- package/docs/src/api/_declaration.html +496 -0
- package/docs/src/api/_layout.html +127 -0
- package/docs/src/api/_package.html +13 -0
- package/docs/src/api/index.html +23 -0
- package/docs/src/guides/_layout.html +24 -0
- package/docs/src/guides/amd-requirejs-dojo.md +40 -0
- package/docs/src/guides/babel-and-rollup.md +30 -0
- package/docs/src/guides/babel-and-webpack.md +30 -0
- package/docs/src/guides/browser-authentication.md +9 -0
- package/docs/src/guides/browserify.md +9 -0
- package/docs/src/guides/cli-authentication.md +9 -0
- package/docs/src/guides/client-server-authentication.md +9 -0
- package/docs/src/guides/from-a-cdn.md +36 -0
- package/docs/src/guides/index.md +52 -0
- package/docs/src/guides/node.md +30 -0
- package/docs/src/guides/package-overview.md +8 -0
- package/docs/src/guides/server-authentication.md +9 -0
- package/docs/src/guides/typescript-and-webpack.md +9 -0
- package/docs/src/img/icons.png +0 -0
- package/docs/src/img/icons@2x.png +0 -0
- package/docs/src/index.html +12 -0
- package/docs/src/js/api-search.js +113 -0
- package/docs/src/js/index.js +1 -0
- package/docs/src/js/nav-toggle.js +41 -0
- package/docs/src/sass/_highlight.scss +96 -0
- package/docs/src/sass/_icons.scss +157 -0
- package/docs/src/sass/style.scss +169 -0
- package/jasmine.json +7 -0
- package/karma.conf.js +100 -0
- package/lerna.json +8 -0
- package/notes/README.md +88 -0
- package/package.json +91 -0
- package/packages/arcgis-rest-auth/README.md +64 -0
- package/packages/arcgis-rest-auth/package-lock.json +11 -0
- package/packages/arcgis-rest-auth/package.json +51 -0
- package/packages/arcgis-rest-auth/src/ApplicationSession.ts +91 -0
- package/packages/arcgis-rest-auth/src/UserSession.ts +829 -0
- package/packages/arcgis-rest-auth/src/authenticated-request-options.ts +21 -0
- package/packages/arcgis-rest-auth/src/fetch-token.ts +55 -0
- package/packages/arcgis-rest-auth/src/generate-token.ts +36 -0
- package/packages/arcgis-rest-auth/src/index.ts +5 -0
- package/packages/arcgis-rest-auth/test/ApplicationSession.test.ts +121 -0
- package/packages/arcgis-rest-auth/test/UserSession.test.ts +883 -0
- package/packages/arcgis-rest-auth/test/fetchToken.test.ts +76 -0
- package/packages/arcgis-rest-auth/test/generateToken.test.ts +36 -0
- package/packages/arcgis-rest-auth/test/utils.ts +11 -0
- package/packages/arcgis-rest-auth/tsconfig.json +6 -0
- package/packages/arcgis-rest-common-types/README.md +61 -0
- package/packages/arcgis-rest-common-types/package.json +38 -0
- package/packages/arcgis-rest-common-types/src/group.ts +51 -0
- package/packages/arcgis-rest-common-types/src/index.ts +467 -0
- package/packages/arcgis-rest-common-types/src/item.ts +45 -0
- package/packages/arcgis-rest-common-types/src/webmap.ts +1225 -0
- package/packages/arcgis-rest-common-types/tsconfig.json +11 -0
- package/packages/arcgis-rest-feature-service/README.md +70 -0
- package/packages/arcgis-rest-feature-service/package-lock.json +11 -0
- package/packages/arcgis-rest-feature-service/package.json +50 -0
- package/packages/arcgis-rest-feature-service/src/add.ts +82 -0
- package/packages/arcgis-rest-feature-service/src/addAttachment.ts +65 -0
- package/packages/arcgis-rest-feature-service/src/delete.ts +85 -0
- package/packages/arcgis-rest-feature-service/src/deleteAttachments.ts +68 -0
- package/packages/arcgis-rest-feature-service/src/getAttachments.ts +64 -0
- package/packages/arcgis-rest-feature-service/src/helpers.ts +77 -0
- package/packages/arcgis-rest-feature-service/src/index.ts +8 -0
- package/packages/arcgis-rest-feature-service/src/query.ts +174 -0
- package/packages/arcgis-rest-feature-service/src/update.ts +81 -0
- package/packages/arcgis-rest-feature-service/src/updateAttachment.ts +74 -0
- package/packages/arcgis-rest-feature-service/test/attachments.test.ts +179 -0
- package/packages/arcgis-rest-feature-service/test/features.test.ts +172 -0
- package/packages/arcgis-rest-feature-service/test/mocks/feature.ts +220 -0
- package/packages/arcgis-rest-feature-service/test/mocks/foo.txt +1 -0
- package/packages/arcgis-rest-feature-service/tsconfig.json +6 -0
- package/packages/arcgis-rest-geocoder/README.md +73 -0
- package/packages/arcgis-rest-geocoder/package-lock.json +11 -0
- package/packages/arcgis-rest-geocoder/package.json +52 -0
- package/packages/arcgis-rest-geocoder/src/bulk.ts +102 -0
- package/packages/arcgis-rest-geocoder/src/geocode.ts +117 -0
- package/packages/arcgis-rest-geocoder/src/helpers.ts +81 -0
- package/packages/arcgis-rest-geocoder/src/index.ts +4 -0
- package/packages/arcgis-rest-geocoder/src/reverse.ts +84 -0
- package/packages/arcgis-rest-geocoder/src/suggest.ts +72 -0
- package/packages/arcgis-rest-geocoder/test/geocoder.test.ts +510 -0
- package/packages/arcgis-rest-geocoder/test/mocks/responses.ts +588 -0
- package/packages/arcgis-rest-geocoder/tsconfig.json +6 -0
- package/packages/arcgis-rest-groups/README.md +64 -0
- package/packages/arcgis-rest-groups/package-lock.json +11 -0
- package/packages/arcgis-rest-groups/package.json +52 -0
- package/packages/arcgis-rest-groups/src/groups.ts +272 -0
- package/packages/arcgis-rest-groups/src/index.ts +1 -0
- package/packages/arcgis-rest-groups/test/groups.test.ts +280 -0
- package/packages/arcgis-rest-groups/test/mocks/responses.ts +137 -0
- package/packages/arcgis-rest-groups/tsconfig.json +6 -0
- package/packages/arcgis-rest-items/README.md +66 -0
- package/packages/arcgis-rest-items/package-lock.json +11 -0
- package/packages/arcgis-rest-items/package.json +52 -0
- package/packages/arcgis-rest-items/src/index.ts +1 -0
- package/packages/arcgis-rest-items/src/items.ts +498 -0
- package/packages/arcgis-rest-items/test/items.test.ts +1153 -0
- package/packages/arcgis-rest-items/test/mocks/foo.zip +0 -0
- package/packages/arcgis-rest-items/test/mocks/item.ts +30 -0
- package/packages/arcgis-rest-items/test/mocks/resources.ts +28 -0
- package/packages/arcgis-rest-items/test/mocks/search.ts +60 -0
- package/packages/arcgis-rest-items/tsconfig.json +6 -0
- package/packages/arcgis-rest-request/README.md +65 -0
- package/packages/arcgis-rest-request/package-lock.json +11 -0
- package/packages/arcgis-rest-request/package.json +42 -0
- package/packages/arcgis-rest-request/src/index.ts +10 -0
- package/packages/arcgis-rest-request/src/request.ts +259 -0
- package/packages/arcgis-rest-request/src/utils/ArcGISAuthError.ts +67 -0
- package/packages/arcgis-rest-request/src/utils/ArcGISRequestError.ts +73 -0
- package/packages/arcgis-rest-request/src/utils/ErrorTypes.ts +29 -0
- package/packages/arcgis-rest-request/src/utils/check-for-errors.ts +65 -0
- package/packages/arcgis-rest-request/src/utils/encode-form-data.ts +29 -0
- package/packages/arcgis-rest-request/src/utils/encode-query-string.ts +23 -0
- package/packages/arcgis-rest-request/src/utils/get-portal-url.ts +25 -0
- package/packages/arcgis-rest-request/src/utils/get-portal.ts +45 -0
- package/packages/arcgis-rest-request/src/utils/process-params.ts +99 -0
- package/packages/arcgis-rest-request/test/mocks/errors.ts +59 -0
- package/packages/arcgis-rest-request/test/mocks/geojson-feature-collection.ts +10 -0
- package/packages/arcgis-rest-request/test/mocks/portal.ts +109 -0
- package/packages/arcgis-rest-request/test/mocks/sharing-rest-info.ts +38 -0
- package/packages/arcgis-rest-request/test/mocks/webmap.ts +38 -0
- package/packages/arcgis-rest-request/test/request.test.ts +296 -0
- package/packages/arcgis-rest-request/test/utils/ArcGISAuthError.test.ts +167 -0
- package/packages/arcgis-rest-request/test/utils/ArcGISRequestError.test.ts +40 -0
- package/packages/arcgis-rest-request/test/utils/check-for-errors.test.ts +101 -0
- package/packages/arcgis-rest-request/test/utils/encode-form-data.test.ts +112 -0
- package/packages/arcgis-rest-request/test/utils/get-portal-url.test.ts +34 -0
- package/packages/arcgis-rest-request/test/utils/portal.test.ts +94 -0
- package/packages/arcgis-rest-request/test/utils/process-params.test.ts +190 -0
- package/packages/arcgis-rest-request/tsconfig.json +6 -0
- package/packages/arcgis-rest-sharing/README.md +67 -0
- package/packages/arcgis-rest-sharing/package-lock.json +11 -0
- package/packages/arcgis-rest-sharing/package.json +55 -0
- package/packages/arcgis-rest-sharing/src/access.ts +91 -0
- package/packages/arcgis-rest-sharing/src/group-sharing.ts +212 -0
- package/packages/arcgis-rest-sharing/src/helpers.ts +92 -0
- package/packages/arcgis-rest-sharing/src/index.ts +2 -0
- package/packages/arcgis-rest-sharing/test/access.test.ts +153 -0
- package/packages/arcgis-rest-sharing/test/group-sharing.test.ts +436 -0
- package/packages/arcgis-rest-sharing/test/mocks/sharing.ts +15 -0
- package/packages/arcgis-rest-sharing/tsconfig.json +6 -0
- package/packages/arcgis-rest-users/README.md +71 -0
- package/packages/arcgis-rest-users/package-lock.json +11 -0
- package/packages/arcgis-rest-users/package.json +51 -0
- package/packages/arcgis-rest-users/src/index.ts +1 -0
- package/packages/arcgis-rest-users/src/users.ts +70 -0
- package/packages/arcgis-rest-users/test/mocks/responses.ts +170 -0
- package/packages/arcgis-rest-users/test/users.test.ts +97 -0
- package/packages/arcgis-rest-users/tsconfig.json +6 -0
- package/support/FormData.d.ts +1 -0
- package/support/changelog.js +388 -0
- package/support/commit-template.txt +19 -0
- package/support/deploy-doc-site.js +16 -0
- package/support/publish.sh +40 -0
- package/support/test-helpers.js +8 -0
- package/tsconfig.json +69 -0
- package/tslint.json +14 -0
- package/umd-base-profile.js +82 -0
- package/umd-production-profile.js +13 -0
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/* Copyright (c) 2018 Environmental Systems Research Institute, Inc.
|
|
2
|
+
* Apache-2.0 */
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
request,
|
|
6
|
+
IRequestOptions,
|
|
7
|
+
getPortalUrl
|
|
8
|
+
} from "@esri/arcgis-rest-request";
|
|
9
|
+
import { IItem } from "@esri/arcgis-rest-common-types";
|
|
10
|
+
|
|
11
|
+
import {
|
|
12
|
+
ISharingRequestOptions,
|
|
13
|
+
ISharingResponse,
|
|
14
|
+
isOrgAdmin,
|
|
15
|
+
getUserMembership
|
|
16
|
+
} from "./helpers";
|
|
17
|
+
|
|
18
|
+
export interface IGroupSharingRequestOptions extends ISharingRequestOptions {
|
|
19
|
+
/**
|
|
20
|
+
* Group identifier
|
|
21
|
+
*/
|
|
22
|
+
groupId: string;
|
|
23
|
+
confirmItemControl?: boolean;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
interface IGroupSharingUnsharingRequestOptions
|
|
27
|
+
extends IGroupSharingRequestOptions {
|
|
28
|
+
action: "share" | "unshare";
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Share an item with a group.
|
|
33
|
+
*
|
|
34
|
+
* ```js
|
|
35
|
+
* import { shareItemWithGroup } from '@esri/arcgis-rest-sharing';
|
|
36
|
+
*
|
|
37
|
+
* shareItemWithGroup({
|
|
38
|
+
* id: "abc123",
|
|
39
|
+
* groupId: "xyz987",
|
|
40
|
+
* authentication: session
|
|
41
|
+
* })
|
|
42
|
+
* ```
|
|
43
|
+
*
|
|
44
|
+
* @param requestOptions - Options for the request.
|
|
45
|
+
* @returns A Promise that will resolve with the data from the response.
|
|
46
|
+
*/
|
|
47
|
+
export function shareItemWithGroup(
|
|
48
|
+
requestOptions: IGroupSharingRequestOptions
|
|
49
|
+
): Promise<ISharingResponse> {
|
|
50
|
+
return changeGroupSharing({ action: "share", ...requestOptions });
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Stop sharing an item with a group.
|
|
55
|
+
*
|
|
56
|
+
* ```js
|
|
57
|
+
* import { unshareItemWithGroup } from '@esri/arcgis-rest-sharing';
|
|
58
|
+
*
|
|
59
|
+
* unshareItemWithGroup({
|
|
60
|
+
* id: "abc123",
|
|
61
|
+
* groupId: "xyz987",
|
|
62
|
+
* authentication: session
|
|
63
|
+
* })
|
|
64
|
+
* ```
|
|
65
|
+
*
|
|
66
|
+
* @param requestOptions - Options for the request.
|
|
67
|
+
* @returns A Promise that will resolve with the data from the response.
|
|
68
|
+
*/
|
|
69
|
+
export function unshareItemWithGroup(
|
|
70
|
+
requestOptions: IGroupSharingRequestOptions
|
|
71
|
+
): Promise<ISharingResponse> {
|
|
72
|
+
return changeGroupSharing({ action: "unshare", ...requestOptions });
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* @param requestOptions - Options for the request.
|
|
77
|
+
* @returns A Promise that will resolve with the data from the response.
|
|
78
|
+
*/
|
|
79
|
+
function changeGroupSharing(
|
|
80
|
+
requestOptions: IGroupSharingUnsharingRequestOptions
|
|
81
|
+
): Promise<ISharingResponse> {
|
|
82
|
+
const username = requestOptions.authentication.username;
|
|
83
|
+
const owner = requestOptions.owner || username;
|
|
84
|
+
|
|
85
|
+
return isOrgAdmin(requestOptions).then(admin => {
|
|
86
|
+
const resultProp =
|
|
87
|
+
requestOptions.action === "share" ? "notSharedWith" : "notUnsharedFrom";
|
|
88
|
+
// check if the item has already been shared with the group...
|
|
89
|
+
return isItemSharedWithGroup(requestOptions).then(result => {
|
|
90
|
+
// console.log(admin);
|
|
91
|
+
// if we are sharing and result is true OR we are unsharing and result is false... short circuit
|
|
92
|
+
if (
|
|
93
|
+
(requestOptions.action === "share" && result === true) ||
|
|
94
|
+
(requestOptions.action === "unshare" && result === false)
|
|
95
|
+
) {
|
|
96
|
+
// and send back the same response structure ArcGIS Online would
|
|
97
|
+
const response = { itemId: requestOptions.id, shortcut: true } as any;
|
|
98
|
+
response[resultProp] = [];
|
|
99
|
+
return response;
|
|
100
|
+
} else {
|
|
101
|
+
// next check to ensure the user is a member of the group
|
|
102
|
+
return getUserMembership(requestOptions)
|
|
103
|
+
.then(membership => {
|
|
104
|
+
if (membership === "nonmember") {
|
|
105
|
+
// abort and reject promise
|
|
106
|
+
throw Error(
|
|
107
|
+
`This item can not be ${
|
|
108
|
+
requestOptions.action
|
|
109
|
+
}d by ${username} as they are not a member of the specified group ${
|
|
110
|
+
requestOptions.groupId
|
|
111
|
+
}.`
|
|
112
|
+
);
|
|
113
|
+
} else {
|
|
114
|
+
// if orgAdmin or owner (and member of group) share using the owner url
|
|
115
|
+
if (owner === username || admin) {
|
|
116
|
+
return `${getPortalUrl(
|
|
117
|
+
requestOptions
|
|
118
|
+
)}/content/users/${owner}/items/${requestOptions.id}/${
|
|
119
|
+
requestOptions.action
|
|
120
|
+
}`;
|
|
121
|
+
} else {
|
|
122
|
+
// if they are a group admin/owner, use the bare item url
|
|
123
|
+
if (membership === "admin") {
|
|
124
|
+
return `${getPortalUrl(requestOptions)}/content/items/${
|
|
125
|
+
requestOptions.id
|
|
126
|
+
}/${requestOptions.action}`;
|
|
127
|
+
} else {
|
|
128
|
+
// otherwise abort
|
|
129
|
+
throw Error(
|
|
130
|
+
`This item can not be ${
|
|
131
|
+
requestOptions.action
|
|
132
|
+
}d by ${username} as they are neither the owner, a groupAdmin of ${
|
|
133
|
+
requestOptions.groupId
|
|
134
|
+
}, nor an org_admin.`
|
|
135
|
+
);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
})
|
|
140
|
+
.then(url => {
|
|
141
|
+
// now its finally time to do the sharing
|
|
142
|
+
requestOptions.params = {
|
|
143
|
+
groups: requestOptions.groupId,
|
|
144
|
+
confirmItemControl: requestOptions.confirmItemControl
|
|
145
|
+
};
|
|
146
|
+
// dont mixin to ensure that old query parameters from the search request arent included
|
|
147
|
+
return request(url, requestOptions);
|
|
148
|
+
})
|
|
149
|
+
.then(sharingResponse => {
|
|
150
|
+
if (sharingResponse[resultProp].length) {
|
|
151
|
+
throw Error(
|
|
152
|
+
`Item ${requestOptions.id} could not be ${
|
|
153
|
+
requestOptions.action
|
|
154
|
+
}d to group ${requestOptions.groupId}.`
|
|
155
|
+
);
|
|
156
|
+
} else {
|
|
157
|
+
// all is well
|
|
158
|
+
return sharingResponse;
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
} // else
|
|
162
|
+
}); // then
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Find out whether or not an item is already shared with a group.
|
|
168
|
+
*
|
|
169
|
+
* @param requestOptions - Options for the request.
|
|
170
|
+
* @returns A Promise that will resolve with the data from the response.
|
|
171
|
+
*/
|
|
172
|
+
function isItemSharedWithGroup(
|
|
173
|
+
requestOptions: IGroupSharingRequestOptions
|
|
174
|
+
): Promise<boolean> {
|
|
175
|
+
const query = {
|
|
176
|
+
q: `id: ${requestOptions.id} AND group: ${requestOptions.groupId}`,
|
|
177
|
+
start: 1,
|
|
178
|
+
num: 10,
|
|
179
|
+
sortField: "title"
|
|
180
|
+
};
|
|
181
|
+
|
|
182
|
+
// instead of calling out to "@esri/arcgis-rest-items, make the request manually to forgoe another dependency
|
|
183
|
+
requestOptions.params = {
|
|
184
|
+
...query,
|
|
185
|
+
...requestOptions.params
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
const url = `${getPortalUrl(requestOptions)}/search`;
|
|
189
|
+
|
|
190
|
+
return request(url, requestOptions).then(searchResponse => {
|
|
191
|
+
// if there are no search results at all, we know the item hasnt already been shared with the group
|
|
192
|
+
if (searchResponse.total === 0) {
|
|
193
|
+
return false;
|
|
194
|
+
} else {
|
|
195
|
+
let sharedItem: IItem;
|
|
196
|
+
// otherwise loop through and search for the id
|
|
197
|
+
searchResponse.results.some((item: IItem) => {
|
|
198
|
+
const matchedItem = item.id === requestOptions.id;
|
|
199
|
+
if (matchedItem) {
|
|
200
|
+
sharedItem = item;
|
|
201
|
+
}
|
|
202
|
+
return matchedItem;
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
if (sharedItem) {
|
|
206
|
+
return true;
|
|
207
|
+
} else {
|
|
208
|
+
return false;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/* Copyright (c) 2018 Environmental Systems Research Institute, Inc.
|
|
2
|
+
* Apache-2.0 */
|
|
3
|
+
import {
|
|
4
|
+
request,
|
|
5
|
+
IRequestOptions,
|
|
6
|
+
getPortalUrl
|
|
7
|
+
} from "@esri/arcgis-rest-request";
|
|
8
|
+
import { UserSession } from "@esri/arcgis-rest-auth";
|
|
9
|
+
import { IUser, IGroup } from "@esri/arcgis-rest-common-types";
|
|
10
|
+
import { IGroupSharingRequestOptions } from "./group-sharing";
|
|
11
|
+
|
|
12
|
+
export interface ISharingRequestOptions extends IRequestOptions {
|
|
13
|
+
/**
|
|
14
|
+
* Unique identifier for the item.
|
|
15
|
+
*/
|
|
16
|
+
id: string;
|
|
17
|
+
/**
|
|
18
|
+
* Represents a user with privileges to update item sharing.
|
|
19
|
+
*/
|
|
20
|
+
authentication: UserSession;
|
|
21
|
+
/**
|
|
22
|
+
* Item owner, if different from the authenticated user.
|
|
23
|
+
*/
|
|
24
|
+
owner?: string;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface ISharingResponse {
|
|
28
|
+
notSharedWith?: string[];
|
|
29
|
+
notUnsharedFrom?: string[];
|
|
30
|
+
itemId: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function getSharingUrl(requestOptions: ISharingRequestOptions): string {
|
|
34
|
+
const username = requestOptions.authentication.username;
|
|
35
|
+
const owner = requestOptions.owner || username;
|
|
36
|
+
return `${getPortalUrl(requestOptions)}/content/users/${encodeURIComponent(
|
|
37
|
+
owner
|
|
38
|
+
)}/items/${requestOptions.id}/share`;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function isItemOwner(requestOptions: ISharingRequestOptions): boolean {
|
|
42
|
+
const username = requestOptions.authentication.username;
|
|
43
|
+
const owner = requestOptions.owner || username;
|
|
44
|
+
return owner === username;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export function isOrgAdmin(
|
|
48
|
+
requestOptions: ISharingRequestOptions
|
|
49
|
+
): Promise<boolean> {
|
|
50
|
+
const session = requestOptions.authentication as UserSession;
|
|
51
|
+
|
|
52
|
+
return session.getUser().then(user => {
|
|
53
|
+
if (!user || user.role !== "org_admin") {
|
|
54
|
+
return false;
|
|
55
|
+
} else {
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export function getUserMembership(
|
|
62
|
+
requestOptions: IGroupSharingRequestOptions
|
|
63
|
+
): Promise<string> {
|
|
64
|
+
// start by assuming the user does not belong to the group
|
|
65
|
+
let result = "nonmember";
|
|
66
|
+
const session = requestOptions.authentication as UserSession;
|
|
67
|
+
|
|
68
|
+
// the response to this call is cached. yay!
|
|
69
|
+
return session
|
|
70
|
+
.getUser()
|
|
71
|
+
.then((user: IUser) => {
|
|
72
|
+
if (user.groups) {
|
|
73
|
+
user.groups.some(function(group: IGroup) {
|
|
74
|
+
const matchedGroup = group.id === requestOptions.groupId;
|
|
75
|
+
if (matchedGroup) {
|
|
76
|
+
result = group.userMembership.memberType;
|
|
77
|
+
}
|
|
78
|
+
return matchedGroup;
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
return result;
|
|
82
|
+
})
|
|
83
|
+
.catch(
|
|
84
|
+
/* istanbul ignore next */ err => {
|
|
85
|
+
throw Error(
|
|
86
|
+
`failure determining membership of ${session.username} in group:${
|
|
87
|
+
requestOptions.groupId
|
|
88
|
+
}: ${err}`
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
);
|
|
92
|
+
}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { setItemAccess } from "../src/index";
|
|
2
|
+
import * as fetchMock from "fetch-mock";
|
|
3
|
+
import { MOCK_USER_SESSION } from "./mocks/sharing";
|
|
4
|
+
import {
|
|
5
|
+
AnonUserResponse,
|
|
6
|
+
GroupMemberUserResponse,
|
|
7
|
+
GroupAdminUserResponse,
|
|
8
|
+
OrgAdminUserResponse
|
|
9
|
+
} from "../../arcgis-rest-users/test/mocks/responses";
|
|
10
|
+
|
|
11
|
+
const SharingResponse = {
|
|
12
|
+
notSharedWith: [] as any,
|
|
13
|
+
itemId: "abc123"
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
describe("setItemAccess()", () => {
|
|
17
|
+
// make sure session doesnt cache metadata
|
|
18
|
+
beforeEach(function() {
|
|
19
|
+
MOCK_USER_SESSION._user = null;
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
afterEach(fetchMock.restore);
|
|
23
|
+
|
|
24
|
+
it("should share an item with everyone", done => {
|
|
25
|
+
fetchMock.once("*", SharingResponse);
|
|
26
|
+
|
|
27
|
+
setItemAccess({
|
|
28
|
+
authentication: MOCK_USER_SESSION,
|
|
29
|
+
id: "abc123",
|
|
30
|
+
access: "public"
|
|
31
|
+
})
|
|
32
|
+
.then(response => {
|
|
33
|
+
const [url, options]: [string, RequestInit] = fetchMock.lastCall("*");
|
|
34
|
+
expect(url).toEqual(
|
|
35
|
+
"https://myorg.maps.arcgis.com/sharing/rest/content/users/jsmith/items/abc123/share"
|
|
36
|
+
);
|
|
37
|
+
expect(options.method).toBe("POST");
|
|
38
|
+
expect(response).toEqual(SharingResponse);
|
|
39
|
+
expect(options.body).toContain("f=json");
|
|
40
|
+
expect(options.body).toContain("everyone=true");
|
|
41
|
+
expect(options.body).toContain("org=true");
|
|
42
|
+
done();
|
|
43
|
+
})
|
|
44
|
+
.catch(e => {
|
|
45
|
+
fail(e);
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it("should share an item with an organization", done => {
|
|
50
|
+
fetchMock.once("*", SharingResponse);
|
|
51
|
+
|
|
52
|
+
setItemAccess({
|
|
53
|
+
authentication: MOCK_USER_SESSION,
|
|
54
|
+
id: "abc123",
|
|
55
|
+
access: "org"
|
|
56
|
+
})
|
|
57
|
+
.then(response => {
|
|
58
|
+
const [url, options]: [string, RequestInit] = fetchMock.lastCall("*");
|
|
59
|
+
expect(url).toEqual(
|
|
60
|
+
"https://myorg.maps.arcgis.com/sharing/rest/content/users/jsmith/items/abc123/share"
|
|
61
|
+
);
|
|
62
|
+
expect(options.method).toBe("POST");
|
|
63
|
+
expect(response).toEqual(SharingResponse);
|
|
64
|
+
expect(options.body).toContain("f=json");
|
|
65
|
+
expect(options.body).toContain("everyone=false");
|
|
66
|
+
expect(options.body).toContain("org=true");
|
|
67
|
+
done();
|
|
68
|
+
})
|
|
69
|
+
.catch(e => {
|
|
70
|
+
fail(e);
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it("should stop sharing an item entirely", done => {
|
|
75
|
+
fetchMock.once("*", SharingResponse);
|
|
76
|
+
|
|
77
|
+
setItemAccess({
|
|
78
|
+
authentication: MOCK_USER_SESSION,
|
|
79
|
+
id: "abc123",
|
|
80
|
+
access: "private"
|
|
81
|
+
})
|
|
82
|
+
.then(response => {
|
|
83
|
+
const [url, options]: [string, RequestInit] = fetchMock.lastCall("*");
|
|
84
|
+
expect(url).toEqual(
|
|
85
|
+
"https://myorg.maps.arcgis.com/sharing/rest/content/users/jsmith/items/abc123/share"
|
|
86
|
+
);
|
|
87
|
+
expect(options.method).toBe("POST");
|
|
88
|
+
expect(response).toEqual(SharingResponse);
|
|
89
|
+
expect(options.body).toContain("f=json");
|
|
90
|
+
expect(options.body).toContain("everyone=false");
|
|
91
|
+
expect(options.body).toContain("org=false");
|
|
92
|
+
expect(options.body).toContain("groups=");
|
|
93
|
+
done();
|
|
94
|
+
})
|
|
95
|
+
.catch(e => {
|
|
96
|
+
fail(e);
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it("should share another persons item if an org admin makes the request", done => {
|
|
101
|
+
fetchMock.once(
|
|
102
|
+
"https://myorg.maps.arcgis.com/sharing/rest/community/users/jsmith?f=json&token=fake-token",
|
|
103
|
+
OrgAdminUserResponse
|
|
104
|
+
);
|
|
105
|
+
|
|
106
|
+
fetchMock.once(
|
|
107
|
+
"begin:https://myorg.maps.arcgis.com/sharing/rest/content/users/casey/items/abc123/share",
|
|
108
|
+
SharingResponse
|
|
109
|
+
);
|
|
110
|
+
|
|
111
|
+
setItemAccess({
|
|
112
|
+
authentication: MOCK_USER_SESSION,
|
|
113
|
+
id: "abc123",
|
|
114
|
+
access: "private",
|
|
115
|
+
owner: "casey"
|
|
116
|
+
})
|
|
117
|
+
.then(response => {
|
|
118
|
+
const [url, options]: [string, RequestInit] = fetchMock.lastCall();
|
|
119
|
+
expect(url).toEqual(
|
|
120
|
+
"https://myorg.maps.arcgis.com/sharing/rest/content/users/casey/items/abc123/share"
|
|
121
|
+
);
|
|
122
|
+
expect(options.method).toBe("POST");
|
|
123
|
+
expect(response).toEqual(SharingResponse);
|
|
124
|
+
expect(options.body).toContain("f=json");
|
|
125
|
+
expect(options.body).toContain("everyone=false");
|
|
126
|
+
expect(options.body).toContain("org=false");
|
|
127
|
+
expect(options.body).toContain("groups=");
|
|
128
|
+
done();
|
|
129
|
+
})
|
|
130
|
+
.catch(e => {
|
|
131
|
+
fail(e);
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
it("should throw if the person trying to share doesnt own the item and is not an admin", done => {
|
|
136
|
+
fetchMock.once(
|
|
137
|
+
"https://myorg.maps.arcgis.com/sharing/rest/community/users/jsmith?f=json&token=fake-token",
|
|
138
|
+
AnonUserResponse
|
|
139
|
+
);
|
|
140
|
+
|
|
141
|
+
setItemAccess({
|
|
142
|
+
authentication: MOCK_USER_SESSION,
|
|
143
|
+
id: "abc123",
|
|
144
|
+
access: "private",
|
|
145
|
+
owner: "casey"
|
|
146
|
+
}).catch(e => {
|
|
147
|
+
expect(e.message).toEqual(
|
|
148
|
+
"This item can not be shared by jsmith. They are neither the item owner nor an organization admin."
|
|
149
|
+
);
|
|
150
|
+
done();
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
});
|