ducimusipsa 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.
Files changed (307) hide show
  1. package/.prettierignore +2 -0
  2. package/.travis.yml +34 -0
  3. package/.vscode/launch.json +24 -0
  4. package/.vscode/settings.json +3 -0
  5. package/demos/ago-node-cli/README.md +29 -0
  6. package/demos/ago-node-cli/ago.js +32 -0
  7. package/demos/ago-node-cli/index.js +11 -0
  8. package/demos/ago-node-cli/lib/item-export-command.js +48 -0
  9. package/demos/ago-node-cli/lib/item-search-command.js +35 -0
  10. package/demos/ago-node-cli/package-lock.json +180 -0
  11. package/demos/ago-node-cli/package.json +30 -0
  12. package/demos/attachments/README.md +5 -0
  13. package/demos/attachments/index.html +164 -0
  14. package/demos/attachments/package-lock.json +182 -0
  15. package/demos/attachments/package.json +18 -0
  16. package/demos/batch-geocoder-node/NYC_Restaurant_Inspection_Results.csv +100 -0
  17. package/demos/batch-geocoder-node/README.md +15 -0
  18. package/demos/batch-geocoder-node/batch-geocode.js +115 -0
  19. package/demos/batch-geocoder-node/config-template.js +18 -0
  20. package/demos/batch-geocoder-node/package-lock.json +109 -0
  21. package/demos/batch-geocoder-node/package.json +38 -0
  22. package/demos/express/README.md +15 -0
  23. package/demos/express/config.json.template +3 -0
  24. package/demos/express/package-lock.json +428 -0
  25. package/demos/express/package.json +18 -0
  26. package/demos/express/server.js +33 -0
  27. package/demos/feature-service-browser/README.md +6 -0
  28. package/demos/feature-service-browser/index.html +122 -0
  29. package/demos/feature-service-browser/package-lock.json +182 -0
  30. package/demos/feature-service-browser/package.json +18 -0
  31. package/demos/geocoder-browser/README.md +10 -0
  32. package/demos/geocoder-browser/config.js.template +1 -0
  33. package/demos/geocoder-browser/index.html +131 -0
  34. package/demos/geocoder-browser/package-lock.json +182 -0
  35. package/demos/geocoder-browser/package.json +19 -0
  36. package/demos/geocoder-browser/post-sign-in.html +25 -0
  37. package/demos/jsapi-integration/README.md +25 -0
  38. package/demos/jsapi-integration/config.js +6 -0
  39. package/demos/jsapi-integration/index.html +85 -0
  40. package/demos/jsapi-integration/package-lock.json +184 -0
  41. package/demos/jsapi-integration/package.json +19 -0
  42. package/demos/oauth2-browser/README.md +14 -0
  43. package/demos/oauth2-browser/authenticate.html +32 -0
  44. package/demos/oauth2-browser/config.js.template +6 -0
  45. package/demos/oauth2-browser/index.html +202 -0
  46. package/demos/oauth2-browser/logo.svg +4 -0
  47. package/demos/oauth2-browser/package-lock.json +163 -0
  48. package/demos/oauth2-browser/package.json +18 -0
  49. package/demos/oauth2-browser/style.css +36 -0
  50. package/demos/oauth2-browser-retry/README.md +25 -0
  51. package/demos/oauth2-browser-retry/authenticate.html +21 -0
  52. package/demos/oauth2-browser-retry/index.html +116 -0
  53. package/demos/oauth2-browser-retry/logo.svg +4 -0
  54. package/demos/vue/.env.example +11 -0
  55. package/demos/vue/.eslintrc.js +17 -0
  56. package/demos/vue/.postcssrc.js +5 -0
  57. package/demos/vue/README.md +17 -0
  58. package/demos/vue/babel.config.js +3 -0
  59. package/demos/vue/package-lock.json +11323 -0
  60. package/demos/vue/package.json +33 -0
  61. package/demos/vue/public/favicon.ico +0 -0
  62. package/demos/vue/public/index.html +24 -0
  63. package/demos/vue/src/assets/logo.svg +29 -0
  64. package/demos/vue/src/components/App.vue +308 -0
  65. package/demos/vue/src/components/Authenticate.vue +65 -0
  66. package/demos/vue/src/components/Loader.vue +230 -0
  67. package/demos/vue/src/main.js +92 -0
  68. package/docs/FAQ.md +28 -0
  69. package/docs/HISTORY.md +62 -0
  70. package/docs/acetate.config.js +223 -0
  71. package/docs/build-typedoc.js +303 -0
  72. package/docs/src/_layout.html +82 -0
  73. package/docs/src/api/_declaration.html +496 -0
  74. package/docs/src/api/_layout.html +127 -0
  75. package/docs/src/api/_package.html +13 -0
  76. package/docs/src/api/index.html +23 -0
  77. package/docs/src/guides/_layout.html +24 -0
  78. package/docs/src/guides/amd-requirejs-dojo.md +40 -0
  79. package/docs/src/guides/babel-and-rollup.md +30 -0
  80. package/docs/src/guides/babel-and-webpack.md +30 -0
  81. package/docs/src/guides/browser-authentication.md +41 -0
  82. package/docs/src/guides/browserify.md +9 -0
  83. package/docs/src/guides/cli-authentication.md +9 -0
  84. package/docs/src/guides/client-server-authentication.md +9 -0
  85. package/docs/src/guides/from-a-cdn.md +36 -0
  86. package/docs/src/guides/index.md +52 -0
  87. package/docs/src/guides/node.md +70 -0
  88. package/docs/src/guides/package-overview.md +8 -0
  89. package/docs/src/guides/server-authentication.md +9 -0
  90. package/docs/src/guides/typescript-and-webpack.md +9 -0
  91. package/docs/src/img/icons.png +0 -0
  92. package/docs/src/img/icons@2x.png +0 -0
  93. package/docs/src/index.html +12 -0
  94. package/docs/src/js/api-search.js +112 -0
  95. package/docs/src/js/nav-toggle.js +41 -0
  96. package/docs/src/sass/_highlight.scss +96 -0
  97. package/docs/src/sass/_icons.scss +157 -0
  98. package/docs/src/sass/style.scss +169 -0
  99. package/jasmine.json +7 -0
  100. package/karma.conf.js +100 -0
  101. package/lerna.json +8 -0
  102. package/notes/README.md +88 -0
  103. package/package.json +129 -0
  104. package/packages/arcgis-rest-auth/README.md +67 -0
  105. package/packages/arcgis-rest-auth/package-lock.json +11 -0
  106. package/packages/arcgis-rest-auth/package.json +53 -0
  107. package/packages/arcgis-rest-auth/src/ApplicationSession.ts +108 -0
  108. package/packages/arcgis-rest-auth/src/UserSession.ts +880 -0
  109. package/packages/arcgis-rest-auth/src/authenticated-request-options.ts +24 -0
  110. package/packages/arcgis-rest-auth/src/fetch-token.ts +52 -0
  111. package/packages/arcgis-rest-auth/src/generate-token.ts +39 -0
  112. package/packages/arcgis-rest-auth/src/index.ts +8 -0
  113. package/packages/arcgis-rest-auth/test/ApplicationSession.test.ts +124 -0
  114. package/packages/arcgis-rest-auth/test/UserSession.test.ts +1005 -0
  115. package/packages/arcgis-rest-auth/test/fetchToken.test.ts +112 -0
  116. package/packages/arcgis-rest-auth/test/generateToken.test.ts +130 -0
  117. package/packages/arcgis-rest-auth/test/utils.ts +14 -0
  118. package/packages/arcgis-rest-auth/tsconfig.json +6 -0
  119. package/packages/arcgis-rest-common/README.md +57 -0
  120. package/packages/arcgis-rest-common/package-lock.json +11 -0
  121. package/packages/arcgis-rest-common/package.json +41 -0
  122. package/packages/arcgis-rest-common/src/index.ts +10 -0
  123. package/packages/arcgis-rest-common/src/types/feature.ts +14 -0
  124. package/packages/arcgis-rest-common/src/types/geometry.ts +47 -0
  125. package/packages/arcgis-rest-common/src/types/symbol.ts +21 -0
  126. package/packages/arcgis-rest-common/src/util/location.ts +19 -0
  127. package/packages/arcgis-rest-common/test/location.test.ts +73 -0
  128. package/packages/arcgis-rest-common/tsconfig.json +6 -0
  129. package/packages/arcgis-rest-common-types/README.md +64 -0
  130. package/packages/arcgis-rest-common-types/package.json +40 -0
  131. package/packages/arcgis-rest-common-types/src/group.ts +54 -0
  132. package/packages/arcgis-rest-common-types/src/index.ts +469 -0
  133. package/packages/arcgis-rest-common-types/src/item.ts +47 -0
  134. package/packages/arcgis-rest-common-types/src/webmap.ts +1267 -0
  135. package/packages/arcgis-rest-common-types/tsconfig.json +11 -0
  136. package/packages/arcgis-rest-feature-service/README.md +73 -0
  137. package/packages/arcgis-rest-feature-service/package-lock.json +11 -0
  138. package/packages/arcgis-rest-feature-service/package.json +53 -0
  139. package/packages/arcgis-rest-feature-service/src/add.ts +90 -0
  140. package/packages/arcgis-rest-feature-service/src/addAttachment.ts +64 -0
  141. package/packages/arcgis-rest-feature-service/src/decodeValues.ts +129 -0
  142. package/packages/arcgis-rest-feature-service/src/delete.ts +97 -0
  143. package/packages/arcgis-rest-feature-service/src/deleteAttachments.ts +67 -0
  144. package/packages/arcgis-rest-feature-service/src/getAttachments.ts +64 -0
  145. package/packages/arcgis-rest-feature-service/src/getLayer.ts +27 -0
  146. package/packages/arcgis-rest-feature-service/src/helpers.ts +50 -0
  147. package/packages/arcgis-rest-feature-service/src/index.ts +14 -0
  148. package/packages/arcgis-rest-feature-service/src/query.ts +183 -0
  149. package/packages/arcgis-rest-feature-service/src/queryRelated.ts +94 -0
  150. package/packages/arcgis-rest-feature-service/src/update.ts +90 -0
  151. package/packages/arcgis-rest-feature-service/src/updateAttachment.ts +73 -0
  152. package/packages/arcgis-rest-feature-service/test/attachments.test.ts +203 -0
  153. package/packages/arcgis-rest-feature-service/test/crud.test.ts +263 -0
  154. package/packages/arcgis-rest-feature-service/test/decodeValues.test.ts +67 -0
  155. package/packages/arcgis-rest-feature-service/test/getLayer.test.ts +31 -0
  156. package/packages/arcgis-rest-feature-service/test/mocks/cvdQueryResponse.ts +225 -0
  157. package/packages/arcgis-rest-feature-service/test/mocks/feature.ts +281 -0
  158. package/packages/arcgis-rest-feature-service/test/mocks/fields.ts +779 -0
  159. package/packages/arcgis-rest-feature-service/test/mocks/foo.txt +1 -0
  160. package/packages/arcgis-rest-feature-service/test/mocks/service.ts +259 -0
  161. package/packages/arcgis-rest-feature-service/test/query.test.ts +140 -0
  162. package/packages/arcgis-rest-feature-service/tsconfig.json +6 -0
  163. package/packages/arcgis-rest-feature-service-admin/README.md +69 -0
  164. package/packages/arcgis-rest-feature-service-admin/package-lock.json +11 -0
  165. package/packages/arcgis-rest-feature-service-admin/package.json +56 -0
  166. package/packages/arcgis-rest-feature-service-admin/src/addTo.ts +74 -0
  167. package/packages/arcgis-rest-feature-service-admin/src/create.ts +207 -0
  168. package/packages/arcgis-rest-feature-service-admin/src/index.ts +2 -0
  169. package/packages/arcgis-rest-feature-service-admin/test/addTo.test.ts +353 -0
  170. package/packages/arcgis-rest-feature-service-admin/test/create.test.ts +412 -0
  171. package/packages/arcgis-rest-feature-service-admin/test/mocks/layerDefinition.ts +79 -0
  172. package/packages/arcgis-rest-feature-service-admin/test/mocks/move.ts +14 -0
  173. package/packages/arcgis-rest-feature-service-admin/test/mocks/service.ts +72 -0
  174. package/packages/arcgis-rest-feature-service-admin/tsconfig.json +6 -0
  175. package/packages/arcgis-rest-geocoder/README.md +83 -0
  176. package/packages/arcgis-rest-geocoder/package-lock.json +11 -0
  177. package/packages/arcgis-rest-geocoder/package.json +55 -0
  178. package/packages/arcgis-rest-geocoder/src/bulk.ts +102 -0
  179. package/packages/arcgis-rest-geocoder/src/geocode.ts +130 -0
  180. package/packages/arcgis-rest-geocoder/src/helpers.ts +80 -0
  181. package/packages/arcgis-rest-geocoder/src/index.ts +8 -0
  182. package/packages/arcgis-rest-geocoder/src/reverse.ts +83 -0
  183. package/packages/arcgis-rest-geocoder/src/suggest.ts +69 -0
  184. package/packages/arcgis-rest-geocoder/test/bulk.test.ts +113 -0
  185. package/packages/arcgis-rest-geocoder/test/geocode.test.ts +176 -0
  186. package/packages/arcgis-rest-geocoder/test/helpers.test.ts +111 -0
  187. package/packages/arcgis-rest-geocoder/test/mocks/responses.ts +629 -0
  188. package/packages/arcgis-rest-geocoder/test/reverse.test.ts +126 -0
  189. package/packages/arcgis-rest-geocoder/test/suggest.test.ts +98 -0
  190. package/packages/arcgis-rest-geocoder/tsconfig.json +6 -0
  191. package/packages/arcgis-rest-groups/README.md +67 -0
  192. package/packages/arcgis-rest-groups/package-lock.json +11 -0
  193. package/packages/arcgis-rest-groups/package.json +55 -0
  194. package/packages/arcgis-rest-groups/src/create.ts +34 -0
  195. package/packages/arcgis-rest-groups/src/get.ts +95 -0
  196. package/packages/arcgis-rest-groups/src/helpers.ts +27 -0
  197. package/packages/arcgis-rest-groups/src/index.ts +11 -0
  198. package/packages/arcgis-rest-groups/src/notification.ts +77 -0
  199. package/packages/arcgis-rest-groups/src/protect.ts +40 -0
  200. package/packages/arcgis-rest-groups/src/remove.ts +23 -0
  201. package/packages/arcgis-rest-groups/src/search.ts +64 -0
  202. package/packages/arcgis-rest-groups/src/update.ts +36 -0
  203. package/packages/arcgis-rest-groups/test/crud.test.ts +134 -0
  204. package/packages/arcgis-rest-groups/test/get.test.ts +101 -0
  205. package/packages/arcgis-rest-groups/test/mocks/responses.ts +141 -0
  206. package/packages/arcgis-rest-groups/test/notification.test.ts +102 -0
  207. package/packages/arcgis-rest-groups/test/protect.test.ts +64 -0
  208. package/packages/arcgis-rest-groups/test/search.test.ts +85 -0
  209. package/packages/arcgis-rest-groups/tsconfig.json +6 -0
  210. package/packages/arcgis-rest-items/README.md +69 -0
  211. package/packages/arcgis-rest-items/package-lock.json +11 -0
  212. package/packages/arcgis-rest-items/package.json +55 -0
  213. package/packages/arcgis-rest-items/src/add.ts +103 -0
  214. package/packages/arcgis-rest-items/src/create.ts +110 -0
  215. package/packages/arcgis-rest-items/src/get.ts +79 -0
  216. package/packages/arcgis-rest-items/src/helpers.ts +147 -0
  217. package/packages/arcgis-rest-items/src/index.ts +11 -0
  218. package/packages/arcgis-rest-items/src/protect.ts +38 -0
  219. package/packages/arcgis-rest-items/src/remove.ts +58 -0
  220. package/packages/arcgis-rest-items/src/search.ts +78 -0
  221. package/packages/arcgis-rest-items/src/update.ts +134 -0
  222. package/packages/arcgis-rest-items/test/add.test.ts +256 -0
  223. package/packages/arcgis-rest-items/test/create.test.ts +371 -0
  224. package/packages/arcgis-rest-items/test/get.test.ts +181 -0
  225. package/packages/arcgis-rest-items/test/mocks/foo.zip +0 -0
  226. package/packages/arcgis-rest-items/test/mocks/item.ts +35 -0
  227. package/packages/arcgis-rest-items/test/mocks/resources.ts +31 -0
  228. package/packages/arcgis-rest-items/test/mocks/search.ts +62 -0
  229. package/packages/arcgis-rest-items/test/protect.test.ts +122 -0
  230. package/packages/arcgis-rest-items/test/remove.test.ts +161 -0
  231. package/packages/arcgis-rest-items/test/search.test.ts +159 -0
  232. package/packages/arcgis-rest-items/test/update.test.ts +450 -0
  233. package/packages/arcgis-rest-items/tsconfig.json +6 -0
  234. package/packages/arcgis-rest-request/README.md +68 -0
  235. package/packages/arcgis-rest-request/package-lock.json +11 -0
  236. package/packages/arcgis-rest-request/package.json +45 -0
  237. package/packages/arcgis-rest-request/src/index.ts +15 -0
  238. package/packages/arcgis-rest-request/src/request.ts +358 -0
  239. package/packages/arcgis-rest-request/src/utils/ArcGISRequestError.ts +76 -0
  240. package/packages/arcgis-rest-request/src/utils/ErrorTypes.ts +29 -0
  241. package/packages/arcgis-rest-request/src/utils/append-custom-params.ts +29 -0
  242. package/packages/arcgis-rest-request/src/utils/encode-form-data.ts +34 -0
  243. package/packages/arcgis-rest-request/src/utils/encode-query-string.ts +23 -0
  244. package/packages/arcgis-rest-request/src/utils/get-portal-url.ts +25 -0
  245. package/packages/arcgis-rest-request/src/utils/get-portal.ts +45 -0
  246. package/packages/arcgis-rest-request/src/utils/params.ts +52 -0
  247. package/packages/arcgis-rest-request/src/utils/process-params.ts +99 -0
  248. package/packages/arcgis-rest-request/src/utils/retryAuthError.ts +9 -0
  249. package/packages/arcgis-rest-request/src/utils/warn.ts +11 -0
  250. package/packages/arcgis-rest-request/test/mocks/errors.ts +68 -0
  251. package/packages/arcgis-rest-request/test/mocks/geojson-feature-collection.ts +13 -0
  252. package/packages/arcgis-rest-request/test/mocks/portal.ts +112 -0
  253. package/packages/arcgis-rest-request/test/mocks/sharing-rest-info.ts +41 -0
  254. package/packages/arcgis-rest-request/test/mocks/webmap.ts +41 -0
  255. package/packages/arcgis-rest-request/test/request.test.ts +323 -0
  256. package/packages/arcgis-rest-request/test/utils/ArcGISAuthError.test.ts +170 -0
  257. package/packages/arcgis-rest-request/test/utils/ArcGISRequestError.test.ts +51 -0
  258. package/packages/arcgis-rest-request/test/utils/check-for-errors.test.ts +111 -0
  259. package/packages/arcgis-rest-request/test/utils/encode-form-data.test.ts +133 -0
  260. package/packages/arcgis-rest-request/test/utils/get-portal-url.test.ts +37 -0
  261. package/packages/arcgis-rest-request/test/utils/portal.test.ts +97 -0
  262. package/packages/arcgis-rest-request/test/utils/process-params.test.ts +193 -0
  263. package/packages/arcgis-rest-request/tsconfig.json +6 -0
  264. package/packages/arcgis-rest-routing/README.md +71 -0
  265. package/packages/arcgis-rest-routing/package-lock.json +11 -0
  266. package/packages/arcgis-rest-routing/package.json +54 -0
  267. package/packages/arcgis-rest-routing/src/helpers.ts +16 -0
  268. package/packages/arcgis-rest-routing/src/index.ts +4 -0
  269. package/packages/arcgis-rest-routing/src/solveRoute.ts +102 -0
  270. package/packages/arcgis-rest-routing/test/mocks/responses.ts +825 -0
  271. package/packages/arcgis-rest-routing/test/solveRoute.test.ts +267 -0
  272. package/packages/arcgis-rest-routing/tsconfig.json +6 -0
  273. package/packages/arcgis-rest-sharing/README.md +70 -0
  274. package/packages/arcgis-rest-sharing/package-lock.json +11 -0
  275. package/packages/arcgis-rest-sharing/package.json +60 -0
  276. package/packages/arcgis-rest-sharing/src/access.ts +85 -0
  277. package/packages/arcgis-rest-sharing/src/group-sharing.ts +211 -0
  278. package/packages/arcgis-rest-sharing/src/helpers.ts +82 -0
  279. package/packages/arcgis-rest-sharing/src/index.ts +5 -0
  280. package/packages/arcgis-rest-sharing/test/access.test.ts +154 -0
  281. package/packages/arcgis-rest-sharing/test/group-sharing.test.ts +566 -0
  282. package/packages/arcgis-rest-sharing/test/helpers.test.ts +55 -0
  283. package/packages/arcgis-rest-sharing/test/mocks/sharing.ts +18 -0
  284. package/packages/arcgis-rest-sharing/tsconfig.json +6 -0
  285. package/packages/arcgis-rest-users/README.md +74 -0
  286. package/packages/arcgis-rest-users/package-lock.json +11 -0
  287. package/packages/arcgis-rest-users/package.json +54 -0
  288. package/packages/arcgis-rest-users/src/get.ts +69 -0
  289. package/packages/arcgis-rest-users/src/index.ts +6 -0
  290. package/packages/arcgis-rest-users/src/invitation.ts +166 -0
  291. package/packages/arcgis-rest-users/src/notification.ts +73 -0
  292. package/packages/arcgis-rest-users/test/get.test.ts +99 -0
  293. package/packages/arcgis-rest-users/test/invitation.test.ts +169 -0
  294. package/packages/arcgis-rest-users/test/mocks/invitation.ts +70 -0
  295. package/packages/arcgis-rest-users/test/mocks/notification.ts +34 -0
  296. package/packages/arcgis-rest-users/test/mocks/user.ts +173 -0
  297. package/packages/arcgis-rest-users/test/notification.test.ts +83 -0
  298. package/packages/arcgis-rest-users/tsconfig.json +6 -0
  299. package/support/changelog.js +394 -0
  300. package/support/deploy-doc-site.js +16 -0
  301. package/support/dev.sh +6 -0
  302. package/support/publish.sh +43 -0
  303. package/support/test-helpers.js +8 -0
  304. package/tsconfig.json +69 -0
  305. package/tslint.json +16 -0
  306. package/umd-base-profile.js +82 -0
  307. package/umd-production-profile.js +13 -0
