{"version":3,"names":["CacheProvider","constructor","this","cacheKeyPrefix","defaultExpiration","store","window","localStorage","static","instance","async","key","callback","expiration","cacheKey","data","refresh","cacheData","getItem","isAdminLoggedIn","JSON","parse","now","Date","getTime","expires","then","value","setItem","stringify","Promise","resolve","ApiService","endpointUrl","options","url","carriedData","abortableFetch","ready","res","json","_data","console","log","debug","cacheProvider","getCacheData","locationExpiration","getCachedCollection","baseUrl","headers","filterAmg","providerExpiration","newsExpiration","heroExpiration","getInstance"],"sources":["./src/providers/cache.provider.ts","./src/services/api.ts"],"sourcesContent":["/**\r\n * API data provider with cacheing.\r\n */\r\nexport class CacheProvider {\r\n private static instance = null;\r\n\r\n private cacheKeyPrefix = 'adena_';\r\n\r\n // 1 day default cache life\r\n private defaultExpiration = 1000 * 60 * 60 * 24;\r\n\r\n private store = window.localStorage;\r\n\r\n public static getInstance(): CacheProvider {\r\n if (null === CacheProvider.instance) {\r\n CacheProvider.instance = new CacheProvider();\r\n }\r\n return CacheProvider.instance;\r\n }\r\n\r\n /**\r\n * Wrapper to retrieve and cache data\r\n * @param key data key to store/retrieve\r\n * @param callback Function that returns a promise to retrieve the data\r\n * @param expiration optional custom expiration time\r\n */\r\n public async getCacheData(key: string, callback: Function, expiration?: number) {\r\n const cacheKey = this.cacheKeyPrefix + key;\r\n\r\n let data: { expires: number; value: any; } = null,\r\n refresh = false,\r\n cacheData = this.store.getItem(cacheKey);\r\n\r\n if (null === cacheData || window.isAdminLoggedIn) {\r\n refresh = true;\r\n } else {\r\n data = JSON.parse(cacheData);\r\n const now = new Date().getTime();\r\n\r\n if (now - data.expires > (expiration ? expiration : this.defaultExpiration) || !data.expires) {\r\n refresh = true;\r\n }\r\n }\r\n\r\n if (refresh) {\r\n return await callback().then(value => {\r\n data = {\r\n expires : new Date().getTime() + (expiration ? expiration : this.defaultExpiration),\r\n value : value\r\n }\r\n \r\n this.store.setItem(cacheKey, JSON.stringify(data));\r\n return data.value;\r\n });\r\n }\r\n\r\n return await new Promise(resolve => {\r\n resolve(data.value);\r\n });\r\n }\r\n}\r\n","import { Location } from '../interfaces/location';\r\nimport { Provider } from '../interfaces/provider';\r\nimport { abortableFetch } from '../utils/utils';\r\nimport { CacheProvider } from '../providers/cache.provider';\r\n\r\n/**\r\n * Main Collection Endpoint for Adena API\r\n * @todo refactor request urls to only return necessary data\r\n * @see https://docs.microsoft.com/en-us/odata/concepts/queryoptions-overview\r\n */\r\nexport class ApiService {\r\n\tprivate static debug = false;\r\n\r\n\t//@ts-ignore\r\n\tprivate static baseUrl: string = window.baseUrl || 'https://localhost:44352';\r\n\r\n\tpublic static cacheProvider = CacheProvider.getInstance();\r\n\r\n\tprivate static async getCachedCollection(\r\n\t\tendpointUrl: string,\r\n\t\tcacheKey: string,\r\n\t\toptions: any = {},\r\n\t\texpiration: number = null\r\n\t) {\r\n\t\tconst callback = async (url: string = null, carriedData: any[] = null) =>\r\n\t\t\tabortableFetch(url ? url : endpointUrl, options)\r\n\t\t\t\t.ready.then(res => res.json())\r\n\t\t\t\t.then(async data => {\r\n\t\t\t\t\tlet _data = data.value;\r\n\t\t\t\t\tif (carriedData) {\r\n\t\t\t\t\t\t_data = [..._data, ...carriedData];\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (data['@odata.nextLink']) {\r\n\t\t\t\t\t\t// Option to recursively retrieve records\r\n\t\t\t\t\t\t// This is super slow, we should return each chunk as\r\n\t\t\t\t\t\t// we get it\r\n\t\t\t\t\t\treturn callback(data['@odata.nextLink'], _data);\r\n\t\t\t\t\t}\r\n console.log(_data);\r\n\t\t\t\t\treturn _data;\r\n\t\t\t\t});\r\n\t\treturn await (this.debug\r\n\t\t\t? callback()\r\n\t\t\t: this.cacheProvider.getCacheData(cacheKey, callback, expiration));\r\n\t}\r\n\r\n\tpublic static async getLocations(): Promise {\r\n\t\t//let locationExpiration = 0; // 2hours\r\n let locationExpiration = 1000 * 60 * 60 * 2; // 2hours\r\n\t\treturn this.getCachedCollection(\r\n\t\t\t`${this.baseUrl}/api/default/locations?$expand=LocationTypes,Areas,Image&$orderby=Title`,\r\n\t\t\t'locations_v3',\r\n {'headers': {'X-Requested-With': ''}}, \r\n\t\t\tlocationExpiration\r\n\t\t);\r\n\t}\r\n\r\n\tpublic static async getProviders(filterAmg: boolean = false): Promise {\r\n\t\tlet providerExpiration = 1000 * 60 * 60 * 24 * 2;\r\n\t\treturn this.getCachedCollection(\r\n\t\t\t`${\r\n\t\t\t\tthis.baseUrl\r\n\t\t\t}/api/default/providers?$filter=ProviderHidden+eq+false&$select=Id,PageUrl,UrlName,StartDate,Title,FirstName,MetaDescription,Fax,Address1,MetaTitle,Publications,Certifications,Phone,LeadershipTitle,AdenaStatus,Phone2,City,BioVideo,Languages,Gender,Bio,MiddleName,Address2,NPINumber,LastName,State,Zip,AcceptingAppointments,ProviderType&$expand=Specialties($select=Id),Locations($select=Id),Photo($select=Url,Title,AlternativeText,Thumbnails)&$orderby=Title${\r\n\t\t\t\tfilterAmg ? '&$filter=AdenaMedicalGroup eq true' : ''\r\n\t\t\t}`,\r\n\t\t\t'providers',\r\n {'headers': {'X-Requested-With': ''}}, \r\n\t\t\tproviderExpiration\r\n\t\t);\r\n\t}\r\n\r\n\tpublic static async getSpecialties(): Promise {\r\n\t\treturn this.getCachedCollection(\r\n\t\t\t`${this.baseUrl}/api/default/specialties?$select=Id,Title,UrlName&$orderby=Title`,\r\n\t\t\t'specialties',\r\n {'headers': {'X-Requested-With': ''}}\r\n\t\t);\r\n\t}\r\n\r\n public static async getNews() {\r\n let newsExpiration = 1000 * 60 * 60; // 1 hour\r\n return this.getCachedCollection(\r\n\t\t\t`${this.baseUrl}/api/default/newsitems?$select=*&$expand=FullNewsCategories($select=title, id, urlName),Image&$orderby=publicationDate desc`,\r\n\t\t\t'news',\r\n {\r\n 'headers': {\r\n 'X-Requested-With': ''\r\n },\r\n },\r\n newsExpiration\r\n\r\n\t\t);\r\n }\r\n\r\n public static async getNewsCategories() {\r\n return this.getCachedCollection(\r\n\t\t\t`${this.baseUrl}/api/default/flat-taxa?$filter=TaxonomyId eq 53087cc5-3335-4384-a008-20a45e718545`,\r\n\t\t\t'news-categories',\r\n {'headers': {'X-Requested-With': ''}}\r\n\t\t);\r\n }\r\n\r\n public static async getHeros() {\r\n let heroExpiration = 1000 * 60 * 60 * 6; // 6 hours\r\n return this.getCachedCollection(\r\n\t\t\t`${this.baseUrl}/api/default/heros?$expand=callstoaction($expand=iconimage),slides($expand=image)`,\r\n\t\t\t'hp-heros',\r\n {'headers': {'X-Requested-With': ''}},\r\n heroExpiration\r\n\t\t);\r\n }\r\n\r\n \r\n}\r\n"],"mappings":"oCAGA,MAAaA,EAAbC,cAGYC,KAAAC,eAAiB,SAGjBD,KAAAE,kBAAoB,IAAO,GAAK,GAAK,GAErCF,KAAAG,MAAQC,OAAOC,Y,CAEhBC,qBACH,GAAI,OAASR,EAAcS,SAAU,CACjCT,EAAcS,SAAW,IAAIT,C,CAEjC,OAAOA,EAAcS,Q,CASlBC,mBAAmBC,EAAaC,EAAoBC,GACvD,MAAMC,EAAWZ,KAAKC,eAAiBQ,EAEvC,IAAII,EAAyC,KACzCC,EAAU,MACVC,EAAYf,KAAKG,MAAMa,QAAQJ,GAEnC,GAAI,OAASG,GAAaX,OAAOa,gBAAiB,CAC9CH,EAAU,I,KACP,CACHD,EAAOK,KAAKC,MAAMJ,GAClB,MAAMK,GAAM,IAAIC,MAAOC,UAEvB,GAAIF,EAAMP,EAAKU,SAAWZ,EAAaA,EAAaX,KAAKE,qBAAuBW,EAAKU,QAAS,CAC1FT,EAAU,I,EAIlB,GAAIA,EAAS,CACT,aAAaJ,IAAWc,MAAKC,IACzBZ,EAAO,CACHU,SAAU,IAAIF,MAAOC,WAAaX,EAAaA,EAAaX,KAAKE,mBACjEuB,MAAQA,GAGZzB,KAAKG,MAAMuB,QAAQd,EAAUM,KAAKS,UAAUd,IAC5C,OAAOA,EAAKY,KAAK,G,CAIzB,aAAa,IAAIG,SAAQC,IACrBA,EAAQhB,EAAKY,MAAM,G,EArDZ3B,EAAAS,SAAW,KCM9B,MAAauB,EAQJxB,iCACPyB,EACAnB,EACAoB,EAAe,GACfrB,EAAqB,MAErB,MAAMD,EAAWF,MAAOyB,EAAc,KAAMC,EAAqB,OAChEC,EAAeF,EAAMA,EAAMF,EAAaC,GACtCI,MAAMZ,MAAKa,GAAOA,EAAIC,SACtBd,MAAKhB,MAAMK,IACX,IAAI0B,EAAQ1B,EAAKY,MACjB,GAAIS,EAAa,CAChBK,EAAQ,IAAIA,KAAUL,E,CAEvB,GAAIrB,EAAK,mBAAoB,CAI5B,OAAOH,EAASG,EAAK,mBAAoB0B,E,CAErCC,QAAQC,IAAIF,GACjB,OAAOA,CAAK,IAEf,aAAcvC,KAAK0C,MAChBhC,IACAV,KAAK2C,cAAcC,aAAahC,EAAUF,EAAUC,G,CAGjDL,4BAEJ,IAAIuC,EAAqB,IAAO,GAAK,GAAK,EAC5C,OAAO7C,KAAK8C,oBACX,GAAG9C,KAAK+C,iFACR,eACG,CAACC,QAAW,CAAC,mBAAoB,KACpCH,E,CAIKvC,0BAA0B2C,EAAqB,OACrD,IAAIC,EAAqB,IAAO,GAAK,GAAK,GAAK,EAC/C,OAAOlD,KAAK8C,oBACX,GACC9C,KAAK+C,idAELE,EAAY,qCAAuC,KAEpD,YACG,CAACD,QAAW,CAAC,mBAAoB,KACpCE,E,CAIK5C,8BACN,OAAON,KAAK8C,oBACX,GAAG9C,KAAK+C,0EACR,cACG,CAACC,QAAW,CAAC,mBAAoB,K,CAI9B1C,uBACL,IAAI6C,EAAiB,IAAO,GAAK,GACjC,OAAOnD,KAAK8C,oBACb,GAAG9C,KAAK+C,qIACR,OACG,CACEC,QAAW,CACT,mBAAoB,KAGxBG,E,CAKG7C,iCACL,OAAON,KAAK8C,oBACb,GAAG9C,KAAK+C,2FACR,kBACG,CAACC,QAAW,CAAC,mBAAoB,K,CAI9B1C,wBACL,IAAI8C,EAAiB,IAAO,GAAK,GAAK,EACtC,OAAOpD,KAAK8C,oBACb,GAAG9C,KAAK+C,2FACR,WACG,CAACC,QAAW,CAAC,mBAAoB,KACjCI,E,EAjGUtB,EAAAY,MAAQ,MAGRZ,EAAAiB,QAAkB3C,OAAO2C,SAAW,0BAErCjB,EAAAa,cAAgB7C,EAAcuD,qB"}