{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///SPAs/_identity/helpers.ts","webpack:///SPAs/_data/settings.ts","webpack:///SPAs/_data/repository.ts","webpack:///SPAs/_shared/elements/footer-public/footer-public.ts","webpack:///./SPAs/_shared/elements/footer-public/footer-public.html","webpack:///SPAs/_shared/elements/nav-public/nav-public.ts","webpack:///./SPAs/_shared/elements/nav-public/nav-public.html","webpack:///SPAs/blog/app/_routes.ts","webpack:///SPAs/_shared/value-converters/sentry.ts","webpack:///SPAs/_identity/md5.ts","webpack:///SPAs/blog/app/app.ts","webpack:///./SPAs/blog/app/app.html","webpack:///./SPAs/blog/pages/home/home.ts","webpack:///./SPAs/blog/pages/notfound/notfound.ts","webpack:///./SPAs/blog/pages/post/post.ts","webpack:///SPAs/_data/lookups.ts","webpack:///SPAs/blog/boot.ts","webpack:///./SPAs/blog/styles/blog.min.css","webpack:///SPAs/_data/entity-manager-factory.ts"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","1","jsonpScriptSrc","p","exports","module","l","e","promises","installedChunkData","promise","Promise","resolve","reject","error","Error","script","loadScript","src","retries","onScriptComplete","document","createElement","retryAttemptString","charset","timeout","nc","setAttribute","event","onerror","onload","clearTimeout","chunk","errorType","type","realSrc","target","message","name","request","undefined","setTimeout","cacheBust","retryScript","head","appendChild","all","m","c","d","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","err","jsonpArray","window","oldJsonpFunction","slice","router","ea","md5","sentry","showContent","refreshData","firstRequest","baseAddress","user","IsAuthenticated","UserName","Roles","AntiForgeryToken","IsFullyConfirmed","PersonId","IsActiveCommunity","CommunityExpired","Person","Purchases","CourseProductOptions","SessionEngagement","HadCommunity","CancelledCommunity","TrialCommunity","Trial7Days","Webinars","defaultPaymentMethod","hideNav","isCourses","antiForgeryDone","forceAntiForgeryUpdate","gotUserInfo","status","error406","this","httpClient","hasExpired","date","Date","hasExpiredOrEqualTo","buildPurchases","person","forAdmin","purchase","courseProductOption","transactionItems","transactionItem","purchaseHistory","purchases","courseProductOptions","hadCommunity","cancelledCommunity","trialCommunity","trial7days","userPurchases","orders","sort","a","b","dateA","createdDate","order","basket","basketItems","updatedDate","basketItem","isActive","isCommunity","isActiveCommunity","isCancelled","subscriptionId","firstBillingDate","productOption","planId","indexOf","orderDate","startDate","basketItemName","itemName","productName","product","productIsCommunity","productRequiresCommunity","requiresCommunity","productOptionId","productOptionName","productOptionPriceDesc","priceDescription","productOptionCurrency","currency","productOptionSchedule","paymentSchedule","productOptionGroupId","productOptionUpgradeId","productOptionPlanId","basketItemId","basketItemQuantity","quantity","basketItemPrice","price","basketItemDiscountCode","discountCode","basketItemVatPercentage","vatPercentage","basketItemSubscriptionId","basketItemIsActive","basketItemIsCancelled","basketItemCancelledDate","cancelledDate","basketItemCancelledBy","cancelledBy","basketItemCancellationReason","cancellationReason","basketItemTransactionItems","basketItemFirstBillingDate","courseId","course","friendlyId","friendlyUrl","purchaseDate","tItems","tItem","transaction","notes","toLowerCase","amount","billingStartDate","invoiceNumber","transactionItemId","transactionDate","source","userNotes","transactionId","billingEndDate","addAntiForgeryTokenAsync","fetch","now","json","token","text","toView","updateHttpClientHeadersAsync","configure","config","withDefaults","headers","__RequestVerificationToken","publish","initialiseIdentityAsync","registerAsync","requestModel","apiResponse","method","body","response","statusCode","userName","loginAsync","Token","updateUserInfo","logoutAsync","getUserInfoAsync","testAsync","userInfo","isUserInRole","rolesAllowed","filteredRoles","filter","item","requestResetAsync","context","emailAddress","resetPasswordAsync","personId","confirmAccountAsync","confirmEmailChangeAsync","resendConfirmationAsync","resendContext","changePasswordAsync","changeUserNameAsync","checkNotExistingUserAsync","zoomRegister","webinarId","isValidEmail","email","trim","test","isValidPassword","password","score","letters","variations","digits","lower","upper","nonWords","variationCount","check","contactAsync","IdentityHelpers","serviceName","pageSize","identity","dataParams","engagementAddress","breezeManager","getTrackers","getDataParams","apiMethod","forceRemote","liveApiMethod","filterName","filterValue","checkFetched","failed","getData","catch","logEngagement","params","engagementType","engagementContentId","engagementGroupId","engagementResourceId","videoTrackerId","resourceGroupVideoId","resourceGroupMaterialId","resourceGroupWebinarId","completed","engagementModel","contentId","resourceGroupId","resourceId","requestType","notComplete","mgr","query","breeze","EntityQuery","from","Predicate","where","cachedEntities","executeQueryLocally","fetched","executeQuery","originalError","queryString","toJSON","details","httpResponse","queryResults","results","entity","buildEntityErrorString","entityErrors","entityName","flattenedEntity","errorString","entityError","entityAspect","getValidationErrors","entityGroup","entityType","shortName","flattenEntity","errorMessage","saveAnon","entities","getAdapterInstance","saveOptions","SaveOptions","resourceName","saveChanges","saveResult","saveAdmin","location","reload","saveMember","cancelChanges","rejectChanges","generateGuid","entityTypeName","metadataStore","getEntityType","dataProperties","forEach","Repository","currentYear","getFullYear","FooterPublic","repository","basketId","joinInviteId","joinToken","spaName","modal","modalParent","clickEvent","messageEvent","inviteRequested","hasEnrollment","enrollmentOpen","isCommunityMember","liveUrlImages","breezeMgr","getCookie","v","cookie","match","openInviteModal","classList","add","remove","closeInviteModal","eventtarget","contains","attached","querySelector","addEventListener","processMessage","iframe","getElementById","style","height","frameHeight","enrollment","getEntities","today","openDate","friendlyOpenDate","detached","removeEventListener","NavPublic","unknownRoute","route","settings","spa","nav","title","routeArray","valueStr","description","category","level","Warning","hexChr","rhex","num","str","charAt","str2blks_MD5","nblk","blks","Array","charCodeAt","x","y","lsw","rol","cnt","cmn","q","ff","gg","hh","ii","calcMD5","olda","oldb","oldc","oldd","lookups","bindingEngine","routes","logger","getLogger","routerReady","lookupsError","routeBuilder","configureRouter","options","pushState","addAuthorizeStep","AuthorizeStep","map","mapUnknownRoutes","instruction","fragment","subscription","collectionObserver","subscribe","routerConfigured","splices","dispose","navEvent","consentCookie","gtag","getUserInfo","getPerson","activate","personData","App","run","navigationInstruction","next","getAllInstructions","some","authorize","cancel","navigateToRoute","page","replace","cb","require","trialVideos","trialMaterials","buildTrialUsage","engagements","newVideo","vTrackers","resourceGroup","resourceType","vTracker","videoId","newMaterial","mTrackers","mTracker","materialId","responseData","eTrackers","engagementTrackers","Lookups","aurelia","use","standardConfiguration","plugin","dsn","ignoreErrors","release","beforeSend","hint","urlTag","tags","url","toString","alert","integrations","BrowserTracing","tracesSampleRate","maxValueLength","baseUrl","getElementsByTagName","href","withBaseUrl","start","then","setRoot","warnings","wForgottenReturn","longStackTraces","entityManager","createEntityManagerAsync","initializeAdapterInstance","NamingConvention","camelCase","setAsDefault","copyEntityManager","EntityManager","fetchMetadata","getEntityManager","setBreezeHeaders","requestInterceptor","requestInfo","copy","createEmptyCopy","entityChanged","logChanges","getKey","entityAction","getName","EntityAction","PropertyChange","pcArgs","args","propertyName","oldValue","newValue","EntityStateChange","entityState"],"mappings":"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","file":"blog.3952ebf8de563bf8f5c8.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t1: 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"\" + ({\"2\":\"blog-async-home\",\"3\":\"blog-async-notfound\",\"4\":\"blog-async-post\",\"6\":\"blog-vendor-algolia\"}[chunkId]||chunkId) + \".\" + {\"0\":\"03075025fc808c5f5823\",\"2\":\"920bfad49dddc9d9f33a\",\"3\":\"1765a1d0eca262921fc5\",\"4\":\"358e7534b35803714be7\",\"6\":\"b18402e0e6773b9c22cd\",\"8\":\"36fdc2c1cc4b13b953e8\",\"9\":\"b86a4a5dbecd0396298d\",\"10\":\"d98de8674a4aeb104ce3\",\"11\":\"055b05a1294def65923c\",\"12\":\"af62c52b5334d80c3db0\",\"13\":\"4f2ccdc4f0d36b761d9f\",\"14\":\"e0ee8b50df02df02c100\",\"15\":\"4d6cbde5af68b8af4033\",\"16\":\"a2af37f3204fe83a3ac6\",\"17\":\"e0a720d9959c98b07cde\"}[chunkId] + \".js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\t// create error before stack unwound to get useful stacktrace later\n \t\t\t\tvar error = new Error();\n \t\t\t\tfunction loadScript(src, retries) {\n \t\t\t\t var script = document.createElement('script');\n \t\t\t\t var retryAttempt = 3 - retries + 1;\n \t\t\t\t var retryAttemptString = '&retry-attempt=' + retryAttempt;\n \t\t\t\t var onScriptComplete;\n\n \t\t\t\t script.charset = 'utf-8';\n \t\t\t\t script.timeout = 120;\n \t\t\t\t if (__webpack_require__.nc) {\n \t\t\t\t script.setAttribute('nonce', __webpack_require__.nc);\n \t\t\t\t }\n \t\t\t\t script.src = src;\n\n \t\t\t\t onScriptComplete = function(event) {\n \t\t\t\t // avoid mem leaks in IE.\n \t\t\t\t script.onerror = script.onload = null;\n \t\t\t\t clearTimeout(timeout);\n \t\t\t\t var chunk = installedChunks[chunkId];\n \t\t\t\t if (chunk !== 0) {\n \t\t\t\t if (chunk) {\n \t\t\t\t if (retries === 0) {\n \t\t\t\t var errorType =\n \t\t\t\t event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t var realSrc = event && event.target && event.target.src;\n \t\t\t\t error.message =\n \t\t\t\t 'Loading chunk ' +\n \t\t\t\t chunkId +\n \t\t\t\t ' failed after 3 retries.\\n(' +\n \t\t\t\t errorType +\n \t\t\t\t ': ' +\n \t\t\t\t realSrc +\n \t\t\t\t ')';\n \t\t\t\t error.name = 'ChunkLoadError';\n \t\t\t\t error.type = errorType;\n \t\t\t\t error.request = realSrc;\n \t\t\t\t chunk[1](error);\n \t\t\t\t installedChunks[chunkId] = undefined;\n \t\t\t\t } else {\n \t\t\t\t setTimeout(function() {\n \t\t\t\t var cacheBust = 'cache-bust=true' + retryAttemptString;\n \t\t\t\t var retryScript = loadScript(\n \t\t\t\t jsonpScriptSrc(chunkId) + '?' + cacheBust,\n \t\t\t\t retries - 1\n \t\t\t\t );\n \t\t\t\t document.head.appendChild(retryScript);\n \t\t\t\t }, 0);\n \t\t\t\t }\n \t\t\t\t } else {\n \t\t\t\t installedChunks[chunkId] = undefined;\n \t\t\t\t }\n \t\t\t\t }\n \t\t\t\t };\n \t\t\t\t var timeout = setTimeout(function() {\n \t\t\t\t onScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t }, 120000);\n \t\t\t\t script.onerror = script.onload = onScriptComplete;\n \t\t\t\t return script;\n \t\t\t\t}\n\n \t\t\t\tvar script = loadScript(jsonpScriptSrc(chunkId), 3);\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"https://js.thecuriouspianoteachers.org/spa/blog/\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([0,5,7]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","import { Router } from 'aurelia-router';\r\nimport { autoinject, camelCase } from 'aurelia-framework';\r\nimport { HttpClient, json } from 'aurelia-fetch-client';\r\nimport { EventAggregator } from 'aurelia-event-aggregator';\r\nimport {\r\n IApiResponse, IRegisterModel, ILoginModel, IUserInfo, ITrialVideo, ITrialMaterial,\r\n IResetPasswordModel, IConfirmAccountModel, IChangePasswordModel,\r\n IChangeUserNameModel, IPurchase, IBasketItemTransactionItem,\r\n IGetDataParams, IEntityPerson, IZoomRegisterModel, IConfirmChangeEmailModel,\r\n IProductOption, IEngagement, IPurchases,\r\n} from '@shared/interfaces/interfaces';\r\nimport { setBreezeHeaders } from '@data/entity-manager-factory';\r\nimport { Md5 } from './md5';\r\nimport { SentryValueConverter } from '@shared/value-converters/sentry';\r\nimport isBefore from 'date-fns/isBefore';\r\nimport startOfDay from 'date-fns/startOfDay';\r\nimport isEqual from 'date-fns/isEqual';\r\n// import * as toCamelCase from 'camelcase-keys';\r\n// import { resolve, reject } from 'bluebird';\r\n\r\n@autoinject\r\nexport class IdentityHelpers {\r\n\r\n private router: Router;\r\n public showContent: boolean = false;\r\n public refreshData: boolean = false;\r\n public httpClient: HttpClient;\r\n private md5: Md5;\r\n private sentry: SentryValueConverter;\r\n public firstRequest: boolean = true;\r\n readonly baseAddress: string = '/api/account';\r\n public user: IUserInfo = {\r\n IsAuthenticated: false,\r\n UserName: '',\r\n Roles: [],\r\n AntiForgeryToken: '',\r\n IsFullyConfirmed: false,\r\n PersonId: '',\r\n IsActiveCommunity: false,\r\n CommunityExpired: false,\r\n Person: null,\r\n Purchases: [],\r\n CourseProductOptions: [],\r\n SessionEngagement: [],\r\n HadCommunity: false,\r\n CancelledCommunity: false,\r\n TrialCommunity: false,\r\n Trial7Days: false,\r\n Webinars: [],\r\n };\r\n public defaultPaymentMethod: any = null;\r\n public hideNav: boolean = false;\r\n public isCourses: boolean = false;\r\n public antiForgeryDone: boolean = false;\r\n public forceAntiForgeryUpdate: boolean = false;\r\n private ea: EventAggregator;\r\n public gotUserInfo: boolean = false;\r\n public status: string = '';\r\n public error406: string =\r\n 'Error: we protect our site against attacks by using a cookie, which is missing or invalid. Please refresh the page and try again. ' +\r\n 'If you have disabled cookies, you will need to enable them for this site in order for it to work properly. ' +\r\n 'If you continue to see this message, your security cookie might have expired. Please clear all browser cookies for ' +\r\n 'thecuriouspianoteachers.org and try again - everything should then work as normal. We apologise for any inconvenience.';\r\n\r\n constructor(router: Router, ea: EventAggregator, md5: Md5, sentry: SentryValueConverter) {\r\n this.router = router;\r\n this.httpClient = new HttpClient();\r\n // .configure((x: any) => {\r\n // x.defaults.cache = 'no-cache';\r\n // });\r\n this.ea = ea;\r\n this.md5 = md5;\r\n this.sentry = sentry;\r\n // this.lookups = lookups;\r\n }\r\n\r\n hasExpired(date: Date) {\r\n return !isBefore(startOfDay(new Date()), date);\r\n }\r\n\r\n hasExpiredOrEqualTo(date: Date) {\r\n return !isBefore(startOfDay(new Date()), startOfDay(date))\r\n || isEqual(startOfDay(new Date()), startOfDay(date));\r\n }\r\n\r\n buildPurchases(person: IEntityPerson, forAdmin?: boolean): IPurchases {\r\n\r\n const purchaseHistory: IPurchases = {\r\n purchases: [], courseProductOptions: [], hadCommunity: false,\r\n cancelledCommunity: false, trialCommunity: false, trial7days: false,\r\n };\r\n let purchase: IPurchase;\r\n let courseProductOption: IProductOption;\r\n let transactionItems: IBasketItemTransactionItem[];\r\n let transactionItem: IBasketItemTransactionItem;\r\n const userPurchases: IPurchase[] = [];\r\n const courseProductOptions: IProductOption[] = [];\r\n let hadCommunity: boolean = false;\r\n let cancelledCommunity: boolean = false;\r\n let trialCommunity: boolean = false;\r\n let trial7days: boolean = false;\r\n\r\n // if (this.user?.Person) {\r\n\r\n // this.user.Purchases = [];\r\n // console.log(this.user.Person.orders);\r\n\r\n // for (const order of this.user.Person.orders) {\r\n\r\n const orders: any = person.orders;\r\n\r\n orders.sort((a: any, b: any) => {\r\n const dateA: any = new Date(a.createdDate);\r\n const dateB: any = new Date(b.createdDate);\r\n return dateB - dateA;\r\n });\r\n\r\n for (const order of orders) {\r\n\r\n order.basket.basketItems.sort((a: any, b: any) => {\r\n const dateA: any = new Date(a.updatedDate);\r\n const dateB: any = new Date(b.updatedDate);\r\n return dateB - dateA;\r\n });\r\n\r\n for (const basketItem of order.basket.basketItems) {\r\n\r\n if ((basketItem.isActive || (person.isCommunity && !person.isActiveCommunity))\r\n || basketItem.isCancelled) {\r\n\r\n if (basketItem.subscriptionId && basketItem.subscriptionId.length > 0) {\r\n hadCommunity = true;\r\n cancelledCommunity = basketItem.isCancelled;\r\n\r\n if (person.isActiveCommunity &&\r\n basketItem.isActive &&\r\n basketItem.firstBillingDate &&\r\n !this.hasExpired(basketItem.firstBillingDate)) {\r\n trialCommunity = true;\r\n trial7days = basketItem.productOption.planId.indexOf('7days') > -1;\r\n }\r\n\r\n }\r\n\r\n transactionItems = [];\r\n\r\n purchase = {\r\n orderDate: basketItem.createdDate,\r\n startDate: basketItem.productOption.startDate,\r\n basketItemName: basketItem.itemName,\r\n productName: basketItem.product.name,\r\n productIsCommunity: basketItem.product.isCommunity,\r\n productRequiresCommunity: basketItem.product.requiresCommunity,\r\n productOptionId: basketItem.productOptionId,\r\n productOptionName: basketItem.productOption.name,\r\n productOptionPriceDesc: basketItem.productOption.priceDescription,\r\n productOptionCurrency: basketItem.productOption.currency,\r\n productOptionSchedule: basketItem.productOption.paymentSchedule,\r\n productOptionGroupId: basketItem.productOption.productOptionGroupId,\r\n productOptionUpgradeId: basketItem.productOption.productOptionUpgradeId,\r\n productOptionPlanId: basketItem.productOption.planId,\r\n basketItemId: basketItem.basketItemId,\r\n basketItemQuantity: basketItem.quantity,\r\n basketItemPrice: basketItem.price,\r\n basketItemDiscountCode: basketItem.discountCode,\r\n basketItemVatPercentage: basketItem.vatPercentage,\r\n basketItemSubscriptionId: basketItem.subscriptionId,\r\n basketItemIsActive: basketItem.isActive,\r\n basketItemIsCancelled: basketItem.isCancelled,\r\n basketItemCancelledDate: basketItem.cancelledDate,\r\n basketItemCancelledBy: basketItem.cancelledBy,\r\n basketItemCancellationReason: basketItem.cancellationReason,\r\n basketItemTransactionItems: [],\r\n basketItemFirstBillingDate: basketItem.firstBillingDate,\r\n person: order.basket.person,\r\n };\r\n\r\n if (basketItem.productOption.courseId && basketItem.isActive) {\r\n\r\n courseProductOption = {\r\n productOptionId: basketItem.productOption.productOptionId,\r\n productName: basketItem.product.name,\r\n productOptionName: basketItem.productOption.name,\r\n courseId: basketItem.productOption.courseId,\r\n course: basketItem.productOption.course,\r\n friendlyId: basketItem.productOption.friendlyId,\r\n friendlyUrl: basketItem.productOption.course.friendlyUrl,\r\n purchaseDate: basketItem.updatedDate,\r\n startDate: basketItem.productOption.startDate,\r\n };\r\n\r\n courseProductOptions.push(courseProductOption);\r\n }\r\n\r\n const tItems: any = basketItem.transactionItems;\r\n\r\n tItems.sort((a: any, b: any) => {\r\n const dateA: any = new Date(a.createdDate);\r\n const dateB: any = new Date(b.createdDate);\r\n return dateB - dateA;\r\n });\r\n\r\n for (const tItem of tItems) {\r\n // exclude transactions for update payment method, resume subscription\r\n // or failed one-off transactions (i.e. only include failed recurring)\r\n if (tItem.transaction.notes.toLowerCase().indexOf('update') === -1 &&\r\n // tItem.transaction.notes.toLowerCase().indexOf('resume') === -1 &&\r\n tItem.transaction.notes.toLowerCase().indexOf('migrate') === -1 &&\r\n // tItem.transaction.notes.toLowerCase().indexOf('upgrade') === -1 &&\r\n tItem.transaction.amount !== 0 &&\r\n ((tItem.transaction.subscriptionId && tItem.transaction.billingStartDate)\r\n || tItem.transaction.invoiceNumber)) {\r\n transactionItem = {\r\n transactionItemId: tItem.transactionItemId,\r\n amount: tItem.transaction.amount > 0 && basketItem.productOption.courseId ?\r\n tItem.basketItem.price : tItem.transaction.amount,\r\n transaction: {\r\n transactionDate: tItem.transaction.createdDate,\r\n currency: tItem.transaction.currency,\r\n amount: tItem.transaction.amount,\r\n source: tItem.transaction.source,\r\n status: tItem.transaction.status,\r\n userNotes: tItem.transaction.userNotes,\r\n invoiceNumber: tItem.transaction.invoiceNumber,\r\n transactionId: tItem.transaction.transactionId,\r\n billingStartDate: tItem.transaction.billingStartDate,\r\n billingEndDate: tItem.transaction.billingEndDate,\r\n // subscriptionId: tItem.transaction.subscriptionId,\r\n },\r\n };\r\n transactionItems.push(transactionItem);\r\n }\r\n }\r\n\r\n purchase.basketItemTransactionItems = transactionItems;\r\n\r\n // this.user.Purchases.push(purchase);\r\n userPurchases.push(purchase);\r\n }\r\n }\r\n }\r\n\r\n purchaseHistory.purchases = userPurchases;\r\n\r\n if (!forAdmin) {\r\n this.user.Purchases = userPurchases;\r\n this.user.CourseProductOptions = courseProductOptions;\r\n this.user.HadCommunity = hadCommunity;\r\n this.user.CancelledCommunity = cancelledCommunity;\r\n this.user.TrialCommunity = trialCommunity;\r\n this.user.Trial7Days = trial7days;\r\n } else {\r\n purchaseHistory.cancelledCommunity = cancelledCommunity;\r\n purchaseHistory.hadCommunity = hadCommunity;\r\n purchaseHistory.courseProductOptions = courseProductOptions;\r\n purchaseHistory.trialCommunity = trialCommunity;\r\n purchaseHistory.trial7days = trial7days;\r\n }\r\n\r\n // }\r\n console.log(purchaseHistory);\r\n return purchaseHistory;\r\n }\r\n\r\n async addAntiForgeryTokenAsync(): Promise {\r\n\r\n this.antiForgeryDone = false;\r\n // const self = this;\r\n\r\n try {\r\n const response: Response =\r\n await this.httpClient.fetch(`${this.baseAddress}/antiforgerytokens?t=${Date.now()}`);\r\n // const reportData = this.sentry.toView(\r\n // 'AF Response', response);\r\n const token = await response.json();\r\n this.user.AntiForgeryToken = token.text;\r\n return Promise.resolve('OK');\r\n } catch (err) {\r\n const reportError = this.sentry.toView(\r\n 'Identity error (addAntiForgeryTokenAsync)',\r\n err);\r\n return Promise.reject(err);\r\n }\r\n\r\n }\r\n\r\n async updateHttpClientHeadersAsync(): Promise {\r\n\r\n const promise: any = new Promise((resolve, reject) => {\r\n console.log(this.user.AntiForgeryToken);\r\n this.httpClient.configure((config) => {\r\n config.withDefaults({\r\n headers: {\r\n __RequestVerificationToken: this.user.AntiForgeryToken,\r\n //'x-csrf-token-header-cpt': this.user.AntiForgeryToken,\r\n 'x-csrf-token-header-cpt-sso': this.user.AntiForgeryToken,\r\n 'Cache-Control': 'no-cache',\r\n },\r\n // cache: 'no-cache',\r\n });\r\n });\r\n setBreezeHeaders(this.user.AntiForgeryToken);\r\n this.ea.publish('antiForgeryDone', { value: true });\r\n this.antiForgeryDone = true;\r\n // console.log(this.httpClient);\r\n return resolve('OK');\r\n });\r\n\r\n return promise;\r\n }\r\n\r\n async initialiseIdentityAsync(): Promise {\r\n\r\n const promise: any = new Promise(async (resolve, reject) => {\r\n\r\n try {\r\n\r\n // if (!this.antiForgeryDone || this.forceAntiForgeryUpdate) {\r\n await this.addAntiForgeryTokenAsync();\r\n await this.updateHttpClientHeadersAsync();\r\n // }\r\n\r\n this.forceAntiForgeryUpdate = false;\r\n\r\n return resolve('OK');\r\n\r\n } catch (err) {\r\n const reportError = this.sentry.toView(\r\n 'Identity error (initialiseIdentityAsync)',\r\n err);\r\n return resolve(err);\r\n }\r\n\r\n });\r\n\r\n return promise;\r\n\r\n }\r\n\r\n async registerAsync(requestModel: IRegisterModel): Promise {\r\n\r\n const apiResponse = {};\r\n\r\n const promise: Promise = new Promise(async (resolve, reject) => {\r\n\r\n try {\r\n\r\n const response =\r\n await this.httpClient.fetch(`${this.baseAddress}/register?t=${Date.now()}`, {\r\n method: 'POST',\r\n body: json(requestModel),\r\n });\r\n\r\n apiResponse.statusCode = response.status;\r\n const result = await response.json();\r\n\r\n if (apiResponse.statusCode === 200) {\r\n apiResponse.message = `Registration successful - ${result.UserName}`;\r\n } else {\r\n apiResponse.message = `Registration failed: ${result.message}`;\r\n\r\n const reportError = this.sentry.toView(\r\n `Identity error (registerAsync): ${requestModel.userName}`,\r\n `Status code: ${response.status}. Message: ${result.message}`);\r\n }\r\n return resolve(apiResponse);\r\n\r\n } catch (err) {\r\n\r\n console.log(err);\r\n\r\n if (apiResponse.statusCode === 406) {\r\n apiResponse.message = this.error406;\r\n } else {\r\n apiResponse.message = 'Registration failed: server API error. ' +\r\n 'Please try again later.';\r\n }\r\n\r\n const reportError = this.sentry.toView(\r\n `Identity error (registerAsync): ${requestModel.userName}`,\r\n err);\r\n\r\n return resolve(apiResponse);\r\n\r\n }\r\n\r\n });\r\n\r\n return promise;\r\n\r\n }\r\n\r\n async loginAsync(requestModel: ILoginModel): Promise {\r\n\r\n const apiResponse = {};\r\n\r\n const promise: Promise = new Promise(async (resolve, reject) => {\r\n\r\n try {\r\n\r\n const response = await this.httpClient.fetch(`${this.baseAddress}/login?t=${Date.now()}`, {\r\n method: 'POST',\r\n body: json(requestModel),\r\n });\r\n\r\n apiResponse.statusCode = response.status;\r\n const result = await response.json();\r\n\r\n if (apiResponse.statusCode === 200) {\r\n apiResponse.message = `Login successful - ${result.UserName}`;\r\n this.user.AntiForgeryToken = result.Token;\r\n await this.updateHttpClientHeadersAsync();\r\n // this.forceAntiForgeryUpdate = true;\r\n this.updateUserInfo(result);\r\n } else {\r\n const reportError = this.sentry.toView(\r\n `Identity error (loginAsync): ${requestModel.userName}`,\r\n `Status code: ${response.status}. Message: ${result.message}`);\r\n apiResponse.message = result.message;\r\n }\r\n resolve(apiResponse);\r\n\r\n } catch (err) {\r\n\r\n if (apiResponse.statusCode === 406) {\r\n apiResponse.message = this.error406;\r\n } else {\r\n apiResponse.message = 'Sorry, there was a server error. Please try again later.';\r\n }\r\n const reportError = this.sentry.toView(\r\n `Identity error (loginAsync): ${requestModel.userName}`,\r\n err);\r\n resolve(apiResponse);\r\n\r\n }\r\n\r\n });\r\n\r\n return promise;\r\n\r\n }\r\n\r\n async logoutAsync(): Promise {\r\n\r\n const apiResponse = {};\r\n let response: Response;\r\n const promise: Promise = new Promise(async (resolve, reject) => {\r\n\r\n try {\r\n\r\n response = await this.httpClient.fetch(`${this.baseAddress}/logout?t=${Date.now()}`, {\r\n method: 'POST',\r\n });\r\n\r\n apiResponse.statusCode = response.status;\r\n const result = await response.json();\r\n\r\n if (apiResponse.statusCode === 200) {\r\n apiResponse.message = 'You have successfully logged out.';\r\n this.user.AntiForgeryToken = result.Token;\r\n await this.updateHttpClientHeadersAsync();\r\n // this.forceAntiForgeryUpdate = true;\r\n this.updateUserInfo(result);\r\n } else {\r\n apiResponse.message = result.message;\r\n const reportError = this.sentry.toView(\r\n 'Identity error (logoutAsync)',\r\n `Status code: ${response.status}. Message: ${result.message}`);\r\n }\r\n return resolve(apiResponse);\r\n\r\n } catch (err) {\r\n\r\n if (apiResponse.statusCode === 406) {\r\n apiResponse.message = this.error406;\r\n } else {\r\n apiResponse.message = 'Sorry, there was a server error. Please try again later.';\r\n }\r\n const reportError = this.sentry.toView(\r\n 'Identity error (logoutAsync)',\r\n err);\r\n\r\n const reportStatus = this.sentry.toView(\r\n `Repository (getData) user status: IsAuthenticated = ${this.user.IsAuthenticated}.\r\n UserName = ${this.user.UserName}. PersonId = ${this.user.PersonId}.\r\n IsActiveCommunity = ${this.user.IsActiveCommunity}`);\r\n\r\n const reportData = this.sentry.toView(\r\n `Logout status code: ${apiResponse.statusCode}`);\r\n\r\n // reportData = this.sentry.toView(\r\n // 'Logout response', response);\r\n\r\n return resolve(apiResponse);\r\n\r\n }\r\n\r\n });\r\n\r\n return promise;\r\n }\r\n\r\n async getUserInfoAsync(): Promise {\r\n\r\n const apiResponse = {};\r\n const promise: Promise = new Promise(async (resolve, reject) => {\r\n\r\n try {\r\n\r\n const response = await this.httpClient.fetch(\r\n `${this.baseAddress}/userInfo?t=${Date.now()}`, {\r\n method: 'GET',\r\n });\r\n\r\n apiResponse.statusCode = response.status;\r\n const result = await response.json();\r\n\r\n // result.Person = toCamelCase(result.Person);\r\n\r\n if (apiResponse.statusCode === 200 && result.IsAuthenticated) {\r\n // this.status = '. User logged in - ' + result.UserName;\r\n this.updateUserInfo(result);\r\n } else {\r\n // this.status = result.message;\r\n this.gotUserInfo = true;\r\n\r\n if (apiResponse.statusCode !== 200) {\r\n const reportError = this.sentry.toView(\r\n 'Identity error (getUserInfoAsync)',\r\n `Status code: ${response.status}. Message: ${result.message}`);\r\n }\r\n\r\n }\r\n\r\n return resolve(apiResponse);\r\n\r\n } catch (err) {\r\n\r\n apiResponse.message = 'Failed to retrieve user info: server API error. ' +\r\n 'Please try again later.';\r\n\r\n const reportError = this.sentry.toView(\r\n 'Identity error (getUserInfoAsync)',\r\n err);\r\n\r\n return resolve(apiResponse);\r\n\r\n }\r\n\r\n });\r\n\r\n return promise;\r\n\r\n }\r\n\r\n async testAsync(): Promise {\r\n\r\n const apiResponse = {};\r\n const promise: Promise = new Promise(async (resolve, reject) => {\r\n\r\n const response = await\r\n this.httpClient.fetch('/api/task/sendInviteActivationsIfEnrollmentOpen?t=${Date.now()}', {\r\n method: 'GET',\r\n });\r\n\r\n console.log(response);\r\n apiResponse.statusCode = response.status;\r\n const result = await response.json();\r\n\r\n console.log(apiResponse.statusCode);\r\n console.log(result);\r\n return resolve(apiResponse);\r\n\r\n });\r\n\r\n return promise;\r\n\r\n }\r\n\r\n updateUserInfo(userInfo: IUserInfo) {\r\n\r\n const { IsAuthenticated, Roles, UserName, IsFullyConfirmed, PersonId,\r\n IsActiveCommunity, Person, CommunityExpired } = userInfo;\r\n\r\n this.user.IsAuthenticated = IsAuthenticated;\r\n this.user.Roles = Roles;\r\n this.user.UserName = UserName;\r\n this.user.IsFullyConfirmed = IsFullyConfirmed;\r\n this.user.PersonId = PersonId;\r\n this.user.IsActiveCommunity = IsActiveCommunity;\r\n this.user.CommunityExpired = CommunityExpired;\r\n\r\n // now null\r\n this.user.Person = Person;\r\n this.gotUserInfo = true;\r\n\r\n }\r\n\r\n isUserInRole(rolesAllowed: string) {\r\n\r\n let filteredRoles: never[] = [];\r\n\r\n if (this.user.Roles) {\r\n filteredRoles = this.user.Roles.filter((item: any) => {\r\n return rolesAllowed.indexOf(item) > -1;\r\n });\r\n }\r\n\r\n return filteredRoles.length > 0;\r\n }\r\n\r\n async requestResetAsync(userName: string, context: string): Promise {\r\n\r\n const apiResponse = {};\r\n const promise: Promise = new Promise(async (resolve, reject) => {\r\n\r\n try {\r\n\r\n const response = await this.httpClient.fetch(`${this.baseAddress}/sendResetEmail?t=${Date.now()}`, {\r\n method: 'POST',\r\n body: json({ userName, context, emailAddress: userName }),\r\n });\r\n\r\n apiResponse.statusCode = response.status;\r\n const result = await response.json();\r\n\r\n if (apiResponse.statusCode === 200) {\r\n apiResponse.message = `We have sent you an email containing a link to ${context === 'forgot' ? 'reset' : 'set'} your password. Please click this link and follow the instructions.`;\r\n } else {\r\n apiResponse.message = result.message;\r\n const reportError = this.sentry.toView(\r\n `Identity error (requestResetAsync): ${userName}`,\r\n `Status code: ${response.status}. Message: ${result.message}`);\r\n }\r\n return resolve(apiResponse);\r\n\r\n } catch (err) {\r\n\r\n if (apiResponse.statusCode === 406) {\r\n apiResponse.message = this.error406;\r\n } else {\r\n apiResponse.message = 'Sorry, there was a server error. Please try again later.';\r\n }\r\n const reportError = this.sentry.toView(\r\n `Identity error (requestResetAsync): ${userName}`,\r\n err);\r\n return resolve(apiResponse);\r\n\r\n }\r\n\r\n });\r\n\r\n return promise;\r\n\r\n }\r\n\r\n async resetPasswordAsync(requestModel: IResetPasswordModel): Promise {\r\n\r\n const apiResponse = {};\r\n const promise: Promise = new Promise(async (resolve, reject) => {\r\n\r\n try {\r\n\r\n const response = await this.httpClient.fetch(`${this.baseAddress}/resetPassword?t=${Date.now()}`, {\r\n method: 'POST',\r\n body: json(requestModel),\r\n });\r\n\r\n apiResponse.statusCode = response.status;\r\n const result = await response.json();\r\n\r\n if (apiResponse.statusCode === 200) {\r\n apiResponse.message = `You have successfully ${requestModel.context === 'reset' ? 'reset' : 'set'} your password. Please use this new password to login.`;\r\n } else {\r\n const reportError = this.sentry.toView(\r\n `Identity error (resetPasswordAsync) for personId: ${requestModel.personId}`,\r\n `Status code: ${response.status}. Message: ${result.message}`);\r\n apiResponse.message = result.message;\r\n }\r\n return resolve(apiResponse);\r\n\r\n } catch (err) {\r\n\r\n if (apiResponse.statusCode === 406) {\r\n apiResponse.message = this.error406;\r\n } else {\r\n apiResponse.message = 'Sorry, there was a server error. Please try again later.';\r\n }\r\n const reportError = this.sentry.toView(\r\n `Identity error (resetPasswordAsync) for personId: ${requestModel.personId}`,\r\n err);\r\n return resolve(apiResponse);\r\n\r\n }\r\n\r\n });\r\n\r\n return promise;\r\n\r\n }\r\n\r\n async confirmAccountAsync(requestModel: IConfirmAccountModel): Promise {\r\n\r\n const apiResponse = {};\r\n const promise: Promise = new Promise(async (resolve, reject) => {\r\n\r\n try {\r\n\r\n const response = await this.httpClient.fetch(`${this.baseAddress}/confirmAccount?t=${Date.now()}`, {\r\n method: 'POST',\r\n body: json(requestModel),\r\n });\r\n\r\n apiResponse.statusCode = response.status;\r\n const result = await response.json();\r\n\r\n if (apiResponse.statusCode === 200) {\r\n apiResponse.message = 'You have successfully confirmed your account.';\r\n } else {\r\n const reportError = this.sentry.toView(\r\n `Identity error (confirmAccountAsync) for personId: ${requestModel.personId}`,\r\n `Status code: ${response.status}. Message: ${result.message}`);\r\n apiResponse.message = result.message;\r\n }\r\n return resolve(apiResponse);\r\n\r\n } catch (err) {\r\n\r\n if (apiResponse.statusCode === 406) {\r\n apiResponse.message = this.error406;\r\n } else {\r\n apiResponse.message = 'Sorry, there was a server error. Please try again later.';\r\n }\r\n const reportError = this.sentry.toView(\r\n `Identity error (confirmAccountAsync) for personId: ${requestModel.personId}`,\r\n err);\r\n return resolve(apiResponse);\r\n\r\n }\r\n\r\n });\r\n\r\n return promise;\r\n\r\n }\r\n\r\n async confirmEmailChangeAsync(requestModel: IConfirmChangeEmailModel): Promise {\r\n\r\n const apiResponse = {};\r\n const promise: Promise = new Promise(async (resolve, reject) => {\r\n\r\n try {\r\n\r\n const response = await this.httpClient.fetch(`${this.baseAddress}/confirmEmailChange?t=${Date.now()}`, {\r\n method: 'POST',\r\n body: json(requestModel),\r\n });\r\n\r\n apiResponse.statusCode = response.status;\r\n const result = await response.json();\r\n\r\n if (apiResponse.statusCode === 200) {\r\n apiResponse.message = 'You have successfully changed your email address. Please log in with the new address on future visits.';\r\n } else {\r\n const reportError = this.sentry.toView(\r\n `Identity error (confirmEmailChangeAsync) for personId: ${requestModel.personId}`,\r\n `Status code: ${response.status}. Message: ${result.message}`);\r\n apiResponse.message = result.message;\r\n }\r\n return resolve(apiResponse);\r\n\r\n } catch (err) {\r\n\r\n if (apiResponse.statusCode === 406) {\r\n apiResponse.message = this.error406;\r\n } else {\r\n apiResponse.message = 'Sorry, there was a server error. Please try again later.';\r\n }\r\n const reportError = this.sentry.toView(\r\n `Identity error (confirmEmailChangeAsync) for personId: ${requestModel.personId}`,\r\n err);\r\n return resolve(apiResponse);\r\n\r\n }\r\n\r\n });\r\n\r\n return promise;\r\n\r\n }\r\n\r\n async resendConfirmationAsync(context: string): Promise {\r\n\r\n const apiResponse = {};\r\n const promise: Promise = new Promise(async (resolve, reject) => {\r\n\r\n try {\r\n\r\n const response = await this.httpClient.fetch(`${this.baseAddress}/resendConfirmation?t=${Date.now()}`, {\r\n method: 'POST',\r\n body: json({\r\n emailAddress: this.user.UserName, userName: this.user.UserName,\r\n resendContext: context,\r\n }),\r\n });\r\n\r\n apiResponse.statusCode = response.status;\r\n const result = await response.json();\r\n\r\n if (apiResponse.statusCode === 200) {\r\n apiResponse.message = 'Confirmation email successfully sent - ' +\r\n 'please click on the link in the email we have just sent you';\r\n } else {\r\n const reportError = this.sentry.toView(\r\n `Identity error (resendConfirmationAsync): ${this.user.UserName}`,\r\n `Status code: ${response.status}. Message: ${result.message}`);\r\n apiResponse.message = result.message;\r\n }\r\n return resolve(apiResponse);\r\n\r\n } catch (err) {\r\n\r\n if (apiResponse.statusCode === 406) {\r\n apiResponse.message = this.error406;\r\n } else {\r\n apiResponse.message = 'Sorry, there was a server error. Please try again later.';\r\n }\r\n const reportError = this.sentry.toView(\r\n `Identity error (resendConfirmationAsync): ${this.user.UserName}`,\r\n err);\r\n return resolve(apiResponse);\r\n\r\n }\r\n\r\n });\r\n\r\n return promise;\r\n\r\n }\r\n\r\n async changePasswordAsync(requestModel: IChangePasswordModel): Promise {\r\n\r\n const apiResponse = {};\r\n const promise: Promise = new Promise(async (resolve, reject) => {\r\n\r\n try {\r\n\r\n const response = await this.httpClient.fetch(`${this.baseAddress}/changePassword?t=${Date.now()}`, {\r\n method: 'POST',\r\n body: json(requestModel),\r\n });\r\n\r\n apiResponse.statusCode = response.status;\r\n const result = await response.json();\r\n\r\n if (apiResponse.statusCode === 200) {\r\n apiResponse.message = 'Successful - please use your new password the ' +\r\n 'next time you log in';\r\n } else {\r\n const reportError = this.sentry.toView(\r\n `Identity error (changePasswordAsync) for personId: ${requestModel.personId}`,\r\n `Status code: ${response.status}. Message: ${result.message}`);\r\n apiResponse.message = result.message;\r\n }\r\n return resolve(apiResponse);\r\n\r\n } catch (err) {\r\n\r\n if (apiResponse.statusCode === 406) {\r\n apiResponse.message = this.error406;\r\n } else {\r\n apiResponse.message = 'Sorry, there was a server error. Please try again later.';\r\n }\r\n const reportError = this.sentry.toView(\r\n `Identity error (changePasswordAsync) for personId: ${requestModel.personId}`,\r\n err);\r\n return resolve(apiResponse);\r\n\r\n }\r\n\r\n });\r\n\r\n return promise;\r\n\r\n }\r\n\r\n async changeUserNameAsync(requestModel: IChangeUserNameModel): Promise {\r\n\r\n const apiResponse = {};\r\n const promise: Promise = new Promise(async (resolve, reject) => {\r\n\r\n try {\r\n\r\n const response = await this.httpClient.fetch(`${this.baseAddress}/changeUserName?t=${Date.now()}`, {\r\n method: 'POST',\r\n body: json(requestModel),\r\n });\r\n\r\n apiResponse.statusCode = response.status;\r\n const result = await response.json();\r\n\r\n if (apiResponse.statusCode === 200) {\r\n apiResponse.message = 'IMPORTANT - we have sent a confirmation email to your new address. ' +\r\n 'Your email address will not be changed until you have clicked the link in this email.';\r\n // this.user.IsFullyConfirmed = false;\r\n this.status = 'IMPORTANT - we have sent a confirmation email to your new address. ' +\r\n 'Your email address will not be changed until you have clicked the link in this email.';\r\n } else {\r\n const reportError = this.sentry.toView(\r\n `Identity error (changeUserNameAsync): ${this.user.UserName}`,\r\n `Status code: ${response.status}. Message: ${result.message}`);\r\n apiResponse.message = result.message;\r\n }\r\n\r\n this.status = result.message;\r\n\r\n return resolve(apiResponse);\r\n\r\n } catch (err) {\r\n\r\n if (apiResponse.statusCode === 406) {\r\n apiResponse.message = this.error406;\r\n } else {\r\n apiResponse.message = 'Sorry, there was a server error. Please try again later.';\r\n }\r\n const reportError = this.sentry.toView(\r\n `Identity error (changeUserNameAsync): ${this.user.UserName}`,\r\n err);\r\n return resolve(apiResponse);\r\n\r\n }\r\n\r\n });\r\n\r\n return promise;\r\n }\r\n\r\n async checkNotExistingUserAsync(userName: string): Promise {\r\n\r\n const apiResponse = {};\r\n const promise: Promise = new Promise(async (resolve, reject) => {\r\n\r\n try {\r\n\r\n const response = await this.httpClient.fetch(`${this.baseAddress}/checkNotExistingUser?t=${Date.now()}`, {\r\n method: 'POST',\r\n body: json({ userName }),\r\n });\r\n\r\n apiResponse.statusCode = response.status;\r\n const result = await response.json();\r\n\r\n if (apiResponse.statusCode === 400) {\r\n apiResponse.message = 'Email address already exists.';\r\n } else {\r\n apiResponse.message = 'OK';\r\n }\r\n\r\n if (apiResponse.statusCode === 500) {\r\n const reportError = this.sentry.toView(\r\n `Identity error (checkNotExistingUserAsync): ${userName}`,\r\n `Status code: ${response.status}. Message: ${result.message}`);\r\n }\r\n\r\n return resolve(apiResponse);\r\n\r\n } catch (err) {\r\n\r\n // if (apiResponse.statusCode === 406) {\r\n // apiResponse.message = this.error406;\r\n // } else {\r\n // }\r\n // we let a server error here go as a duplicate email address or\r\n // CSRF error will fail later\r\n apiResponse.message = '';\r\n const reportError = this.sentry.toView(\r\n `Identity error (checkNotExistingUserAsync): ${userName}`,\r\n err);\r\n return resolve(apiResponse);\r\n\r\n }\r\n\r\n });\r\n\r\n return promise;\r\n\r\n }\r\n\r\n async zoomRegister(requestModel: IZoomRegisterModel): Promise {\r\n\r\n const apiResponse = {};\r\n const promise: Promise = new Promise(async (resolve, reject) => {\r\n\r\n try {\r\n\r\n const response = await this.httpClient.fetch(`${this.baseAddress}/zoomRegister?t=${Date.now()}`, {\r\n method: 'POST',\r\n body: json(requestModel),\r\n });\r\n\r\n apiResponse.statusCode = response.status;\r\n const result = await response.json();\r\n\r\n if (apiResponse.statusCode === 200) {\r\n apiResponse.message = 'Thanks, you have successfully registered for this webinar! Instructions on how to join the live call have been emailed to you.';\r\n } else {\r\n apiResponse.message = result.message;\r\n const reportError = this.sentry.toView(\r\n `Identity error, status not 200 (zoomRegister): ${this.user.UserName} for webinarId ${requestModel.webinarId}`,\r\n `Status code: ${response.status}. Message: ${result.message}`);\r\n }\r\n return resolve(apiResponse);\r\n\r\n } catch (err) {\r\n\r\n if (apiResponse.statusCode === 406) {\r\n apiResponse.message = this.error406;\r\n } else {\r\n apiResponse.message = 'Sorry, there was a server error. Please try again later.';\r\n }\r\n const reportError = this.sentry.toView(\r\n `Identity error (zoomRegister), exception: ${this.user.UserName} for webinarId ${requestModel.webinarId}`,\r\n err);\r\n return resolve(apiResponse);\r\n\r\n }\r\n\r\n });\r\n\r\n return promise;\r\n }\r\n\r\n isValidEmail(email: string): string {\r\n const re = /^([\\w-]+(?:\\.[\\w-]+)*)@((?:[\\w-]+\\.)*\\w[\\w-]{0,66})\\.([a-z]{2,20}(?:\\.[a-z]{2})?)$/i;\r\n const valid = email && email.trim().length > 6 ? re.test(email.trim()) : false;\r\n return valid ? '' : 'Invalid email address.';\r\n }\r\n\r\n isValidPassword(password: string, context: string): string {\r\n\r\n let score = 0;\r\n\r\n if (!password || password.length < 8) {\r\n return 'Invalid password - min 8 characters.';\r\n }\r\n\r\n if (password.indexOf(' ') > -1) {\r\n return 'Invalid password - no spaces.';\r\n }\r\n\r\n if (password.length > 20) {\r\n return 'Invalid password - max 20 characters.';\r\n }\r\n\r\n if (context === 'login' || context === 'changepwcurrent' || context === 'changeusername') {\r\n return 'OK';\r\n }\r\n\r\n // registration password is checked for strength\r\n // award every unique letter until 5 repetitions\r\n const letters: any = new Object();\r\n\r\n for (let i = 0; i < password.length; i += 1) {\r\n letters[password[i]] = (letters[password[i]] || 0) + 1;\r\n score += 6.5 / letters[password[i]];\r\n }\r\n\r\n // bonus points for mixing it up\r\n const variations: any = {\r\n digits: /\\d/.test(password),\r\n lower: /[a-z]/.test(password),\r\n upper: /[A-Z]/.test(password),\r\n nonWords: /\\W/.test(password),\r\n };\r\n\r\n let variationCount = 0;\r\n\r\n for (const check in variations) {\r\n variationCount += (variations[check] === true) ? 1 : 0;\r\n }\r\n\r\n score += (variationCount - 1) * 10;\r\n\r\n return score < 50 || variationCount < 2 ? 'Invalid password - too weak, try another.' : 'OK';\r\n\r\n }\r\n\r\n async contactAsync(message: string): Promise {\r\n\r\n const apiResponse = {};\r\n const promise: Promise = new Promise(async (resolve, reject) => {\r\n\r\n try {\r\n\r\n const response = await\r\n this.httpClient.fetch(`${this.baseAddress}/contact?t=${Date.now()}`, {\r\n method: 'POST',\r\n body: json({ message }),\r\n });\r\n\r\n apiResponse.statusCode = response.status;\r\n const result = await response.json();\r\n\r\n if (apiResponse.statusCode === 200) {\r\n apiResponse.message = \"Thanks for your message, we'll respond as soon as possible, to the email address you used to log into the site.\";\r\n } else {\r\n apiResponse.message = result.message;\r\n const reportError = this.sentry.toView(\r\n `Identity error (contactAsync): ${this.user.UserName}`,\r\n `Status code: ${response.status}. Message: ${result.message}`);\r\n }\r\n return resolve(apiResponse);\r\n\r\n } catch (err) {\r\n\r\n if (apiResponse.statusCode === 406) {\r\n apiResponse.message = this.error406;\r\n } else {\r\n apiResponse.message = 'Sorry, there was a server error. Please try again later.';\r\n }\r\n const reportError = this.sentry.toView(\r\n `Identity error (contactAsync): ${this.user.UserName}`,\r\n err);\r\n return resolve(apiResponse);\r\n\r\n }\r\n\r\n });\r\n\r\n return promise;\r\n\r\n }\r\n\r\n}\r\n","export default {\r\n serviceName: '/breeze/data',\r\n pageSize: 100,\r\n};\r\n","import { autoinject } from 'aurelia-framework';\r\nimport { createEntityManagerAsync, getEntityManager } from './entity-manager-factory';\r\nimport { IGetDataParams, IApiResponse, ILogEngagementParams, IEngagement } from '@shared/interfaces/interfaces';\r\nimport { IdentityHelpers } from '@identity/helpers';\r\nimport * as uuid from 'uuid';\r\nimport { json } from 'aurelia-fetch-client';\r\nimport { SentryValueConverter } from '@shared/value-converters/sentry';\r\n\r\n@autoinject\r\nexport class Repository {\r\n\r\n private data: any[];\r\n private dataParams: IGetDataParams | null = null;\r\n private identity!: IdentityHelpers;\r\n private sentry: SentryValueConverter;\r\n public breezeManager: breeze.EntityManager;\r\n readonly engagementAddress: string = '/api/content/logengagement';\r\n constructor(identity: IdentityHelpers, sentry: SentryValueConverter) {\r\n this.data = [];\r\n this.identity = identity;\r\n this.breezeManager = getEntityManager();\r\n this.sentry = sentry;\r\n }\r\n\r\n async getTrackers(personId: string, context? : string): Promise {\r\n\r\n const getDataParams: IGetDataParams = {\r\n apiMethod: 'EngagementTrackers',\r\n forceRemote: false,\r\n liveApiMethod: 'PersonTrackers',\r\n filterName: 'personId',\r\n filterValue: personId,\r\n checkFetched: false,\r\n };\r\n\r\n let failed: boolean = false;\r\n let error: string = '';\r\n\r\n const response = await this.getData(getDataParams)\r\n .catch((err) => {\r\n // TODO - mirror approach to repo error in basket.ts once tested\r\n console.log(`Error - status = ${err.status}`);\r\n // this.loadError = `Error retrieving data: ${err.status}`;\r\n failed = true;\r\n error = err;\r\n const reportError = this.sentry.toView(\r\n `Repository error (getTrackers) for personId: ${personId}. ${context ? `. Context: ${context}` : ''}`,\r\n err);\r\n });\r\n\r\n if (failed || !response) {\r\n return Promise.reject(error);\r\n }\r\n\r\n return Promise.resolve(response);\r\n\r\n }\r\n\r\n async logEngagement(params: ILogEngagementParams, context?: string): Promise {\r\n\r\n // if (!this.identity.antiForgeryDone || this.identity.forceAntiForgeryUpdate) {\r\n // this creates headers for http fetch client and breeze adapter\r\n await this.identity.initialiseIdentityAsync();\r\n // }\r\n\r\n const apiResponse = {};\r\n\r\n const { engagementType, engagementContentId,\r\n engagementGroupId, engagementResourceId, videoTrackerId,\r\n resourceGroupVideoId, resourceGroupMaterialId, resourceGroupWebinarId, completed } = params;\r\n\r\n const promise: Promise = new Promise(async (resolve, reject) => {\r\n\r\n try {\r\n\r\n const engagementModel: any = {\r\n videoTrackerId,\r\n resourceGroupVideoId,\r\n resourceGroupMaterialId,\r\n resourceGroupWebinarId,\r\n completed,\r\n contentId: engagementContentId,\r\n resourceGroupId: engagementGroupId,\r\n resourceId: engagementResourceId,\r\n requestType: engagementType,\r\n };\r\n\r\n const response = await this.identity.httpClient.fetch(\r\n `${this.engagementAddress}/logEngagement?t=${Date.now()}`, {\r\n method: 'POST',\r\n body: json(engagementModel),\r\n });\r\n\r\n apiResponse.statusCode = response.status;\r\n const result = await response.json();\r\n\r\n const reportData = this.sentry.toView(\r\n `Repository (logEngagement) for params: ${json(params)}`);\r\n\r\n if (apiResponse.statusCode === 200) {\r\n apiResponse.message = result.Token;\r\n } else {\r\n apiResponse.message = `Failed to log engagement: ${result.message}`;\r\n const reportError = this.sentry.toView(\r\n 'Repository error (logEngagement)',\r\n `Status code: ${apiResponse.statusCode}. Message: ${result.message}. ${context ? `. Context: ${context}` : ''}`);\r\n }\r\n return resolve(apiResponse);\r\n\r\n } catch (err) {\r\n\r\n apiResponse.message = 'Failed to log engagement: server API error. ' +\r\n 'Please try again later.';\r\n\r\n const reportError = this.sentry.toView(\r\n 'Repository error (logEngagement)',\r\n err);\r\n\r\n return resolve(apiResponse);\r\n\r\n }\r\n\r\n });\r\n\r\n return promise;\r\n\r\n }\r\n\r\n async getData(params: IGetDataParams, context?: string): Promise {\r\n\r\n const { apiMethod, filterName, filterValue, forceRemote,\r\n checkFetched, liveApiMethod, notComplete } = params;\r\n\r\n // var promise: Promise> = new Promise((resolve, reject) => {\r\n // resolve(this.test);\r\n // });\r\n // return promise;\r\n\r\n const mgr: breeze.EntityManager = getEntityManager();\r\n\r\n let query = breeze.EntityQuery\r\n .from(apiMethod);\r\n\r\n if (filterName.length) {\r\n const filter: breeze.Predicate = breeze.Predicate.create(filterName, '==', filterValue);\r\n query = query.where(filter);\r\n }\r\n\r\n // first see if we already have data in cache\r\n if (!forceRemote) {\r\n const cachedEntities: breeze.Entity[] = mgr.executeQueryLocally(query);\r\n\r\n // console.log(cachedEntities);\r\n\r\n if (cachedEntities.length > 0) {\r\n\r\n if (!checkFetched) {\r\n return Promise.resolve(cachedEntities);\r\n }\r\n\r\n // sometimes we need to make sure that the full entity is returned\r\n // so we set fetched to true when that entity is retrieved from db\r\n // and then check that value here, e.g ResourceGroups only query\r\n // does not retrieve resource elements to reduce payload until needed\r\n const e: any = cachedEntities[0];\r\n console.log(`Fetched ${filterName}: ${e.fetched}`);\r\n if (e.fetched) {\r\n return Promise.resolve(cachedEntities);\r\n }\r\n }\r\n }\r\n\r\n // fetch data from remote database if not already in cache - this may have\r\n // a different method name to the entity name, eg LibraryResources\r\n query = breeze.EntityQuery\r\n .from((liveApiMethod ? liveApiMethod : apiMethod) +\r\n (filterName ? `/${filterName}/${filterValue}/ts/${Date.now()}` : `/ts/${Date.now()}`));\r\n\r\n let failed: boolean = false;\r\n let error: string = '';\r\n let originalError: any;\r\n\r\n const queryResults = await mgr.executeQuery(query)\r\n .catch((err) => {\r\n originalError = err;\r\n const queryString: string = json(query.toJSON());\r\n failed = true;\r\n error = err && err.message ? err.message : 'No error message. ';\r\n error += err && err.details ? err.details : 'No error details. ';\r\n error += err && err.httpResponse ? `HTTP Response: ${err.httpResponse.status}` : 'No HTTP Response';\r\n\r\n const reportData = this.sentry.toView(\r\n `Repository (getData) for query: ${queryString}. ${context ? `. Context: ${context}` : ''}`);\r\n\r\n const reportStatus = this.sentry.toView(\r\n `Repository (getData) user status: IsAuthenticated = ${this.identity.user.IsAuthenticated}.\r\n UserName = ${this.identity.user.UserName}. PersonId = ${this.identity.user.PersonId}.\r\n IsActiveCommunity = ${this.identity.user.IsActiveCommunity}`);\r\n\r\n const reportError = this.sentry.toView(\r\n 'Repository error (getData)',\r\n error);\r\n\r\n let reportErrorRaw = this.sentry.toView(\r\n `Repository raw error (getData): ${originalError}`);\r\n\r\n reportErrorRaw = this.sentry.toView(\r\n 'Repository raw error (getData)', originalError);\r\n\r\n });\r\n\r\n if (failed || ! queryResults) {\r\n return Promise.reject(originalError);\r\n }\r\n\r\n if (!notComplete) {\r\n for (const entity of queryResults.results) {\r\n const e: any = entity;\r\n e.fetched = true;\r\n }\r\n }\r\n\r\n return Promise.resolve(queryResults.results);\r\n\r\n }\r\n\r\n buildEntityErrorString(entityErrors: any) {\r\n let getError: any;\r\n let entityName: string = '';\r\n let flattenedEntity: string = '';\r\n let errorString: string = '';\r\n\r\n for (const entityError of entityErrors) {\r\n getError = entityError.entity.entityAspect.getValidationErrors();\r\n entityName = entityError.entity.entityAspect.entityGroup.entityType.shortName;\r\n flattenedEntity = this.flattenEntity(entityName, entityError.entity);\r\n errorString += `\\n${entityError.errorMessage}: ${json(flattenedEntity)}`;\r\n }\r\n return errorString;\r\n }\r\n\r\n async saveAnon(entities: breeze.Entity[] | undefined, context?: string):\r\n Promise {\r\n\r\n // set up anti-forgery token if not already done\r\n // if (!this.identity.antiForgeryDone || this.identity.forceAntiForgeryUpdate) {\r\n // this creates headers for http fetch client and breeze adapter\r\n await this.identity.initialiseIdentityAsync();\r\n // }\r\n\r\n const adapter: any = breeze.config.getAdapterInstance('ajax');\r\n\r\n const saveOptions: breeze.SaveOptions = new breeze.SaveOptions({\r\n resourceName: `saveanon?ts=${Date.now()}`,\r\n });\r\n const mgr: breeze.EntityManager = getEntityManager();\r\n\r\n let failed: boolean = false;\r\n let error: string = '';\r\n\r\n const saveResult = await mgr.saveChanges(entities, saveOptions)\r\n .catch((err) => {\r\n const entityErrors: any = err.entityErrors;\r\n console.log('Save Error');\r\n console.log(err);\r\n console.log('Save Entities');\r\n console.log(entities);\r\n console.log('Entity Errors');\r\n console.log(entityErrors);\r\n failed = true;\r\n const reportData = this.sentry.toView(\r\n `Repository (saveAnon): ${this.buildEntityErrorString(entityErrors)}. ${context ? `. Context: ${context}` : ''}`);\r\n const reportError = this.sentry.toView(\r\n 'Repository errors (saveAnon)',\r\n err);\r\n error = err;\r\n });\r\n\r\n if (failed || !saveResult) {\r\n return Promise.reject(error);\r\n }\r\n\r\n // console.log(`Saved entities: ${saveResult.entities}`);\r\n\r\n return Promise.resolve(saveResult);\r\n\r\n }\r\n\r\n async saveAdmin(entities: breeze.Entity[] | undefined, context?: string):\r\n Promise {\r\n\r\n // set up anti-forgery token if not already done\r\n // if (!this.identity.antiForgeryDone || this.identity.forceAntiForgeryUpdate) {\r\n // this creates headers for http fetch client and breeze adapter\r\n await this.identity.initialiseIdentityAsync();\r\n // }\r\n\r\n const adapter: any = breeze.config.getAdapterInstance('ajax');\r\n\r\n const saveOptions: breeze.SaveOptions = new breeze.SaveOptions(\r\n { resourceName: `saveadminchanges?ts=${Date.now()}` });\r\n const mgr: breeze.EntityManager = getEntityManager();\r\n\r\n let failed: boolean = false;\r\n let error: any = {};\r\n\r\n const saveResult = await mgr.saveChanges(entities, saveOptions)\r\n .catch((err) => {\r\n const entityErrors: any = err.entityErrors;\r\n console.log('Save Error');\r\n console.log(err);\r\n console.log('Save Entities');\r\n console.log(entities);\r\n console.log('Entity Errors');\r\n console.log(entityErrors);\r\n failed = true;\r\n\r\n const reportData = this.sentry.toView(\r\n `Repository (saveAdmin): ${this.buildEntityErrorString(entityErrors)}. ${context ? `\\nContext: ${context}` : ''}`);\r\n\r\n const reportError = this.sentry.toView(\r\n 'Repository errors (saveAdmin)',\r\n err);\r\n // error = err.entityErrors ? err.entityErrors : err;\r\n error = err;\r\n // 404 = controller method not allowed (i.e. user logged out or not admin\r\n // so reload to force login)\r\n // Or not found (should never happen)\r\n // 406 = token error (probably other tabs open so reload)\r\n if (err.status === 406 || err.status === 404) {\r\n window.location.reload();\r\n }\r\n error.status = 500;\r\n });\r\n\r\n if (failed || !saveResult) {\r\n return Promise.reject(error);\r\n }\r\n\r\n console.log(saveResult);\r\n console.log(`Saved entities: ${saveResult.entities}`);\r\n\r\n return Promise.resolve(saveResult);\r\n\r\n }\r\n\r\n async saveMember(entities: breeze.Entity[] | undefined, personId: string, context?: string):\r\n Promise {\r\n\r\n // set up anti-forgery token if not already done\r\n // if (!this.identity.antiForgeryDone || this.identity.forceAntiForgeryUpdate) {\r\n // this creates headers for http fetch client and breeze adapter\r\n await this.identity.initialiseIdentityAsync();\r\n // }\r\n\r\n const adapter: any = breeze.config.getAdapterInstance('ajax');\r\n\r\n const saveOptions: breeze.SaveOptions = new breeze.SaveOptions(\r\n { resourceName: `savememberchanges/pId/${personId}?ts=${Date.now()}` });\r\n const mgr: breeze.EntityManager = getEntityManager();\r\n\r\n let failed: boolean = false;\r\n let error: any = {};\r\n console.log(entities);\r\n\r\n console.log(this.breezeManager.hasChanges());\r\n\r\n const saveResult = await mgr.saveChanges(entities, saveOptions)\r\n .catch((err) => {\r\n const entityErrors: any = err.entityErrors;\r\n console.log('Save Error');\r\n console.log(err);\r\n console.log('Save Entities');\r\n console.log(entities);\r\n console.log('Entity Errors');\r\n console.log(entityErrors);\r\n failed = true;\r\n // error = err.entityErrors ? err.entityErrors : err;\r\n error = err;\r\n // 404 = controller method not allowed (i.e. user logged out so reload to force login)\r\n // Or not found (should never happen)\r\n // 406 = token error (probably other tabs open so reload)\r\n if (err.status === 406 || err.status === 404) {\r\n window.location.reload();\r\n }\r\n error.status = 500;\r\n\r\n const reportData = this.sentry.toView(\r\n `Repository (saveMember): ${this.buildEntityErrorString(entityErrors)}. ${context ? `\\nContext: ${context}` : ''}`);\r\n\r\n const reportError = this.sentry.toView(\r\n 'Repository errors (saveMember)',\r\n err);\r\n });\r\n\r\n if (failed || !saveResult) {\r\n return Promise.reject(error);\r\n }\r\n\r\n console.log(saveResult);\r\n console.log(`Saved entities: ${saveResult.entities}`);\r\n\r\n return Promise.resolve(saveResult);\r\n\r\n }\r\n\r\n cancelChanges(): boolean {\r\n\r\n const mgr: breeze.EntityManager = getEntityManager();\r\n mgr.rejectChanges();\r\n return true;\r\n\r\n }\r\n\r\n generateGuid() {\r\n // time/MAC based\r\n // return uuid.v1();\r\n // random\r\n return uuid.v4();\r\n }\r\n\r\n flattenEntity(entityTypeName: string, entity: any): any {\r\n\r\n const flattenedEntity: any = {};\r\n\r\n // if (this.breezeManager) {\r\n const entityType: any =\r\n this.breezeManager.metadataStore.getEntityType(entityTypeName);\r\n\r\n entityType.dataProperties.forEach((property: any) => {\r\n flattenedEntity[property.name] = entity[property.name];\r\n });\r\n // }\r\n\r\n return flattenedEntity;\r\n\r\n }\r\n\r\n}\r\n","import { Router } from 'aurelia-router';\r\nimport { autoinject } from 'aurelia-framework';\r\nimport { IdentityHelpers } from '@identity/helpers';\r\n\r\n@autoinject\r\nexport class FooterPublic {\r\n\r\n private router: Router;\r\n private identity: IdentityHelpers;\r\n\r\n currentYear() {\r\n return new Date().getFullYear();\r\n }\r\n\r\n constructor(router: Router, identity: IdentityHelpers) {\r\n this.router = router;\r\n this.identity = identity;\r\n }\r\n}\r\n","module.exports = \"\";","import { Router } from 'aurelia-router';\r\nimport { autoinject, bindable } from 'aurelia-framework';\r\nimport { IdentityHelpers } from '@identity/helpers';\r\nimport { Repository } from '@data/repository';\r\nimport { IEntityEnrollment } from '../../interfaces/interfaces';\r\nimport parse from 'date-fns/parse';\r\nimport isAfter from 'date-fns/isAfter';\r\nimport isBefore from 'date-fns/isBefore';\r\nimport isEqual from 'date-fns/isEqual';\r\ndeclare const LIVE_URL_IMAGES: string; // The value is supplied by Webpack during the build\r\n\r\n@autoinject\r\nexport class NavPublic {\r\n\r\n private router: Router;\r\n private identity: IdentityHelpers;\r\n private basketId: string | null = null;\r\n private joinInviteId: string | null = null;\r\n private joinToken: string | null = null;\r\n @bindable spaName: string = '';\r\n private modal: HTMLElement | null = null;\r\n private modalParent: HTMLElement | null = null;\r\n private body: HTMLElement | null = null;\r\n private clickEvent: any = null;\r\n private messageEvent: any = null;\r\n private inviteRequested: boolean = false;\r\n private repository: Repository;\r\n private breezeMgr!: breeze.EntityManager;\r\n private enrollment: any;\r\n private hasEnrollment: boolean = false;\r\n private enrollmentOpen: boolean = false;\r\n private isCommunityMember: boolean = false;\r\n private liveUrlImages: string = LIVE_URL_IMAGES;\r\n\r\n getCookie(name: String) {\r\n const v = document.cookie.match(`(^|;) ?${name}=([^;]*)(;|$)`);\r\n return v ? v[2] : null;\r\n }\r\n\r\n constructor(router: Router, identity: IdentityHelpers, repository: Repository) {\r\n this.router = router;\r\n this.identity = identity;\r\n this.repository = repository;\r\n this.breezeMgr = this.repository.breezeManager;\r\n }\r\n\r\n openInviteModal() {\r\n if (this.modal && this.body) {\r\n this.modal.classList.add('invoked');\r\n this.body.classList.add('modal-overlay');\r\n this.body.classList.add('noscroll');\r\n\r\n setTimeout(\r\n () => {\r\n if (this.modal) {\r\n this.modal.classList.remove('loaded');\r\n }\r\n },\r\n 400,\r\n );\r\n }\r\n }\r\n\r\n closeInviteModal(event: any) {\r\n const theevent = event || window.event;\r\n const { target: eventtarget } = theevent;\r\n\r\n if (eventtarget.classList.contains('invite-modal-container') ||\r\n eventtarget.classList.contains('invite-modal-close')) {\r\n if (this.modal && this.body) {\r\n this.modal.classList.remove('invoked');\r\n this.body.classList.remove('modal-overlay');\r\n this.body.classList.remove('noscroll');\r\n\r\n setTimeout(\r\n () => {\r\n if (this.modal) {\r\n this.modal.classList.add('loaded');\r\n }\r\n },\r\n 400,\r\n );\r\n }\r\n }\r\n }\r\n\r\n attached() {\r\n this.modal = document.querySelector('#GetYourInvite');\r\n this.modalParent = document.querySelector('#modalParent');\r\n this.body = document.querySelector('body');\r\n\r\n if (this.modal) {\r\n this.modal.classList.add('loaded');\r\n }\r\n\r\n if (this.modalParent) {\r\n this.clickEvent = this.closeInviteModal.bind(this);\r\n this.modalParent.addEventListener('click', this.clickEvent);\r\n }\r\n\r\n }\r\n\r\n processMessage(e: any) {\r\n console.log('Message received');\r\n console.log(e.data);\r\n\r\n if (e.data.hasOwnProperty('frameHeight')) {\r\n\r\n console.log(e.data.frameHeight);\r\n\r\n const iframe: HTMLIFrameElement | null = \r\n document.getElementById('inviteIframe');\r\n if (iframe) {\r\n iframe.style.height = `${e.data.frameHeight}px`;\r\n }\r\n }\r\n\r\n if (e.data.hasOwnProperty('submitted')) {\r\n this.inviteRequested = true;\r\n }\r\n }\r\n\r\n public async bind() {\r\n\r\n console.log('Bind nav');\r\n console.log(this.spaName);\r\n\r\n this.basketId = this.getCookie('cpt-cart');\r\n this.joinInviteId = this.getCookie('cpt-join-InviteId');\r\n this.joinToken = this.getCookie('cpt-join-Token');\r\n\r\n this.messageEvent = this.processMessage.bind(this);\r\n window.addEventListener('message', this.messageEvent);\r\n\r\n this.enrollment = this.breezeMgr.getEntities('ProductEnrollment');\r\n this.hasEnrollment = this.enrollment.length > 0;\r\n\r\n if (this.hasEnrollment) {\r\n const today: Date = new Date();\r\n const openDate: Date = parse(\r\n this.enrollment[0].friendlyOpenDate, 'dd/MM/yyyy', new Date());\r\n this.enrollmentOpen = isAfter(today, openDate) || isEqual(today, openDate);\r\n }\r\n\r\n this.isCommunityMember = this.identity.user && this.identity.user.IsAuthenticated &&\r\n this.identity.user.Person !== null && (this.identity.user.Person.isActiveCommunity ||\r\n !this.identity.user.CommunityExpired);\r\n\r\n return Promise.resolve();\r\n }\r\n\r\n detached() {\r\n if (this.clickEvent && this.modalParent) {\r\n this.modalParent.removeEventListener('click', this.clickEvent);\r\n this.clickEvent = null;\r\n }\r\n if (this.messageEvent) {\r\n window.removeEventListener('message', this.messageEvent);\r\n this.messageEvent = null;\r\n }\r\n }\r\n\r\n}\r\n","module.exports = \"\";","import { PLATFORM } from 'aurelia-framework';\r\nimport { IRoute, IRouteSettings } from '@shared/interfaces/interfaces';\r\n\r\nexport class Routes {\r\n\r\n public unknownRoute: IRoute = {\r\n route: ['blog/notfound'],\r\n name: 'notfound',\r\n settings: \r\n {\r\n spa: 'blog',\r\n },\r\n moduleId: PLATFORM.moduleName('../pages/notfound/notfound', 'blog-async-notfound'),\r\n nav: false,\r\n title: 'Page not found',\r\n };\r\n\r\n public routeArray: IRoute[] = [\r\n {\r\n route: ['blog/home'],\r\n name: 'home',\r\n settings: \r\n {\r\n spa: 'blog',\r\n },\r\n moduleId: PLATFORM.moduleName('../pages/home/home', 'blog-async-home'),\r\n nav: true,\r\n // title: 'Home',\r\n },\r\n \r\n {\r\n route: ['blog/post/:id/:groupurl/:resourceurl?'],\r\n name: 'post',\r\n settings: \r\n {\r\n spa: 'blog',\r\n },\r\n moduleId: PLATFORM.moduleName('../pages/post/post', 'blog-async-post'),\r\n nav: false,\r\n // title: 'Blog Post',\r\n },\r\n ];\r\n}\r\n","import * as Sentry from '@sentry/browser';\r\n\r\nexport class SentryValueConverter {\r\n\r\n toView(value: string, err?: any) {\r\n\r\n try {\r\n\r\n let valueStr: string = value;\r\n\r\n if (valueStr.length) {\r\n\r\n if (err && err.details && err.details.originalError &&\r\n err.details.originalError.description) {\r\n valueStr += `. ERR DESCRIPTION: ${err.details.originalError.description}`;\r\n }\r\n\r\n Sentry.addBreadcrumb({\r\n category: 'data',\r\n message: valueStr,\r\n level: Sentry.Severity.Warning,\r\n });\r\n // Sentry.captureMessage(value);\r\n }\r\n\r\n if (err) {\r\n Sentry.captureException(err);\r\n }\r\n\r\n return true;\r\n\r\n } catch (error) {\r\n Sentry.captureException('Sentry exception...');\r\n Sentry.captureException(error);\r\n console.log(`Error in sentry value-converter: ${error}`);\r\n }\r\n }\r\n}\r\n","export class Md5 {\r\n\r\n private hexChr: string = '0123456789abcdef';\r\n\r\n rhex(num: any) {\r\n let str: string = '';\r\n let j: number;\r\n for (j = 0; j <= 3; j += 1) {\r\n str += this.hexChr.charAt((num >> (j * 8 + 4)) & 0x0F) +\r\n this.hexChr.charAt((num >> (j * 8)) & 0x0F);\r\n }\r\n return str;\r\n }\r\n\r\n str2blks_MD5(str: string) {\r\n const nblk: any = ((str.length + 8) >> 6) + 1;\r\n const blks: any = new Array(nblk * 16);\r\n let i: number;\r\n for (i = 0; i < nblk * 16; i += 1) blks[i] = 0;\r\n for (i = 0; i < str.length; i += 1)\r\n blks[i >> 2] |= str.charCodeAt(i) << ((i % 4) * 8);\r\n blks[i >> 2] |= 0x80 << ((i % 4) * 8);\r\n blks[nblk * 16 - 2] = str.length * 8;\r\n return blks;\r\n }\r\n\r\n add(x: any, y: any) {\r\n const lsw: any = (x & 0xFFFF) + (y & 0xFFFF);\r\n const msw: any = (x >> 16) + (y >> 16) + (lsw >> 16);\r\n return (msw << 16) | (lsw & 0xFFFF);\r\n }\r\n\r\n rol(num: any, cnt: any) {\r\n return (num << cnt) | (num >>> (32 - cnt));\r\n }\r\n\r\n cmn(q: any, a: any, b: any, x: any, s: any, t: any) {\r\n return this.add(this.rol(this.add(this.add(a, q), this.add(x, t)), s), b);\r\n }\r\n\r\n ff(a: any, b: any, c: any, d: any, x: any, s: any, t: any) {\r\n return this.cmn((b & c) | ((~b) & d), a, b, x, s, t);\r\n }\r\n gg(a: any, b: any, c: any, d: any, x: any, s: any, t: any) {\r\n return this.cmn((b & d) | (c & (~d)), a, b, x, s, t);\r\n }\r\n hh(a: any, b: any, c: any, d: any, x: any, s: any, t: any) {\r\n return this.cmn(b ^ c ^ d, a, b, x, s, t);\r\n }\r\n ii(a: any, b: any, c: any, d: any, x: any, s: any, t: any) {\r\n return this.cmn(c ^ (b | (~d)), a, b, x, s, t);\r\n }\r\n\r\n calcMD5(str: any) {\r\n const x: any = this.str2blks_MD5(str);\r\n let a: any = 1732584193;\r\n let b: any = -271733879;\r\n let c: any = -1732584194;\r\n let d: any = 271733878;\r\n let i: number;\r\n\r\n for (i = 0; i < x.length; i += 16) {\r\n const olda: any = a;\r\n const oldb: any = b;\r\n const oldc: any = c;\r\n const oldd: any = d;\r\n\r\n a = this.ff(a, b, c, d, x[i + 0], 7, -680876936);\r\n d = this.ff(d, a, b, c, x[i + 1], 12, -389564586);\r\n c = this.ff(c, d, a, b, x[i + 2], 17, 606105819);\r\n b = this.ff(b, c, d, a, x[i + 3], 22, -1044525330);\r\n a = this.ff(a, b, c, d, x[i + 4], 7, -176418897);\r\n d = this.ff(d, a, b, c, x[i + 5], 12, 1200080426);\r\n c = this.ff(c, d, a, b, x[i + 6], 17, -1473231341);\r\n b = this.ff(b, c, d, a, x[i + 7], 22, -45705983);\r\n a = this.ff(a, b, c, d, x[i + 8], 7, 1770035416);\r\n d = this.ff(d, a, b, c, x[i + 9], 12, -1958414417);\r\n c = this.ff(c, d, a, b, x[i + 10], 17, -42063);\r\n b = this.ff(b, c, d, a, x[i + 11], 22, -1990404162);\r\n a = this.ff(a, b, c, d, x[i + 12], 7, 1804603682);\r\n d = this.ff(d, a, b, c, x[i + 13], 12, -40341101);\r\n c = this.ff(c, d, a, b, x[i + 14], 17, -1502002290);\r\n b = this.ff(b, c, d, a, x[i + 15], 22, 1236535329);\r\n\r\n a = this.gg(a, b, c, d, x[i + 1], 5, -165796510);\r\n d = this.gg(d, a, b, c, x[i + 6], 9, -1069501632);\r\n c = this.gg(c, d, a, b, x[i + 11], 14, 643717713);\r\n b = this.gg(b, c, d, a, x[i + 0], 20, -373897302);\r\n a = this.gg(a, b, c, d, x[i + 5], 5, -701558691);\r\n d = this.gg(d, a, b, c, x[i + 10], 9, 38016083);\r\n c = this.gg(c, d, a, b, x[i + 15], 14, -660478335);\r\n b = this.gg(b, c, d, a, x[i + 4], 20, -405537848);\r\n a = this.gg(a, b, c, d, x[i + 9], 5, 568446438);\r\n d = this.gg(d, a, b, c, x[i + 14], 9, -1019803690);\r\n c = this.gg(c, d, a, b, x[i + 3], 14, -187363961);\r\n b = this.gg(b, c, d, a, x[i + 8], 20, 1163531501);\r\n a = this.gg(a, b, c, d, x[i + 13], 5, -1444681467);\r\n d = this.gg(d, a, b, c, x[i + 2], 9, -51403784);\r\n c = this.gg(c, d, a, b, x[i + 7], 14, 1735328473);\r\n b = this.gg(b, c, d, a, x[i + 12], 20, -1926607734);\r\n\r\n a = this.hh(a, b, c, d, x[i + 5], 4, -378558);\r\n d = this.hh(d, a, b, c, x[i + 8], 11, -2022574463);\r\n c = this.hh(c, d, a, b, x[i + 11], 16, 1839030562);\r\n b = this.hh(b, c, d, a, x[i + 14], 23, -35309556);\r\n a = this.hh(a, b, c, d, x[i + 1], 4, -1530992060);\r\n d = this.hh(d, a, b, c, x[i + 4], 11, 1272893353);\r\n c = this.hh(c, d, a, b, x[i + 7], 16, -155497632);\r\n b = this.hh(b, c, d, a, x[i + 10], 23, -1094730640);\r\n a = this.hh(a, b, c, d, x[i + 13], 4, 681279174);\r\n d = this.hh(d, a, b, c, x[i + 0], 11, -358537222);\r\n c = this.hh(c, d, a, b, x[i + 3], 16, -722521979);\r\n b = this.hh(b, c, d, a, x[i + 6], 23, 76029189);\r\n a = this.hh(a, b, c, d, x[i + 9], 4, -640364487);\r\n d = this.hh(d, a, b, c, x[i + 12], 11, -421815835);\r\n c = this.hh(c, d, a, b, x[i + 15], 16, 530742520);\r\n b = this.hh(b, c, d, a, x[i + 2], 23, -995338651);\r\n\r\n a = this.ii(a, b, c, d, x[i + 0], 6, -198630844);\r\n d = this.ii(d, a, b, c, x[i + 7], 10, 1126891415);\r\n c = this.ii(c, d, a, b, x[i + 14], 15, -1416354905);\r\n b = this.ii(b, c, d, a, x[i + 5], 21, -57434055);\r\n a = this.ii(a, b, c, d, x[i + 12], 6, 1700485571);\r\n d = this.ii(d, a, b, c, x[i + 3], 10, -1894986606);\r\n c = this.ii(c, d, a, b, x[i + 10], 15, -1051523);\r\n b = this.ii(b, c, d, a, x[i + 1], 21, -2054922799);\r\n a = this.ii(a, b, c, d, x[i + 8], 6, 1873313359);\r\n d = this.ii(d, a, b, c, x[i + 15], 10, -30611744);\r\n c = this.ii(c, d, a, b, x[i + 6], 15, -1560198380);\r\n b = this.ii(b, c, d, a, x[i + 13], 21, 1309151649);\r\n a = this.ii(a, b, c, d, x[i + 4], 6, -145523070);\r\n d = this.ii(d, a, b, c, x[i + 11], 10, -1120210379);\r\n c = this.ii(c, d, a, b, x[i + 2], 15, 718787259);\r\n b = this.ii(b, c, d, a, x[i + 9], 21, -343485551);\r\n\r\n a = this.add(a, olda);\r\n b = this.add(b, oldb);\r\n c = this.add(c, oldc);\r\n d = this.add(d, oldd);\r\n }\r\n return this.rhex(a) + this.rhex(b) + this.rhex(c) + this.rhex(d);\r\n }\r\n}\r\n","import { Aurelia, PLATFORM, autoinject, BindingEngine, LogManager } from 'aurelia-framework';\r\nimport { Router, RouterConfiguration, NavigationInstruction, Next } from 'aurelia-router';\r\nimport { Routes } from './_routes';\r\nimport { Lookups } from '@data/lookups';\r\nimport { IdentityHelpers } from '@identity/helpers';\r\nimport { IApiResponse, IEntityPerson } from '@shared/interfaces/interfaces';\r\nimport { EventAggregator } from 'aurelia-event-aggregator';\r\ndeclare let gtag: Function;\r\n\r\n@autoinject\r\nexport class App {\r\n\r\n private logger: any = LogManager.getLogger('app');\r\n public title = 'The Curious Piano Teachers Blog';\r\n private lookups: Lookups;\r\n private router!: Router;\r\n private identity!: IdentityHelpers;\r\n private routerReady: boolean = false;\r\n private bind: BindingEngine;\r\n private routeBuilder: Routes;\r\n private subscription: any;\r\n private lookupsError: boolean = false;\r\n private spaName: string = 'blog';\r\n private navEvent: any;\r\n private ea: EventAggregator;\r\n\r\n constructor(\r\n lookups: Lookups, bindingEngine: BindingEngine, routes: Routes,\r\n identity: IdentityHelpers, ea: EventAggregator) {\r\n this.lookups = lookups;\r\n this.bind = bindingEngine;\r\n this.routeBuilder = routes;\r\n this.identity = identity;\r\n this.ea = ea;\r\n }\r\n\r\n configureRouter(config: RouterConfiguration, router: Router) {\r\n\r\n config.options.pushState = true;\r\n // config.title = 'The Curious Piano Teachers Blog';\r\n config.addAuthorizeStep(AuthorizeStep);\r\n config.map(this.routeBuilder.routeArray);\r\n config.mapUnknownRoutes((instruction: NavigationInstruction) => {\r\n const route = instruction.fragment === '/blog'\r\n || instruction.fragment === '/blog/' ?\r\n this.routeBuilder.routeArray[0] : this.routeBuilder.unknownRoute;\r\n return route;\r\n });\r\n this.router = router;\r\n\r\n this.subscription = this.bind.collectionObserver(this.router.routes)\r\n .subscribe(this.routerConfigured.bind(this));\r\n }\r\n\r\n routerConfigured(splices: any) {\r\n this.routerReady = true;\r\n this.subscription.dispose();\r\n\r\n this.navEvent = this.ea.subscribe(\r\n 'router:navigation:complete',\r\n (response: any) => {\r\n console.log(response);\r\n console.log(window.location);\r\n console.log(document.title);\r\n\r\n // only submit to analytics if cookie consent allows it!\r\n // TODO - test event correctly sent to Analytics if cookie consent\r\n // and not sent if no consent\r\n // also test consent given subsequent to initial page load!\r\n const consentCookie = this.getCookie('cpt-cookie-consent');\r\n\r\n if (!consentCookie || consentCookie.indexOf('-analytics') === -1) {\r\n return;\r\n }\r\n\r\n if (typeof (gtag) !== 'undefined') {\r\n gtag('js', new Date());\r\n gtag('config', 'G-PMPJFNGGSE');\r\n // gtag('event', 'page_view', {\r\n // page_title: document.title,\r\n // page_location: window.location.pathname,\r\n //// page_path: window.location.pathname,\r\n // });\r\n }\r\n\r\n });\r\n // console.log(response.instruction.fragment);\r\n }\r\n\r\n getCookie(name: String) {\r\n const v = document.cookie.match(`(^|;) ?${name}=([^;]*)(;|$)`);\r\n return v ? v[2] : null;\r\n }\r\n\r\n async getUserInfo(): Promise {\r\n\r\n const promise: any = new Promise(async (resolve, reject) => {\r\n\r\n const response = await this.identity.getUserInfoAsync();\r\n return resolve(response);\r\n\r\n });\r\n\r\n return promise;\r\n\r\n }\r\n\r\n attached() {\r\n }\r\n\r\n async getPerson(): Promise {\r\n\r\n this.lookupsError = false;\r\n const personResponse: any = await this.lookups.getPerson(this.identity.user.PersonId, false, 'blog.app.app')\r\n .catch((err) => {\r\n console.log(err);\r\n this.lookupsError = true;\r\n });\r\n\r\n return personResponse;\r\n\r\n }\r\n\r\n async activate(): Promise {\r\n\r\n const promise: any = new Promise(async (resolve, reject) => {\r\n\r\n await this.identity.initialiseIdentityAsync();\r\n console.log('Got identity');\r\n\r\n const gotUser = await this.getUserInfo();\r\n console.log(`Got user? ${gotUser}`);\r\n\r\n // if (gotUser.statusCode !== 200) {\r\n // this.lookupsError = true;\r\n // return resolve();\r\n // }\r\n\r\n if (this.identity.user.IsAuthenticated) {\r\n\r\n // const personResponse: any =\r\n // await this.lookups.getPerson(this.identity.user.PersonId, false, 'blog.app.app')\r\n // .catch((err) => {\r\n // // TODO - Handle Error! App can't function without person\r\n // // try again(refresh) option ? handle lost internet connection?\r\n // console.log(err);\r\n // // this.lookupsError = true;\r\n // });\r\n\r\n let personResponse: any = await this.getPerson();\r\n\r\n if (this.lookupsError) {\r\n setTimeout(\r\n async () => {\r\n personResponse = await this.getPerson();\r\n },\r\n 200);\r\n }\r\n\r\n if (this.lookupsError) {\r\n // return resolve();\r\n }\r\n\r\n this.lookupsError = false;\r\n\r\n const personData: breeze.Entity[] = personResponse;\r\n if (!personData || personData.length === 0) {\r\n console.log('No person data found');\r\n // this.lookupsError = true;\r\n // return resolve();\r\n }\r\n\r\n if (personData && personData.length > 0) {\r\n console.log('Got person');\r\n this.identity.user.Person = personData[0];\r\n }\r\n\r\n }\r\n\r\n const lookups = await this.lookups.getData('Blog', 'blog.app.app')\r\n .catch((err) => {\r\n // TODO - Handle Error! App can't function without lookups\r\n // try again(refresh) option ? handle lost internet connection?\r\n console.log(err);\r\n this.lookupsError = true;\r\n });\r\n\r\n if (this.lookupsError) {\r\n return resolve();\r\n }\r\n\r\n console.log('Got lookups');\r\n console.log(lookups);\r\n // const gotUser = await this.getUserInfo();\r\n // console.log(`Got user? ${gotUser}`);\r\n // this.identity.test();\r\n // var mgr = getEntityManager();\r\n // console.log(mgr.getEntities('Event'));\r\n // self.logger.debug(mgr.getEntities('Event'));\r\n\r\n return resolve();\r\n\r\n });\r\n\r\n return promise;\r\n\r\n }\r\n}\r\n\r\n@autoinject\r\nclass AuthorizeStep {\r\n\r\n private identity: IdentityHelpers;\r\n private router: Router;\r\n\r\n constructor(identity: IdentityHelpers, router: Router) {\r\n this.identity = identity;\r\n this.router = router;\r\n }\r\n\r\n run(navigationInstruction: NavigationInstruction, next: Next): Promise {\r\n\r\n if (navigationInstruction.getAllInstructions().some(i => i.config.settings.authorize)) {\r\n\r\n if (!this.identity.user.IsAuthenticated ||\r\n !this.identity.isUserInRole(navigationInstruction.config.settings.authorize)) {\r\n return next.cancel(this.router.navigateToRoute(\r\n 'login',\r\n { page: navigationInstruction.fragment }, { replace: true }));\r\n }\r\n\r\n }\r\n\r\n return next();\r\n }\r\n\r\n}\r\n","module.exports = \"\";","module.exports = function(cb) {\n\trequire.ensure([], function(require) {\n\t\tcb(require(\"!!../../../../node_modules/awesome-typescript-loader/dist/entry.js!./home.ts\"));\n\t}, \"blog-async-home\");\n}","module.exports = function(cb) {\n\trequire.ensure([], function(require) {\n\t\tcb(require(\"!!../../../../node_modules/awesome-typescript-loader/dist/entry.js!./notfound.ts\"));\n\t}, \"blog-async-notfound\");\n}","module.exports = function(cb) {\n\trequire.ensure([], function(require) {\n\t\tcb(require(\"!!../../../../node_modules/awesome-typescript-loader/dist/entry.js!./post.ts\"));\n\t}, \"blog-async-post\");\n}","import { IGetDataParams, ITrialVideo, ITrialMaterial, IEntityPerson, IEngagement } from '@shared/interfaces/interfaces';\r\nimport { autoinject } from 'aurelia-framework';\r\nimport { Repository } from '@data/repository';\r\nimport { getEntityManager, createEntityManagerAsync } from '@data/entity-manager-factory';\r\nimport { SentryValueConverter } from '@shared/value-converters/sentry';\r\n// import { EntityAspect } from 'breeze';\r\n\r\n@autoinject\r\nexport class Lookups {\r\n events: any;\r\n private repository: Repository;\r\n private sentry: SentryValueConverter;\r\n public trialVideos: ITrialVideo[] = [];\r\n public trialMaterials: ITrialMaterial[] = [];\r\n\r\n constructor(repository: Repository, sentry: SentryValueConverter) {\r\n this.repository = repository;\r\n this.sentry = sentry;\r\n }\r\n\r\n async getData(spaName: string, context?: string) {\r\n\r\n if (!this.repository.breezeManager) {\r\n await createEntityManagerAsync();\r\n this.repository.breezeManager = getEntityManager();\r\n }\r\n\r\n const getDataParams: IGetDataParams = {\r\n apiMethod: `Lookups_${spaName}`,\r\n filterName: '',\r\n filterValue: '',\r\n forceRemote: true,\r\n };\r\n\r\n let failed: boolean = false;\r\n let error: string = '';\r\n\r\n const response = await this.repository.getData(getDataParams, `${context ? `${context} => ` : ''}_data.lookups.getData (${spaName})`)\r\n .catch((err) => {\r\n // TODO - mirror approach to repo error in basket.ts once tested\r\n console.log(`Error - status = ${err.status}`);\r\n // const reportError = this.sentry.toView(\r\n // `lookups.getData error (${spaName}). Status: ${err.status}`,\r\n // err);\r\n // this.error = 'Error retrieving data';\r\n failed = true;\r\n error = err;\r\n // 404 = controller method not allowed (i.e. user not logged in or not admin)\r\n // Or not found (should never happen)\r\n // 406 = token error (probably other tabs open so reload?)\r\n // 405 = data not found\r\n // don't reload because lookups are called by apps, which are only run once on spa load\r\n // if (err.status === 406 || err.status === 404) {\r\n // window.location.reload();\r\n // }\r\n });\r\n\r\n if (failed || !response) {\r\n return Promise.reject(error);\r\n }\r\n\r\n return Promise.resolve(response);\r\n\r\n }\r\n\r\n async getPerson(personId: string, forceRemote: boolean, context?: string):\r\n Promise {\r\n\r\n if (!this.repository.breezeManager) {\r\n await createEntityManagerAsync();\r\n this.repository.breezeManager = getEntityManager();\r\n }\r\n\r\n const getDataParams: IGetDataParams = {\r\n forceRemote,\r\n apiMethod: 'Persons',\r\n filterName: 'personId',\r\n filterValue: personId,\r\n checkFetched: true,\r\n };\r\n\r\n let failed: boolean = false;\r\n let error: string = '';\r\n\r\n const response = await this.repository.getData(getDataParams, `${context ? `${context} => ` : ''}_data.lookups.getPerson`)\r\n .catch((err) => {\r\n // TODO - mirror approach to repo error in basket.ts once tested\r\n console.log(`Error - status = ${err.status}`);\r\n const reportError = this.sentry.toView(\r\n `lookups.getPerson error (${personId}). Status: ${err.status}`,\r\n err);\r\n // this.loadError = `Error retrieving data: ${err.status}`;\r\n failed = true;\r\n error = err;\r\n // 404 = controller method not allowed (i.e. user not logged in or not admin)\r\n // Or not found (should never happen)\r\n // 406 = token error (probably other tabs open so reload?)\r\n // 405 = data not found\r\n // don't reload because lookups are called by apps, which are only run once on spa load\r\n // if (err.status === 406 || err.status === 404) {\r\n // window.location.reload();\r\n // }\r\n });\r\n\r\n if (failed || !response) {\r\n return Promise.reject(error);\r\n }\r\n\r\n return Promise.resolve(response);\r\n\r\n }\r\n\r\n buildTrialUsage(engagements: any[]) {\r\n\r\n this.trialVideos = [];\r\n this.trialMaterials = [];\r\n\r\n const vTrackers: IEngagement[] = engagements.filter(\r\n t => t.resourceGroupVideoId &&\r\n t.resourceGroup.resourceType &&\r\n t.resourceGroup.resourceType.name.toLowerCase().indexOf('box') > -1);\r\n let existingVideo: ITrialVideo[];\r\n let newVideo: ITrialVideo;\r\n for (const vTracker of vTrackers) {\r\n existingVideo =\r\n this.trialVideos.filter(e => e.videoId === vTracker.resourceGroupVideoId);\r\n if (existingVideo.length === 0 && vTracker.resourceGroupVideoId) {\r\n newVideo = {\r\n videoId: vTracker.resourceGroupVideoId,\r\n };\r\n this.trialVideos.push(newVideo);\r\n }\r\n }\r\n // console.log('TrialVideos');\r\n // console.log(this.trialVideos);\r\n\r\n const mTrackers: IEngagement[] =\r\n engagements.filter(\r\n t => t.resourceGroupMaterialId &&\r\n t.resourceGroup.resourceType &&\r\n t.resourceGroup.resourceType.name.toLowerCase().indexOf('box') > -1);\r\n let existingMaterial: ITrialMaterial[];\r\n let newMaterial: ITrialMaterial;\r\n for (const mTracker of mTrackers) {\r\n existingMaterial =\r\n this.trialMaterials.filter(e => e.materialId === mTracker.resourceGroupMaterialId);\r\n if (existingMaterial.length === 0 && mTracker.resourceGroupMaterialId) {\r\n newMaterial = {\r\n materialId: mTracker.resourceGroupMaterialId,\r\n };\r\n this.trialMaterials.push(newMaterial);\r\n }\r\n }\r\n // console.log('TrialMaterials');\r\n // console.log(this.trialMaterials);\r\n\r\n }\r\n\r\n async getTrackers(personId: string, forceRemote: boolean, context?: string):\r\n Promise {\r\n\r\n if (!this.repository.breezeManager) {\r\n await createEntityManagerAsync();\r\n this.repository.breezeManager = getEntityManager();\r\n }\r\n\r\n const getDataParams: IGetDataParams = {\r\n forceRemote,\r\n apiMethod: 'PersonTrackers',\r\n filterName: 'personId',\r\n filterValue: personId,\r\n checkFetched: true,\r\n };\r\n\r\n let failed: boolean = false;\r\n let error: string = '';\r\n\r\n const response = await this.repository.getData(getDataParams, `${context ? `${context} => ` : ''}_data.lookups.getTrackers`)\r\n .catch((err) => {\r\n // TODO - mirror approach to repo error in basket.ts once tested\r\n console.log(`Error - status = ${err.status}`);\r\n const reportError = this.sentry.toView(\r\n `lookups.getTrackers error (${personId}). Status: ${err.status}`,\r\n err);\r\n // this.loadError = `Error retrieving data: ${err.status}`;\r\n failed = true;\r\n error = err;\r\n // 404 = controller method not allowed (i.e. user not logged in or not admin)\r\n // Or not found (should never happen)\r\n // 406 = token error (probably other tabs open so reload?)\r\n // 405 = data not found\r\n // don't reload because lookups are called by apps, which are only run once on spa load\r\n // if (err.status === 406 || err.status === 404) {\r\n // window.location.reload();\r\n // }\r\n });\r\n\r\n if (failed || !response) {\r\n return Promise.reject(error);\r\n }\r\n\r\n // console.log(response);\r\n const responseData: any = response[0];\r\n const eTrackers: any[] = responseData.engagementTrackers;\r\n this.buildTrialUsage(eTrackers);\r\n\r\n return Promise.resolve(response);\r\n\r\n }\r\n\r\n}\r\n","import 'whatwg-fetch';\r\nimport { Aurelia, PLATFORM, LogManager } from 'aurelia-framework';\r\nimport { HttpClient } from 'aurelia-fetch-client';\r\nimport * as Bluebird from 'bluebird';\r\ndeclare const IS_DEV_BUILD: boolean; // The value is supplied by Webpack during the build\r\ndeclare const VERSION: string; // The value is supplied by Webpack during the build\r\ndeclare var require: any;\r\nimport { ConsoleAppender } from 'aurelia-logging-console';\r\nimport { SentryAppender, Levels } from 'aurelia-sentry';\r\nimport * as Sentry from '@sentry/browser';\r\nimport { Integrations } from '@sentry/tracing';\r\nimport { RewriteFrames } from '@sentry/integrations';\r\n// import \"bootstrap/dist/css/bootstrap.css\";\r\n// import \"bootstrap-css-only/css/bootstrap-grid.min.css\";\r\n\r\nBluebird.config({ warnings: { wForgottenReturn: false }, longStackTraces: false });\r\nrequire('expose-loader?breeze!breeze-client/breeze.debug');\r\n\r\nexport function configure(aurelia: Aurelia) {\r\n\r\n aurelia.use\r\n .standardConfiguration()\r\n .plugin(PLATFORM.moduleName('aurelia-breeze'));\r\n // .plugin(PLATFORM.moduleName('aurelia-computed'))\r\n\r\n if (!IS_DEV_BUILD) {\r\n\r\n let alertCount: number = 0;\r\n\r\n Sentry.init({\r\n dsn: 'https://68dc5a7baeed492e81f53b29c14868e7@o460993.ingest.sentry.io/5462155',\r\n ignoreErrors: [\r\n 'TypeError: cancelled',\r\n ],\r\n release: `v-${VERSION}`,\r\n beforeSend: (event: Sentry.Event, hint) => {\r\n const urlTag: string = event.tags && event.tags.url ? event.tags.url : '';\r\n if (event.message && (event.message.toString().indexOf('Aurelia S') > -1 ||\r\n event.message.toString().indexOf('Router navigation failed') > -1 ||\r\n urlTag.indexOf('//localhost') > -1)) {\r\n return null;\r\n }\r\n if (event.message && event.message.toString().indexOf('Loading chunk') > -1 &&\r\n event.message.toString().indexOf('failed after 3 retries') > -1 && alertCount === 0) {\r\n alertCount += 1;\r\n alert('It looks like you are using an old version of the site, which is no longer supported. Please refresh the page. If this error appears again, please clear your browser cache before refreshing.');\r\n }\r\n return event;\r\n },\r\n integrations: [new Integrations.BrowserTracing(), new RewriteFrames()],\r\n // Set tracesSampleRate to 1.0 to capture 100%\r\n // of transactions for performance monitoring.\r\n // We recommend adjusting this value in production\r\n tracesSampleRate: 0.1,\r\n maxValueLength: 1000,\r\n });\r\n\r\n // LogManager.addAppender(new SentryAppender({ minLevel: Levels.warning }));\r\n // LogManager.setLevel(LogManager.logLevel.warning);\r\n\r\n } else {\r\n\r\n // Sentry.init({\r\n // dsn: 'https://a14734e2f34e483fb65ac3c289bec28e@o460993.ingest.sentry.io/5462176',\r\n // release: `v-${VERSION}`,\r\n // integrations: [new Integrations.BrowserTracing()],\r\n // // Set tracesSampleRate to 1.0 to capture 100%\r\n // // of transactions for performance monitoring.\r\n // // We recommend adjusting this value in production\r\n // tracesSampleRate: 1.0,\r\n // });\r\n\r\n LogManager.addAppender(new ConsoleAppender());\r\n LogManager.setLevel(LogManager.logLevel.debug);\r\n aurelia.use.developmentLogging();\r\n }\r\n\r\n new HttpClient().configure((config) => {\r\n const baseUrl = document.getElementsByTagName('base')[0].href;\r\n config.withBaseUrl(baseUrl);\r\n });\r\n\r\n aurelia.start().then(a => a.setRoot(PLATFORM.moduleName('app/app')));\r\n}\r\n\r\nexport const fetchCredentials: RequestCredentials = 'include';\r\nexport const appHeaders: string[][] = ([['pragma', 'no-cache'], ['cache-control', 'no-cache']]);\r\n","export default __webpack_public_path__ + \"0910e11d81113dce68444f53c1a8a13d.css\";","import settings from './settings';\r\n\r\nlet entityManager: breeze.EntityManager;\r\n\r\nexport async function createEntityManagerAsync() {\r\n\r\n breeze.config.initializeAdapterInstance('uriBuilder', 'json');\r\n breeze.NamingConvention.camelCase.setAsDefault();\r\n\r\n if (entityManager) {\r\n return Promise.resolve(copyEntityManager());\r\n }\r\n\r\n entityManager = new breeze.EntityManager(settings.serviceName);\r\n\r\n return entityManager.fetchMetadata()\r\n .then(() => copyEntityManager());\r\n}\r\n\r\nexport function getEntityManager() {\r\n return entityManager;\r\n}\r\n\r\nexport function setBreezeHeaders(token: string) {\r\n\r\n // get the current default Breeze ajax adapter\r\n const adapter: any = breeze.config.getAdapterInstance('ajax');\r\n\r\n // set antiForgery header\r\n adapter.requestInterceptor = function (requestInfo: any) {\r\n //requestInfo.config.headers['x-csrf-token-header-cpt'] = token;\r\n requestInfo.config.headers['x-csrf-token-header-cpt-sso'] = token;\r\n // this tells .NET Core to not do a forms auth redirect to login page\r\n requestInfo.config.headers['X-Requested-With'] = 'XMLHttpRequest';\r\n requestInfo.config.headers['Cache-Control'] = 'no-cache';\r\n\r\n if (requestInfo.config.url.indexOf('Metadata') > -1) {\r\n requestInfo.config.url += `/ts/${Date.now()}`;\r\n }\r\n\r\n };\r\n\r\n // set antiForgery header\r\n // adapter.defaultSettings = {\r\n // headers: {\r\n // 'x-csrf-token-header-cpt': token,\r\n // },\r\n // };\r\n\r\n}\r\n\r\nconst eventCtor = function () {};\r\n\r\nfunction eventInitialiser(event: any) {\r\n event.testComputed = `${event.name} - computed`;\r\n}\r\n\r\nfunction extendMetadata(metadataStore:breeze.MetadataStore) {\r\n metadataStore.registerEntityTypeCtor('Event', eventCtor, eventInitialiser);\r\n return true;\r\n}\r\n\r\nfunction copyEntityManager() {\r\n // extendMetadata(entityManager.metadataStore);\r\n const copy: breeze.EntityManager = entityManager.createEmptyCopy();\r\n copy.entityChanged.subscribe(logChanges);\r\n // entityManager.importEntities(entityManager.exportEntities());\r\n return copy;\r\n}\r\n\r\n// log entity changes to the console for debugging purposes.\r\nfunction logChanges(data:\r\n {\r\n entity:\r\n {\r\n entityType:\r\n {\r\n name: string;\r\n };\r\n entityAspect:\r\n {\r\n getKey: () =>\r\n {\r\n toString: () => string;\r\n };\r\n entityState:\r\n {\r\n getName: () => string;\r\n };\r\n };\r\n };\r\n entityAction: breeze.EntityActionSymbol; args: any;\r\n }) {\r\n const entityName: string = data.entity ?\r\n `${data.entity.entityType.name}'/'${data.entity.entityAspect.getKey().toString()}` :\r\n '?';\r\n let message = `Entity Changed. Entity: ${entityName};\r\n EntityAction: ${data.entityAction.getName()} ;`;\r\n if (data.entityAction === breeze.EntityAction.PropertyChange) {\r\n const pcArgs = data.args;\r\n message += `PropertyName: ${(pcArgs.propertyName || 'null')};\r\n Old Value: ${(pcArgs.oldValue ? pcArgs.oldValue.toString() : 'null')};\r\n New Value: ' ${(pcArgs.newValue ? pcArgs.newValue.toString() : 'null')};`;\r\n }\r\n if (data.entityAction === breeze.EntityAction.EntityStateChange) {\r\n message += `New State: ${data.entity.entityAspect.entityState.getName()};`;\r\n }\r\n console.log(message);\r\n}\r\n"],"sourceRoot":""}