/// /// /// /// /// /// /// class DataService { private dataCache:{[cacheKey:string]:JQueryPromise} = {}; private localStorageService:LocalStorageService = new LocalStorageService(); private renuoUploadCredentials:{[cacheKey:string]:JQueryPromise} = {}; private dataConverter:DataConverter = new DataConverter(); constructor(private ajaxService:AjaxService, localStorageService:LocalStorageService = null) { this.localStorageService = localStorageService ? localStorageService : new LocalStorageService(); } cacheKey(contentBlock:ContentBlock, enableHttpCaching:boolean) { return [contentBlock.apiHost, contentBlock.apiKey, enableHttpCaching].join('|'); } storeContent(contentBlock:ContentBlock, privateApiKey:string):JQueryPromise { const promise = this.ajaxService.storeContentBlock(contentBlock, privateApiKey); promise.done(ajaxResponse => { contentBlock.version = ajaxResponse.content_block.version; this.updateCache(contentBlock, ajaxResponse.content_block, true); this.updateCache(contentBlock, ajaxResponse.content_block, false); } ); return promise; } private updateCache(contentBlock:ContentBlock, data:AjaxContentBlock, httpCaching:boolean) { const cacheKey = this.cacheKey(contentBlock, httpCaching); const cacheEntry = this.localStorageService.fetch(cacheKey); cacheEntry[contentBlock.contentPath] = data; this.localStorageService.put(cacheKey, cacheEntry); const deferred:JQueryDeferred = $.Deferred(); this.dataCache[cacheKey] = deferred.promise(); deferred.resolve(cacheEntry); } private loadAllContents(contentBlock:ContentBlock, enableHttpCaching:boolean):JQueryPromise { return this.ajaxService.fetchContentBlocks(contentBlock.apiKey, contentBlock.apiHost, enableHttpCaching).then(raw => this.dataConverter.convertJsonObjectToHash(raw)); }; loadReadonlyContent(contentBlock:ContentBlock):JQueryPromise { return this.loadContent(contentBlock, true); } loadReadonlyContentFromCache(contentBlock:ContentBlock):ContentBlock { const cacheKey = this.cacheKey(contentBlock, true); const hash = this.localStorageService.fetch(cacheKey); if(!hash) return contentBlock; return this.dataConverter.extractObjectFromHash(contentBlock, hash); } loadEditableContent(contentBlock:ContentBlock, privateApiKey:string):JQueryPromise { const cbPromise = this.loadContent(contentBlock, false); const uploadPromise = this.loadRenuoUploadCredentials(contentBlock, privateApiKey); return jQuery.when(cbPromise, uploadPromise).then( (cb:ContentBlock, credentials:RenuoUploadCredentials) => new EditableContentBlock(cb, credentials) ); } private loadRenuoUploadCredentials(contentBlock:ContentBlock, privateApiKey:string):JQueryPromise { const cacheKey = this.cacheKey(contentBlock, false); if (!this.renuoUploadCredentials[cacheKey]) this.renuoUploadCredentials[cacheKey] = this.ajaxService.getRenuoUploadCredentials(contentBlock, privateApiKey).then( (credentials:AjaxRenuoUploadCredentials) => this.dataConverter.convertJsonObjectToCredentials(credentials)); return this.renuoUploadCredentials[cacheKey]; }; private loadContent(contentBlock:ContentBlock, enableHttpCaching:boolean):JQueryPromise { const cacheKey = this.cacheKey(contentBlock, enableHttpCaching); if (!this.dataCache[cacheKey]) this.dataCache[cacheKey] = this.loadAllContents(contentBlock, enableHttpCaching); return this.dataCache[cacheKey].then((hash) => { this.localStorageService.put(cacheKey, hash); return this.dataConverter.extractObjectFromHash(contentBlock, hash); }); } }