@@ -0,0 +1,211 @@
1
+ /* Copyright (c) 2018 Environmental Systems Research Institute, Inc.
2
+ * Apache-2.0 */
3
+
4
+ import { request, getPortalUrl } from "@esri/arcgis-rest-request";
5
+ import { IItem } from "@esri/arcgis-rest-common-types";
6
+
7
+ import {
8
+ ISharingRequestOptions,
9
+ ISharingResponse,
10
+ isOrgAdmin,
11
+ getUserMembership
12
+ } from "./helpers";
13
+
14
+ export interface IGroupSharingRequestOptions extends ISharingRequestOptions {
15
+ /**
16
+ * Group identifier
17
+ */
18
+ groupId: string;
19
+ confirmItemControl?: boolean;
20
+ }
21
+
22
+ interface IGroupSharingUnsharingRequestOptions
23
+ extends IGroupSharingRequestOptions {
24
+ action: "share" | "unshare";
25
+ }
26
+
27
+ /**
28
+ * Share an item with a group.
29
+ *
30
+ * ```js
31
+ * import { shareItemWithGroup } from '@esri/arcgis-rest-sharing';
32
+ *
33
+ * shareItemWithGroup({
34
+ * id: "abc123",
35
+ * groupId: "xyz987",
36
+ * authentication: session
37
+ * })
38
+ * ```
39
+ *
40
+ * @param requestOptions - Options for the request.
41
+ * @returns A Promise that will resolve with the data from the response.
42
+ */
43
+ export function shareItemWithGroup(
44
+ requestOptions: IGroupSharingRequestOptions
45
+ ): Promise<ISharingResponse> {
46
+ return changeGroupSharing({ action: "share", ...requestOptions });
47
+ }
48
+
49
+ /**
50
+ * Stop sharing an item with a group.
51
+ *
52
+ * ```js
53
+ * import { unshareItemWithGroup } from '@esri/arcgis-rest-sharing';
54
+ *
55
+ * unshareItemWithGroup({
56
+ * id: "abc123",
57
+ * groupId: "xyz987",
58
+ * authentication: session
59
+ * })
60
+ * ```
61
+ *
62
+ * @param requestOptions - Options for the request.
63
+ * @returns A Promise that will resolve with the data from the response.
64
+ */
65
+ export function unshareItemWithGroup(
66
+ requestOptions: IGroupSharingRequestOptions
67
+ ): Promise<ISharingResponse> {
68
+ return changeGroupSharing({ action: "unshare", ...requestOptions });
69
+ }
70
+
71
+ /**
72
+ * @param requestOptions - Options for the request.
73
+ * @returns A Promise that will resolve with the data from the response.
74
+ */
75
+ function changeGroupSharing(
76
+ requestOptions: IGroupSharingUnsharingRequestOptions
77
+ ): Promise<ISharingResponse> {
78
+ const username = requestOptions.authentication.username;
79
+ const owner = requestOptions.owner || username;
80
+
81
+ return isOrgAdmin(requestOptions).then(admin => {
82
+ const resultProp =
83
+ requestOptions.action === "share" ? "notSharedWith" : "notUnsharedFrom";
84
+ // check if the item has already been shared with the group...
85
+ return isItemSharedWithGroup(requestOptions).then(result => {
86
+ // console.log(admin);
87
+ // if we are sharing and result is true OR we are unsharing and result is false... short circuit
88
+ if (
89
+ (requestOptions.action === "share" && result === true) ||
90
+ (requestOptions.action === "unshare" && result === false)
91
+ ) {
92
+ // and send back the same response structure ArcGIS Online would
93
+ const response = { itemId: requestOptions.id, shortcut: true } as any;
94
+ response[resultProp] = [];
95
+ return response;
96
+ } else {
97
+ // next check to ensure the user is a member of the group
98
+ return getUserMembership(requestOptions)
99
+ .then(membership => {
100
+ if (membership === "nonmember") {
101
+ // abort and reject promise
102
+ throw Error(
103
+ `This item can not be ${
104
+ requestOptions.action
105
+ }d by ${username} as they are not a member of the specified group ${
106
+ requestOptions.groupId
107
+ }.`
108
+ );
109
+ } else {
110
+ // if orgAdmin or owner (and member of group) share using the owner url
111
+ if (owner === username || admin) {
112
+ return `${getPortalUrl(
113
+ requestOptions
114
+ )}/content/users/${owner}/items/${requestOptions.id}/${
115
+ requestOptions.action
116
+ }`;
117
+ } else {
118
+ // if they are a group admin/owner, use the bare item url
119
+ if (membership === "admin" || membership === "owner") {
120
+ return `${getPortalUrl(requestOptions)}/content/items/${
121
+ requestOptions.id
122
+ }/${requestOptions.action}`;
123
+ } else {
124
+ // otherwise abort
125
+ throw Error(
126
+ `This item can not be ${
127
+ requestOptions.action
128
+ }d by ${username} as they are neither the owner, a groupAdmin of ${
129
+ requestOptions.groupId
130
+ }, nor an org_admin.`
131
+ );
132
+ }
133
+ }
134
+ }
135
+ })
136
+ .then(url => {
137
+ // now its finally time to do the sharing
138
+ requestOptions.params = {
139
+ groups: requestOptions.groupId,
140
+ confirmItemControl: requestOptions.confirmItemControl
141
+ };
142
+ // dont mixin to ensure that old query parameters from the search request arent included
143
+ return request(url, requestOptions);
144
+ })
145
+ .then(sharingResponse => {
146
+ if (sharingResponse[resultProp].length) {
147
+ throw Error(
148
+ `Item ${requestOptions.id} could not be ${
149
+ requestOptions.action
150
+ }d to group ${requestOptions.groupId}.`
151
+ );
152
+ } else {
153
+ // all is well
154
+ return sharingResponse;
155
+ }
156
+ });
157
+ } // else
158
+ }); // then
159
+ });
160
+ }
161
+
162
+ /**
163
+ * Find out whether or not an item is already shared with a group.
164
+ *
165
+ * @param requestOptions - Options for the request.
166
+ * @returns A Promise that will resolve with the data from the response.
167
+ */
168
+ function isItemSharedWithGroup(
169
+ requestOptions: IGroupSharingRequestOptions
170
+ ): Promise<boolean> {
171
+ const query = {
172
+ q: `id: ${requestOptions.id} AND group: ${requestOptions.groupId}`,
173
+ start: 1,
174
+ num: 10,
175
+ sortField: "title"
176
+ };
177
+
178
+ // we need to append some params into requestOptions, so make a clone
179
+ // instead of mutating the params on the inbound requestOptions object
180
+ const options = { ...requestOptions };
181
+ // instead of calling out to "@esri/arcgis-rest-items, make the request manually to forgoe another dependency
182
+ options.params = {
183
+ ...query,
184
+ ...requestOptions.params
185
+ };
186
+
187
+ const url = `${getPortalUrl(options)}/search`;
188
+
189
+ return request(url, options).then(searchResponse => {
190
+ // if there are no search results at all, we know the item hasnt already been shared with the group
191
+ if (searchResponse.total === 0) {
192
+ return false;
193
+ } else {
194
+ let sharedItem: IItem;
195
+ // otherwise loop through and search for the id
196
+ searchResponse.results.some((item: IItem) => {
197
+ const matchedItem = item.id === requestOptions.id;
198
+ if (matchedItem) {
199
+ sharedItem = item;
200
+ }
201
+ return matchedItem;
202
+ });
203
+
204
+ if (sharedItem) {
205
+ return true;
206
+ } else {
207
+ return false;
208
+ }
209
+ }
210
+ });
211
+ }
@@ -0,0 +1,82 @@
1
+ /* Copyright (c) 2018 Environmental Systems Research Institute, Inc.
2
+ * Apache-2.0 */
3
+
4
+ import { IRequestOptions, getPortalUrl } from "@esri/arcgis-rest-request";
5
+ import { UserSession } from "@esri/arcgis-rest-auth";
6
+ import { IGroup, IUser, GroupMembership } from "@esri/arcgis-rest-common-types";
7
+ import { getGroup } from "@esri/arcgis-rest-groups";
8
+ import { IGroupSharingRequestOptions } from "./group-sharing";
9
+
10
+ export interface ISharingRequestOptions extends IRequestOptions {
11
+ /**
12
+ * Unique identifier for the item.
13
+ */
14
+ id: string;
15
+ /**
16
+ * Represents a user with privileges to update item sharing.
17
+ */
18
+ authentication: UserSession;
19
+ /**
20
+ * Item owner, if different from the authenticated user.
21
+ */
22
+ owner?: string;
23
+ }
24
+
25
+ export interface ISharingResponse {
26
+ notSharedWith?: string[];
27
+ notUnsharedFrom?: string[];
28
+ itemId: string;
29
+ }
30
+
31
+ export function getSharingUrl(requestOptions: ISharingRequestOptions): string {
32
+ const username = requestOptions.authentication.username;
33
+ const owner = requestOptions.owner || username;
34
+ return `${getPortalUrl(requestOptions)}/content/users/${encodeURIComponent(
35
+ owner
36
+ )}/items/${requestOptions.id}/share`;
37
+ }
38
+
39
+ export function isItemOwner(requestOptions: ISharingRequestOptions): boolean {
40
+ const username = requestOptions.authentication.username;
41
+ const owner = requestOptions.owner || username;
42
+ return owner === username;
43
+ }
44
+
45
+ /**
46
+ * Check it the user is a full org_admin
47
+ * @param requestOptions
48
+ * @returns Promise resolving in a boolean indicating if the user is an ArcGIS Organization administrator
49
+ */
50
+ export function isOrgAdmin(
51
+ requestOptions: ISharingRequestOptions
52
+ ): Promise<boolean> {
53
+ const session = requestOptions.authentication as UserSession;
54
+
55
+ return session.getUser(requestOptions).then((user: IUser) => {
56
+ if (!user || user.role !== "org_admin") {
57
+ return false;
58
+ } else {
59
+ return true;
60
+ }
61
+ });
62
+ }
63
+
64
+ /**
65
+ * Get the User Membership for a particular group. Use this if all you have is the groupId.
66
+ * If you have the group object, check the `userMembership.memberType` property instead of calling this method.
67
+ *
68
+ * @param IGroupIdRequestOptions options to pass through in the request
69
+ * @returns A Promise that resolves with "owner" | "admin" | "member" | "nonmember"
70
+ */
71
+ export function getUserMembership(
72
+ requestOptions: IGroupSharingRequestOptions
73
+ ): Promise<GroupMembership> {
74
+ // fetch the group...
75
+ return getGroup(requestOptions.groupId, requestOptions)
76
+ .then((group: IGroup) => {
77
+ return group.userMembership.memberType;
78
+ })
79
+ .catch(() => {
80
+ return "nonmember" as GroupMembership;
81
+ });
82
+ }
@@ -0,0 +1,5 @@
1
+ /* Copyright (c) 2018 Environmental Systems Research Institute, Inc.
2
+ * Apache-2.0 */
3
+
4
+ export * from "./access";
5
+ export * from "./group-sharing";
@@ -0,0 +1,154 @@
1
+ /* Copyright (c) 2018 Environmental Systems Research Institute, Inc.
2
+ * Apache-2.0 */
3
+
4
+ import { setItemAccess } from "../src/index";
5
+ import * as fetchMock from "fetch-mock";
6
+ import { MOCK_USER_SESSION } from "./mocks/sharing";
7
+ import {
8
+ AnonUserResponse,
9
+ OrgAdminUserResponse
10
+ } from "../../arcgis-rest-users/test/mocks/user";
11
+
12
+ const SharingResponse = {
13
+ notSharedWith: [] as any,
14
+ itemId: "abc123"
15
+ };
16
+
17
+ describe("setItemAccess()", () => {
18
+ // make sure session doesnt cache metadata
19
+ beforeEach(function() {
20
+ MOCK_USER_SESSION._user = null;
21
+ });
22
+
23
+ afterEach(fetchMock.restore);
24
+
25
+ it("should share an item with everyone", done => {
26
+ fetchMock.once("*", SharingResponse);
27
+
28
+ setItemAccess({
29
+ authentication: MOCK_USER_SESSION,
30
+ id: "abc123",
31
+ access: "public"
32
+ })
33
+ .then(response => {
34
+ const [url, options]: [string, RequestInit] = fetchMock.lastCall("*");
35
+ expect(url).toEqual(
36
+ "https://myorg.maps.arcgis.com/sharing/rest/content/users/jsmith/items/abc123/share"
37
+ );
38
+ expect(options.method).toBe("POST");
39
+ expect(response).toEqual(SharingResponse);
40
+ expect(options.body).toContain("f=json");
41
+ expect(options.body).toContain("everyone=true");
42
+ expect(options.body).toContain("org=true");
43
+ done();
44
+ })
45
+ .catch(e => {
46
+ fail(e);
47
+ });
48
+ });
49
+
50
+ it("should share an item with an organization", done => {
51
+ fetchMock.once("*", SharingResponse);
52
+
53
+ setItemAccess({
54
+ authentication: MOCK_USER_SESSION,
55
+ id: "abc123",
56
+ access: "org"
57
+ })
58
+ .then(response => {
59
+ const [url, options]: [string, RequestInit] = fetchMock.lastCall("*");
60
+ expect(url).toEqual(
61
+ "https://myorg.maps.arcgis.com/sharing/rest/content/users/jsmith/items/abc123/share"
62
+ );
63
+ expect(options.method).toBe("POST");
64
+ expect(response).toEqual(SharingResponse);
65
+ expect(options.body).toContain("f=json");
66
+ expect(options.body).toContain("everyone=false");
67
+ expect(options.body).toContain("org=true");
68
+ done();
69
+ })
70
+ .catch(e => {
71
+ fail(e);
72
+ });
73
+ });
74
+
75
+ it("should stop sharing an item entirely", done => {
76
+ fetchMock.once("*", SharingResponse);
77
+
78
+ setItemAccess({
79
+ authentication: MOCK_USER_SESSION,
80
+ id: "abc123",
81
+ access: "private"
82
+ })
83
+ .then(response => {
84
+ const [url, options]: [string, RequestInit] = fetchMock.lastCall("*");
85
+ expect(url).toEqual(
86
+ "https://myorg.maps.arcgis.com/sharing/rest/content/users/jsmith/items/abc123/share"
87
+ );
88
+ expect(options.method).toBe("POST");
89
+ expect(response).toEqual(SharingResponse);
90
+ expect(options.body).toContain("f=json");
91
+ expect(options.body).toContain("everyone=false");
92
+ expect(options.body).toContain("org=false");
93
+ expect(options.body).toContain("groups=");
94
+ done();
95
+ })
96
+ .catch(e => {
97
+ fail(e);
98
+ });
99
+ });
100
+
101
+ it("should share another persons item if an org admin makes the request", done => {
102
+ fetchMock.once(
103
+ "https://myorg.maps.arcgis.com/sharing/rest/community/users/jsmith?f=json&token=fake-token",
104
+ OrgAdminUserResponse
105
+ );
106
+
107
+ fetchMock.once(
108
+ "begin:https://myorg.maps.arcgis.com/sharing/rest/content/users/casey/items/abc123/share",
109
+ SharingResponse
110
+ );
111
+
112
+ setItemAccess({
113
+ authentication: MOCK_USER_SESSION,
114
+ id: "abc123",
115
+ access: "private",
116
+ owner: "casey"
117
+ })
118
+ .then(response => {
119
+ const [url, options]: [string, RequestInit] = fetchMock.lastCall();
120
+ expect(url).toEqual(
121
+ "https://myorg.maps.arcgis.com/sharing/rest/content/users/casey/items/abc123/share"
122
+ );
123
+ expect(options.method).toBe("POST");
124
+ expect(response).toEqual(SharingResponse);
125
+ expect(options.body).toContain("f=json");
126
+ expect(options.body).toContain("everyone=false");
127
+ expect(options.body).toContain("org=false");
128
+ expect(options.body).toContain("groups=");
129
+ done();
130
+ })
131
+ .catch(e => {
132
+ fail(e);
133
+ });
134
+ });
135
+
136
+ it("should throw if the person trying to share doesnt own the item and is not an admin", done => {
137
+ fetchMock.once(
138
+ "https://myorg.maps.arcgis.com/sharing/rest/community/users/jsmith?f=json&token=fake-token",
139
+ AnonUserResponse
140
+ );
141
+
142
+ setItemAccess({
143
+ authentication: MOCK_USER_SESSION,
144
+ id: "abc123",
145
+ access: "private",
146
+ owner: "casey"
147
+ }).catch(e => {
148
+ expect(e.message).toEqual(
149
+ "This item can not be shared by jsmith. They are neither the item owner nor an organization admin."
150
+ );
151
+ done();
152
+ });
153
+ });
154
+ });