impeditmaiores 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- package/.prettierignore +2 -0
- package/.travis.yml +35 -0
- package/.vscode/launch.json +24 -0
- package/.vscode/settings.json +3 -0
- package/codecov.yml +7 -0
- package/demos/ago-node-cli/README.md +29 -0
- package/demos/ago-node-cli/ago.js +33 -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 +152 -0
- package/demos/ago-node-cli/package.json +30 -0
- package/demos/attachments/README.md +5 -0
- package/demos/attachments/index.html +165 -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 +15 -0
- package/demos/batch-geocoder-node/batch-geocode.js +115 -0
- package/demos/batch-geocoder-node/config-template.js +18 -0
- package/demos/batch-geocoder-node/package-lock.json +81 -0
- package/demos/batch-geocoder-node/package.json +37 -0
- package/demos/express/README.md +15 -0
- package/demos/express/config.json.template +3 -0
- package/demos/express/package-lock.json +413 -0
- package/demos/express/package.json +18 -0
- package/demos/express/server.js +33 -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 +182 -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 +25 -0
- package/demos/jsapi-integration/config.js +6 -0
- package/demos/jsapi-integration/index.html +89 -0
- package/demos/jsapi-integration/package-lock.json +184 -0
- package/demos/jsapi-integration/package.json +19 -0
- package/demos/node-cli-item-management/README.md +10 -0
- package/demos/node-cli-item-management/index.js +238 -0
- package/demos/node-cli-item-management/package-lock.json +152 -0
- package/demos/node-cli-item-management/package.json +27 -0
- package/demos/node-cli-item-management/screenshot.png +0 -0
- package/demos/oauth2-browser/README.md +14 -0
- package/demos/oauth2-browser/authenticate.html +30 -0
- package/demos/oauth2-browser/config.js.template +6 -0
- package/demos/oauth2-browser/index.html +211 -0
- package/demos/oauth2-browser/logo.svg +4 -0
- package/demos/oauth2-browser/package-lock.json +224 -0
- package/demos/oauth2-browser/package.json +18 -0
- package/demos/oauth2-browser/style.css +36 -0
- package/demos/oauth2-browser-retry/README.md +25 -0
- package/demos/oauth2-browser-retry/authenticate.html +22 -0
- package/demos/oauth2-browser-retry/index.html +116 -0
- package/demos/oauth2-browser-retry/logo.svg +4 -0
- package/demos/stream-response-to-file/README.md +7 -0
- package/demos/stream-response-to-file/index.js +36 -0
- package/demos/stream-response-to-file/output/.gitkeep +0 -0
- package/demos/stream-response-to-file/package-lock.json +60 -0
- package/demos/stream-response-to-file/package.json +33 -0
- package/demos/tree-shaking-rollup/.babelrc +3 -0
- package/demos/tree-shaking-rollup/README.md +9 -0
- package/demos/tree-shaking-rollup/index.html +11 -0
- package/demos/tree-shaking-rollup/package-lock.json +2225 -0
- package/demos/tree-shaking-rollup/package.json +25 -0
- package/demos/tree-shaking-rollup/rollup.config.js +17 -0
- package/demos/tree-shaking-rollup/src/index.js +8 -0
- package/demos/tree-shaking-webpack/README.md +8 -0
- package/demos/tree-shaking-webpack/index.html +11 -0
- package/demos/tree-shaking-webpack/package-lock.json +4614 -0
- package/demos/tree-shaking-webpack/package.json +24 -0
- package/demos/tree-shaking-webpack/src/index.js +10 -0
- package/demos/tree-shaking-webpack/webpack.config.js +27 -0
- package/demos/vue/.env.example +11 -0
- package/demos/vue/.eslintrc.js +17 -0
- package/demos/vue/.postcssrc.js +5 -0
- package/demos/vue/README.md +17 -0
- package/demos/vue/babel.config.js +3 -0
- package/demos/vue/package-lock.json +11342 -0
- package/demos/vue/package.json +33 -0
- package/demos/vue/public/favicon.ico +0 -0
- package/demos/vue/public/index.html +24 -0
- package/demos/vue/src/assets/logo.svg +29 -0
- package/demos/vue/src/components/App.vue +305 -0
- package/demos/vue/src/components/Authenticate.vue +65 -0
- package/demos/vue/src/components/Loader.vue +230 -0
- package/demos/vue/src/main.js +92 -0
- package/demos/webmap-checker-sapper/.env.example +5 -0
- package/demos/webmap-checker-sapper/README.md +123 -0
- package/demos/webmap-checker-sapper/appveyor.yml +18 -0
- package/demos/webmap-checker-sapper/cypress/fixtures/example.json +5 -0
- package/demos/webmap-checker-sapper/cypress/integration/spec.js +19 -0
- package/demos/webmap-checker-sapper/cypress/plugins/index.js +17 -0
- package/demos/webmap-checker-sapper/cypress/support/commands.js +25 -0
- package/demos/webmap-checker-sapper/cypress/support/index.js +20 -0
- package/demos/webmap-checker-sapper/cypress.json +4 -0
- package/demos/webmap-checker-sapper/package-lock.json +3870 -0
- package/demos/webmap-checker-sapper/package.json +50 -0
- package/demos/webmap-checker-sapper/rollup.config.js +87 -0
- package/demos/webmap-checker-sapper/src/client.js +20 -0
- package/demos/webmap-checker-sapper/src/components/LayerStatus.html +108 -0
- package/demos/webmap-checker-sapper/src/components/Nav.html +21 -0
- package/demos/webmap-checker-sapper/src/components/WebMap.html +62 -0
- package/demos/webmap-checker-sapper/src/routes/_error.html +41 -0
- package/demos/webmap-checker-sapper/src/routes/_layout.html +21 -0
- package/demos/webmap-checker-sapper/src/routes/auth/authorize.js +18 -0
- package/demos/webmap-checker-sapper/src/routes/auth/exchange-token.js +20 -0
- package/demos/webmap-checker-sapper/src/routes/auth/post-sign-in.js +24 -0
- package/demos/webmap-checker-sapper/src/routes/auth/sign-out.js +10 -0
- package/demos/webmap-checker-sapper/src/routes/index.html +20 -0
- package/demos/webmap-checker-sapper/src/routes/webmaps/[webmapId].html +83 -0
- package/demos/webmap-checker-sapper/src/routes/webmaps/index.html +59 -0
- package/demos/webmap-checker-sapper/src/server.js +101 -0
- package/demos/webmap-checker-sapper/src/service-worker.js +82 -0
- package/demos/webmap-checker-sapper/src/template.html +33 -0
- package/demos/webmap-checker-sapper/src/userInfoMiddleware.js +21 -0
- package/demos/webmap-checker-sapper/src/utils.js +33 -0
- package/demos/webmap-checker-sapper/static/favicon.png +0 -0
- package/demos/webmap-checker-sapper/static/global.css +36 -0
- package/demos/webmap-checker-sapper/static/manifest.json +20 -0
- package/demos/webmap-checker-sapper/static/svelte-logo-192.png +0 -0
- package/demos/webmap-checker-sapper/static/svelte-logo-512.png +0 -0
- package/docs/FAQ.md +48 -0
- package/docs/HISTORY.md +62 -0
- package/docs/acetate.config.js +262 -0
- package/docs/build-typedoc.js +434 -0
- package/docs/generate-srihashes.js +53 -0
- package/docs/src/_layout.html +86 -0
- package/docs/src/api/_declaration.html +600 -0
- package/docs/src/api/_layout.html +204 -0
- package/docs/src/api/_package.html +38 -0
- package/docs/src/api/index.html +16 -0
- package/docs/src/guides/_layout.html +24 -0
- package/docs/src/guides/amd-requirejs-dojo.md +40 -0
- package/docs/src/guides/browser-authentication.md +41 -0
- package/docs/src/guides/bundlers.md +52 -0
- package/docs/src/guides/cli-authentication.md +9 -0
- package/docs/src/guides/client-server-authentication.md +9 -0
- package/docs/src/guides/embedded-apps.md +93 -0
- package/docs/src/guides/from-a-cdn.md +38 -0
- package/docs/src/guides/index.md +59 -0
- package/docs/src/guides/node.md +87 -0
- package/docs/src/guides/package-overview.md +111 -0
- package/docs/src/guides/server-authentication.md +9 -0
- package/docs/src/guides/whats-new-v2-0.md +305 -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 +112 -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 +242 -0
- package/docs/src/srihashes.json +12 -0
- package/jasmine.json +7 -0
- package/karma.conf.js +106 -0
- package/lerna.json +8 -0
- package/notes/README.md +68 -0
- package/package.json +87 -0
- package/packages/arcgis-rest-auth/README.md +71 -0
- package/packages/arcgis-rest-auth/package-lock.json +11 -0
- package/packages/arcgis-rest-auth/package.json +69 -0
- package/packages/arcgis-rest-auth/src/ApplicationSession.ts +122 -0
- package/packages/arcgis-rest-auth/src/UserSession.ts +1206 -0
- package/packages/arcgis-rest-auth/src/app-tokens.ts +91 -0
- package/packages/arcgis-rest-auth/src/authenticated-request-options.ts +24 -0
- package/packages/arcgis-rest-auth/src/federation-utils.ts +85 -0
- package/packages/arcgis-rest-auth/src/fetch-token.ts +50 -0
- package/packages/arcgis-rest-auth/src/generate-token.ts +35 -0
- package/packages/arcgis-rest-auth/src/index.ts +9 -0
- package/packages/arcgis-rest-auth/src/validate-app-access.ts +68 -0
- package/packages/arcgis-rest-auth/test/ApplicationSession.test.ts +124 -0
- package/packages/arcgis-rest-auth/test/UserSession.test.ts +1807 -0
- package/packages/arcgis-rest-auth/test/app-tokens.test.ts +91 -0
- package/packages/arcgis-rest-auth/test/federation-utils.test.ts +323 -0
- package/packages/arcgis-rest-auth/test/fetchToken.test.ts +112 -0
- package/packages/arcgis-rest-auth/test/generateToken.test.ts +102 -0
- package/packages/arcgis-rest-auth/test/utils.ts +14 -0
- package/packages/arcgis-rest-auth/test/validate-app-access.test.ts +46 -0
- package/packages/arcgis-rest-auth/tsconfig.json +6 -0
- package/packages/arcgis-rest-feature-layer/README.md +77 -0
- package/packages/arcgis-rest-feature-layer/package-lock.json +11 -0
- package/packages/arcgis-rest-feature-layer/package.json +64 -0
- package/packages/arcgis-rest-feature-layer/src/add.ts +56 -0
- package/packages/arcgis-rest-feature-layer/src/addAttachment.ts +53 -0
- package/packages/arcgis-rest-feature-layer/src/applyEdits.ts +90 -0
- package/packages/arcgis-rest-feature-layer/src/decodeValues.ts +124 -0
- package/packages/arcgis-rest-feature-layer/src/delete.ts +61 -0
- package/packages/arcgis-rest-feature-layer/src/deleteAttachments.ts +52 -0
- package/packages/arcgis-rest-feature-layer/src/getAttachments.ts +55 -0
- package/packages/arcgis-rest-feature-layer/src/getLayer.ts +24 -0
- package/packages/arcgis-rest-feature-layer/src/getService.ts +26 -0
- package/packages/arcgis-rest-feature-layer/src/helpers.ts +79 -0
- package/packages/arcgis-rest-feature-layer/src/index.ts +31 -0
- package/packages/arcgis-rest-feature-layer/src/query.ts +204 -0
- package/packages/arcgis-rest-feature-layer/src/queryRelated.ts +89 -0
- package/packages/arcgis-rest-feature-layer/src/update.ts +56 -0
- package/packages/arcgis-rest-feature-layer/src/updateAttachment.ts +59 -0
- package/packages/arcgis-rest-feature-layer/test/attachments.test.ts +200 -0
- package/packages/arcgis-rest-feature-layer/test/crud.test.ts +195 -0
- package/packages/arcgis-rest-feature-layer/test/decodeValues.test.ts +67 -0
- package/packages/arcgis-rest-feature-layer/test/getLayer.test.ts +31 -0
- package/packages/arcgis-rest-feature-layer/test/getService.test.ts +31 -0
- package/packages/arcgis-rest-feature-layer/test/mocks/cvdQueryResponse.ts +225 -0
- package/packages/arcgis-rest-feature-layer/test/mocks/feature.ts +302 -0
- package/packages/arcgis-rest-feature-layer/test/mocks/fields.ts +779 -0
- package/packages/arcgis-rest-feature-layer/test/mocks/foo.txt +1 -0
- package/packages/arcgis-rest-feature-layer/test/mocks/service.ts +398 -0
- package/packages/arcgis-rest-feature-layer/test/query.test.ts +167 -0
- package/packages/arcgis-rest-feature-layer/tsconfig.json +6 -0
- package/packages/arcgis-rest-geocoding/README.md +86 -0
- package/packages/arcgis-rest-geocoding/package-lock.json +11 -0
- package/packages/arcgis-rest-geocoding/package.json +64 -0
- package/packages/arcgis-rest-geocoding/src/bulk.ts +104 -0
- package/packages/arcgis-rest-geocoding/src/geocode.ts +133 -0
- package/packages/arcgis-rest-geocoding/src/helpers.ts +54 -0
- package/packages/arcgis-rest-geocoding/src/index.ts +15 -0
- package/packages/arcgis-rest-geocoding/src/reverse.ts +84 -0
- package/packages/arcgis-rest-geocoding/src/suggest.ts +45 -0
- package/packages/arcgis-rest-geocoding/test/bulk.test.ts +194 -0
- package/packages/arcgis-rest-geocoding/test/geocode.test.ts +249 -0
- package/packages/arcgis-rest-geocoding/test/helpers.test.ts +85 -0
- package/packages/arcgis-rest-geocoding/test/mocks/responses.ts +637 -0
- package/packages/arcgis-rest-geocoding/test/reverse.test.ts +126 -0
- package/packages/arcgis-rest-geocoding/test/suggest.test.ts +53 -0
- package/packages/arcgis-rest-geocoding/tsconfig.json +6 -0
- package/packages/arcgis-rest-portal/README.md +73 -0
- package/packages/arcgis-rest-portal/package-lock.json +11 -0
- package/packages/arcgis-rest-portal/package.json +64 -0
- package/packages/arcgis-rest-portal/src/groups/add-users.ts +140 -0
- package/packages/arcgis-rest-portal/src/groups/create.ts +43 -0
- package/packages/arcgis-rest-portal/src/groups/get.ts +184 -0
- package/packages/arcgis-rest-portal/src/groups/helpers.ts +14 -0
- package/packages/arcgis-rest-portal/src/groups/invite-users.ts +127 -0
- package/packages/arcgis-rest-portal/src/groups/join.ts +57 -0
- package/packages/arcgis-rest-portal/src/groups/notification.ts +77 -0
- package/packages/arcgis-rest-portal/src/groups/protect.ts +56 -0
- package/packages/arcgis-rest-portal/src/groups/remove-users.ts +76 -0
- package/packages/arcgis-rest-portal/src/groups/remove.ts +32 -0
- package/packages/arcgis-rest-portal/src/groups/search.ts +47 -0
- package/packages/arcgis-rest-portal/src/groups/update-user-membership.ts +63 -0
- package/packages/arcgis-rest-portal/src/groups/update.ts +39 -0
- package/packages/arcgis-rest-portal/src/index.ts +66 -0
- package/packages/arcgis-rest-portal/src/items/add.ts +138 -0
- package/packages/arcgis-rest-portal/src/items/content.ts +67 -0
- package/packages/arcgis-rest-portal/src/items/create.ts +150 -0
- package/packages/arcgis-rest-portal/src/items/export.ts +80 -0
- package/packages/arcgis-rest-portal/src/items/get.ts +437 -0
- package/packages/arcgis-rest-portal/src/items/helpers.ts +275 -0
- package/packages/arcgis-rest-portal/src/items/protect.ts +41 -0
- package/packages/arcgis-rest-portal/src/items/reassign.ts +61 -0
- package/packages/arcgis-rest-portal/src/items/remove.ts +135 -0
- package/packages/arcgis-rest-portal/src/items/search.ts +25 -0
- package/packages/arcgis-rest-portal/src/items/update.ts +184 -0
- package/packages/arcgis-rest-portal/src/items/upload.ts +125 -0
- package/packages/arcgis-rest-portal/src/orgs/notification.ts +131 -0
- package/packages/arcgis-rest-portal/src/sharing/access.ts +84 -0
- package/packages/arcgis-rest-portal/src/sharing/helpers.ts +81 -0
- package/packages/arcgis-rest-portal/src/sharing/is-item-shared-with-group.ts +42 -0
- package/packages/arcgis-rest-portal/src/sharing/share-item-with-group.ts +319 -0
- package/packages/arcgis-rest-portal/src/sharing/unshare-item-with-group.ts +105 -0
- package/packages/arcgis-rest-portal/src/users/get-user-tags.ts +52 -0
- package/packages/arcgis-rest-portal/src/users/get-user-url.ts +18 -0
- package/packages/arcgis-rest-portal/src/users/get-user.ts +58 -0
- package/packages/arcgis-rest-portal/src/users/invitation.ts +156 -0
- package/packages/arcgis-rest-portal/src/users/notification.ts +68 -0
- package/packages/arcgis-rest-portal/src/users/search-users.ts +37 -0
- package/packages/arcgis-rest-portal/src/users/update.ts +66 -0
- package/packages/arcgis-rest-portal/src/util/SearchQueryBuilder.ts +374 -0
- package/packages/arcgis-rest-portal/src/util/array.ts +16 -0
- package/packages/arcgis-rest-portal/src/util/generic-search.ts +99 -0
- package/packages/arcgis-rest-portal/src/util/get-portal-settings.ts +45 -0
- package/packages/arcgis-rest-portal/src/util/get-portal-url.ts +27 -0
- package/packages/arcgis-rest-portal/src/util/get-portal.ts +52 -0
- package/packages/arcgis-rest-portal/src/util/get-subscription-info.ts +43 -0
- package/packages/arcgis-rest-portal/src/util/scrub-control-chars.ts +12 -0
- package/packages/arcgis-rest-portal/src/util/search.ts +42 -0
- package/packages/arcgis-rest-portal/test/groups/add-users.test.ts +239 -0
- package/packages/arcgis-rest-portal/test/groups/crud.test.ts +180 -0
- package/packages/arcgis-rest-portal/test/groups/get.test.ts +176 -0
- package/packages/arcgis-rest-portal/test/groups/invite-users.test.ts +149 -0
- package/packages/arcgis-rest-portal/test/groups/join.test.ts +72 -0
- package/packages/arcgis-rest-portal/test/groups/notification.test.ts +112 -0
- package/packages/arcgis-rest-portal/test/groups/protect.test.ts +72 -0
- package/packages/arcgis-rest-portal/test/groups/remove-users.test.ts +140 -0
- package/packages/arcgis-rest-portal/test/groups/search.test.ts +151 -0
- package/packages/arcgis-rest-portal/test/groups/update-user-membership.test.ts +62 -0
- package/packages/arcgis-rest-portal/test/items/add.test.ts +323 -0
- package/packages/arcgis-rest-portal/test/items/content.test.ts +156 -0
- package/packages/arcgis-rest-portal/test/items/create.test.ts +399 -0
- package/packages/arcgis-rest-portal/test/items/export.test.ts +122 -0
- package/packages/arcgis-rest-portal/test/items/get.test.ts +583 -0
- package/packages/arcgis-rest-portal/test/items/helpers.test.ts +60 -0
- package/packages/arcgis-rest-portal/test/items/protect.test.ts +122 -0
- package/packages/arcgis-rest-portal/test/items/reassign.test.ts +131 -0
- package/packages/arcgis-rest-portal/test/items/remove.test.ts +238 -0
- package/packages/arcgis-rest-portal/test/items/search.test.ts +272 -0
- package/packages/arcgis-rest-portal/test/items/update.test.ts +554 -0
- package/packages/arcgis-rest-portal/test/items/upload.test.ts +282 -0
- package/packages/arcgis-rest-portal/test/mocks/groups/responses.ts +208 -0
- package/packages/arcgis-rest-portal/test/mocks/items/foo.zip +0 -0
- package/packages/arcgis-rest-portal/test/mocks/items/item.ts +526 -0
- package/packages/arcgis-rest-portal/test/mocks/items/resources.ts +38 -0
- package/packages/arcgis-rest-portal/test/mocks/items/search.ts +121 -0
- package/packages/arcgis-rest-portal/test/mocks/portal/response.ts +126 -0
- package/packages/arcgis-rest-portal/test/mocks/portal/settings-response.ts +56 -0
- package/packages/arcgis-rest-portal/test/mocks/sharing/sharing.ts +18 -0
- package/packages/arcgis-rest-portal/test/mocks/users/invitation.ts +70 -0
- package/packages/arcgis-rest-portal/test/mocks/users/notification.ts +34 -0
- package/packages/arcgis-rest-portal/test/mocks/users/user-search.ts +388 -0
- package/packages/arcgis-rest-portal/test/mocks/users/user-tags.ts +5 -0
- package/packages/arcgis-rest-portal/test/mocks/users/user.ts +174 -0
- package/packages/arcgis-rest-portal/test/orgs/notification.test.ts +142 -0
- package/packages/arcgis-rest-portal/test/sharing/access.test.ts +162 -0
- package/packages/arcgis-rest-portal/test/sharing/helpers.test.ts +55 -0
- package/packages/arcgis-rest-portal/test/sharing/share-item-with-group.test.ts +1325 -0
- package/packages/arcgis-rest-portal/test/sharing/unshare-item-with-group.test.ts +288 -0
- package/packages/arcgis-rest-portal/test/users/get-user-tags.test.ts +71 -0
- package/packages/arcgis-rest-portal/test/users/get-user-url.test.ts +40 -0
- package/packages/arcgis-rest-portal/test/users/get-user.test.ts +90 -0
- package/packages/arcgis-rest-portal/test/users/invitation.test.ts +127 -0
- package/packages/arcgis-rest-portal/test/users/notification.test.ts +77 -0
- package/packages/arcgis-rest-portal/test/users/search.test.ts +42 -0
- package/packages/arcgis-rest-portal/test/users/update.test.ts +151 -0
- package/packages/arcgis-rest-portal/test/util/SearchQueryBuilder.test.ts +340 -0
- package/packages/arcgis-rest-portal/test/util/array.test.ts +30 -0
- package/packages/arcgis-rest-portal/test/util/get-portal-settings.test.ts +68 -0
- package/packages/arcgis-rest-portal/test/util/get-portal-url.test.ts +37 -0
- package/packages/arcgis-rest-portal/test/util/portal.test.ts +148 -0
- package/packages/arcgis-rest-portal/test/util/scrub-control-chars.test.ts +22 -0
- package/packages/arcgis-rest-portal/tsconfig.json +6 -0
- package/packages/arcgis-rest-request/README.md +72 -0
- package/packages/arcgis-rest-request/package-lock.json +11 -0
- package/packages/arcgis-rest-request/package.json +60 -0
- package/packages/arcgis-rest-request/src/index.ts +25 -0
- package/packages/arcgis-rest-request/src/request.ts +413 -0
- package/packages/arcgis-rest-request/src/utils/ArcGISRequestError.ts +76 -0
- package/packages/arcgis-rest-request/src/utils/ErrorTypes.ts +29 -0
- package/packages/arcgis-rest-request/src/utils/GrantTypes.ts +5 -0
- package/packages/arcgis-rest-request/src/utils/HTTPMethods.ts +6 -0
- package/packages/arcgis-rest-request/src/utils/IAuthenticationManager.ts +21 -0
- package/packages/arcgis-rest-request/src/utils/IFetchTokenParams.ts +11 -0
- package/packages/arcgis-rest-request/src/utils/IGenerateTokenParams.ts +9 -0
- package/packages/arcgis-rest-request/src/utils/IParamBuilder.ts +3 -0
- package/packages/arcgis-rest-request/src/utils/IParams.ts +6 -0
- package/packages/arcgis-rest-request/src/utils/IParamsBuilder.ts +5 -0
- package/packages/arcgis-rest-request/src/utils/IRequestOptions.ts +49 -0
- package/packages/arcgis-rest-request/src/utils/ITokenRequestOptions.ts +9 -0
- package/packages/arcgis-rest-request/src/utils/ResponseFormats.ts +10 -0
- package/packages/arcgis-rest-request/src/utils/append-custom-params.ts +49 -0
- package/packages/arcgis-rest-request/src/utils/clean-url.ts +20 -0
- package/packages/arcgis-rest-request/src/utils/decode-query-string.ts +27 -0
- package/packages/arcgis-rest-request/src/utils/encode-form-data.ts +38 -0
- package/packages/arcgis-rest-request/src/utils/encode-query-string.ts +35 -0
- package/packages/arcgis-rest-request/src/utils/process-params.ts +108 -0
- package/packages/arcgis-rest-request/src/utils/retryAuthError.ts +10 -0
- package/packages/arcgis-rest-request/src/utils/warn.ts +11 -0
- package/packages/arcgis-rest-request/src/utils/with-options.ts +48 -0
- package/packages/arcgis-rest-request/test/mocks/errors.ts +76 -0
- package/packages/arcgis-rest-request/test/mocks/geojson-feature-collection.ts +13 -0
- package/packages/arcgis-rest-request/test/mocks/param-builder.ts +7 -0
- package/packages/arcgis-rest-request/test/mocks/sharing-rest-info.ts +41 -0
- package/packages/arcgis-rest-request/test/mocks/webmap.ts +41 -0
- package/packages/arcgis-rest-request/test/request.test.ts +571 -0
- package/packages/arcgis-rest-request/test/utils/ArcGISAuthError.test.ts +191 -0
- package/packages/arcgis-rest-request/test/utils/ArcGISRequestError.test.ts +51 -0
- package/packages/arcgis-rest-request/test/utils/check-for-errors.test.ts +111 -0
- package/packages/arcgis-rest-request/test/utils/clean-url.test.ts +50 -0
- package/packages/arcgis-rest-request/test/utils/encode-form-data.test.ts +133 -0
- package/packages/arcgis-rest-request/test/utils/encode-query-string.test.ts +18 -0
- package/packages/arcgis-rest-request/test/utils/process-params.test.ts +205 -0
- package/packages/arcgis-rest-request/test/utils/with-options.test.ts +133 -0
- package/packages/arcgis-rest-request/tsconfig.json +4 -0
- package/packages/arcgis-rest-routing/README.md +75 -0
- package/packages/arcgis-rest-routing/package-lock.json +11 -0
- package/packages/arcgis-rest-routing/package.json +63 -0
- package/packages/arcgis-rest-routing/src/helpers.ts +16 -0
- package/packages/arcgis-rest-routing/src/index.ts +11 -0
- package/packages/arcgis-rest-routing/src/solveRoute.ts +124 -0
- package/packages/arcgis-rest-routing/test/mocks/responses.ts +825 -0
- package/packages/arcgis-rest-routing/test/solveRoute.test.ts +509 -0
- package/packages/arcgis-rest-routing/tsconfig.json +6 -0
- package/packages/arcgis-rest-service-admin/README.md +73 -0
- package/packages/arcgis-rest-service-admin/package-lock.json +11 -0
- package/packages/arcgis-rest-service-admin/package.json +65 -0
- package/packages/arcgis-rest-service-admin/src/addTo.ts +70 -0
- package/packages/arcgis-rest-service-admin/src/create.ts +189 -0
- package/packages/arcgis-rest-service-admin/src/index.ts +11 -0
- package/packages/arcgis-rest-service-admin/src/update.ts +50 -0
- package/packages/arcgis-rest-service-admin/test/addTo.test.ts +350 -0
- package/packages/arcgis-rest-service-admin/test/create.test.ts +294 -0
- package/packages/arcgis-rest-service-admin/test/mocks/layerDefinition.ts +79 -0
- package/packages/arcgis-rest-service-admin/test/mocks/service.ts +81 -0
- package/packages/arcgis-rest-service-admin/test/update.test.ts +115 -0
- package/packages/arcgis-rest-service-admin/tsconfig.json +6 -0
- package/packages/arcgis-rest-types/README.md +66 -0
- package/packages/arcgis-rest-types/package.json +54 -0
- package/packages/arcgis-rest-types/src/feature.ts +39 -0
- package/packages/arcgis-rest-types/src/geometry.ts +272 -0
- package/packages/arcgis-rest-types/src/group.ts +72 -0
- package/packages/arcgis-rest-types/src/index.ts +9 -0
- package/packages/arcgis-rest-types/src/item.ts +81 -0
- package/packages/arcgis-rest-types/src/service.ts +114 -0
- package/packages/arcgis-rest-types/src/statisticDefinition.ts +33 -0
- package/packages/arcgis-rest-types/src/symbol.ts +170 -0
- package/packages/arcgis-rest-types/src/user.ts +49 -0
- package/packages/arcgis-rest-types/src/webmap.ts +1367 -0
- package/packages/arcgis-rest-types/tsconfig.json +10 -0
- package/support/changelog.js +393 -0
- package/support/deploy-doc-site.js +16 -0
- package/support/dev.sh +6 -0
- package/support/publish.sh +47 -0
- package/support/test-helpers.js +9 -0
- package/tsconfig.json +63 -0
- package/tslint.json +16 -0
- package/umd-base-profile.js +81 -0
- package/umd-production-profile.js +13 -0
@@ -0,0 +1,84 @@
|
|
1
|
+
/* Copyright (c) 2018 Environmental Systems Research Institute, Inc.
|
2
|
+
* Apache-2.0 */
|
3
|
+
|
4
|
+
import { request } from "@esri/arcgis-rest-request";
|
5
|
+
|
6
|
+
import {
|
7
|
+
ISharingOptions,
|
8
|
+
ISharingResponse,
|
9
|
+
isItemOwner,
|
10
|
+
getSharingUrl,
|
11
|
+
isOrgAdmin
|
12
|
+
} from "./helpers";
|
13
|
+
|
14
|
+
export interface ISetAccessOptions extends ISharingOptions {
|
15
|
+
/**
|
16
|
+
* "private" indicates that the item can only be accessed by the user. "public" means accessible to anyone. An item shared to the organization has an access level of "org".
|
17
|
+
*/
|
18
|
+
access: "private" | "org" | "public";
|
19
|
+
}
|
20
|
+
|
21
|
+
/**
|
22
|
+
* ```js
|
23
|
+
* import { setItemAccess } from "@esri/arcgis-rest-portal";
|
24
|
+
* //
|
25
|
+
* setItemAccess({
|
26
|
+
* id: "abc123",
|
27
|
+
* access: "public", // 'org' || 'private'
|
28
|
+
* authentication: session
|
29
|
+
* })
|
30
|
+
* ```
|
31
|
+
* Change who is able to access an item.
|
32
|
+
*
|
33
|
+
* @param requestOptions - Options for the request.
|
34
|
+
* @returns A Promise that will resolve with the data from the response.
|
35
|
+
*/
|
36
|
+
export function setItemAccess(
|
37
|
+
requestOptions: ISetAccessOptions
|
38
|
+
): Promise<ISharingResponse> {
|
39
|
+
const url = getSharingUrl(requestOptions);
|
40
|
+
|
41
|
+
if (isItemOwner(requestOptions)) {
|
42
|
+
// if the user owns the item, proceed
|
43
|
+
return updateItemAccess(url, requestOptions);
|
44
|
+
} else {
|
45
|
+
// otherwise we need to check to see if they are an organization admin
|
46
|
+
return isOrgAdmin(requestOptions).then(admin => {
|
47
|
+
if (admin) {
|
48
|
+
return updateItemAccess(url, requestOptions);
|
49
|
+
} else {
|
50
|
+
// if neither, updating the sharing isnt possible
|
51
|
+
throw Error(
|
52
|
+
`This item can not be shared by ${requestOptions.authentication.username}. They are neither the item owner nor an organization admin.`
|
53
|
+
);
|
54
|
+
}
|
55
|
+
});
|
56
|
+
}
|
57
|
+
}
|
58
|
+
|
59
|
+
function updateItemAccess(
|
60
|
+
url: string,
|
61
|
+
requestOptions: ISetAccessOptions
|
62
|
+
): Promise<any> {
|
63
|
+
requestOptions.params = {
|
64
|
+
org: false,
|
65
|
+
everyone: false,
|
66
|
+
...requestOptions.params
|
67
|
+
};
|
68
|
+
|
69
|
+
// if the user wants to make the item private, it needs to be unshared from any/all groups as well
|
70
|
+
if (requestOptions.access === "private") {
|
71
|
+
requestOptions.params.groups = " ";
|
72
|
+
}
|
73
|
+
if (requestOptions.access === "org") {
|
74
|
+
requestOptions.params.org = true;
|
75
|
+
}
|
76
|
+
// if sharing with everyone, share with the entire organization as well.
|
77
|
+
if (requestOptions.access === "public") {
|
78
|
+
// this is how the ArcGIS Online Home app sets public access
|
79
|
+
// setting org = true instead of account = true will cancel out all sharing
|
80
|
+
requestOptions.params.account = true;
|
81
|
+
requestOptions.params.everyone = true;
|
82
|
+
}
|
83
|
+
return request(url, requestOptions);
|
84
|
+
}
|
@@ -0,0 +1,81 @@
|
|
1
|
+
/* Copyright (c) 2018 Environmental Systems Research Institute, Inc.
|
2
|
+
* Apache-2.0 */
|
3
|
+
|
4
|
+
import { IGroup, IUser, GroupMembership } from "@esri/arcgis-rest-types";
|
5
|
+
import { IUserRequestOptions } from "@esri/arcgis-rest-auth";
|
6
|
+
import { getPortalUrl } from "../util/get-portal-url";
|
7
|
+
import { getGroup } from "../groups/get";
|
8
|
+
|
9
|
+
export interface ISharingOptions extends IUserRequestOptions {
|
10
|
+
/**
|
11
|
+
* Unique identifier for the item.
|
12
|
+
*/
|
13
|
+
id: string;
|
14
|
+
/**
|
15
|
+
* Item owner, if different from the authenticated user.
|
16
|
+
*/
|
17
|
+
owner?: string;
|
18
|
+
}
|
19
|
+
|
20
|
+
export interface ISharingResponse {
|
21
|
+
notSharedWith?: string[];
|
22
|
+
notUnsharedFrom?: string[];
|
23
|
+
itemId: string;
|
24
|
+
}
|
25
|
+
|
26
|
+
export function getSharingUrl(requestOptions: ISharingOptions): string {
|
27
|
+
const username = requestOptions.authentication.username;
|
28
|
+
const owner = requestOptions.owner || username;
|
29
|
+
return `${getPortalUrl(requestOptions)}/content/users/${encodeURIComponent(
|
30
|
+
owner
|
31
|
+
)}/items/${requestOptions.id}/share`;
|
32
|
+
}
|
33
|
+
|
34
|
+
export function isItemOwner(requestOptions: ISharingOptions): boolean {
|
35
|
+
const username = requestOptions.authentication.username;
|
36
|
+
const owner = requestOptions.owner || username;
|
37
|
+
return owner === username;
|
38
|
+
}
|
39
|
+
|
40
|
+
/**
|
41
|
+
* Check it the user is a full org_admin
|
42
|
+
* @param requestOptions
|
43
|
+
* @returns Promise resolving in a boolean indicating if the user is an ArcGIS Organization administrator
|
44
|
+
*/
|
45
|
+
export function isOrgAdmin(
|
46
|
+
requestOptions: IUserRequestOptions
|
47
|
+
): Promise<boolean> {
|
48
|
+
const session = requestOptions.authentication;
|
49
|
+
|
50
|
+
return session.getUser(requestOptions).then((user: IUser) => {
|
51
|
+
return user && user.role === "org_admin" && !user.roleId;
|
52
|
+
});
|
53
|
+
}
|
54
|
+
|
55
|
+
/**
|
56
|
+
* Get the User Membership for a particular group. Use this if all you have is the groupId.
|
57
|
+
* If you have the group object, check the `userMembership.memberType` property instead of calling this method.
|
58
|
+
*
|
59
|
+
* @param requestOptions
|
60
|
+
* @returns A Promise that resolves with "owner" | "admin" | "member" | "nonmember"
|
61
|
+
*/
|
62
|
+
export function getUserMembership(
|
63
|
+
requestOptions: IGroupSharingOptions
|
64
|
+
): Promise<GroupMembership> {
|
65
|
+
// fetch the group...
|
66
|
+
return getGroup(requestOptions.groupId, requestOptions)
|
67
|
+
.then((group: IGroup) => {
|
68
|
+
return group.userMembership.memberType;
|
69
|
+
})
|
70
|
+
.catch(() => {
|
71
|
+
return "none" as GroupMembership;
|
72
|
+
});
|
73
|
+
}
|
74
|
+
|
75
|
+
export interface IGroupSharingOptions extends ISharingOptions {
|
76
|
+
/**
|
77
|
+
* Group identifier
|
78
|
+
*/
|
79
|
+
groupId: string;
|
80
|
+
confirmItemControl?: boolean;
|
81
|
+
}
|
@@ -0,0 +1,42 @@
|
|
1
|
+
import { IGroupSharingOptions } from "./helpers";
|
2
|
+
import { searchItems } from "../items/search";
|
3
|
+
import { ISearchOptions } from "../util/search";
|
4
|
+
|
5
|
+
/**
|
6
|
+
* ```js
|
7
|
+
* import { isItemSharedWithGroup } from "@esri/arcgis-rest-portal";
|
8
|
+
* //
|
9
|
+
* isItemSharedWithGroup({
|
10
|
+
* groupId: 'bc3,
|
11
|
+
* itemId: 'f56,
|
12
|
+
* authentication
|
13
|
+
* })
|
14
|
+
* .then(isShared => {})
|
15
|
+
* ```
|
16
|
+
* Find out whether or not an item is already shared with a group.
|
17
|
+
*
|
18
|
+
* @param requestOptions - Options for the request. NOTE: `rawResponse` is not supported by this operation.
|
19
|
+
* @returns Promise that will resolve with true/false
|
20
|
+
*/
|
21
|
+
export function isItemSharedWithGroup(
|
22
|
+
requestOptions: IGroupSharingOptions
|
23
|
+
): Promise<boolean> {
|
24
|
+
const searchOpts = {
|
25
|
+
q: `id: ${requestOptions.id} AND group: ${requestOptions.groupId}`,
|
26
|
+
start: 1,
|
27
|
+
num: 10,
|
28
|
+
sortField: "title",
|
29
|
+
authentication: requestOptions.authentication,
|
30
|
+
httpMethod: "POST"
|
31
|
+
} as ISearchOptions;
|
32
|
+
|
33
|
+
return searchItems(searchOpts).then(searchResponse => {
|
34
|
+
let result = false;
|
35
|
+
if (searchResponse.total > 0) {
|
36
|
+
result = searchResponse.results.some((itm: any) => {
|
37
|
+
return itm.id === requestOptions.id;
|
38
|
+
});
|
39
|
+
return result;
|
40
|
+
}
|
41
|
+
});
|
42
|
+
}
|
@@ -0,0 +1,319 @@
|
|
1
|
+
import { request } from "@esri/arcgis-rest-request";
|
2
|
+
import { IUser } from "@esri/arcgis-rest-types";
|
3
|
+
import { getPortalUrl } from "../util/get-portal-url";
|
4
|
+
import {
|
5
|
+
IGroupSharingOptions,
|
6
|
+
ISharingResponse,
|
7
|
+
getUserMembership
|
8
|
+
} from "./helpers";
|
9
|
+
import { getUser } from "../users/get-user";
|
10
|
+
import { addGroupUsers, IAddGroupUsersResult } from "../groups/add-users";
|
11
|
+
import { removeGroupUsers } from "../groups/remove-users";
|
12
|
+
import { updateUserMemberships, IUpdateGroupUsersResult } from "../groups/update-user-membership";
|
13
|
+
import { isItemSharedWithGroup } from "../sharing/is-item-shared-with-group";
|
14
|
+
|
15
|
+
interface IEnsureMembershipResult {
|
16
|
+
promise: Promise<IAddGroupUsersResult>,
|
17
|
+
revert: (sharingResults: ISharingResponse) => Promise<ISharingResponse>
|
18
|
+
}
|
19
|
+
|
20
|
+
/**
|
21
|
+
* ```js
|
22
|
+
* import { shareItemWithGroup } from '@esri/arcgis-rest-portal';
|
23
|
+
* //
|
24
|
+
* shareItemWithGroup({
|
25
|
+
* id: "abc123",
|
26
|
+
* groupId: "xyz987",
|
27
|
+
* owner: "some-owner",
|
28
|
+
* authentication
|
29
|
+
* })
|
30
|
+
* ```
|
31
|
+
* Share an item with a group, either as an
|
32
|
+
* [item owner](https://developers.arcgis.com/rest/users-groups-and-items/share-item-as-item-owner-.htm),
|
33
|
+
* [group admin](https://developers.arcgis.com/rest/users-groups-and-items/share-item-as-group-admin-.htm) or
|
34
|
+
* organization admin.
|
35
|
+
*
|
36
|
+
* @param requestOptions - Options for the request.
|
37
|
+
* @returns A Promise that will resolve with the data from the response.
|
38
|
+
*/
|
39
|
+
export function shareItemWithGroup (
|
40
|
+
requestOptions: IGroupSharingOptions
|
41
|
+
): Promise<ISharingResponse> {
|
42
|
+
return isItemSharedWithGroup(requestOptions)
|
43
|
+
.then((isShared) => {
|
44
|
+
if (isShared) {
|
45
|
+
// already shared, exit early with success response
|
46
|
+
return {
|
47
|
+
itemId: requestOptions.id,
|
48
|
+
shortcut: true,
|
49
|
+
notSharedWith: []
|
50
|
+
} as ISharingResponse;
|
51
|
+
}
|
52
|
+
|
53
|
+
const {
|
54
|
+
authentication: { username },
|
55
|
+
owner,
|
56
|
+
confirmItemControl
|
57
|
+
} = requestOptions;
|
58
|
+
const itemOwner = owner || username;
|
59
|
+
|
60
|
+
// non-item owner
|
61
|
+
if (itemOwner !== username) {
|
62
|
+
// next perform any necessary membership adjustments for
|
63
|
+
// current user and/or item owner
|
64
|
+
return Promise.all([
|
65
|
+
getUser({
|
66
|
+
username,
|
67
|
+
authentication: requestOptions.authentication
|
68
|
+
}),
|
69
|
+
getUser({
|
70
|
+
username: itemOwner,
|
71
|
+
authentication: requestOptions.authentication
|
72
|
+
}),
|
73
|
+
getUserMembership(requestOptions)
|
74
|
+
])
|
75
|
+
.then(([currentUser, ownerUser, membership]) => {
|
76
|
+
const isSharedEditingGroup = !!confirmItemControl;
|
77
|
+
const isAdmin = currentUser.role === "org_admin" && !currentUser.roleId;
|
78
|
+
return getMembershipAdjustments(
|
79
|
+
currentUser,
|
80
|
+
isSharedEditingGroup,
|
81
|
+
membership,
|
82
|
+
isAdmin,
|
83
|
+
ownerUser,
|
84
|
+
requestOptions
|
85
|
+
);
|
86
|
+
})
|
87
|
+
.then(membershipAdjustments => {
|
88
|
+
const [
|
89
|
+
{ revert } = {
|
90
|
+
promise: Promise.resolve({ notAdded: [] }),
|
91
|
+
revert: (sharingResults: ISharingResponse) => {
|
92
|
+
return Promise.resolve(sharingResults);
|
93
|
+
}
|
94
|
+
} as IEnsureMembershipResult
|
95
|
+
] = membershipAdjustments;
|
96
|
+
// perform all membership adjustments
|
97
|
+
return Promise.all(membershipAdjustments.map(({ promise }) => promise))
|
98
|
+
.then(() => {
|
99
|
+
// then attempt the share
|
100
|
+
return shareToGroup(requestOptions);
|
101
|
+
})
|
102
|
+
.then(sharingResults => {
|
103
|
+
// lastly, if the admin user was added to the group,
|
104
|
+
// remove them from the group. this is a no-op that
|
105
|
+
// immediately resolves the sharingResults when no
|
106
|
+
// membership adjustment was needed
|
107
|
+
return revert(sharingResults);
|
108
|
+
});
|
109
|
+
});
|
110
|
+
}
|
111
|
+
|
112
|
+
// item owner, let it call through
|
113
|
+
return shareToGroup(requestOptions);
|
114
|
+
})
|
115
|
+
.then(sharingResponse => {
|
116
|
+
if (sharingResponse.notSharedWith.length) {
|
117
|
+
throw Error(
|
118
|
+
`Item ${requestOptions.id} could not be shared to group ${requestOptions.groupId}.`
|
119
|
+
);
|
120
|
+
} else {
|
121
|
+
// all is well
|
122
|
+
return sharingResponse;
|
123
|
+
}
|
124
|
+
});
|
125
|
+
}
|
126
|
+
|
127
|
+
function getMembershipAdjustments (
|
128
|
+
currentUser: IUser,
|
129
|
+
isSharedEditingGroup: boolean,
|
130
|
+
membership: string,
|
131
|
+
isAdmin: boolean,
|
132
|
+
ownerUser: IUser,
|
133
|
+
requestOptions: IGroupSharingOptions
|
134
|
+
) {
|
135
|
+
const membershipGuarantees = [];
|
136
|
+
if (requestOptions.groupId !== currentUser.favGroupId) {
|
137
|
+
if (isSharedEditingGroup) {
|
138
|
+
if (!isAdmin) {
|
139
|
+
// abort and reject promise
|
140
|
+
throw Error(`This item can not be shared to shared editing group ${requestOptions.groupId} by ${currentUser.username} as they not the item owner or org admin.`);
|
141
|
+
}
|
142
|
+
|
143
|
+
membershipGuarantees.push(
|
144
|
+
// admin user must be a group member to share, should be reverted afterwards
|
145
|
+
ensureMembership(
|
146
|
+
currentUser,
|
147
|
+
currentUser,
|
148
|
+
false,
|
149
|
+
`Error adding ${currentUser.username} as member to edit group ${requestOptions.groupId}. Consequently item ${requestOptions.id} was not shared to the group.`,
|
150
|
+
requestOptions
|
151
|
+
),
|
152
|
+
// item owner must be a group admin
|
153
|
+
ensureMembership(
|
154
|
+
currentUser,
|
155
|
+
ownerUser,
|
156
|
+
true,
|
157
|
+
membership === "none"
|
158
|
+
? `Error adding user ${ownerUser.username} to edit group ${requestOptions.groupId}. Consequently item ${requestOptions.id} was not shared to the group.`
|
159
|
+
: `Error promoting user ${ownerUser.username} to admin in edit group ${requestOptions.groupId}. Consequently item ${requestOptions.id} was not shared to the group.`,
|
160
|
+
requestOptions
|
161
|
+
)
|
162
|
+
);
|
163
|
+
} else if (isAdmin) {
|
164
|
+
// admin user must be a group member to share, should be reverted afterwards
|
165
|
+
membershipGuarantees.push(
|
166
|
+
ensureMembership(
|
167
|
+
currentUser,
|
168
|
+
currentUser,
|
169
|
+
false,
|
170
|
+
`Error adding ${currentUser.username} as member to view group ${requestOptions.groupId}. Consequently item ${requestOptions.id} was not shared to the group.`,
|
171
|
+
requestOptions
|
172
|
+
)
|
173
|
+
);
|
174
|
+
} else if (membership === "none") {
|
175
|
+
// all other non-item owners must be a group member
|
176
|
+
throw new Error(`This item can not be shared by ${currentUser.username} as they are not a member of the specified group ${requestOptions.groupId}.`);
|
177
|
+
}
|
178
|
+
}
|
179
|
+
|
180
|
+
return membershipGuarantees;
|
181
|
+
}
|
182
|
+
|
183
|
+
function shareToGroup (
|
184
|
+
requestOptions: IGroupSharingOptions
|
185
|
+
): Promise<ISharingResponse> {
|
186
|
+
const username = requestOptions.authentication.username;
|
187
|
+
const itemOwner = requestOptions.owner || username;
|
188
|
+
// decide what url to use
|
189
|
+
// default to the non-owner url...
|
190
|
+
let url = `${getPortalUrl(requestOptions)}/content/items/${requestOptions.id}/share`;
|
191
|
+
|
192
|
+
// but if they are the owner, we use a different path...
|
193
|
+
if (itemOwner === username) {
|
194
|
+
url = `${getPortalUrl(requestOptions)}/content/users/${itemOwner}/items/${requestOptions.id}/share`;
|
195
|
+
}
|
196
|
+
|
197
|
+
// now its finally time to do the sharing
|
198
|
+
requestOptions.params = {
|
199
|
+
groups: requestOptions.groupId,
|
200
|
+
confirmItemControl: requestOptions.confirmItemControl
|
201
|
+
};
|
202
|
+
|
203
|
+
return request(url, requestOptions);
|
204
|
+
}
|
205
|
+
|
206
|
+
export function ensureMembership (
|
207
|
+
currentUser: IUser,
|
208
|
+
ownerUser: IUser,
|
209
|
+
shouldPromote: boolean,
|
210
|
+
errorMessage: string,
|
211
|
+
requestOptions: IGroupSharingOptions
|
212
|
+
): IEnsureMembershipResult {
|
213
|
+
const ownerGroups = ownerUser.groups || [];
|
214
|
+
const group = ownerGroups.find(g => {
|
215
|
+
return g.id === requestOptions.groupId;
|
216
|
+
});
|
217
|
+
|
218
|
+
// if they are in different orgs, eject
|
219
|
+
if (currentUser.orgId !== ownerUser.orgId) {
|
220
|
+
throw Error(
|
221
|
+
`User ${ownerUser.username} is not a member of the same org as ${currentUser.username}. Consequently they can not be added added to group ${requestOptions.groupId} nor can item ${requestOptions.id} be shared to the group.`
|
222
|
+
);
|
223
|
+
}
|
224
|
+
|
225
|
+
// if owner is not a member, and has 512 groups
|
226
|
+
if (!group && ownerGroups.length > 511) {
|
227
|
+
throw Error(
|
228
|
+
`User ${ownerUser.username} already has 512 groups, and can not be added to group ${requestOptions.groupId}. Consequently item ${requestOptions.id} can not be shared to the group.`
|
229
|
+
);
|
230
|
+
}
|
231
|
+
|
232
|
+
let promise: Promise<IAddGroupUsersResult>;
|
233
|
+
let revert: (sharingResults: ISharingResponse) => Promise<ISharingResponse>;
|
234
|
+
|
235
|
+
// decide if we need to add them or upgrade them
|
236
|
+
if (group) {
|
237
|
+
// they are in the group...
|
238
|
+
// check member type
|
239
|
+
if (shouldPromote && group.userMembership.memberType === "member") {
|
240
|
+
// promote them
|
241
|
+
promise = updateUserMemberships({
|
242
|
+
id: requestOptions.groupId,
|
243
|
+
users: [ownerUser.username],
|
244
|
+
newMemberType: "admin",
|
245
|
+
authentication: requestOptions.authentication
|
246
|
+
})
|
247
|
+
.then((results: IUpdateGroupUsersResult) => {
|
248
|
+
// convert the result into the right type
|
249
|
+
const notAdded = results.results.reduce(
|
250
|
+
(acc: any[], entry: any) => {
|
251
|
+
if (!entry.success) {
|
252
|
+
acc.push(entry.username);
|
253
|
+
}
|
254
|
+
return acc;
|
255
|
+
},
|
256
|
+
[]
|
257
|
+
);
|
258
|
+
// and return it
|
259
|
+
return Promise.resolve({ notAdded });
|
260
|
+
})
|
261
|
+
.catch(() => ({ notAdded: [ownerUser.username] }));
|
262
|
+
revert = (sharingResults) => updateUserMemberships({
|
263
|
+
id: requestOptions.groupId,
|
264
|
+
users: [ownerUser.username],
|
265
|
+
newMemberType: "member",
|
266
|
+
authentication: requestOptions.authentication
|
267
|
+
})
|
268
|
+
.then(() => sharingResults)
|
269
|
+
.catch(() => sharingResults);
|
270
|
+
} else {
|
271
|
+
// they are already an admin in the group
|
272
|
+
// return the same response the API would if we added them
|
273
|
+
promise = Promise.resolve({ notAdded: [] });
|
274
|
+
revert = sharingResults => Promise.resolve(sharingResults);
|
275
|
+
}
|
276
|
+
} else {
|
277
|
+
// attempt to add user to group
|
278
|
+
const userType = shouldPromote ? "admins" : "users";
|
279
|
+
// can't currently determine if the group is within the admin's
|
280
|
+
// org without performing a search, so attempt to add and handle
|
281
|
+
// the api error
|
282
|
+
promise = addGroupUsers({
|
283
|
+
id: requestOptions.groupId,
|
284
|
+
[userType]: [ownerUser.username],
|
285
|
+
authentication: requestOptions.authentication
|
286
|
+
})
|
287
|
+
.then(results => {
|
288
|
+
// results.errors includes an ArcGISAuthError when the group
|
289
|
+
// is in a different org, but notAdded is empty, throw here
|
290
|
+
// to normalize the results in below catch
|
291
|
+
if (results.errors && results.errors.length) {
|
292
|
+
throw results.errors[0];
|
293
|
+
}
|
294
|
+
return results;
|
295
|
+
})
|
296
|
+
.catch(() => ({ notAdded: [ownerUser.username] }));
|
297
|
+
revert = (sharingResults) => {
|
298
|
+
return removeGroupUsers({
|
299
|
+
id: requestOptions.groupId,
|
300
|
+
users: [ownerUser.username],
|
301
|
+
authentication: requestOptions.authentication
|
302
|
+
})
|
303
|
+
.then(() => {
|
304
|
+
// always resolves, suppress any resolved errors
|
305
|
+
return sharingResults;
|
306
|
+
});
|
307
|
+
};
|
308
|
+
}
|
309
|
+
|
310
|
+
return {
|
311
|
+
promise: promise.then(membershipResponse => {
|
312
|
+
if (membershipResponse.notAdded.length) {
|
313
|
+
throw new Error(errorMessage);
|
314
|
+
}
|
315
|
+
return membershipResponse;
|
316
|
+
}),
|
317
|
+
revert
|
318
|
+
};
|
319
|
+
};
|
@@ -0,0 +1,105 @@
|
|
1
|
+
import { request } from "@esri/arcgis-rest-request";
|
2
|
+
import { getPortalUrl } from "../util/get-portal-url";
|
3
|
+
import {
|
4
|
+
IGroupSharingOptions,
|
5
|
+
ISharingResponse,
|
6
|
+
getUserMembership
|
7
|
+
} from "./helpers";
|
8
|
+
import { isItemSharedWithGroup } from "./is-item-shared-with-group";
|
9
|
+
import { getUser } from "../users/get-user";
|
10
|
+
|
11
|
+
/**
|
12
|
+
* Stop sharing an item with a group, either as an
|
13
|
+
* [item owner](https://developers.arcgis.com/rest/users-groups-and-items/unshare-item-as-item-owner-.htm),
|
14
|
+
* [group admin](https://developers.arcgis.com/rest/users-groups-and-items/unshare-item-as-group-admin-.htm) or
|
15
|
+
* organization admin.
|
16
|
+
*
|
17
|
+
* ```js
|
18
|
+
* import { unshareItemWithGroup } from '@esri/arcgis-rest-portal';
|
19
|
+
*
|
20
|
+
* unshareItemWithGroup({
|
21
|
+
* id: "abc123",
|
22
|
+
* groupId: "xyz987",
|
23
|
+
* owner: "some-owner",
|
24
|
+
* authentication: session
|
25
|
+
* })
|
26
|
+
* ```
|
27
|
+
*
|
28
|
+
* @param requestOptions - Options for the request.
|
29
|
+
* @returns A Promise that will resolve with the data from the response.
|
30
|
+
*/
|
31
|
+
export function unshareItemWithGroup (
|
32
|
+
requestOptions: IGroupSharingOptions
|
33
|
+
): Promise<ISharingResponse> {
|
34
|
+
return isItemSharedWithGroup(requestOptions)
|
35
|
+
.then(isShared => {
|
36
|
+
// not shared
|
37
|
+
if (!isShared) {
|
38
|
+
// exit early with success response
|
39
|
+
return Promise.resolve({
|
40
|
+
itemId: requestOptions.id,
|
41
|
+
shortcut: true,
|
42
|
+
notUnsharedFrom: []
|
43
|
+
} as ISharingResponse);
|
44
|
+
}
|
45
|
+
|
46
|
+
const {
|
47
|
+
authentication: { username },
|
48
|
+
owner
|
49
|
+
} = requestOptions;
|
50
|
+
|
51
|
+
// next check if the user is a member of the group
|
52
|
+
return Promise.all([
|
53
|
+
getUserMembership(requestOptions),
|
54
|
+
getUser({
|
55
|
+
username,
|
56
|
+
authentication: requestOptions.authentication
|
57
|
+
})
|
58
|
+
])
|
59
|
+
.then(([membership, currentUser]) => {
|
60
|
+
const itemOwner = owner || username;
|
61
|
+
const isItemOwner = itemOwner === username;
|
62
|
+
const isAdmin = currentUser.role === 'org_admin' && !currentUser.roleId;
|
63
|
+
|
64
|
+
if (!isItemOwner && !isAdmin && ['admin', 'owner'].indexOf(membership) < 0) {
|
65
|
+
// abort and reject promise
|
66
|
+
throw Error(`This item can not be unshared from group ${requestOptions.groupId} by ${username} as they not the item owner, an org admin, group admin or group owner.`);
|
67
|
+
}
|
68
|
+
|
69
|
+
// let the sharing call go
|
70
|
+
return unshareFromGroup(requestOptions);
|
71
|
+
})
|
72
|
+
.then(sharingResponse => {
|
73
|
+
if (sharingResponse.notUnsharedFrom.length) {
|
74
|
+
throw Error(
|
75
|
+
`Item ${requestOptions.id} could not be unshared to group ${requestOptions.groupId}`
|
76
|
+
);
|
77
|
+
} else {
|
78
|
+
// all is well
|
79
|
+
return sharingResponse;
|
80
|
+
}
|
81
|
+
});
|
82
|
+
});
|
83
|
+
}
|
84
|
+
|
85
|
+
function unshareFromGroup (
|
86
|
+
requestOptions: IGroupSharingOptions
|
87
|
+
): Promise<ISharingResponse> {
|
88
|
+
const username = requestOptions.authentication.username;
|
89
|
+
const itemOwner = requestOptions.owner || username;
|
90
|
+
// decide what url to use
|
91
|
+
// default to the non-owner url...
|
92
|
+
let url = `${getPortalUrl(requestOptions)}/content/items/${requestOptions.id}/unshare`;
|
93
|
+
|
94
|
+
// but if they are the owner, we use a different path...
|
95
|
+
if (itemOwner === username) {
|
96
|
+
url = `${getPortalUrl(requestOptions)}/content/users/${itemOwner}/items/${requestOptions.id}/unshare`;
|
97
|
+
}
|
98
|
+
|
99
|
+
// now its finally time to do the sharing
|
100
|
+
requestOptions.params = {
|
101
|
+
groups: requestOptions.groupId
|
102
|
+
};
|
103
|
+
|
104
|
+
return request(url, requestOptions);
|
105
|
+
}
|
@@ -0,0 +1,52 @@
|
|
1
|
+
/* Copyright (c) 2018 Environmental Systems Research Institute, Inc.
|
2
|
+
* Apache-2.0 */
|
3
|
+
|
4
|
+
import { request } from "@esri/arcgis-rest-request";
|
5
|
+
import { getPortalUrl } from "../util/get-portal-url";
|
6
|
+
import { IGetUserOptions } from "./get-user";
|
7
|
+
|
8
|
+
export interface ITagCount {
|
9
|
+
/**
|
10
|
+
* the name of a tag
|
11
|
+
*/
|
12
|
+
tag: string;
|
13
|
+
/**
|
14
|
+
* a count that reports the number of times the tag was used
|
15
|
+
*/
|
16
|
+
count: number;
|
17
|
+
}
|
18
|
+
|
19
|
+
export interface IGetUserTagsResponse {
|
20
|
+
/**
|
21
|
+
* Array of user item tag objects
|
22
|
+
*/
|
23
|
+
tags: ITagCount[];
|
24
|
+
}
|
25
|
+
|
26
|
+
/**
|
27
|
+
* ```js
|
28
|
+
* import { getUserTags } from '@esri/arcgis-rest-portal';
|
29
|
+
* //
|
30
|
+
* getUserTags({
|
31
|
+
* username: "jsmith",
|
32
|
+
* authentication
|
33
|
+
* })
|
34
|
+
* .then(response)
|
35
|
+
* ```
|
36
|
+
* Users tag the content they publish in their portal via the add and update item calls. This resource lists all the tags used by the user along with the number of times the tags have been used. See the [REST Documentation](https://developers.arcgis.com/rest/users-groups-and-items/user-tags.htm) for more information.
|
37
|
+
*
|
38
|
+
* @param IGetUserOptions - options to pass through in the request
|
39
|
+
* @returns A Promise that will resolve with the user tag array
|
40
|
+
*/
|
41
|
+
export function getUserTags(
|
42
|
+
requestOptions: IGetUserOptions
|
43
|
+
): Promise<IGetUserTagsResponse> {
|
44
|
+
const username =
|
45
|
+
requestOptions.username || requestOptions.authentication.username;
|
46
|
+
const url = `${getPortalUrl(
|
47
|
+
requestOptions
|
48
|
+
)}/community/users/${encodeURIComponent(username)}/tags`;
|
49
|
+
|
50
|
+
// send the request
|
51
|
+
return request(url, requestOptions);
|
52
|
+
}
|