import "jquery"; import * as _ from "underscore"; import Q from "q"; import { getAuthorizationHeader } from "../../Utils/AuthorizationUtils"; import * as DataModels from "../../Contracts/DataModels"; import * as ViewModels from "../../Contracts/ViewModels"; import * as Constants from "../../Common/Constants"; import { DataAccessUtilityBase } from "../../Common/DataAccessUtilityBase"; import { MessageHandler } from "../../Common/MessageHandler"; import { MessageTypes } from "../../Contracts/ExplorerContracts"; export class DataAccessUtility extends DataAccessUtilityBase { public readDatabases(options: any): Q.Promise { return MessageHandler.sendCachedDataMessage(MessageTypes.AllDatabases, [ (window).dataExplorer.databaseAccount().id, Constants.ClientDefaults.portalCacheTimeoutMs ]).catch(error => { return super.readDatabases(options); }); } // public readCollections(database: ViewModels.Database, options: any): Q.Promise { // return MessageHandler.sendCachedDataMessage(MessageTypes.CollectionsForDatabase, [ // (window).dataExplorer.databaseAccount().id, // database.id() // ]); // } public readOffers(options: any): Q.Promise { return MessageHandler.sendCachedDataMessage(MessageTypes.AllOffers, [ (window).dataExplorer.databaseAccount().id, Constants.ClientDefaults.portalCacheTimeoutMs ]).catch(error => { return super.readOffers(options); }); } public readOffer(requestedResource: DataModels.Offer, options: any): Q.Promise { const deferred: Q.Deferred = Q.defer(); super.readOffer(requestedResource, options).then( (offer: DataModels.OfferWithHeaders) => deferred.resolve(offer), (reason: any) => { const isThrottled: boolean = !!reason && !!reason.error && !!reason.error.code && reason.error.code == Constants.HttpStatusCodes.TooManyRequests; if (isThrottled && MessageHandler.canSendMessage()) { MessageHandler.sendCachedDataMessage(MessageTypes.SingleOffer, [ (window).dataExplorer.databaseAccount().id, requestedResource._self, requestedResource.offerVersion ]).then( (offer: DataModels.OfferWithHeaders) => deferred.resolve(offer), (reason: any) => deferred.reject(reason) ); return; } deferred.reject(reason); } ); return deferred.promise; } public updateOfferThroughputBeyondLimit( updateThroughputRequestPayload: DataModels.UpdateOfferThroughputRequest, options: any ): Q.Promise { const deferred: Q.Deferred = Q.defer(); const explorer = window.dataExplorer; const url: string = `${explorer.extensionEndpoint()}/api/offerthroughputrequest/updatebeyondspecifiedlimit`; const authorizationHeader: ViewModels.AuthorizationTokenHeaderMetadata = getAuthorizationHeader(); const requestOptions: any = _.extend({}, options, {}); requestOptions[authorizationHeader.header] = authorizationHeader.token; const requestSettings: JQueryAjaxSettings = { type: "POST", contentType: "application/json", headers: requestOptions, data: JSON.stringify(updateThroughputRequestPayload) }; $.ajax(url, requestSettings).then( (data: any, textStatus: string, xhr: JQueryXHR) => { deferred.resolve(); }, (xhr: JQueryXHR, textStatus: string, error: any) => { deferred.reject(xhr.responseText); } ); return deferred.promise; } }