{"version":3,"file":"users-Bws8stBw.js","sources":["../../../Nitrogen.Client/src/models/UserCecRequirement.js","../../../Nitrogen.Client/src/models/User.js","../../../Nitrogen.Client/src/api/modules/users.js"],"sourcesContent":["import { DateTime } from 'luxon';\r\nimport { getValueFromDto as getValue, getDateTimeFromDto as getDate, getObjectFromDto as getObject } from './_helpers.js';\r\nimport Duration from './Duration.js';\r\n\r\nexport default class UserCecRequirement {\r\n\tconstructor(dto) {\r\n\t\tthis.id = getValue(dto, 'id', 'number', 0);\r\n\t\tthis.description = getValue(dto, 'description', 'string', '');\r\n\t\tthis.renewalDate = getDate(dto, 'renewalDate', null);\r\n\t\tthis.renewalTerm = getObject(dto, 'renewalTerm', Duration, new Duration());\r\n\t\tthis.renewalWarning = getObject(dto, 'renewalWarning', Duration, new Duration());\r\n\t\tthis.creditsRequired = getValue(dto, 'creditsRequired', 'number', 0);\r\n\t\tthis.creditsEarned = getValue(dto, 'creditsEarned', 'number', 0);\r\n\t}\r\n\r\n\tget warningDate() {\r\n\t\treturn this.renewalDate && this.renewalWarning ? this.renewalDate.minus(this.renewalWarning.toLuxonDuration()) : null;\r\n\t}\r\n\r\n\tget isPastWarning() {\r\n\t\tconst warningDate = this.warningDate;\r\n\t\treturn warningDate && warningDate <= DateTime.now().startOf('day');\r\n\t}\r\n}\r\n","import UserCecRequirement from './UserCecRequirement.js';\r\nimport { getArrayFromDto as getArray, getArrayOfObjectsFromDto as getTypedArray, getDateTimeFromDto as getDate, getValueFromDto as getValue } from './_helpers.js';\r\n\r\nexport default class User {\r\n\tconstructor(dto) {\r\n\t\tthis.id = getValue(dto, 'id', 'number', 0);\r\n\t\tthis.emailAddress = getValue(dto, 'emailAddress', 'string', '');\r\n\t\tthis.emailConfirmed = getValue(dto, 'emailConfirmed', 'boolean', false);\r\n\t\tthis.roles = getArray(dto, 'roles', []);\r\n\t\tthis.cecRequirements = getTypedArray(dto, 'cecRequirements', UserCecRequirement, []);\r\n\t\tthis.firstName = getValue(dto, 'firstName', 'string', '');\r\n\t\tthis.middleInitial = getValue(dto, 'middleInitial', 'string', '');\r\n\t\tthis.lastName = getValue(dto, 'lastName', 'string', '');\r\n\t\tthis.title = getValue(dto, 'title', 'string', '');\r\n\t\tthis.phoneNumber = getValue(dto, 'phoneNumber', 'string', '');\r\n\t\tthis.operatorCertificationNumber = getValue(dto, 'operatorCertificationNumber', 'string', '');\r\n\t\tthis.grade = getValue(dto, 'grade', 'string', '');\r\n\t\tthis.departmentOfCommerceId = getValue(dto, 'departmentOfCommerceId', 'string', '');\r\n\t\tthis.operator = getValue(dto, 'operator', 'boolean', false);\r\n\t\tthis.wage = getValue(dto, 'wage', 'number', null);\r\n\t\tthis.wageDate = getDate(dto, 'wageDate', null);\r\n\t\tthis.active = getValue(dto, 'active', 'boolean', false);\r\n\t}\r\n\r\n\tget name() {\r\n\t\treturn (this.firstName + ' ' + this.lastName).trim();\r\n\t}\r\n\r\n\tget initials() {\r\n\t\treturn (this.firstName ? this.firstName.substr(0, 1) : '') + (this.middleInitial || '') + (this.lastName ? this.lastName.substr(0, 1) : '');\r\n\t}\r\n\r\n\tget cecRequirementWarnings() {\r\n\t\treturn this.cecRequirements.filter(x => x.isPastWarning);\r\n\t}\r\n\r\n\ttoString() {\r\n\t\treturn `${this.firstName} ${this.lastName} (${this.initials})`;\r\n\t}\r\n}\r\n","import { makeComparator } from '@/helpers/helpers';\r\nimport { getIdb, idbHelpers } from '@/idb';\r\nimport User from '@/models/User';\r\nimport { DateTime } from 'luxon';\r\nimport { fetchWrap, idbResponse, isIdbResponse, offlineResponse } from '../_helpers';\r\nimport cache from './cache';\r\n\r\nconst idbStore = 'users';\r\n\r\nexport default {\r\n\t/**\r\n\t * Get all users, filtered by the following parameters.\r\n\t * @param {Object} params\r\n\t * @param {boolean} params.active\r\n\t * @param {boolean} params.operator\r\n\t * @returns (async) Returns a Response if the request was made without network errors, or undefined if a network error occurred.\r\n\t */\r\n\tasync getAll({ active = undefined, operator = undefined } = {}) {\r\n\t\tconst filters = {};\r\n\t\tif (typeof active === 'boolean') {\r\n\t\t\tfilters.active = active;\r\n\t\t}\r\n\t\tif (typeof operator === 'boolean') {\r\n\t\t\tfilters.operator = operator;\r\n\t\t}\r\n\t\tconst idb = await getIdb();\r\n\t\tlet response, data = [], timestamp;\r\n\t\tlet useIdb = await cache.isCacheHit(idbStore);\r\n\t\tif (!useIdb) {\r\n\t\t\ttry {\r\n\t\t\t\ttimestamp = DateTime.now();\r\n\t\t\t\tresponse = await fetchWrap('/api/Users');\r\n\t\t\t\tif (response.ok) { data = await response.json(); }\r\n\t\t\t} catch {\r\n\t\t\t\tuseIdb = true;\r\n\t\t\t\tresponse = offlineResponse();\r\n\t\t\t}\r\n\t\t}\r\n\t\tconst filter = Object.keys(filters).length > 0 ? (\r\n\t\t\tx => (!('active' in filters) || x.active === filters.active) && (!('operator' in filters) || x.operator === filters.operator)\r\n\t\t\t) : undefined;\r\n\t\tif (useIdb && idb) {\r\n\t\t\tif (filter) {\r\n\t\t\t\tdata = await idbHelpers.getFiltered(idb, idbStore, filter);\r\n\t\t\t} else {\r\n\t\t\t\tdata = await idb.getAll(idbStore);\r\n\t\t\t}\r\n\t\t\tresponse = idbResponse(200);\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\tif (!isIdbResponse(response)) {\r\n\t\t\t\tif (idb) {\r\n\t\t\t\t\tawait idbHelpers.replaceAll(idb, idbStore, data);\r\n\t\t\t\t\tawait cache.setTimestamp(idbStore, timestamp);\r\n\t\t\t\t}\r\n\t\t\t\tif (filter) {\r\n\t\t\t\t\tdata = data.filter(filter);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tdata.sort(makeComparator('firstName', 'lastName'));\r\n\t\t\treturn data.map(x => new User(x));\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Get a user\r\n\t * @param {User} id User ID\r\n\t * @returns (async) Returns a User if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync getById(id) {\r\n\t\tconst idb = await getIdb();\r\n\t\tlet response, data = null;\r\n\t\tlet useIdb = await cache.isCacheHit(idbStore);\r\n\t\tif (!useIdb && await cache.canCache()) {\r\n\t\t\t// cache all for future re-use\r\n\t\t\tif ((data = (await this.getAll()).find(x => x.id === id) ?? null)) {\r\n\t\t\t\treturn data;\r\n\t\t\t} else {\r\n\t\t\t\tthrow idbResponse(404);\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (!useIdb) {\r\n\t\t\ttry {\r\n\t\t\t\tresponse = await fetchWrap('/api/Users/' + id);\r\n\t\t\t\tif (response.ok) { data = await response.json(); }\r\n\t\t\t} catch {\r\n\t\t\t\tuseIdb = true;\r\n\t\t\t\tresponse = offlineResponse();\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (useIdb && idb) {\r\n\t\t\tdata = await idb.get(idbStore, id);\r\n\t\t\tresponse = data ? idbResponse(200) : idbResponse(404);\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\tif (idb && !isIdbResponse(response)) {\r\n\t\t\t\tawait idb.put(idbStore, data);\r\n\t\t\t}\r\n\t\t\treturn new User(data);\r\n\t\t} else {\r\n\t\t\tthrow response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Create a user\r\n\t * @param {User} model user to create.\r\n\t * @returns (async) Returns the new User if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync create(model) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/Users/', {\r\n\t\t\t\tmethod: 'POST',\r\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\r\n\t\t\t\tbody: JSON.stringify(model),\r\n\t\t\t});\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\tawait cache.clearTimestamp(idbStore);\r\n\t\t\tconst data = await response.json();\r\n\t\t\treturn new User(data);\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Update a use\r\n\t * @param {User} model user to update.\r\n\t * @returns (async) Returns the updated User if the request was successful, otherwise a Response.\r\n\t */\r\n\tasync update(model) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/Users/' + model.id, {\r\n\t\t\t\tmethod: 'PUT',\r\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\r\n\t\t\t\tbody: JSON.stringify(model),\r\n\t\t\t});\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\tawait cache.clearTimestamp(idbStore);\r\n\t\t\tconst data = JSON.parse(JSON.stringify(model));\r\n\t\t\treturn new User(data);\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Delete a user\r\n\t * @param {Number} id User ID to delete.\r\n\t * @returns (async) Returns true if the request was successful (or not found), false if the user could not be deleted, otherwise a Response.\r\n\t */\r\n\tasync deleteById(id) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/Users/' + id, { method: 'DELETE' });\r\n\t\t} catch {\r\n\t\t\treturn offlineResponse();\r\n\t\t}\r\n\t\tif (response.ok) {\r\n\t\t\tawait cache.clearTimestamp(idbStore);\r\n\t\t\treturn true;\r\n\t\t} else if (response.status === 404) {\r\n\t\t\treturn true;\r\n\t\t} else if (response.status === 409) {\r\n\t\t\treturn false;\r\n\t\t} else {\r\n\t\t\treturn response;\r\n\t\t}\r\n\t},\r\n\tasync resendInvite(id) {\r\n\t\tlet response;\r\n\t\ttry {\r\n\t\t\tresponse = await fetchWrap('/api/Users/' + id + '/resendsetupemail', { method: 'POST' });\r\n\t\t} catch {\r\n\t\t\tresponse = offlineResponse();\r\n\t\t}\r\n\t\treturn response;\r\n\t},\r\n};\r\n"],"names":["UserCecRequirement","dto","getValue","getDate","getObject","Duration","warningDate","DateTime","User","getArray","getTypedArray","x","idbStore","usersApi","active","operator","filters","idb","getIdb","response","data","timestamp","useIdb","cache","fetchWrap","offlineResponse","filter","idbHelpers","idbResponse","isIdbResponse","makeComparator","id","model"],"mappings":"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"}