@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
3 lines (2 loc) • 7.8 kB
JavaScript
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.8/LICENSE.txt */
import{__decorate as e}from"tslib";import i from"../../core/Collection.js";import r from"../../core/Error.js";import{EventedAccessor as s}from"../../core/Evented.js";import n from"../../core/Logger.js";import{getOrCreateMapValue as t}from"../../core/MapUtils.js";import{debounce as o,logOnError as a}from"../../core/promiseUtils.js";import d from"../../core/ReactiveMap.js";import{whenOnce as c,watch as v}from"../../core/reactiveUtils.js";import{property as l,subclass as p}from"../../core/accessorSupport/decorators.js";import{UpdatingHandles as m}from"../../core/support/UpdatingHandles.js";import{parse as f}from"../../layers/support/arcgisLayerUrl.js";import{isSubtypeGroupLayer as u,isFeatureLayer as h}from"../../layers/support/layerUtils.js";import g from"../../rest/featureService/FeatureService.js";import{ServiceVersionInfo as y}from"./ServiceVersionInfo.js";function w(e){return!e||0===e.trim().length}const S=new Map;function I(e){return t(S,e,()=>{const i=new _({view:e});return e.addHandles({remove(){S.delete(e),i.destroy()}}),i})}let _=class extends s{constructor(e){super(e),this._updatingHandles=new m,this.items=new i,this.tablesAndLayersLookup=new d,this.additionalLayers=new i,this._debouncedCheckAndUpdateServiceInfos=o(async()=>{const e=[];for(const i of this.items){if(0===i.layersAndTables.length)continue;const r=i.layersAndTables.getItemAt(0);r?.gdbVersion!==i.versionInfo?.versionIdentifier.name&&e.push(i)}0!==e.length&&(await c(()=>!this.updating),await this._updateVersionInfos(e))}),this._processed=new Set}initialize(){this._syncServiceInfos(),this.addHandles([v(()=>this.view.map,()=>{this._reset()}),v(()=>this._allLayersAndTables,()=>this._syncServiceInfos()),v(()=>this.items.map(e=>e.layersAndTables.map(e=>e.gdbVersion??"").join(",")),()=>{a(this.checkAndUpdateServiceInfos(),n.getLogger(this))})])}destroy(){this._set("view",null),this.items.removeAll(),this.tablesAndLayersLookup.clear()}get updating(){return this._updatingHandles.updating}checkAndUpdateServiceInfos(){return this._debouncedCheckAndUpdateServiceInfos()}changeVersion(e,i,r){return this._updatingHandles.addPromise((async()=>{await this._changeVersionInternal(e,i,r)})())}createVersion(e){return this._updatingHandles.addPromise((async()=>{const i=e.featureServerUrl,s=this._findServiceInfo(i);if(!s?.versionService)throw new r("services:no-version-management-service","No version management service");const n=s.loggedInServiceUser.toUpperCase(),t=w(e.ownerName)?n:e.ownerName?.trim().toUpperCase();if(t!==n&&s.featureServiceVersion<=11.1)throw new r("services:versioning-api-error","Version management API too old");if("SDE"===t?.toUpperCase()&&"DEFAULT"===e.versionName.toUpperCase())throw new r("services:no-valid-version-name","No valid version name");{const i=await s.versionService.getVersionInfos();if(i?.find(i=>i.versionIdentifier.name.toUpperCase()===(t+"."+e.versionName).toUpperCase()||i.versionIdentifier.name.toUpperCase()===(n+"."+e.versionName).toUpperCase()))throw new r("services:no-valid-version-name","No valid version name")}const o=await s.versionService.createVersion({versionName:e.versionName,access:t!==n?"public":e.access,description:e.description});if(t!==n){const{guid:i,name:r}=o.versionIdentifier;await s.versionService.alterVersion({guid:i,name:r},{ownerName:t,access:e.access})}e.switchToVersion&&await this._changeVersionInternal(i,o.versionIdentifier.name,o.versionIdentifier.guid),this.emit("version-created",{versionIdentifier:o.versionIdentifier,versionManagementService:s.versionService})})())}deleteVersion(e,i,s){return this._updatingHandles.addPromise((async()=>{const n=this._findServiceInfo(e);if(!n?.versionService)throw new r("services:no-version-management-service","No version management service");if(n.featureServiceVersion<=11.1)throw new r("services:versioning-api-error","Version management API too old");const t={name:i,guid:s};await n.versionService.deleteVersion(t)&&(await n.syncVersionInfo(),this.emit("version-deleted",{versionIdentifier:t,versionManagementService:n.versionService}))})())}startEditing(e){return this._updatingHandles.addPromise((async()=>{const i=this._findServiceInfo(e);if(!i?.versionService)throw new r("services:no-version-management-service","No version management service");const s=i.versionInfo?.versionIdentifier??{name:i.versionService.defaultVersionIdentifier.name,guid:i.versionService.defaultVersionIdentifier.guid};let n=!0;("none"!==i.versionService.getLockType(s)||(n=await i.versionService.startReading(s),n))&&(n=await i.versionService.startEditing(s),i.updateLockType())})())}finishEditing(e,i){return this._updatingHandles.addPromise((async()=>{const s=this._findServiceInfo(e);if(!s?.versionService)throw new r("services:no-version-management-service","No version management service");const n=s.versionInfo?.versionIdentifier??{name:s.versionService.defaultVersionIdentifier.name,guid:s.versionService.defaultVersionIdentifier.guid},t=s.versionService.getLockType(n);if("none"!==t)return"read"===t?(await s.versionService.stopReading(n),void s.updateLockType()):"edit"===t?(await s.versionService.stopEditing(n,i),await s.versionService.stopReading(n),void s.updateLockType()):void 0})())}async loadAll(){await this._updatingHandles.addPromise(Promise.allSettled(this.items.map(e=>e.load())))}async loadServiceVersionInfoForLayer(e){return await(this.tablesAndLayersLookup.get(e)?.load())}async _changeVersionInternal(e,i,s){const n=this._findServiceInfo(e);if(!n?.versionService)throw new r("services:no-version-management-service","No version management service");const t=n.versionInfo?.versionIdentifier??{name:n.versionService.defaultVersionIdentifier.name,guid:n.versionService.defaultVersionIdentifier.guid},o={name:i,guid:s};await n.versionService.changeVersion(this.view?.map,t,o)&&await n.syncVersionInfo()}_findServiceInfo(e){return this.items.find(i=>i.featureService.url===e)??null}_removeFeatureService(e){this.items.remove(e)}_reset(){this.additionalLayers.removeAll(),this._processed.clear(),this.tablesAndLayersLookup.clear(),this.items.removeAll()}_updateVersionInfos(e){return this._updatingHandles.addPromise((async()=>{for(const i of e)await i.syncVersionInfo().catch(e=>{n.getLogger(this).error("Failed to update version details",e)})})())}_addServiceInfo(e,r){const s=new g({url:e}),n=r.isTable?[]:[r],t=r.isTable?[r]:[],o=new y({featureService:s,layers:new i(n),tables:new i(t)});return this.items.push(o),this.tablesAndLayersLookup.set(r,o),o}get _allLayersAndTables(){return[...this.view.map?.allLayers??[],...this.view.map?.allTables??[],...this.additionalLayers]}_detectNewLayersAndTables(){const e=new Set(this._allLayersAndTables),i=[];for(const r of e)"feature"!==r.type&&"subtype-group"!==r.type||this._processed.has(r)||i.push(r);for(const r of this._processed)if(!e.has(r)&&(u(r)||h(r))){const e=this.tablesAndLayersLookup.get(r);if(!e)continue;this.tablesAndLayersLookup.delete(r),r.isTable?e.tables.remove(r):e.layers.remove(r),0===e.layersAndTables.length&&this._removeFeatureService(e)}return this._processed=e,i}_syncServiceInfos(){const e=this._detectNewLayersAndTables();if(0!==e.length)for(const i of e)if("feature"===i.type||"subtype-group"===i.type){if(!i.url)continue;const e=f(i.url).url.path,r=this._findServiceInfo(e);r?(this.tablesAndLayersLookup.set(i,r),i.isTable?r.tables.push(i):r.layers.push(i)):this._addServiceInfo(e,i)}}};e([l({constructOnly:!0})],_.prototype,"view",void 0),e([l()],_.prototype,"items",void 0),e([l()],_.prototype,"tablesAndLayersLookup",void 0),e([l()],_.prototype,"additionalLayers",void 0),e([l()],_.prototype,"updating",null),e([l()],_.prototype,"_allLayersAndTables",null),_=e([p("esri.undoredo.support.Services")],_);export{_ as Services,I as getServices};