@etainabl/nodejs-sdk 1.2.56 → 1.2.57

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/esm/index.js CHANGED
@@ -575,7 +575,11 @@ var getScheduledReportRunTimes = (schedule, limit = 1, taskTime = moment2()) =>
575
575
  });
576
576
  return [...runTimes, ...scheduleRunTimes];
577
577
  };
578
+
579
+ // src/types/index.ts
580
+ import { ObjectId } from "mongodb";
578
581
  export {
582
+ ObjectId,
579
583
  api_default as api,
580
584
  consumption_exports as consumption,
581
585
  db_default as db,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/api.ts","../../src/logger.ts","../../src/db.ts","../../src/slack.ts","../../src/units.ts","../../src/consumption.ts","../../src/monitoring.ts","../../src/reporting.ts"],"sourcesContent":["import axios from 'axios';\nimport type { AxiosRequestConfig, AxiosInstance, CreateAxiosDefaults, AxiosResponse } from 'axios';\nimport https from 'https';\n\nimport logger from './logger.js';\n\nimport type { Account, Asset, Automation, Entity, Company, DataIngest, Invoice, Log, Reading, Report, Supplier } from './types/index.js'\n\nconst log = logger('etainablApi');\n\nexport interface ETNPagedResponse<T = any> {\n data: T[];\n total: number;\n limit: number;\n skip: number;\n}\n\nexport interface ETNReq {\n method: string;\n url: string;\n}\n\nfunction _handleResponse(req: ETNReq, res: AxiosResponse, isPaged = false) {\n if (!res) {\n throw new Error(`No response from API (${req.method} ${req.url})`);\n }\n\n if (res.status !== 200) {\n throw new Error(`${res.status} ${res.statusText} response from API (${req.method} ${req.url})`);\n }\n\n if (!res.data) {\n throw new Error(`No data from API (${req.method} ${req.url})`);\n }\n\n if (isPaged && !res.data.data) {\n throw new Error(`No data from API (${req.method} ${req.url})`);\n }\n\n return res;\n}\n\nconst factory = {\n getWithId: <T = any> (etainablApi: AxiosInstance, endpoint: string, postEndpoint?: string) => async (id: string, options: AxiosRequestConfig = {}): Promise<T> => {\n const req = {\n method: 'GET',\n url: `${endpoint}/${id}${postEndpoint ? `/${postEndpoint}` : ''}`\n };\n\n log.info(`API Request: ${req.method} ${process.env.ETAsINABL_API_URL}/${req.url}`);\n\n let res: AxiosResponse;\n\n try {\n res = await etainablApi.get(req.url, options);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n console.log(`API Response: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n _handleResponse(req, res)\n\n return res.data;\n },\n get: <T = any> (etainablApi: AxiosInstance, endpoint: string, postEndpoint?: string) => async (options: AxiosRequestConfig = {}): Promise<T> => {\n const req = {\n method: 'GET',\n url: `${endpoint}${postEndpoint ? `/${postEndpoint}` : ''}`\n };\n\n log.info(`API Request: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n let res: AxiosResponse;\n\n try {\n res = await etainablApi.get(req.url, options);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n console.log(`API Response: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n _handleResponse(req, res)\n\n return res.data;\n },\n list: <T = any> (etainablApi: AxiosInstance, endpoint: string, postEndpoint?: string) => async (options: AxiosRequestConfig = {}): Promise<ETNPagedResponse<T>> => {\n const req = {\n method: 'GET',\n url: `${endpoint}${postEndpoint ? `/${postEndpoint}` : ''}`\n };\n \n log.info(`API Request: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n let res: AxiosResponse;\n \n try {\n res = await etainablApi.get(req.url, options);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n console.log(`API Response: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n _handleResponse(req, res, true)\n\n return res.data;\n },\n update: <T = any> (etainablApi: AxiosInstance, endpoint: string, postEndpoint?: string) => async (id: string, data: any, options: AxiosRequestConfig = {}): Promise<T> => {\n const req = {\n method: 'PATCH',\n url: `${endpoint}/${id}${postEndpoint ? `/${postEndpoint}` : ''}`\n };\n \n log.info(`API Request: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n let res: AxiosResponse;\n \n try {\n res = await etainablApi.patch(req.url, data, options);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n _handleResponse(req, res)\n\n return res.data;\n },\n create: <T = any> (etainablApi: AxiosInstance, endpoint: string, postEndpoint?: string) => async (data: any, options: AxiosRequestConfig = {}): Promise<T> => {\n const req = {\n method: 'POST',\n url: `${endpoint}${postEndpoint ? `/${postEndpoint}` : ''}`\n };\n\n log.info(`API Request: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n let res: AxiosResponse;\n \n try {\n res = await etainablApi.post(req.url, data, options);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n _handleResponse(req, res)\n\n return res.data;\n },\n remove: <T = any> (etainablApi: AxiosInstance, endpoint: string, postEndpoint?: string) => async (id: string, options: AxiosRequestConfig = {}): Promise<T> => {\n const req = {\n method: 'DELETE',\n url: `${endpoint}/${id}${postEndpoint ? `/${postEndpoint}` : ''}`\n };\n\n let res: AxiosResponse;\n\n log.info(`API Request: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n try {\n res = await etainablApi.delete(req.url, options);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n _handleResponse(req, res);\n\n return res.data;\n },\n customWithId: <T = any> (etainablApi: AxiosInstance, method: string, endpoint: string, postEndpoint?: string) => async (id: string, data: any, options: AxiosRequestConfig = {}): Promise<T> => {\n const req = {\n method: method,\n url: `${endpoint}/${id}${postEndpoint ? `/${postEndpoint}` : ''}`,\n data,\n ...options\n };\n \n log.info(`API Request (Custom): ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n let res: AxiosResponse;\n \n try {\n res = await etainablApi.request(req);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n _handleResponse(req, res)\n\n return res.data;\n }\n};\n\n// ETN Sub Endpoints\n// e.g. /assets/:id/documents/:documentId\nconst subFactory = {\n // e.g. POST /assets/:id/documents\n create: <T = any> (etainablApi: AxiosInstance, endpoint: string, subEndpoint: string) => async (id: string, data: any, options: AxiosRequestConfig = {}) => { \n const subUrl = `${id}/${subEndpoint}`;\n return factory.create<T>(etainablApi, endpoint, subUrl)(data, options);\n },\n // e.g. PATCH /assets/:id/documents/:documentId\n update: <T = any> (etainablApi: AxiosInstance, endpoint: string, subEndpoint: string) => async (id: string, subId: string, data: any, options: AxiosRequestConfig = {}) => {\n const subUrl = `${subEndpoint}/${subId}`;\n \n return factory.update<T>(etainablApi, endpoint, subUrl)(id, data, options);\n },\n // e.g. DELETE /assets/:id/documents/:documentId\n remove: <T = any> (etainablApi: AxiosInstance, endpoint: string, subEndpoint: string) => async (id: string, subId: string, options: AxiosRequestConfig = {}) => {\n const subUrl = `${subEndpoint}/${subId}`;\n \n return factory.remove<T>(etainablApi, endpoint, subUrl)(id, options);\n }\n}\n\ninterface AuthOptions {\n key?: string;\n token?: string;\n}\n\nexport default (auth: AuthOptions, instanceOptions: CreateAxiosDefaults = {}) => {\n try {\n const headers: any = {};\n\n if (auth.key) {\n headers['x-key'] = auth.key;\n } else if (auth.token) {\n headers['Authorization'] = auth.token;\n } else {\n headers['x-key'] = process.env.ETAINABL_API_KEY;\n }\n \n const etainablApi = axios.create({\n baseURL: process.env.ETAINABL_API_URL,\n timeout: 300000,\n httpsAgent: new https.Agent({ keepAlive: true }),\n headers,\n ...instanceOptions\n });\n \n return {\n instance: etainablApi,\n \n // accounts\n getAccount: factory.getWithId<Account<string>>(etainablApi, 'accounts'),\n listAccounts: factory.list<Account<string>>(etainablApi, 'accounts'),\n updateAccount: factory.update<Account<string>>(etainablApi, 'accounts'),\n createAccount: factory.create<Account<string>>(etainablApi, 'accounts'),\n removeAccount: factory.remove<Account<string>>(etainablApi, 'accounts'),\n getAccountSchema: factory.get(etainablApi, 'accounts', 'schema'),\n invalidateAccountCache: factory.customWithId(etainablApi, 'put', 'accounts', 'invalidate-cache'),\n\n // assets\n getAsset: factory.getWithId<Asset<string>>(etainablApi, 'assets'),\n listAssets: factory.list<Asset<string>>(etainablApi, 'assets'),\n updateAsset: factory.update<Asset<string>>(etainablApi, 'assets'),\n createAsset: factory.create<Asset<string>>(etainablApi, 'assets'),\n removeAsset: factory.remove<Asset<string>>(etainablApi, 'assets'),\n getAssetSchema: factory.get(etainablApi, 'assets', 'schema'),\n \n // assetGroups\n getAssetGroup: factory.getWithId(etainablApi, 'asset-groups'),\n listAssetGroups: factory.list(etainablApi, 'asset-groups'),\n updateAssetGroup: factory.update(etainablApi, 'asset-groups'),\n createAssetGroup: factory.create(etainablApi, 'asset-groups'),\n removeAssetGroup: factory.remove(etainablApi, 'asset-groups'),\n getAssetGroupAssets: factory.getWithId(etainablApi, 'asset-groups', 'assets'),\n getAssetGroupSchema: factory.get(etainablApi, 'asset-groups', 'schema'),\n \n // automation\n getAutomation: factory.getWithId<Automation<string>>(etainablApi, 'automation'),\n listAutomations: factory.list<Automation<string>>(etainablApi, 'automation'),\n updateAutomation: factory.update<Automation<string>>(etainablApi, 'automation'),\n createAutomation: factory.create<Automation<string>>(etainablApi, 'automation'),\n removeAutomation: factory.remove<Automation<string>>(etainablApi, 'automation'),\n createAutomationLog: subFactory.create(etainablApi, 'automation', 'logs'),\n updateAutomationLog: subFactory.update(etainablApi, 'automation', 'logs'),\n removeAutomationLog: subFactory.remove(etainablApi, 'automation', 'logs'),\n \n // company\n getCompany: factory.getWithId<Company<string>>(etainablApi, 'companies'),\n \n // consumption\n getConsumption: factory.getWithId(etainablApi, 'consumptions'),\n listConsumptions: factory.list(etainablApi, 'consumptions'),\n updateConsumption: factory.update(etainablApi, 'consumptions'),\n createConsumption: factory.create(etainablApi, 'consumptions'),\n removeConsumption: factory.remove(etainablApi, 'consumptions'),\n getConsumptionSchema: factory.get(etainablApi, 'consumptions', 'schema'),\n \n // emails\n getEmail: factory.getWithId(etainablApi, 'emails'),\n listEmails: factory.list(etainablApi, 'emails'),\n updateEmail: factory.update(etainablApi, 'emails'),\n createEmail: factory.create(etainablApi, 'emails'),\n removeEmail: factory.remove(etainablApi, 'emails'),\n \n // emission factors\n getEmissionFactor: factory.getWithId(etainablApi, 'emission-factors'),\n listEmissionFactors: factory.list(etainablApi, 'emission-factors'),\n updateEmissionFactor: factory.update(etainablApi, 'emission-factors'),\n createEmissionFactor: factory.create(etainablApi, 'emission-factors'),\n removeEmissionFactor: factory.remove(etainablApi, 'emission-factors'),\n\n // entity\n getEntity: factory.getWithId<Entity<string>>(etainablApi, 'entities'),\n listEntities: factory.list<Entity<string>>(etainablApi, 'entities'),\n updateEntity: factory.update<Entity<string>>(etainablApi, 'entities'),\n createEntity: factory.create<Entity<string>>(etainablApi, 'entities'),\n removeEntity: factory.remove<Entity<string>>(etainablApi, 'entities'),\n getEntitiesSchema: factory.get(etainablApi, 'entities', 'schema'),\n \n \n // logs\n getLog: factory.getWithId<Log<string>>(etainablApi, 'logs'),\n listLogs: factory.list<Log<string>>(etainablApi, 'logs'),\n updateLog: factory.update<Log<string>>(etainablApi, 'logs'),\n createLog: factory.create<Log<string>>(etainablApi, 'logs'),\n removeLog: factory.remove<Log<string>>(etainablApi, 'logs'),\n \n // readings\n getReading: factory.getWithId<Reading<string>>(etainablApi, 'readings'),\n listReadings: factory.list<Reading<string>>(etainablApi, 'readings'),\n updateReading: factory.update<Reading<string>>(etainablApi, 'readings'),\n createReading: factory.create<Reading<string>>(etainablApi, 'readings'),\n removeReading: factory.remove<Reading<string>>(etainablApi, 'readings'),\n getReadingSchema: factory.get(etainablApi, 'readings', 'schema'),\n \n // reports\n getReport: factory.getWithId<Report<string>>(etainablApi, 'reports'),\n listReports: factory.list<Report<string>>(etainablApi, 'reports'),\n updateReport: factory.update<Report<string>>(etainablApi, 'reports'),\n createReport: factory.create<Report<string>>(etainablApi, 'reports'),\n removeReport: factory.remove<Report<string>>(etainablApi, 'reports'),\n sendReport: factory.customWithId(etainablApi, 'post', 'reports', 'send'),\n \n // report templates\n getReportTemplate: factory.getWithId(etainablApi, 'report-templates'),\n listReportTemplates: factory.list(etainablApi, 'report-templates'),\n updateReportTemplate: factory.update(etainablApi, 'report-templates'),\n createReportTemplate: factory.create(etainablApi, 'report-templates'),\n removeReportTemplate: factory.remove(etainablApi, 'report-templates'),\n \n // scheduled reports\n getScheduledReport: factory.getWithId(etainablApi, 'scheduled-reports'),\n listScheduledReports: factory.list(etainablApi, 'scheduled-reports'),\n updateScheduledReport: factory.update(etainablApi, 'scheduled-reports'),\n createScheduledReport: factory.create(etainablApi, 'scheduled-reports'),\n removeScheduledReport: factory.remove(etainablApi, 'scheduled-reports'),\n sendScheduledReport: factory.customWithId(etainablApi, 'post', 'scheduled-reports', 'send'),\n \n // invoices\n getInvoice: factory.getWithId<Invoice<string>>(etainablApi, 'invoices'),\n listInvoices: factory.list<Invoice<string>>(etainablApi, 'invoices'),\n updateInvoice: factory.update<Invoice<string>>(etainablApi, 'invoices'),\n createInvoice: factory.create<Invoice<string>>(etainablApi, 'invoices'),\n removeInvoice: factory.remove<Invoice<string>>(etainablApi, 'invoices'),\n getInvoiceSchema: factory.get(etainablApi, 'invoices', 'schema'),\n\n //suppliers\n listSuppliers: factory.list<Supplier<string>>(etainablApi, 'suppliers'),\n getSupplierSchema: factory.get(etainablApi, 'suppliers', 'schema'),\n\n // import templates\n getImportTemplate: factory.getWithId(etainablApi, 'import-templates'),\n\n //data imports\n listDataIngest: factory.list<DataIngest<string>>(etainablApi, 'data-ingests'),\n updateDataIngest: factory.update<DataIngest<string>>(etainablApi, 'data-ingests'),\n createDataIngest: factory.create<DataIngest<string>>(etainablApi, 'data-ingests')\n\n }\n } catch (e) {\n log.error(e);\n throw e;\n }\n};\n","import winston from 'winston';\n\nexport default (namespace: string) => winston.createLogger({\n level: 'debug',\n format: winston.format.combine(\n winston.format.timestamp(),\n winston.format.json()\n ),\n defaultMeta: { service: process.env.AWS_LAMBDA_FUNCTION_NAME, script: namespace },\n transports: [\n new winston.transports.Console()\n ]\n});\n","import { MongoClient, Db } from 'mongodb';\nimport logger from './logger.js';\n\nconst log = logger('dbHelpers');\n\nlet cachedDb: Db;\n\nasync function connectToDatabase(retryAttempt: number = 1): Promise<Db> {\n if (!process.env.ETAINABL_DB_URL) throw new Error(\"ETAINABL_DB_URL is not set\");\n if (!process.env.AWS_ACCESS_KEY_ID) throw new Error(\"AWS_ACCESS_KEY_ID is not set\");\n if (!process.env.AWS_SECRET_ACCESS_KEY) throw new Error(\"AWS_SECRET_ACCESS_KEY is not set\");\n\n if (cachedDb) {\n log.debug('Using cached MongoDB connection.');\n return Promise.resolve(cachedDb);\n }\n \n const uri = `mongodb+srv://${process.env.ETAINABL_DB_URL}`;\n \n try {\n if (process.env.DB_BASIC_AUTH === 'true') {\n log.debug('Connecting to MongoDB server... (Auth: Basic)');\n\n const client = new MongoClient(uri);\n await client.connect();\n\n log.debug('Connected successfully to MongoDB server! (Auth: Basic)');\n\n cachedDb = client.db('etainabl');\n\n return cachedDb;\n }\n\n log.debug('Connecting to MongoDB server... (Auth: AWS)');\n\n const client = new MongoClient(uri, {\n auth: {\n username: process.env.AWS_ACCESS_KEY_ID,\n password: process.env.AWS_SECRET_ACCESS_KEY\n },\n authSource: '$external',\n authMechanism: 'MONGODB-AWS'\n });\n\n await client.connect();\n\n log.debug('Connected successfully to MongoDB server! (Auth: AWS)');\n\n cachedDb = client.db('etainabl');\n\n return cachedDb;\n\n } catch (e: any) {\n // Retry\n if (retryAttempt > 5) {\n console.log(`Error connecting to MongoDB server after 5 attempts...`);\n throw e;\n }\n\n console.log(`MongoDB Connection error: ${e.message}`);\n\n console.log(`Error connecting to MongoDB server... Retrying in 3 seconds... (Attempt ${retryAttempt})`);\n return connectToDatabase(retryAttempt + 1);\n }\n}\n\nexport default {\n connectToDatabase\n};","import axios from 'axios';\n\nconst postMessage = async (message: string) => {\n const url = 'https://hooks.slack.com/services/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';\n const data = {\n text: `[${(process.env.ENV || '').toUpperCase()}][${process.env.AWS_LAMBDA_FUNCTION_NAME}] ${message}`\n };\n const headers = {\n 'Content-Type': 'application/json'\n };\n return axios.post(url, data, { headers });\n};\n\nexport default {\n postMessage\n}","interface Item {\n units?: string | null;\n unit?: string | null;\n factor?: number | null;\n value: number;\n [key: string]: any; \n}\n\nexport type AccountType = 'electricity' | 'gas' | 'water' | 'waste' | 'solar' | 'heating' | 'flow' | 'cooling' | 'temperature' | 'oil' | 'other';\nexport type ETNUnit = 'kwh' | 'kg' | 'm3' | 'lbs' | 'tonnes' | 'wh' | 'mwh' | 'ft3' | 'hcf' | 'm3/h' | 'qty' | 'l' | 'C' | 'mcuf' | 'hcuf' | 'tcuf' | 'ocuf' | 'hm3' | 'tm3' | 'nm3';\nexport type BaseUnit = 'kwh' | 'm3' | 'C' | 'kg' | 'm3/h' | 'l';\nexport const accountTypeMap: { [key: string]: BaseUnit } = {\n electricity: 'kwh',\n gas: 'kwh',\n water: 'm3',\n waste: 'kg',\n solar: 'kwh',\n heating: 'kwh',\n flow: 'm3/h',\n cooling: 'kwh',\n temperature: 'C',\n oil: 'l'\n};\n\nconst unitConversionFactors: { [key: string]: any } = {\n kwh: {\n kwh: 1,\n mwh: 1000,\n wh: 0.001,\n m3: (39 * 1.02264) / 3.6,\n ft3: (0.0283 * 39 * 1.02264) / 3.6,\n hcf: (2.83 * 39 * 1.02264) / 3.6\n },\n m3: {\n m3: 1,\n l: 0.001\n },\n C: {\n C: 1\n },\n kg: {\n kg: 1,\n lbs: 0.45359237,\n tonnes: 1000\n },\n 'm3/h': {\n 'm3/h': 1\n }\n};\n\nexport const accountTypeUnitMap: { [key: string]: ETNUnit[] } = {\n electricity: ['kwh', 'mwh', 'wh'],\n gas: ['kwh', 'm3', 'ft3', 'hcf'],\n water: ['m3', 'l'],\n waste: ['kg', 'lbs', 'tonnes'],\n solar: ['kwh', 'mwh', 'wh'],\n heating: ['kwh', 'mwh', 'wh'],\n flow: ['m3/h'],\n cooling: ['kwh', 'mwh', 'wh'],\n temperature: ['C'],\n oil: ['l']\n};\n\n// Convert units to base format\nexport const convertItems = (items: Item[], type: AccountType, defaultUnits: ETNUnit | undefined, accountFactor: number | undefined): any => {\n if (!type) throw new Error('Account type is required');\n\n const baseUnit = accountTypeMap[type];\n if (!baseUnit) throw new Error(`Account type ${type} is not supported`);\n\n const convertedItems = items.map(item => {\n const factor = item.factor || accountFactor || 1;\n const units = item.units || item.unit || defaultUnits || baseUnit;\n const convertedValue = item.value * _getConversionFactor(units, baseUnit) * factor;\n return { ...item, value: convertedValue, units: baseUnit };\n });\n\n return convertedItems;\n};\n\nconst _getConversionFactor = (fromUnit: string = 'kwh', toUnit: string) => {\n const conversionFactors = unitConversionFactors[toUnit];\n\n if (!conversionFactors) {\n throw new Error(`Conversion factor base unit ${toUnit} is not defined`);\n }\n\n if (!conversionFactors[fromUnit]) {\n throw new Error(`Conversion factor from unit ${fromUnit} is not defined`);\n }\n\n return conversionFactors[fromUnit];\n};\n\nexport const checkAccountTypeVsUnits = (type: string, unit: string, additionalLog: number | '' = '') => {\n if (!type) throw new Error('Account type is required');\n if (!unit) throw new Error('Unit is required');\n\n const parsedType = type.toLowerCase().trim();\n\n const accountTypeUnits = accountTypeUnitMap[parsedType];\n if (!accountTypeUnits) throw new Error(`Account type \"${parsedType}\" is not supported ${additionalLog}`);\n\n const parsedUnit = unit.toLowerCase().trim() as ETNUnit;\n\n if (!accountTypeUnits.includes(parsedUnit)) {\n throw new Error(`Account type \"${parsedType}\" does not support unit \"${parsedUnit}\" ${additionalLog}`);\n }\n\n return { type: parsedType as AccountType, unit: parsedUnit};\n};\n","import moment from 'moment';\n\ninterface ConsumptionData {\n date: Date;\n consumption: number;\n}\n\ninterface DayNightConsumption {\n dayConsumption: number,\n nightConsumption: number,\n consumption: number\n}\n\nexport const dayNightConsumption = (data: ConsumptionData[]) => data.reduce((acc: DayNightConsumption, item: ConsumptionData): DayNightConsumption => {\n const hour = moment.utc(item.date).hour(); // End Time of HH consumption period\n\n if (hour >= 0 && hour < 7) {\n acc.nightConsumption += item.consumption;\n } else {\n acc.dayConsumption += item.consumption;\n }\n\n acc.consumption += item.consumption;\n\n return acc;\n}, {\n dayConsumption: 0,\n nightConsumption: 0,\n consumption: 0\n});\n\nexport const calcMaxConsumptionValue = (data: ConsumptionData[]) => Math.max(...data.map((item: ConsumptionData) => item.consumption));\n\nexport const calcMaxDemand = (data: ConsumptionData[]) => calcMaxConsumptionValue(data) * 2;\n\nexport const calcPeakLoad = (consumption: number, maxDemand: number, startDate: string | moment.Moment, endDate: string | moment.Moment) => {\n const days = Math.ceil(moment(endDate).diff(moment(startDate), 'days', true));\n\n return maxDemand === 0 ? 0 : ((consumption / (maxDemand * 24 * days)) * 100);\n};","import axios from 'axios';\n\nimport logger from './logger.js';\n\nconst log = logger('monitoring');\n\nexport const sendHeartbeat = async () => {\n if (!process.env.HEARTBEAT_URL || process.env.HEARTBEAT_URL.endsWith('/')) return false;\n\n try {\n await axios.post(process.env.HEARTBEAT_URL);\n\n return true;\n } catch (e: any) {\n log.warn(`Failed to send heartbeat: ${e.message || e}`);\n return false;\n }\n}","import moment from 'moment';\n\nmoment.locale('en', {\n week: {\n dow: 1\n }\n});\n\nconst getNextRunTime = (startDate: moment.Moment, schedule: any, taskTime: moment.Moment): moment.Moment => {\n const [num, freq] = schedule.frequency.split('|');\n const targetDate = moment(startDate).add(num, freq as moment.unitOfTime.Base);\n\n if (schedule.frequencyPeriod === 'first') {\n targetDate.startOf(freq as moment.unitOfTime.StartOf);\n } else if (schedule.frequencyPeriod === 'last') {\n targetDate.endOf(freq as moment.unitOfTime.StartOf);\n }\n\n const isWeekday = targetDate.isoWeekday() > 0 && targetDate.isoWeekday() < 6;\n const isSaturday = targetDate.isoWeekday() === 6;\n\n // The weekday or weekend chosen should be within the same month as the target date\n if (schedule.frequencyDay === 'weekdays' && !isWeekday) {\n if ((targetDate.date() / 7) < 2) {\n targetDate.add(isSaturday ? 2 : 1, 'days');\n } else {\n targetDate.subtract(isSaturday ? 1 : 2, 'days');\n }\n } else if (schedule.frequencyDay === 'weekends' && isWeekday) {\n if ((targetDate.date() / 7) < 2) {\n targetDate.isoWeekday(6);\n } else {\n targetDate.isoWeekday(0);\n }\n }\n\n if (taskTime.isAfter(targetDate, 'minute')) {\n return getNextRunTime(targetDate, schedule, taskTime);\n }\n\n return targetDate;\n};\n\nexport const getScheduledReportRunTimes = (schedule: any, limit = 1, taskTime = moment()): moment.Moment[] => {\n if (!schedule.startDate || !schedule.enabled) return [];\n\n const originalStartDate = moment.utc(schedule.startDate);\n\n let startDate = originalStartDate;\n\n const includeStartDate = taskTime.isSameOrBefore(originalStartDate, 'minute');\n\n let runTimes = [] as moment.Moment[];\n\n if (includeStartDate) {\n runTimes = [originalStartDate];\n }\n\n const [, freq] = schedule.frequency.split('|');\n\n if (freq === 'once') {\n const nextRunTime = runTimes[0];\n\n // If this is now beyond the start date, return an empty array\n return taskTime.isAfter(nextRunTime, 'minute') ? [] : runTimes;\n }\n\n\n const scheduleRunTimes = Array.from(Array(includeStartDate ? limit - 1 : limit).keys()).map(() => {\n const nextRunTime = getNextRunTime(startDate, schedule, taskTime);\n\n startDate = nextRunTime.hour(originalStartDate.hour()).minute(originalStartDate.minute());\n\n return nextRunTime;\n });\n\n return [...runTimes, ...scheduleRunTimes];\n};\n"],"mappings":"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","names":["log","client","axios","axios","log","axios","moment"]}
1
+ {"version":3,"sources":["../../src/api.ts","../../src/logger.ts","../../src/db.ts","../../src/slack.ts","../../src/units.ts","../../src/consumption.ts","../../src/monitoring.ts","../../src/reporting.ts","../../src/types/index.ts"],"sourcesContent":["import axios from 'axios';\nimport type { AxiosRequestConfig, AxiosInstance, CreateAxiosDefaults, AxiosResponse } from 'axios';\nimport https from 'https';\n\nimport logger from './logger.js';\n\nimport type { Account, Asset, Automation, Entity, Company, DataIngest, Invoice, Log, Reading, Report, Supplier } from './types/index.js'\n\nconst log = logger('etainablApi');\n\nexport interface ETNPagedResponse<T = any> {\n data: T[];\n total: number;\n limit: number;\n skip: number;\n}\n\nexport interface ETNReq {\n method: string;\n url: string;\n}\n\nfunction _handleResponse(req: ETNReq, res: AxiosResponse, isPaged = false) {\n if (!res) {\n throw new Error(`No response from API (${req.method} ${req.url})`);\n }\n\n if (res.status !== 200) {\n throw new Error(`${res.status} ${res.statusText} response from API (${req.method} ${req.url})`);\n }\n\n if (!res.data) {\n throw new Error(`No data from API (${req.method} ${req.url})`);\n }\n\n if (isPaged && !res.data.data) {\n throw new Error(`No data from API (${req.method} ${req.url})`);\n }\n\n return res;\n}\n\nconst factory = {\n getWithId: <T = any> (etainablApi: AxiosInstance, endpoint: string, postEndpoint?: string) => async (id: string, options: AxiosRequestConfig = {}): Promise<T> => {\n const req = {\n method: 'GET',\n url: `${endpoint}/${id}${postEndpoint ? `/${postEndpoint}` : ''}`\n };\n\n log.info(`API Request: ${req.method} ${process.env.ETAsINABL_API_URL}/${req.url}`);\n\n let res: AxiosResponse;\n\n try {\n res = await etainablApi.get(req.url, options);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n console.log(`API Response: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n _handleResponse(req, res)\n\n return res.data;\n },\n get: <T = any> (etainablApi: AxiosInstance, endpoint: string, postEndpoint?: string) => async (options: AxiosRequestConfig = {}): Promise<T> => {\n const req = {\n method: 'GET',\n url: `${endpoint}${postEndpoint ? `/${postEndpoint}` : ''}`\n };\n\n log.info(`API Request: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n let res: AxiosResponse;\n\n try {\n res = await etainablApi.get(req.url, options);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n console.log(`API Response: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n _handleResponse(req, res)\n\n return res.data;\n },\n list: <T = any> (etainablApi: AxiosInstance, endpoint: string, postEndpoint?: string) => async (options: AxiosRequestConfig = {}): Promise<ETNPagedResponse<T>> => {\n const req = {\n method: 'GET',\n url: `${endpoint}${postEndpoint ? `/${postEndpoint}` : ''}`\n };\n \n log.info(`API Request: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n let res: AxiosResponse;\n \n try {\n res = await etainablApi.get(req.url, options);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n console.log(`API Response: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n _handleResponse(req, res, true)\n\n return res.data;\n },\n update: <T = any> (etainablApi: AxiosInstance, endpoint: string, postEndpoint?: string) => async (id: string, data: any, options: AxiosRequestConfig = {}): Promise<T> => {\n const req = {\n method: 'PATCH',\n url: `${endpoint}/${id}${postEndpoint ? `/${postEndpoint}` : ''}`\n };\n \n log.info(`API Request: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n let res: AxiosResponse;\n \n try {\n res = await etainablApi.patch(req.url, data, options);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n _handleResponse(req, res)\n\n return res.data;\n },\n create: <T = any> (etainablApi: AxiosInstance, endpoint: string, postEndpoint?: string) => async (data: any, options: AxiosRequestConfig = {}): Promise<T> => {\n const req = {\n method: 'POST',\n url: `${endpoint}${postEndpoint ? `/${postEndpoint}` : ''}`\n };\n\n log.info(`API Request: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n let res: AxiosResponse;\n \n try {\n res = await etainablApi.post(req.url, data, options);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n _handleResponse(req, res)\n\n return res.data;\n },\n remove: <T = any> (etainablApi: AxiosInstance, endpoint: string, postEndpoint?: string) => async (id: string, options: AxiosRequestConfig = {}): Promise<T> => {\n const req = {\n method: 'DELETE',\n url: `${endpoint}/${id}${postEndpoint ? `/${postEndpoint}` : ''}`\n };\n\n let res: AxiosResponse;\n\n log.info(`API Request: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n try {\n res = await etainablApi.delete(req.url, options);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n _handleResponse(req, res);\n\n return res.data;\n },\n customWithId: <T = any> (etainablApi: AxiosInstance, method: string, endpoint: string, postEndpoint?: string) => async (id: string, data: any, options: AxiosRequestConfig = {}): Promise<T> => {\n const req = {\n method: method,\n url: `${endpoint}/${id}${postEndpoint ? `/${postEndpoint}` : ''}`,\n data,\n ...options\n };\n \n log.info(`API Request (Custom): ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n let res: AxiosResponse;\n \n try {\n res = await etainablApi.request(req);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n _handleResponse(req, res)\n\n return res.data;\n }\n};\n\n// ETN Sub Endpoints\n// e.g. /assets/:id/documents/:documentId\nconst subFactory = {\n // e.g. POST /assets/:id/documents\n create: <T = any> (etainablApi: AxiosInstance, endpoint: string, subEndpoint: string) => async (id: string, data: any, options: AxiosRequestConfig = {}) => { \n const subUrl = `${id}/${subEndpoint}`;\n return factory.create<T>(etainablApi, endpoint, subUrl)(data, options);\n },\n // e.g. PATCH /assets/:id/documents/:documentId\n update: <T = any> (etainablApi: AxiosInstance, endpoint: string, subEndpoint: string) => async (id: string, subId: string, data: any, options: AxiosRequestConfig = {}) => {\n const subUrl = `${subEndpoint}/${subId}`;\n \n return factory.update<T>(etainablApi, endpoint, subUrl)(id, data, options);\n },\n // e.g. DELETE /assets/:id/documents/:documentId\n remove: <T = any> (etainablApi: AxiosInstance, endpoint: string, subEndpoint: string) => async (id: string, subId: string, options: AxiosRequestConfig = {}) => {\n const subUrl = `${subEndpoint}/${subId}`;\n \n return factory.remove<T>(etainablApi, endpoint, subUrl)(id, options);\n }\n}\n\ninterface AuthOptions {\n key?: string;\n token?: string;\n}\n\nexport default (auth: AuthOptions, instanceOptions: CreateAxiosDefaults = {}) => {\n try {\n const headers: any = {};\n\n if (auth.key) {\n headers['x-key'] = auth.key;\n } else if (auth.token) {\n headers['Authorization'] = auth.token;\n } else {\n headers['x-key'] = process.env.ETAINABL_API_KEY;\n }\n \n const etainablApi = axios.create({\n baseURL: process.env.ETAINABL_API_URL,\n timeout: 300000,\n httpsAgent: new https.Agent({ keepAlive: true }),\n headers,\n ...instanceOptions\n });\n \n return {\n instance: etainablApi,\n \n // accounts\n getAccount: factory.getWithId<Account<string>>(etainablApi, 'accounts'),\n listAccounts: factory.list<Account<string>>(etainablApi, 'accounts'),\n updateAccount: factory.update<Account<string>>(etainablApi, 'accounts'),\n createAccount: factory.create<Account<string>>(etainablApi, 'accounts'),\n removeAccount: factory.remove<Account<string>>(etainablApi, 'accounts'),\n getAccountSchema: factory.get(etainablApi, 'accounts', 'schema'),\n invalidateAccountCache: factory.customWithId(etainablApi, 'put', 'accounts', 'invalidate-cache'),\n\n // assets\n getAsset: factory.getWithId<Asset<string>>(etainablApi, 'assets'),\n listAssets: factory.list<Asset<string>>(etainablApi, 'assets'),\n updateAsset: factory.update<Asset<string>>(etainablApi, 'assets'),\n createAsset: factory.create<Asset<string>>(etainablApi, 'assets'),\n removeAsset: factory.remove<Asset<string>>(etainablApi, 'assets'),\n getAssetSchema: factory.get(etainablApi, 'assets', 'schema'),\n \n // assetGroups\n getAssetGroup: factory.getWithId(etainablApi, 'asset-groups'),\n listAssetGroups: factory.list(etainablApi, 'asset-groups'),\n updateAssetGroup: factory.update(etainablApi, 'asset-groups'),\n createAssetGroup: factory.create(etainablApi, 'asset-groups'),\n removeAssetGroup: factory.remove(etainablApi, 'asset-groups'),\n getAssetGroupAssets: factory.getWithId(etainablApi, 'asset-groups', 'assets'),\n getAssetGroupSchema: factory.get(etainablApi, 'asset-groups', 'schema'),\n \n // automation\n getAutomation: factory.getWithId<Automation<string>>(etainablApi, 'automation'),\n listAutomations: factory.list<Automation<string>>(etainablApi, 'automation'),\n updateAutomation: factory.update<Automation<string>>(etainablApi, 'automation'),\n createAutomation: factory.create<Automation<string>>(etainablApi, 'automation'),\n removeAutomation: factory.remove<Automation<string>>(etainablApi, 'automation'),\n createAutomationLog: subFactory.create(etainablApi, 'automation', 'logs'),\n updateAutomationLog: subFactory.update(etainablApi, 'automation', 'logs'),\n removeAutomationLog: subFactory.remove(etainablApi, 'automation', 'logs'),\n \n // company\n getCompany: factory.getWithId<Company<string>>(etainablApi, 'companies'),\n \n // consumption\n getConsumption: factory.getWithId(etainablApi, 'consumptions'),\n listConsumptions: factory.list(etainablApi, 'consumptions'),\n updateConsumption: factory.update(etainablApi, 'consumptions'),\n createConsumption: factory.create(etainablApi, 'consumptions'),\n removeConsumption: factory.remove(etainablApi, 'consumptions'),\n getConsumptionSchema: factory.get(etainablApi, 'consumptions', 'schema'),\n \n // emails\n getEmail: factory.getWithId(etainablApi, 'emails'),\n listEmails: factory.list(etainablApi, 'emails'),\n updateEmail: factory.update(etainablApi, 'emails'),\n createEmail: factory.create(etainablApi, 'emails'),\n removeEmail: factory.remove(etainablApi, 'emails'),\n \n // emission factors\n getEmissionFactor: factory.getWithId(etainablApi, 'emission-factors'),\n listEmissionFactors: factory.list(etainablApi, 'emission-factors'),\n updateEmissionFactor: factory.update(etainablApi, 'emission-factors'),\n createEmissionFactor: factory.create(etainablApi, 'emission-factors'),\n removeEmissionFactor: factory.remove(etainablApi, 'emission-factors'),\n\n // entity\n getEntity: factory.getWithId<Entity<string>>(etainablApi, 'entities'),\n listEntities: factory.list<Entity<string>>(etainablApi, 'entities'),\n updateEntity: factory.update<Entity<string>>(etainablApi, 'entities'),\n createEntity: factory.create<Entity<string>>(etainablApi, 'entities'),\n removeEntity: factory.remove<Entity<string>>(etainablApi, 'entities'),\n getEntitiesSchema: factory.get(etainablApi, 'entities', 'schema'),\n \n \n // logs\n getLog: factory.getWithId<Log<string>>(etainablApi, 'logs'),\n listLogs: factory.list<Log<string>>(etainablApi, 'logs'),\n updateLog: factory.update<Log<string>>(etainablApi, 'logs'),\n createLog: factory.create<Log<string>>(etainablApi, 'logs'),\n removeLog: factory.remove<Log<string>>(etainablApi, 'logs'),\n \n // readings\n getReading: factory.getWithId<Reading<string>>(etainablApi, 'readings'),\n listReadings: factory.list<Reading<string>>(etainablApi, 'readings'),\n updateReading: factory.update<Reading<string>>(etainablApi, 'readings'),\n createReading: factory.create<Reading<string>>(etainablApi, 'readings'),\n removeReading: factory.remove<Reading<string>>(etainablApi, 'readings'),\n getReadingSchema: factory.get(etainablApi, 'readings', 'schema'),\n \n // reports\n getReport: factory.getWithId<Report<string>>(etainablApi, 'reports'),\n listReports: factory.list<Report<string>>(etainablApi, 'reports'),\n updateReport: factory.update<Report<string>>(etainablApi, 'reports'),\n createReport: factory.create<Report<string>>(etainablApi, 'reports'),\n removeReport: factory.remove<Report<string>>(etainablApi, 'reports'),\n sendReport: factory.customWithId(etainablApi, 'post', 'reports', 'send'),\n \n // report templates\n getReportTemplate: factory.getWithId(etainablApi, 'report-templates'),\n listReportTemplates: factory.list(etainablApi, 'report-templates'),\n updateReportTemplate: factory.update(etainablApi, 'report-templates'),\n createReportTemplate: factory.create(etainablApi, 'report-templates'),\n removeReportTemplate: factory.remove(etainablApi, 'report-templates'),\n \n // scheduled reports\n getScheduledReport: factory.getWithId(etainablApi, 'scheduled-reports'),\n listScheduledReports: factory.list(etainablApi, 'scheduled-reports'),\n updateScheduledReport: factory.update(etainablApi, 'scheduled-reports'),\n createScheduledReport: factory.create(etainablApi, 'scheduled-reports'),\n removeScheduledReport: factory.remove(etainablApi, 'scheduled-reports'),\n sendScheduledReport: factory.customWithId(etainablApi, 'post', 'scheduled-reports', 'send'),\n \n // invoices\n getInvoice: factory.getWithId<Invoice<string>>(etainablApi, 'invoices'),\n listInvoices: factory.list<Invoice<string>>(etainablApi, 'invoices'),\n updateInvoice: factory.update<Invoice<string>>(etainablApi, 'invoices'),\n createInvoice: factory.create<Invoice<string>>(etainablApi, 'invoices'),\n removeInvoice: factory.remove<Invoice<string>>(etainablApi, 'invoices'),\n getInvoiceSchema: factory.get(etainablApi, 'invoices', 'schema'),\n\n //suppliers\n listSuppliers: factory.list<Supplier<string>>(etainablApi, 'suppliers'),\n getSupplierSchema: factory.get(etainablApi, 'suppliers', 'schema'),\n\n // import templates\n getImportTemplate: factory.getWithId(etainablApi, 'import-templates'),\n\n //data imports\n listDataIngest: factory.list<DataIngest<string>>(etainablApi, 'data-ingests'),\n updateDataIngest: factory.update<DataIngest<string>>(etainablApi, 'data-ingests'),\n createDataIngest: factory.create<DataIngest<string>>(etainablApi, 'data-ingests')\n\n }\n } catch (e) {\n log.error(e);\n throw e;\n }\n};\n","import winston from 'winston';\n\nexport default (namespace: string) => winston.createLogger({\n level: 'debug',\n format: winston.format.combine(\n winston.format.timestamp(),\n winston.format.json()\n ),\n defaultMeta: { service: process.env.AWS_LAMBDA_FUNCTION_NAME, script: namespace },\n transports: [\n new winston.transports.Console()\n ]\n});\n","import { MongoClient, Db } from 'mongodb';\nimport logger from './logger.js';\n\nconst log = logger('dbHelpers');\n\nlet cachedDb: Db;\n\nasync function connectToDatabase(retryAttempt: number = 1): Promise<Db> {\n if (!process.env.ETAINABL_DB_URL) throw new Error(\"ETAINABL_DB_URL is not set\");\n if (!process.env.AWS_ACCESS_KEY_ID) throw new Error(\"AWS_ACCESS_KEY_ID is not set\");\n if (!process.env.AWS_SECRET_ACCESS_KEY) throw new Error(\"AWS_SECRET_ACCESS_KEY is not set\");\n\n if (cachedDb) {\n log.debug('Using cached MongoDB connection.');\n return Promise.resolve(cachedDb);\n }\n \n const uri = `mongodb+srv://${process.env.ETAINABL_DB_URL}`;\n \n try {\n if (process.env.DB_BASIC_AUTH === 'true') {\n log.debug('Connecting to MongoDB server... (Auth: Basic)');\n\n const client = new MongoClient(uri);\n await client.connect();\n\n log.debug('Connected successfully to MongoDB server! (Auth: Basic)');\n\n cachedDb = client.db('etainabl');\n\n return cachedDb;\n }\n\n log.debug('Connecting to MongoDB server... (Auth: AWS)');\n\n const client = new MongoClient(uri, {\n auth: {\n username: process.env.AWS_ACCESS_KEY_ID,\n password: process.env.AWS_SECRET_ACCESS_KEY\n },\n authSource: '$external',\n authMechanism: 'MONGODB-AWS'\n });\n\n await client.connect();\n\n log.debug('Connected successfully to MongoDB server! (Auth: AWS)');\n\n cachedDb = client.db('etainabl');\n\n return cachedDb;\n\n } catch (e: any) {\n // Retry\n if (retryAttempt > 5) {\n console.log(`Error connecting to MongoDB server after 5 attempts...`);\n throw e;\n }\n\n console.log(`MongoDB Connection error: ${e.message}`);\n\n console.log(`Error connecting to MongoDB server... Retrying in 3 seconds... (Attempt ${retryAttempt})`);\n return connectToDatabase(retryAttempt + 1);\n }\n}\n\nexport default {\n connectToDatabase\n};","import axios from 'axios';\n\nconst postMessage = async (message: string) => {\n const url = 'https://hooks.slack.com/services/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';\n const data = {\n text: `[${(process.env.ENV || '').toUpperCase()}][${process.env.AWS_LAMBDA_FUNCTION_NAME}] ${message}`\n };\n const headers = {\n 'Content-Type': 'application/json'\n };\n return axios.post(url, data, { headers });\n};\n\nexport default {\n postMessage\n}","interface Item {\n units?: string | null;\n unit?: string | null;\n factor?: number | null;\n value: number;\n [key: string]: any; \n}\n\nexport type AccountType = 'electricity' | 'gas' | 'water' | 'waste' | 'solar' | 'heating' | 'flow' | 'cooling' | 'temperature' | 'oil' | 'other';\nexport type ETNUnit = 'kwh' | 'kg' | 'm3' | 'lbs' | 'tonnes' | 'wh' | 'mwh' | 'ft3' | 'hcf' | 'm3/h' | 'qty' | 'l' | 'C' | 'mcuf' | 'hcuf' | 'tcuf' | 'ocuf' | 'hm3' | 'tm3' | 'nm3';\nexport type BaseUnit = 'kwh' | 'm3' | 'C' | 'kg' | 'm3/h' | 'l';\nexport const accountTypeMap: { [key: string]: BaseUnit } = {\n electricity: 'kwh',\n gas: 'kwh',\n water: 'm3',\n waste: 'kg',\n solar: 'kwh',\n heating: 'kwh',\n flow: 'm3/h',\n cooling: 'kwh',\n temperature: 'C',\n oil: 'l'\n};\n\nconst unitConversionFactors: { [key: string]: any } = {\n kwh: {\n kwh: 1,\n mwh: 1000,\n wh: 0.001,\n m3: (39 * 1.02264) / 3.6,\n ft3: (0.0283 * 39 * 1.02264) / 3.6,\n hcf: (2.83 * 39 * 1.02264) / 3.6\n },\n m3: {\n m3: 1,\n l: 0.001\n },\n C: {\n C: 1\n },\n kg: {\n kg: 1,\n lbs: 0.45359237,\n tonnes: 1000\n },\n 'm3/h': {\n 'm3/h': 1\n }\n};\n\nexport const accountTypeUnitMap: { [key: string]: ETNUnit[] } = {\n electricity: ['kwh', 'mwh', 'wh'],\n gas: ['kwh', 'm3', 'ft3', 'hcf'],\n water: ['m3', 'l'],\n waste: ['kg', 'lbs', 'tonnes'],\n solar: ['kwh', 'mwh', 'wh'],\n heating: ['kwh', 'mwh', 'wh'],\n flow: ['m3/h'],\n cooling: ['kwh', 'mwh', 'wh'],\n temperature: ['C'],\n oil: ['l']\n};\n\n// Convert units to base format\nexport const convertItems = (items: Item[], type: AccountType, defaultUnits: ETNUnit | undefined, accountFactor: number | undefined): any => {\n if (!type) throw new Error('Account type is required');\n\n const baseUnit = accountTypeMap[type];\n if (!baseUnit) throw new Error(`Account type ${type} is not supported`);\n\n const convertedItems = items.map(item => {\n const factor = item.factor || accountFactor || 1;\n const units = item.units || item.unit || defaultUnits || baseUnit;\n const convertedValue = item.value * _getConversionFactor(units, baseUnit) * factor;\n return { ...item, value: convertedValue, units: baseUnit };\n });\n\n return convertedItems;\n};\n\nconst _getConversionFactor = (fromUnit: string = 'kwh', toUnit: string) => {\n const conversionFactors = unitConversionFactors[toUnit];\n\n if (!conversionFactors) {\n throw new Error(`Conversion factor base unit ${toUnit} is not defined`);\n }\n\n if (!conversionFactors[fromUnit]) {\n throw new Error(`Conversion factor from unit ${fromUnit} is not defined`);\n }\n\n return conversionFactors[fromUnit];\n};\n\nexport const checkAccountTypeVsUnits = (type: string, unit: string, additionalLog: number | '' = '') => {\n if (!type) throw new Error('Account type is required');\n if (!unit) throw new Error('Unit is required');\n\n const parsedType = type.toLowerCase().trim();\n\n const accountTypeUnits = accountTypeUnitMap[parsedType];\n if (!accountTypeUnits) throw new Error(`Account type \"${parsedType}\" is not supported ${additionalLog}`);\n\n const parsedUnit = unit.toLowerCase().trim() as ETNUnit;\n\n if (!accountTypeUnits.includes(parsedUnit)) {\n throw new Error(`Account type \"${parsedType}\" does not support unit \"${parsedUnit}\" ${additionalLog}`);\n }\n\n return { type: parsedType as AccountType, unit: parsedUnit};\n};\n","import moment from 'moment';\n\ninterface ConsumptionData {\n date: Date;\n consumption: number;\n}\n\ninterface DayNightConsumption {\n dayConsumption: number,\n nightConsumption: number,\n consumption: number\n}\n\nexport const dayNightConsumption = (data: ConsumptionData[]) => data.reduce((acc: DayNightConsumption, item: ConsumptionData): DayNightConsumption => {\n const hour = moment.utc(item.date).hour(); // End Time of HH consumption period\n\n if (hour >= 0 && hour < 7) {\n acc.nightConsumption += item.consumption;\n } else {\n acc.dayConsumption += item.consumption;\n }\n\n acc.consumption += item.consumption;\n\n return acc;\n}, {\n dayConsumption: 0,\n nightConsumption: 0,\n consumption: 0\n});\n\nexport const calcMaxConsumptionValue = (data: ConsumptionData[]) => Math.max(...data.map((item: ConsumptionData) => item.consumption));\n\nexport const calcMaxDemand = (data: ConsumptionData[]) => calcMaxConsumptionValue(data) * 2;\n\nexport const calcPeakLoad = (consumption: number, maxDemand: number, startDate: string | moment.Moment, endDate: string | moment.Moment) => {\n const days = Math.ceil(moment(endDate).diff(moment(startDate), 'days', true));\n\n return maxDemand === 0 ? 0 : ((consumption / (maxDemand * 24 * days)) * 100);\n};","import axios from 'axios';\n\nimport logger from './logger.js';\n\nconst log = logger('monitoring');\n\nexport const sendHeartbeat = async () => {\n if (!process.env.HEARTBEAT_URL || process.env.HEARTBEAT_URL.endsWith('/')) return false;\n\n try {\n await axios.post(process.env.HEARTBEAT_URL);\n\n return true;\n } catch (e: any) {\n log.warn(`Failed to send heartbeat: ${e.message || e}`);\n return false;\n }\n}","import moment from 'moment';\n\nmoment.locale('en', {\n week: {\n dow: 1\n }\n});\n\nconst getNextRunTime = (startDate: moment.Moment, schedule: any, taskTime: moment.Moment): moment.Moment => {\n const [num, freq] = schedule.frequency.split('|');\n const targetDate = moment(startDate).add(num, freq as moment.unitOfTime.Base);\n\n if (schedule.frequencyPeriod === 'first') {\n targetDate.startOf(freq as moment.unitOfTime.StartOf);\n } else if (schedule.frequencyPeriod === 'last') {\n targetDate.endOf(freq as moment.unitOfTime.StartOf);\n }\n\n const isWeekday = targetDate.isoWeekday() > 0 && targetDate.isoWeekday() < 6;\n const isSaturday = targetDate.isoWeekday() === 6;\n\n // The weekday or weekend chosen should be within the same month as the target date\n if (schedule.frequencyDay === 'weekdays' && !isWeekday) {\n if ((targetDate.date() / 7) < 2) {\n targetDate.add(isSaturday ? 2 : 1, 'days');\n } else {\n targetDate.subtract(isSaturday ? 1 : 2, 'days');\n }\n } else if (schedule.frequencyDay === 'weekends' && isWeekday) {\n if ((targetDate.date() / 7) < 2) {\n targetDate.isoWeekday(6);\n } else {\n targetDate.isoWeekday(0);\n }\n }\n\n if (taskTime.isAfter(targetDate, 'minute')) {\n return getNextRunTime(targetDate, schedule, taskTime);\n }\n\n return targetDate;\n};\n\nexport const getScheduledReportRunTimes = (schedule: any, limit = 1, taskTime = moment()): moment.Moment[] => {\n if (!schedule.startDate || !schedule.enabled) return [];\n\n const originalStartDate = moment.utc(schedule.startDate);\n\n let startDate = originalStartDate;\n\n const includeStartDate = taskTime.isSameOrBefore(originalStartDate, 'minute');\n\n let runTimes = [] as moment.Moment[];\n\n if (includeStartDate) {\n runTimes = [originalStartDate];\n }\n\n const [, freq] = schedule.frequency.split('|');\n\n if (freq === 'once') {\n const nextRunTime = runTimes[0];\n\n // If this is now beyond the start date, return an empty array\n return taskTime.isAfter(nextRunTime, 'minute') ? [] : runTimes;\n }\n\n\n const scheduleRunTimes = Array.from(Array(includeStartDate ? limit - 1 : limit).keys()).map(() => {\n const nextRunTime = getNextRunTime(startDate, schedule, taskTime);\n\n startDate = nextRunTime.hour(originalStartDate.hour()).minute(originalStartDate.minute());\n\n return nextRunTime;\n });\n\n return [...runTimes, ...scheduleRunTimes];\n};\n","import { ObjectId } from 'mongodb';\n\ntype Primitive = string | number | boolean | null | undefined | symbol | bigint | Date | ObjectId; // Add ObjectId/Date here\n\nexport * from './account.js'\nexport * from './asset.js'\nexport * from './automation.js'\nexport * from './company.js'\nexport * from './scraperRun.js';\nexport * from './dataIngest.js'\nexport * from './entity.js'\nexport * from './email.js';\nexport * from './invoice.js';\nexport * from './log.js';\nexport * from './reading.js'\nexport * from './report.js'\nexport * from './supplier.js'\nexport * from './global.js'\nexport { ObjectId }\n\nexport interface ETNPagedResponse<T = any> {\n data: T[];\n total: number;\n limit: number;\n skip: number;\n}"],"mappings":"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","names":["log","client","axios","axios","log","axios","moment"]}
package/dist/index.d.cts CHANGED
@@ -1,6 +1,7 @@
1
1
  import * as axios from 'axios';
2
2
  import { CreateAxiosDefaults, AxiosInstance, AxiosRequestConfig } from 'axios';
3
3
  import { ObjectId, Db } from 'mongodb';
4
+ export { ObjectId } from 'mongodb';
4
5
  import winston from 'winston';
5
6
  import moment from 'moment';
6
7
 
package/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import * as axios from 'axios';
2
2
  import { CreateAxiosDefaults, AxiosInstance, AxiosRequestConfig } from 'axios';
3
3
  import { ObjectId, Db } from 'mongodb';
4
+ export { ObjectId } from 'mongodb';
4
5
  import winston from 'winston';
5
6
  import moment from 'moment';
6
7
 
package/dist/index.js CHANGED
@@ -30,6 +30,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
30
30
  // src/index.ts
31
31
  var index_exports = {};
32
32
  __export(index_exports, {
33
+ ObjectId: () => import_mongodb2.ObjectId,
33
34
  api: () => api_default,
34
35
  consumption: () => consumption_exports,
35
36
  db: () => db_default,
@@ -612,8 +613,12 @@ var getScheduledReportRunTimes = (schedule, limit = 1, taskTime = (0, import_mom
612
613
  });
613
614
  return [...runTimes, ...scheduleRunTimes];
614
615
  };
616
+
617
+ // src/types/index.ts
618
+ var import_mongodb2 = require("mongodb");
615
619
  // Annotate the CommonJS export names for ESM import in node:
616
620
  0 && (module.exports = {
621
+ ObjectId,
617
622
  api,
618
623
  consumption,
619
624
  db,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/api.ts","../src/logger.ts","../src/db.ts","../src/slack.ts","../src/units.ts","../src/consumption.ts","../src/monitoring.ts","../src/reporting.ts"],"sourcesContent":["import api from './api.js';\nimport logger from './logger.js';\nimport db from './db.js';\nimport slack from './slack.js';\nimport * as units from './units.js';\nimport * as consumption from './consumption.js';\nimport * as monitoring from './monitoring.js';\nimport * as reporting from './reporting.js';\n\nexport {\n api,\n logger,\n consumption,\n monitoring,\n db,\n slack,\n units,\n reporting\n}\n\nexport * from './types/index.js';","import axios from 'axios';\nimport type { AxiosRequestConfig, AxiosInstance, CreateAxiosDefaults, AxiosResponse } from 'axios';\nimport https from 'https';\n\nimport logger from './logger.js';\n\nimport type { Account, Asset, Automation, Entity, Company, DataIngest, Invoice, Log, Reading, Report, Supplier } from './types/index.js'\n\nconst log = logger('etainablApi');\n\nexport interface ETNPagedResponse<T = any> {\n data: T[];\n total: number;\n limit: number;\n skip: number;\n}\n\nexport interface ETNReq {\n method: string;\n url: string;\n}\n\nfunction _handleResponse(req: ETNReq, res: AxiosResponse, isPaged = false) {\n if (!res) {\n throw new Error(`No response from API (${req.method} ${req.url})`);\n }\n\n if (res.status !== 200) {\n throw new Error(`${res.status} ${res.statusText} response from API (${req.method} ${req.url})`);\n }\n\n if (!res.data) {\n throw new Error(`No data from API (${req.method} ${req.url})`);\n }\n\n if (isPaged && !res.data.data) {\n throw new Error(`No data from API (${req.method} ${req.url})`);\n }\n\n return res;\n}\n\nconst factory = {\n getWithId: <T = any> (etainablApi: AxiosInstance, endpoint: string, postEndpoint?: string) => async (id: string, options: AxiosRequestConfig = {}): Promise<T> => {\n const req = {\n method: 'GET',\n url: `${endpoint}/${id}${postEndpoint ? `/${postEndpoint}` : ''}`\n };\n\n log.info(`API Request: ${req.method} ${process.env.ETAsINABL_API_URL}/${req.url}`);\n\n let res: AxiosResponse;\n\n try {\n res = await etainablApi.get(req.url, options);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n console.log(`API Response: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n _handleResponse(req, res)\n\n return res.data;\n },\n get: <T = any> (etainablApi: AxiosInstance, endpoint: string, postEndpoint?: string) => async (options: AxiosRequestConfig = {}): Promise<T> => {\n const req = {\n method: 'GET',\n url: `${endpoint}${postEndpoint ? `/${postEndpoint}` : ''}`\n };\n\n log.info(`API Request: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n let res: AxiosResponse;\n\n try {\n res = await etainablApi.get(req.url, options);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n console.log(`API Response: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n _handleResponse(req, res)\n\n return res.data;\n },\n list: <T = any> (etainablApi: AxiosInstance, endpoint: string, postEndpoint?: string) => async (options: AxiosRequestConfig = {}): Promise<ETNPagedResponse<T>> => {\n const req = {\n method: 'GET',\n url: `${endpoint}${postEndpoint ? `/${postEndpoint}` : ''}`\n };\n \n log.info(`API Request: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n let res: AxiosResponse;\n \n try {\n res = await etainablApi.get(req.url, options);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n console.log(`API Response: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n _handleResponse(req, res, true)\n\n return res.data;\n },\n update: <T = any> (etainablApi: AxiosInstance, endpoint: string, postEndpoint?: string) => async (id: string, data: any, options: AxiosRequestConfig = {}): Promise<T> => {\n const req = {\n method: 'PATCH',\n url: `${endpoint}/${id}${postEndpoint ? `/${postEndpoint}` : ''}`\n };\n \n log.info(`API Request: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n let res: AxiosResponse;\n \n try {\n res = await etainablApi.patch(req.url, data, options);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n _handleResponse(req, res)\n\n return res.data;\n },\n create: <T = any> (etainablApi: AxiosInstance, endpoint: string, postEndpoint?: string) => async (data: any, options: AxiosRequestConfig = {}): Promise<T> => {\n const req = {\n method: 'POST',\n url: `${endpoint}${postEndpoint ? `/${postEndpoint}` : ''}`\n };\n\n log.info(`API Request: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n let res: AxiosResponse;\n \n try {\n res = await etainablApi.post(req.url, data, options);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n _handleResponse(req, res)\n\n return res.data;\n },\n remove: <T = any> (etainablApi: AxiosInstance, endpoint: string, postEndpoint?: string) => async (id: string, options: AxiosRequestConfig = {}): Promise<T> => {\n const req = {\n method: 'DELETE',\n url: `${endpoint}/${id}${postEndpoint ? `/${postEndpoint}` : ''}`\n };\n\n let res: AxiosResponse;\n\n log.info(`API Request: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n try {\n res = await etainablApi.delete(req.url, options);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n _handleResponse(req, res);\n\n return res.data;\n },\n customWithId: <T = any> (etainablApi: AxiosInstance, method: string, endpoint: string, postEndpoint?: string) => async (id: string, data: any, options: AxiosRequestConfig = {}): Promise<T> => {\n const req = {\n method: method,\n url: `${endpoint}/${id}${postEndpoint ? `/${postEndpoint}` : ''}`,\n data,\n ...options\n };\n \n log.info(`API Request (Custom): ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n let res: AxiosResponse;\n \n try {\n res = await etainablApi.request(req);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n _handleResponse(req, res)\n\n return res.data;\n }\n};\n\n// ETN Sub Endpoints\n// e.g. /assets/:id/documents/:documentId\nconst subFactory = {\n // e.g. POST /assets/:id/documents\n create: <T = any> (etainablApi: AxiosInstance, endpoint: string, subEndpoint: string) => async (id: string, data: any, options: AxiosRequestConfig = {}) => { \n const subUrl = `${id}/${subEndpoint}`;\n return factory.create<T>(etainablApi, endpoint, subUrl)(data, options);\n },\n // e.g. PATCH /assets/:id/documents/:documentId\n update: <T = any> (etainablApi: AxiosInstance, endpoint: string, subEndpoint: string) => async (id: string, subId: string, data: any, options: AxiosRequestConfig = {}) => {\n const subUrl = `${subEndpoint}/${subId}`;\n \n return factory.update<T>(etainablApi, endpoint, subUrl)(id, data, options);\n },\n // e.g. DELETE /assets/:id/documents/:documentId\n remove: <T = any> (etainablApi: AxiosInstance, endpoint: string, subEndpoint: string) => async (id: string, subId: string, options: AxiosRequestConfig = {}) => {\n const subUrl = `${subEndpoint}/${subId}`;\n \n return factory.remove<T>(etainablApi, endpoint, subUrl)(id, options);\n }\n}\n\ninterface AuthOptions {\n key?: string;\n token?: string;\n}\n\nexport default (auth: AuthOptions, instanceOptions: CreateAxiosDefaults = {}) => {\n try {\n const headers: any = {};\n\n if (auth.key) {\n headers['x-key'] = auth.key;\n } else if (auth.token) {\n headers['Authorization'] = auth.token;\n } else {\n headers['x-key'] = process.env.ETAINABL_API_KEY;\n }\n \n const etainablApi = axios.create({\n baseURL: process.env.ETAINABL_API_URL,\n timeout: 300000,\n httpsAgent: new https.Agent({ keepAlive: true }),\n headers,\n ...instanceOptions\n });\n \n return {\n instance: etainablApi,\n \n // accounts\n getAccount: factory.getWithId<Account<string>>(etainablApi, 'accounts'),\n listAccounts: factory.list<Account<string>>(etainablApi, 'accounts'),\n updateAccount: factory.update<Account<string>>(etainablApi, 'accounts'),\n createAccount: factory.create<Account<string>>(etainablApi, 'accounts'),\n removeAccount: factory.remove<Account<string>>(etainablApi, 'accounts'),\n getAccountSchema: factory.get(etainablApi, 'accounts', 'schema'),\n invalidateAccountCache: factory.customWithId(etainablApi, 'put', 'accounts', 'invalidate-cache'),\n\n // assets\n getAsset: factory.getWithId<Asset<string>>(etainablApi, 'assets'),\n listAssets: factory.list<Asset<string>>(etainablApi, 'assets'),\n updateAsset: factory.update<Asset<string>>(etainablApi, 'assets'),\n createAsset: factory.create<Asset<string>>(etainablApi, 'assets'),\n removeAsset: factory.remove<Asset<string>>(etainablApi, 'assets'),\n getAssetSchema: factory.get(etainablApi, 'assets', 'schema'),\n \n // assetGroups\n getAssetGroup: factory.getWithId(etainablApi, 'asset-groups'),\n listAssetGroups: factory.list(etainablApi, 'asset-groups'),\n updateAssetGroup: factory.update(etainablApi, 'asset-groups'),\n createAssetGroup: factory.create(etainablApi, 'asset-groups'),\n removeAssetGroup: factory.remove(etainablApi, 'asset-groups'),\n getAssetGroupAssets: factory.getWithId(etainablApi, 'asset-groups', 'assets'),\n getAssetGroupSchema: factory.get(etainablApi, 'asset-groups', 'schema'),\n \n // automation\n getAutomation: factory.getWithId<Automation<string>>(etainablApi, 'automation'),\n listAutomations: factory.list<Automation<string>>(etainablApi, 'automation'),\n updateAutomation: factory.update<Automation<string>>(etainablApi, 'automation'),\n createAutomation: factory.create<Automation<string>>(etainablApi, 'automation'),\n removeAutomation: factory.remove<Automation<string>>(etainablApi, 'automation'),\n createAutomationLog: subFactory.create(etainablApi, 'automation', 'logs'),\n updateAutomationLog: subFactory.update(etainablApi, 'automation', 'logs'),\n removeAutomationLog: subFactory.remove(etainablApi, 'automation', 'logs'),\n \n // company\n getCompany: factory.getWithId<Company<string>>(etainablApi, 'companies'),\n \n // consumption\n getConsumption: factory.getWithId(etainablApi, 'consumptions'),\n listConsumptions: factory.list(etainablApi, 'consumptions'),\n updateConsumption: factory.update(etainablApi, 'consumptions'),\n createConsumption: factory.create(etainablApi, 'consumptions'),\n removeConsumption: factory.remove(etainablApi, 'consumptions'),\n getConsumptionSchema: factory.get(etainablApi, 'consumptions', 'schema'),\n \n // emails\n getEmail: factory.getWithId(etainablApi, 'emails'),\n listEmails: factory.list(etainablApi, 'emails'),\n updateEmail: factory.update(etainablApi, 'emails'),\n createEmail: factory.create(etainablApi, 'emails'),\n removeEmail: factory.remove(etainablApi, 'emails'),\n \n // emission factors\n getEmissionFactor: factory.getWithId(etainablApi, 'emission-factors'),\n listEmissionFactors: factory.list(etainablApi, 'emission-factors'),\n updateEmissionFactor: factory.update(etainablApi, 'emission-factors'),\n createEmissionFactor: factory.create(etainablApi, 'emission-factors'),\n removeEmissionFactor: factory.remove(etainablApi, 'emission-factors'),\n\n // entity\n getEntity: factory.getWithId<Entity<string>>(etainablApi, 'entities'),\n listEntities: factory.list<Entity<string>>(etainablApi, 'entities'),\n updateEntity: factory.update<Entity<string>>(etainablApi, 'entities'),\n createEntity: factory.create<Entity<string>>(etainablApi, 'entities'),\n removeEntity: factory.remove<Entity<string>>(etainablApi, 'entities'),\n getEntitiesSchema: factory.get(etainablApi, 'entities', 'schema'),\n \n \n // logs\n getLog: factory.getWithId<Log<string>>(etainablApi, 'logs'),\n listLogs: factory.list<Log<string>>(etainablApi, 'logs'),\n updateLog: factory.update<Log<string>>(etainablApi, 'logs'),\n createLog: factory.create<Log<string>>(etainablApi, 'logs'),\n removeLog: factory.remove<Log<string>>(etainablApi, 'logs'),\n \n // readings\n getReading: factory.getWithId<Reading<string>>(etainablApi, 'readings'),\n listReadings: factory.list<Reading<string>>(etainablApi, 'readings'),\n updateReading: factory.update<Reading<string>>(etainablApi, 'readings'),\n createReading: factory.create<Reading<string>>(etainablApi, 'readings'),\n removeReading: factory.remove<Reading<string>>(etainablApi, 'readings'),\n getReadingSchema: factory.get(etainablApi, 'readings', 'schema'),\n \n // reports\n getReport: factory.getWithId<Report<string>>(etainablApi, 'reports'),\n listReports: factory.list<Report<string>>(etainablApi, 'reports'),\n updateReport: factory.update<Report<string>>(etainablApi, 'reports'),\n createReport: factory.create<Report<string>>(etainablApi, 'reports'),\n removeReport: factory.remove<Report<string>>(etainablApi, 'reports'),\n sendReport: factory.customWithId(etainablApi, 'post', 'reports', 'send'),\n \n // report templates\n getReportTemplate: factory.getWithId(etainablApi, 'report-templates'),\n listReportTemplates: factory.list(etainablApi, 'report-templates'),\n updateReportTemplate: factory.update(etainablApi, 'report-templates'),\n createReportTemplate: factory.create(etainablApi, 'report-templates'),\n removeReportTemplate: factory.remove(etainablApi, 'report-templates'),\n \n // scheduled reports\n getScheduledReport: factory.getWithId(etainablApi, 'scheduled-reports'),\n listScheduledReports: factory.list(etainablApi, 'scheduled-reports'),\n updateScheduledReport: factory.update(etainablApi, 'scheduled-reports'),\n createScheduledReport: factory.create(etainablApi, 'scheduled-reports'),\n removeScheduledReport: factory.remove(etainablApi, 'scheduled-reports'),\n sendScheduledReport: factory.customWithId(etainablApi, 'post', 'scheduled-reports', 'send'),\n \n // invoices\n getInvoice: factory.getWithId<Invoice<string>>(etainablApi, 'invoices'),\n listInvoices: factory.list<Invoice<string>>(etainablApi, 'invoices'),\n updateInvoice: factory.update<Invoice<string>>(etainablApi, 'invoices'),\n createInvoice: factory.create<Invoice<string>>(etainablApi, 'invoices'),\n removeInvoice: factory.remove<Invoice<string>>(etainablApi, 'invoices'),\n getInvoiceSchema: factory.get(etainablApi, 'invoices', 'schema'),\n\n //suppliers\n listSuppliers: factory.list<Supplier<string>>(etainablApi, 'suppliers'),\n getSupplierSchema: factory.get(etainablApi, 'suppliers', 'schema'),\n\n // import templates\n getImportTemplate: factory.getWithId(etainablApi, 'import-templates'),\n\n //data imports\n listDataIngest: factory.list<DataIngest<string>>(etainablApi, 'data-ingests'),\n updateDataIngest: factory.update<DataIngest<string>>(etainablApi, 'data-ingests'),\n createDataIngest: factory.create<DataIngest<string>>(etainablApi, 'data-ingests')\n\n }\n } catch (e) {\n log.error(e);\n throw e;\n }\n};\n","import winston from 'winston';\n\nexport default (namespace: string) => winston.createLogger({\n level: 'debug',\n format: winston.format.combine(\n winston.format.timestamp(),\n winston.format.json()\n ),\n defaultMeta: { service: process.env.AWS_LAMBDA_FUNCTION_NAME, script: namespace },\n transports: [\n new winston.transports.Console()\n ]\n});\n","import { MongoClient, Db } from 'mongodb';\nimport logger from './logger.js';\n\nconst log = logger('dbHelpers');\n\nlet cachedDb: Db;\n\nasync function connectToDatabase(retryAttempt: number = 1): Promise<Db> {\n if (!process.env.ETAINABL_DB_URL) throw new Error(\"ETAINABL_DB_URL is not set\");\n if (!process.env.AWS_ACCESS_KEY_ID) throw new Error(\"AWS_ACCESS_KEY_ID is not set\");\n if (!process.env.AWS_SECRET_ACCESS_KEY) throw new Error(\"AWS_SECRET_ACCESS_KEY is not set\");\n\n if (cachedDb) {\n log.debug('Using cached MongoDB connection.');\n return Promise.resolve(cachedDb);\n }\n \n const uri = `mongodb+srv://${process.env.ETAINABL_DB_URL}`;\n \n try {\n if (process.env.DB_BASIC_AUTH === 'true') {\n log.debug('Connecting to MongoDB server... (Auth: Basic)');\n\n const client = new MongoClient(uri);\n await client.connect();\n\n log.debug('Connected successfully to MongoDB server! (Auth: Basic)');\n\n cachedDb = client.db('etainabl');\n\n return cachedDb;\n }\n\n log.debug('Connecting to MongoDB server... (Auth: AWS)');\n\n const client = new MongoClient(uri, {\n auth: {\n username: process.env.AWS_ACCESS_KEY_ID,\n password: process.env.AWS_SECRET_ACCESS_KEY\n },\n authSource: '$external',\n authMechanism: 'MONGODB-AWS'\n });\n\n await client.connect();\n\n log.debug('Connected successfully to MongoDB server! (Auth: AWS)');\n\n cachedDb = client.db('etainabl');\n\n return cachedDb;\n\n } catch (e: any) {\n // Retry\n if (retryAttempt > 5) {\n console.log(`Error connecting to MongoDB server after 5 attempts...`);\n throw e;\n }\n\n console.log(`MongoDB Connection error: ${e.message}`);\n\n console.log(`Error connecting to MongoDB server... Retrying in 3 seconds... (Attempt ${retryAttempt})`);\n return connectToDatabase(retryAttempt + 1);\n }\n}\n\nexport default {\n connectToDatabase\n};","import axios from 'axios';\n\nconst postMessage = async (message: string) => {\n const url = 'https://hooks.slack.com/services/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';\n const data = {\n text: `[${(process.env.ENV || '').toUpperCase()}][${process.env.AWS_LAMBDA_FUNCTION_NAME}] ${message}`\n };\n const headers = {\n 'Content-Type': 'application/json'\n };\n return axios.post(url, data, { headers });\n};\n\nexport default {\n postMessage\n}","interface Item {\n units?: string | null;\n unit?: string | null;\n factor?: number | null;\n value: number;\n [key: string]: any; \n}\n\nexport type AccountType = 'electricity' | 'gas' | 'water' | 'waste' | 'solar' | 'heating' | 'flow' | 'cooling' | 'temperature' | 'oil' | 'other';\nexport type ETNUnit = 'kwh' | 'kg' | 'm3' | 'lbs' | 'tonnes' | 'wh' | 'mwh' | 'ft3' | 'hcf' | 'm3/h' | 'qty' | 'l' | 'C' | 'mcuf' | 'hcuf' | 'tcuf' | 'ocuf' | 'hm3' | 'tm3' | 'nm3';\nexport type BaseUnit = 'kwh' | 'm3' | 'C' | 'kg' | 'm3/h' | 'l';\nexport const accountTypeMap: { [key: string]: BaseUnit } = {\n electricity: 'kwh',\n gas: 'kwh',\n water: 'm3',\n waste: 'kg',\n solar: 'kwh',\n heating: 'kwh',\n flow: 'm3/h',\n cooling: 'kwh',\n temperature: 'C',\n oil: 'l'\n};\n\nconst unitConversionFactors: { [key: string]: any } = {\n kwh: {\n kwh: 1,\n mwh: 1000,\n wh: 0.001,\n m3: (39 * 1.02264) / 3.6,\n ft3: (0.0283 * 39 * 1.02264) / 3.6,\n hcf: (2.83 * 39 * 1.02264) / 3.6\n },\n m3: {\n m3: 1,\n l: 0.001\n },\n C: {\n C: 1\n },\n kg: {\n kg: 1,\n lbs: 0.45359237,\n tonnes: 1000\n },\n 'm3/h': {\n 'm3/h': 1\n }\n};\n\nexport const accountTypeUnitMap: { [key: string]: ETNUnit[] } = {\n electricity: ['kwh', 'mwh', 'wh'],\n gas: ['kwh', 'm3', 'ft3', 'hcf'],\n water: ['m3', 'l'],\n waste: ['kg', 'lbs', 'tonnes'],\n solar: ['kwh', 'mwh', 'wh'],\n heating: ['kwh', 'mwh', 'wh'],\n flow: ['m3/h'],\n cooling: ['kwh', 'mwh', 'wh'],\n temperature: ['C'],\n oil: ['l']\n};\n\n// Convert units to base format\nexport const convertItems = (items: Item[], type: AccountType, defaultUnits: ETNUnit | undefined, accountFactor: number | undefined): any => {\n if (!type) throw new Error('Account type is required');\n\n const baseUnit = accountTypeMap[type];\n if (!baseUnit) throw new Error(`Account type ${type} is not supported`);\n\n const convertedItems = items.map(item => {\n const factor = item.factor || accountFactor || 1;\n const units = item.units || item.unit || defaultUnits || baseUnit;\n const convertedValue = item.value * _getConversionFactor(units, baseUnit) * factor;\n return { ...item, value: convertedValue, units: baseUnit };\n });\n\n return convertedItems;\n};\n\nconst _getConversionFactor = (fromUnit: string = 'kwh', toUnit: string) => {\n const conversionFactors = unitConversionFactors[toUnit];\n\n if (!conversionFactors) {\n throw new Error(`Conversion factor base unit ${toUnit} is not defined`);\n }\n\n if (!conversionFactors[fromUnit]) {\n throw new Error(`Conversion factor from unit ${fromUnit} is not defined`);\n }\n\n return conversionFactors[fromUnit];\n};\n\nexport const checkAccountTypeVsUnits = (type: string, unit: string, additionalLog: number | '' = '') => {\n if (!type) throw new Error('Account type is required');\n if (!unit) throw new Error('Unit is required');\n\n const parsedType = type.toLowerCase().trim();\n\n const accountTypeUnits = accountTypeUnitMap[parsedType];\n if (!accountTypeUnits) throw new Error(`Account type \"${parsedType}\" is not supported ${additionalLog}`);\n\n const parsedUnit = unit.toLowerCase().trim() as ETNUnit;\n\n if (!accountTypeUnits.includes(parsedUnit)) {\n throw new Error(`Account type \"${parsedType}\" does not support unit \"${parsedUnit}\" ${additionalLog}`);\n }\n\n return { type: parsedType as AccountType, unit: parsedUnit};\n};\n","import moment from 'moment';\n\ninterface ConsumptionData {\n date: Date;\n consumption: number;\n}\n\ninterface DayNightConsumption {\n dayConsumption: number,\n nightConsumption: number,\n consumption: number\n}\n\nexport const dayNightConsumption = (data: ConsumptionData[]) => data.reduce((acc: DayNightConsumption, item: ConsumptionData): DayNightConsumption => {\n const hour = moment.utc(item.date).hour(); // End Time of HH consumption period\n\n if (hour >= 0 && hour < 7) {\n acc.nightConsumption += item.consumption;\n } else {\n acc.dayConsumption += item.consumption;\n }\n\n acc.consumption += item.consumption;\n\n return acc;\n}, {\n dayConsumption: 0,\n nightConsumption: 0,\n consumption: 0\n});\n\nexport const calcMaxConsumptionValue = (data: ConsumptionData[]) => Math.max(...data.map((item: ConsumptionData) => item.consumption));\n\nexport const calcMaxDemand = (data: ConsumptionData[]) => calcMaxConsumptionValue(data) * 2;\n\nexport const calcPeakLoad = (consumption: number, maxDemand: number, startDate: string | moment.Moment, endDate: string | moment.Moment) => {\n const days = Math.ceil(moment(endDate).diff(moment(startDate), 'days', true));\n\n return maxDemand === 0 ? 0 : ((consumption / (maxDemand * 24 * days)) * 100);\n};","import axios from 'axios';\n\nimport logger from './logger.js';\n\nconst log = logger('monitoring');\n\nexport const sendHeartbeat = async () => {\n if (!process.env.HEARTBEAT_URL || process.env.HEARTBEAT_URL.endsWith('/')) return false;\n\n try {\n await axios.post(process.env.HEARTBEAT_URL);\n\n return true;\n } catch (e: any) {\n log.warn(`Failed to send heartbeat: ${e.message || e}`);\n return false;\n }\n}","import moment from 'moment';\n\nmoment.locale('en', {\n week: {\n dow: 1\n }\n});\n\nconst getNextRunTime = (startDate: moment.Moment, schedule: any, taskTime: moment.Moment): moment.Moment => {\n const [num, freq] = schedule.frequency.split('|');\n const targetDate = moment(startDate).add(num, freq as moment.unitOfTime.Base);\n\n if (schedule.frequencyPeriod === 'first') {\n targetDate.startOf(freq as moment.unitOfTime.StartOf);\n } else if (schedule.frequencyPeriod === 'last') {\n targetDate.endOf(freq as moment.unitOfTime.StartOf);\n }\n\n const isWeekday = targetDate.isoWeekday() > 0 && targetDate.isoWeekday() < 6;\n const isSaturday = targetDate.isoWeekday() === 6;\n\n // The weekday or weekend chosen should be within the same month as the target date\n if (schedule.frequencyDay === 'weekdays' && !isWeekday) {\n if ((targetDate.date() / 7) < 2) {\n targetDate.add(isSaturday ? 2 : 1, 'days');\n } else {\n targetDate.subtract(isSaturday ? 1 : 2, 'days');\n }\n } else if (schedule.frequencyDay === 'weekends' && isWeekday) {\n if ((targetDate.date() / 7) < 2) {\n targetDate.isoWeekday(6);\n } else {\n targetDate.isoWeekday(0);\n }\n }\n\n if (taskTime.isAfter(targetDate, 'minute')) {\n return getNextRunTime(targetDate, schedule, taskTime);\n }\n\n return targetDate;\n};\n\nexport const getScheduledReportRunTimes = (schedule: any, limit = 1, taskTime = moment()): moment.Moment[] => {\n if (!schedule.startDate || !schedule.enabled) return [];\n\n const originalStartDate = moment.utc(schedule.startDate);\n\n let startDate = originalStartDate;\n\n const includeStartDate = taskTime.isSameOrBefore(originalStartDate, 'minute');\n\n let runTimes = [] as moment.Moment[];\n\n if (includeStartDate) {\n runTimes = [originalStartDate];\n }\n\n const [, freq] = schedule.frequency.split('|');\n\n if (freq === 'once') {\n const nextRunTime = runTimes[0];\n\n // If this is now beyond the start date, return an empty array\n return taskTime.isAfter(nextRunTime, 'minute') ? [] : runTimes;\n }\n\n\n const scheduleRunTimes = Array.from(Array(includeStartDate ? limit - 1 : limit).keys()).map(() => {\n const nextRunTime = getNextRunTime(startDate, schedule, taskTime);\n\n startDate = nextRunTime.hour(originalStartDate.hour()).minute(originalStartDate.minute());\n\n return nextRunTime;\n });\n\n return [...runTimes, ...scheduleRunTimes];\n};\n"],"mappings":"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","names":["winston","axios","https","log","client","import_axios","axios","moment","import_axios","log","axios","import_moment","moment"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/api.ts","../src/logger.ts","../src/db.ts","../src/slack.ts","../src/units.ts","../src/consumption.ts","../src/monitoring.ts","../src/reporting.ts","../src/types/index.ts"],"sourcesContent":["import api from './api.js';\nimport logger from './logger.js';\nimport db from './db.js';\nimport slack from './slack.js';\nimport * as units from './units.js';\nimport * as consumption from './consumption.js';\nimport * as monitoring from './monitoring.js';\nimport * as reporting from './reporting.js';\n\nexport {\n api,\n logger,\n consumption,\n monitoring,\n db,\n slack,\n units,\n reporting\n}\n\nexport * from './types/index.js';","import axios from 'axios';\nimport type { AxiosRequestConfig, AxiosInstance, CreateAxiosDefaults, AxiosResponse } from 'axios';\nimport https from 'https';\n\nimport logger from './logger.js';\n\nimport type { Account, Asset, Automation, Entity, Company, DataIngest, Invoice, Log, Reading, Report, Supplier } from './types/index.js'\n\nconst log = logger('etainablApi');\n\nexport interface ETNPagedResponse<T = any> {\n data: T[];\n total: number;\n limit: number;\n skip: number;\n}\n\nexport interface ETNReq {\n method: string;\n url: string;\n}\n\nfunction _handleResponse(req: ETNReq, res: AxiosResponse, isPaged = false) {\n if (!res) {\n throw new Error(`No response from API (${req.method} ${req.url})`);\n }\n\n if (res.status !== 200) {\n throw new Error(`${res.status} ${res.statusText} response from API (${req.method} ${req.url})`);\n }\n\n if (!res.data) {\n throw new Error(`No data from API (${req.method} ${req.url})`);\n }\n\n if (isPaged && !res.data.data) {\n throw new Error(`No data from API (${req.method} ${req.url})`);\n }\n\n return res;\n}\n\nconst factory = {\n getWithId: <T = any> (etainablApi: AxiosInstance, endpoint: string, postEndpoint?: string) => async (id: string, options: AxiosRequestConfig = {}): Promise<T> => {\n const req = {\n method: 'GET',\n url: `${endpoint}/${id}${postEndpoint ? `/${postEndpoint}` : ''}`\n };\n\n log.info(`API Request: ${req.method} ${process.env.ETAsINABL_API_URL}/${req.url}`);\n\n let res: AxiosResponse;\n\n try {\n res = await etainablApi.get(req.url, options);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n console.log(`API Response: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n _handleResponse(req, res)\n\n return res.data;\n },\n get: <T = any> (etainablApi: AxiosInstance, endpoint: string, postEndpoint?: string) => async (options: AxiosRequestConfig = {}): Promise<T> => {\n const req = {\n method: 'GET',\n url: `${endpoint}${postEndpoint ? `/${postEndpoint}` : ''}`\n };\n\n log.info(`API Request: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n let res: AxiosResponse;\n\n try {\n res = await etainablApi.get(req.url, options);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n console.log(`API Response: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n _handleResponse(req, res)\n\n return res.data;\n },\n list: <T = any> (etainablApi: AxiosInstance, endpoint: string, postEndpoint?: string) => async (options: AxiosRequestConfig = {}): Promise<ETNPagedResponse<T>> => {\n const req = {\n method: 'GET',\n url: `${endpoint}${postEndpoint ? `/${postEndpoint}` : ''}`\n };\n \n log.info(`API Request: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n let res: AxiosResponse;\n \n try {\n res = await etainablApi.get(req.url, options);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n console.log(`API Response: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n _handleResponse(req, res, true)\n\n return res.data;\n },\n update: <T = any> (etainablApi: AxiosInstance, endpoint: string, postEndpoint?: string) => async (id: string, data: any, options: AxiosRequestConfig = {}): Promise<T> => {\n const req = {\n method: 'PATCH',\n url: `${endpoint}/${id}${postEndpoint ? `/${postEndpoint}` : ''}`\n };\n \n log.info(`API Request: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n let res: AxiosResponse;\n \n try {\n res = await etainablApi.patch(req.url, data, options);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n _handleResponse(req, res)\n\n return res.data;\n },\n create: <T = any> (etainablApi: AxiosInstance, endpoint: string, postEndpoint?: string) => async (data: any, options: AxiosRequestConfig = {}): Promise<T> => {\n const req = {\n method: 'POST',\n url: `${endpoint}${postEndpoint ? `/${postEndpoint}` : ''}`\n };\n\n log.info(`API Request: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n let res: AxiosResponse;\n \n try {\n res = await etainablApi.post(req.url, data, options);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n _handleResponse(req, res)\n\n return res.data;\n },\n remove: <T = any> (etainablApi: AxiosInstance, endpoint: string, postEndpoint?: string) => async (id: string, options: AxiosRequestConfig = {}): Promise<T> => {\n const req = {\n method: 'DELETE',\n url: `${endpoint}/${id}${postEndpoint ? `/${postEndpoint}` : ''}`\n };\n\n let res: AxiosResponse;\n\n log.info(`API Request: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n try {\n res = await etainablApi.delete(req.url, options);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n _handleResponse(req, res);\n\n return res.data;\n },\n customWithId: <T = any> (etainablApi: AxiosInstance, method: string, endpoint: string, postEndpoint?: string) => async (id: string, data: any, options: AxiosRequestConfig = {}): Promise<T> => {\n const req = {\n method: method,\n url: `${endpoint}/${id}${postEndpoint ? `/${postEndpoint}` : ''}`,\n data,\n ...options\n };\n \n log.info(`API Request (Custom): ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n let res: AxiosResponse;\n \n try {\n res = await etainablApi.request(req);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n _handleResponse(req, res)\n\n return res.data;\n }\n};\n\n// ETN Sub Endpoints\n// e.g. /assets/:id/documents/:documentId\nconst subFactory = {\n // e.g. POST /assets/:id/documents\n create: <T = any> (etainablApi: AxiosInstance, endpoint: string, subEndpoint: string) => async (id: string, data: any, options: AxiosRequestConfig = {}) => { \n const subUrl = `${id}/${subEndpoint}`;\n return factory.create<T>(etainablApi, endpoint, subUrl)(data, options);\n },\n // e.g. PATCH /assets/:id/documents/:documentId\n update: <T = any> (etainablApi: AxiosInstance, endpoint: string, subEndpoint: string) => async (id: string, subId: string, data: any, options: AxiosRequestConfig = {}) => {\n const subUrl = `${subEndpoint}/${subId}`;\n \n return factory.update<T>(etainablApi, endpoint, subUrl)(id, data, options);\n },\n // e.g. DELETE /assets/:id/documents/:documentId\n remove: <T = any> (etainablApi: AxiosInstance, endpoint: string, subEndpoint: string) => async (id: string, subId: string, options: AxiosRequestConfig = {}) => {\n const subUrl = `${subEndpoint}/${subId}`;\n \n return factory.remove<T>(etainablApi, endpoint, subUrl)(id, options);\n }\n}\n\ninterface AuthOptions {\n key?: string;\n token?: string;\n}\n\nexport default (auth: AuthOptions, instanceOptions: CreateAxiosDefaults = {}) => {\n try {\n const headers: any = {};\n\n if (auth.key) {\n headers['x-key'] = auth.key;\n } else if (auth.token) {\n headers['Authorization'] = auth.token;\n } else {\n headers['x-key'] = process.env.ETAINABL_API_KEY;\n }\n \n const etainablApi = axios.create({\n baseURL: process.env.ETAINABL_API_URL,\n timeout: 300000,\n httpsAgent: new https.Agent({ keepAlive: true }),\n headers,\n ...instanceOptions\n });\n \n return {\n instance: etainablApi,\n \n // accounts\n getAccount: factory.getWithId<Account<string>>(etainablApi, 'accounts'),\n listAccounts: factory.list<Account<string>>(etainablApi, 'accounts'),\n updateAccount: factory.update<Account<string>>(etainablApi, 'accounts'),\n createAccount: factory.create<Account<string>>(etainablApi, 'accounts'),\n removeAccount: factory.remove<Account<string>>(etainablApi, 'accounts'),\n getAccountSchema: factory.get(etainablApi, 'accounts', 'schema'),\n invalidateAccountCache: factory.customWithId(etainablApi, 'put', 'accounts', 'invalidate-cache'),\n\n // assets\n getAsset: factory.getWithId<Asset<string>>(etainablApi, 'assets'),\n listAssets: factory.list<Asset<string>>(etainablApi, 'assets'),\n updateAsset: factory.update<Asset<string>>(etainablApi, 'assets'),\n createAsset: factory.create<Asset<string>>(etainablApi, 'assets'),\n removeAsset: factory.remove<Asset<string>>(etainablApi, 'assets'),\n getAssetSchema: factory.get(etainablApi, 'assets', 'schema'),\n \n // assetGroups\n getAssetGroup: factory.getWithId(etainablApi, 'asset-groups'),\n listAssetGroups: factory.list(etainablApi, 'asset-groups'),\n updateAssetGroup: factory.update(etainablApi, 'asset-groups'),\n createAssetGroup: factory.create(etainablApi, 'asset-groups'),\n removeAssetGroup: factory.remove(etainablApi, 'asset-groups'),\n getAssetGroupAssets: factory.getWithId(etainablApi, 'asset-groups', 'assets'),\n getAssetGroupSchema: factory.get(etainablApi, 'asset-groups', 'schema'),\n \n // automation\n getAutomation: factory.getWithId<Automation<string>>(etainablApi, 'automation'),\n listAutomations: factory.list<Automation<string>>(etainablApi, 'automation'),\n updateAutomation: factory.update<Automation<string>>(etainablApi, 'automation'),\n createAutomation: factory.create<Automation<string>>(etainablApi, 'automation'),\n removeAutomation: factory.remove<Automation<string>>(etainablApi, 'automation'),\n createAutomationLog: subFactory.create(etainablApi, 'automation', 'logs'),\n updateAutomationLog: subFactory.update(etainablApi, 'automation', 'logs'),\n removeAutomationLog: subFactory.remove(etainablApi, 'automation', 'logs'),\n \n // company\n getCompany: factory.getWithId<Company<string>>(etainablApi, 'companies'),\n \n // consumption\n getConsumption: factory.getWithId(etainablApi, 'consumptions'),\n listConsumptions: factory.list(etainablApi, 'consumptions'),\n updateConsumption: factory.update(etainablApi, 'consumptions'),\n createConsumption: factory.create(etainablApi, 'consumptions'),\n removeConsumption: factory.remove(etainablApi, 'consumptions'),\n getConsumptionSchema: factory.get(etainablApi, 'consumptions', 'schema'),\n \n // emails\n getEmail: factory.getWithId(etainablApi, 'emails'),\n listEmails: factory.list(etainablApi, 'emails'),\n updateEmail: factory.update(etainablApi, 'emails'),\n createEmail: factory.create(etainablApi, 'emails'),\n removeEmail: factory.remove(etainablApi, 'emails'),\n \n // emission factors\n getEmissionFactor: factory.getWithId(etainablApi, 'emission-factors'),\n listEmissionFactors: factory.list(etainablApi, 'emission-factors'),\n updateEmissionFactor: factory.update(etainablApi, 'emission-factors'),\n createEmissionFactor: factory.create(etainablApi, 'emission-factors'),\n removeEmissionFactor: factory.remove(etainablApi, 'emission-factors'),\n\n // entity\n getEntity: factory.getWithId<Entity<string>>(etainablApi, 'entities'),\n listEntities: factory.list<Entity<string>>(etainablApi, 'entities'),\n updateEntity: factory.update<Entity<string>>(etainablApi, 'entities'),\n createEntity: factory.create<Entity<string>>(etainablApi, 'entities'),\n removeEntity: factory.remove<Entity<string>>(etainablApi, 'entities'),\n getEntitiesSchema: factory.get(etainablApi, 'entities', 'schema'),\n \n \n // logs\n getLog: factory.getWithId<Log<string>>(etainablApi, 'logs'),\n listLogs: factory.list<Log<string>>(etainablApi, 'logs'),\n updateLog: factory.update<Log<string>>(etainablApi, 'logs'),\n createLog: factory.create<Log<string>>(etainablApi, 'logs'),\n removeLog: factory.remove<Log<string>>(etainablApi, 'logs'),\n \n // readings\n getReading: factory.getWithId<Reading<string>>(etainablApi, 'readings'),\n listReadings: factory.list<Reading<string>>(etainablApi, 'readings'),\n updateReading: factory.update<Reading<string>>(etainablApi, 'readings'),\n createReading: factory.create<Reading<string>>(etainablApi, 'readings'),\n removeReading: factory.remove<Reading<string>>(etainablApi, 'readings'),\n getReadingSchema: factory.get(etainablApi, 'readings', 'schema'),\n \n // reports\n getReport: factory.getWithId<Report<string>>(etainablApi, 'reports'),\n listReports: factory.list<Report<string>>(etainablApi, 'reports'),\n updateReport: factory.update<Report<string>>(etainablApi, 'reports'),\n createReport: factory.create<Report<string>>(etainablApi, 'reports'),\n removeReport: factory.remove<Report<string>>(etainablApi, 'reports'),\n sendReport: factory.customWithId(etainablApi, 'post', 'reports', 'send'),\n \n // report templates\n getReportTemplate: factory.getWithId(etainablApi, 'report-templates'),\n listReportTemplates: factory.list(etainablApi, 'report-templates'),\n updateReportTemplate: factory.update(etainablApi, 'report-templates'),\n createReportTemplate: factory.create(etainablApi, 'report-templates'),\n removeReportTemplate: factory.remove(etainablApi, 'report-templates'),\n \n // scheduled reports\n getScheduledReport: factory.getWithId(etainablApi, 'scheduled-reports'),\n listScheduledReports: factory.list(etainablApi, 'scheduled-reports'),\n updateScheduledReport: factory.update(etainablApi, 'scheduled-reports'),\n createScheduledReport: factory.create(etainablApi, 'scheduled-reports'),\n removeScheduledReport: factory.remove(etainablApi, 'scheduled-reports'),\n sendScheduledReport: factory.customWithId(etainablApi, 'post', 'scheduled-reports', 'send'),\n \n // invoices\n getInvoice: factory.getWithId<Invoice<string>>(etainablApi, 'invoices'),\n listInvoices: factory.list<Invoice<string>>(etainablApi, 'invoices'),\n updateInvoice: factory.update<Invoice<string>>(etainablApi, 'invoices'),\n createInvoice: factory.create<Invoice<string>>(etainablApi, 'invoices'),\n removeInvoice: factory.remove<Invoice<string>>(etainablApi, 'invoices'),\n getInvoiceSchema: factory.get(etainablApi, 'invoices', 'schema'),\n\n //suppliers\n listSuppliers: factory.list<Supplier<string>>(etainablApi, 'suppliers'),\n getSupplierSchema: factory.get(etainablApi, 'suppliers', 'schema'),\n\n // import templates\n getImportTemplate: factory.getWithId(etainablApi, 'import-templates'),\n\n //data imports\n listDataIngest: factory.list<DataIngest<string>>(etainablApi, 'data-ingests'),\n updateDataIngest: factory.update<DataIngest<string>>(etainablApi, 'data-ingests'),\n createDataIngest: factory.create<DataIngest<string>>(etainablApi, 'data-ingests')\n\n }\n } catch (e) {\n log.error(e);\n throw e;\n }\n};\n","import winston from 'winston';\n\nexport default (namespace: string) => winston.createLogger({\n level: 'debug',\n format: winston.format.combine(\n winston.format.timestamp(),\n winston.format.json()\n ),\n defaultMeta: { service: process.env.AWS_LAMBDA_FUNCTION_NAME, script: namespace },\n transports: [\n new winston.transports.Console()\n ]\n});\n","import { MongoClient, Db } from 'mongodb';\nimport logger from './logger.js';\n\nconst log = logger('dbHelpers');\n\nlet cachedDb: Db;\n\nasync function connectToDatabase(retryAttempt: number = 1): Promise<Db> {\n if (!process.env.ETAINABL_DB_URL) throw new Error(\"ETAINABL_DB_URL is not set\");\n if (!process.env.AWS_ACCESS_KEY_ID) throw new Error(\"AWS_ACCESS_KEY_ID is not set\");\n if (!process.env.AWS_SECRET_ACCESS_KEY) throw new Error(\"AWS_SECRET_ACCESS_KEY is not set\");\n\n if (cachedDb) {\n log.debug('Using cached MongoDB connection.');\n return Promise.resolve(cachedDb);\n }\n \n const uri = `mongodb+srv://${process.env.ETAINABL_DB_URL}`;\n \n try {\n if (process.env.DB_BASIC_AUTH === 'true') {\n log.debug('Connecting to MongoDB server... (Auth: Basic)');\n\n const client = new MongoClient(uri);\n await client.connect();\n\n log.debug('Connected successfully to MongoDB server! (Auth: Basic)');\n\n cachedDb = client.db('etainabl');\n\n return cachedDb;\n }\n\n log.debug('Connecting to MongoDB server... (Auth: AWS)');\n\n const client = new MongoClient(uri, {\n auth: {\n username: process.env.AWS_ACCESS_KEY_ID,\n password: process.env.AWS_SECRET_ACCESS_KEY\n },\n authSource: '$external',\n authMechanism: 'MONGODB-AWS'\n });\n\n await client.connect();\n\n log.debug('Connected successfully to MongoDB server! (Auth: AWS)');\n\n cachedDb = client.db('etainabl');\n\n return cachedDb;\n\n } catch (e: any) {\n // Retry\n if (retryAttempt > 5) {\n console.log(`Error connecting to MongoDB server after 5 attempts...`);\n throw e;\n }\n\n console.log(`MongoDB Connection error: ${e.message}`);\n\n console.log(`Error connecting to MongoDB server... Retrying in 3 seconds... (Attempt ${retryAttempt})`);\n return connectToDatabase(retryAttempt + 1);\n }\n}\n\nexport default {\n connectToDatabase\n};","import axios from 'axios';\n\nconst postMessage = async (message: string) => {\n const url = 'https://hooks.slack.com/services/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';\n const data = {\n text: `[${(process.env.ENV || '').toUpperCase()}][${process.env.AWS_LAMBDA_FUNCTION_NAME}] ${message}`\n };\n const headers = {\n 'Content-Type': 'application/json'\n };\n return axios.post(url, data, { headers });\n};\n\nexport default {\n postMessage\n}","interface Item {\n units?: string | null;\n unit?: string | null;\n factor?: number | null;\n value: number;\n [key: string]: any; \n}\n\nexport type AccountType = 'electricity' | 'gas' | 'water' | 'waste' | 'solar' | 'heating' | 'flow' | 'cooling' | 'temperature' | 'oil' | 'other';\nexport type ETNUnit = 'kwh' | 'kg' | 'm3' | 'lbs' | 'tonnes' | 'wh' | 'mwh' | 'ft3' | 'hcf' | 'm3/h' | 'qty' | 'l' | 'C' | 'mcuf' | 'hcuf' | 'tcuf' | 'ocuf' | 'hm3' | 'tm3' | 'nm3';\nexport type BaseUnit = 'kwh' | 'm3' | 'C' | 'kg' | 'm3/h' | 'l';\nexport const accountTypeMap: { [key: string]: BaseUnit } = {\n electricity: 'kwh',\n gas: 'kwh',\n water: 'm3',\n waste: 'kg',\n solar: 'kwh',\n heating: 'kwh',\n flow: 'm3/h',\n cooling: 'kwh',\n temperature: 'C',\n oil: 'l'\n};\n\nconst unitConversionFactors: { [key: string]: any } = {\n kwh: {\n kwh: 1,\n mwh: 1000,\n wh: 0.001,\n m3: (39 * 1.02264) / 3.6,\n ft3: (0.0283 * 39 * 1.02264) / 3.6,\n hcf: (2.83 * 39 * 1.02264) / 3.6\n },\n m3: {\n m3: 1,\n l: 0.001\n },\n C: {\n C: 1\n },\n kg: {\n kg: 1,\n lbs: 0.45359237,\n tonnes: 1000\n },\n 'm3/h': {\n 'm3/h': 1\n }\n};\n\nexport const accountTypeUnitMap: { [key: string]: ETNUnit[] } = {\n electricity: ['kwh', 'mwh', 'wh'],\n gas: ['kwh', 'm3', 'ft3', 'hcf'],\n water: ['m3', 'l'],\n waste: ['kg', 'lbs', 'tonnes'],\n solar: ['kwh', 'mwh', 'wh'],\n heating: ['kwh', 'mwh', 'wh'],\n flow: ['m3/h'],\n cooling: ['kwh', 'mwh', 'wh'],\n temperature: ['C'],\n oil: ['l']\n};\n\n// Convert units to base format\nexport const convertItems = (items: Item[], type: AccountType, defaultUnits: ETNUnit | undefined, accountFactor: number | undefined): any => {\n if (!type) throw new Error('Account type is required');\n\n const baseUnit = accountTypeMap[type];\n if (!baseUnit) throw new Error(`Account type ${type} is not supported`);\n\n const convertedItems = items.map(item => {\n const factor = item.factor || accountFactor || 1;\n const units = item.units || item.unit || defaultUnits || baseUnit;\n const convertedValue = item.value * _getConversionFactor(units, baseUnit) * factor;\n return { ...item, value: convertedValue, units: baseUnit };\n });\n\n return convertedItems;\n};\n\nconst _getConversionFactor = (fromUnit: string = 'kwh', toUnit: string) => {\n const conversionFactors = unitConversionFactors[toUnit];\n\n if (!conversionFactors) {\n throw new Error(`Conversion factor base unit ${toUnit} is not defined`);\n }\n\n if (!conversionFactors[fromUnit]) {\n throw new Error(`Conversion factor from unit ${fromUnit} is not defined`);\n }\n\n return conversionFactors[fromUnit];\n};\n\nexport const checkAccountTypeVsUnits = (type: string, unit: string, additionalLog: number | '' = '') => {\n if (!type) throw new Error('Account type is required');\n if (!unit) throw new Error('Unit is required');\n\n const parsedType = type.toLowerCase().trim();\n\n const accountTypeUnits = accountTypeUnitMap[parsedType];\n if (!accountTypeUnits) throw new Error(`Account type \"${parsedType}\" is not supported ${additionalLog}`);\n\n const parsedUnit = unit.toLowerCase().trim() as ETNUnit;\n\n if (!accountTypeUnits.includes(parsedUnit)) {\n throw new Error(`Account type \"${parsedType}\" does not support unit \"${parsedUnit}\" ${additionalLog}`);\n }\n\n return { type: parsedType as AccountType, unit: parsedUnit};\n};\n","import moment from 'moment';\n\ninterface ConsumptionData {\n date: Date;\n consumption: number;\n}\n\ninterface DayNightConsumption {\n dayConsumption: number,\n nightConsumption: number,\n consumption: number\n}\n\nexport const dayNightConsumption = (data: ConsumptionData[]) => data.reduce((acc: DayNightConsumption, item: ConsumptionData): DayNightConsumption => {\n const hour = moment.utc(item.date).hour(); // End Time of HH consumption period\n\n if (hour >= 0 && hour < 7) {\n acc.nightConsumption += item.consumption;\n } else {\n acc.dayConsumption += item.consumption;\n }\n\n acc.consumption += item.consumption;\n\n return acc;\n}, {\n dayConsumption: 0,\n nightConsumption: 0,\n consumption: 0\n});\n\nexport const calcMaxConsumptionValue = (data: ConsumptionData[]) => Math.max(...data.map((item: ConsumptionData) => item.consumption));\n\nexport const calcMaxDemand = (data: ConsumptionData[]) => calcMaxConsumptionValue(data) * 2;\n\nexport const calcPeakLoad = (consumption: number, maxDemand: number, startDate: string | moment.Moment, endDate: string | moment.Moment) => {\n const days = Math.ceil(moment(endDate).diff(moment(startDate), 'days', true));\n\n return maxDemand === 0 ? 0 : ((consumption / (maxDemand * 24 * days)) * 100);\n};","import axios from 'axios';\n\nimport logger from './logger.js';\n\nconst log = logger('monitoring');\n\nexport const sendHeartbeat = async () => {\n if (!process.env.HEARTBEAT_URL || process.env.HEARTBEAT_URL.endsWith('/')) return false;\n\n try {\n await axios.post(process.env.HEARTBEAT_URL);\n\n return true;\n } catch (e: any) {\n log.warn(`Failed to send heartbeat: ${e.message || e}`);\n return false;\n }\n}","import moment from 'moment';\n\nmoment.locale('en', {\n week: {\n dow: 1\n }\n});\n\nconst getNextRunTime = (startDate: moment.Moment, schedule: any, taskTime: moment.Moment): moment.Moment => {\n const [num, freq] = schedule.frequency.split('|');\n const targetDate = moment(startDate).add(num, freq as moment.unitOfTime.Base);\n\n if (schedule.frequencyPeriod === 'first') {\n targetDate.startOf(freq as moment.unitOfTime.StartOf);\n } else if (schedule.frequencyPeriod === 'last') {\n targetDate.endOf(freq as moment.unitOfTime.StartOf);\n }\n\n const isWeekday = targetDate.isoWeekday() > 0 && targetDate.isoWeekday() < 6;\n const isSaturday = targetDate.isoWeekday() === 6;\n\n // The weekday or weekend chosen should be within the same month as the target date\n if (schedule.frequencyDay === 'weekdays' && !isWeekday) {\n if ((targetDate.date() / 7) < 2) {\n targetDate.add(isSaturday ? 2 : 1, 'days');\n } else {\n targetDate.subtract(isSaturday ? 1 : 2, 'days');\n }\n } else if (schedule.frequencyDay === 'weekends' && isWeekday) {\n if ((targetDate.date() / 7) < 2) {\n targetDate.isoWeekday(6);\n } else {\n targetDate.isoWeekday(0);\n }\n }\n\n if (taskTime.isAfter(targetDate, 'minute')) {\n return getNextRunTime(targetDate, schedule, taskTime);\n }\n\n return targetDate;\n};\n\nexport const getScheduledReportRunTimes = (schedule: any, limit = 1, taskTime = moment()): moment.Moment[] => {\n if (!schedule.startDate || !schedule.enabled) return [];\n\n const originalStartDate = moment.utc(schedule.startDate);\n\n let startDate = originalStartDate;\n\n const includeStartDate = taskTime.isSameOrBefore(originalStartDate, 'minute');\n\n let runTimes = [] as moment.Moment[];\n\n if (includeStartDate) {\n runTimes = [originalStartDate];\n }\n\n const [, freq] = schedule.frequency.split('|');\n\n if (freq === 'once') {\n const nextRunTime = runTimes[0];\n\n // If this is now beyond the start date, return an empty array\n return taskTime.isAfter(nextRunTime, 'minute') ? [] : runTimes;\n }\n\n\n const scheduleRunTimes = Array.from(Array(includeStartDate ? limit - 1 : limit).keys()).map(() => {\n const nextRunTime = getNextRunTime(startDate, schedule, taskTime);\n\n startDate = nextRunTime.hour(originalStartDate.hour()).minute(originalStartDate.minute());\n\n return nextRunTime;\n });\n\n return [...runTimes, ...scheduleRunTimes];\n};\n","import { ObjectId } from 'mongodb';\n\ntype Primitive = string | number | boolean | null | undefined | symbol | bigint | Date | ObjectId; // Add ObjectId/Date here\n\nexport * from './account.js'\nexport * from './asset.js'\nexport * from './automation.js'\nexport * from './company.js'\nexport * from './scraperRun.js';\nexport * from './dataIngest.js'\nexport * from './entity.js'\nexport * from './email.js';\nexport * from './invoice.js';\nexport * from './log.js';\nexport * from './reading.js'\nexport * from './report.js'\nexport * from './supplier.js'\nexport * from './global.js'\nexport { ObjectId }\n\nexport interface ETNPagedResponse<T = any> {\n data: T[];\n total: number;\n limit: number;\n skip: number;\n}"],"mappings":"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","names":["winston","axios","https","log","client","import_axios","axios","moment","import_axios","log","axios","import_moment","moment","import_mongodb"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@etainabl/nodejs-sdk",
3
- "version": "1.2.56",
3
+ "version": "1.2.57",
4
4
  "type": "module",
5
5
  "main": "./dist/cjs/index.js",
6
6
  "module": "./dist/esm/index.mjs",