@citrineos/data
Version:
The OCPP data module which includes all persistence layer implementation.
152 lines • 6.71 kB
JavaScript
;
// Copyright (c) 2023 S44, LLC
// Copyright Contributors to the CitrineOS Project
//
// SPDX-License-Identifier: Apache 2.0
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.DefaultSequelizeInstance = void 0;
const sequelize_typescript_1 = require("sequelize-typescript");
const tslog_1 = require("tslog");
const ComponentVariable_1 = require("./model/DeviceModel/ComponentVariable");
const _1 = require(".");
const DeviceModel_1 = require("./model/DeviceModel");
const MessageInfo_1 = require("./model/MessageInfo");
const Subscription_1 = require("./model/Subscription");
const Tariff_1 = require("./model/Tariff");
const IdTokenAdditionalInfo_1 = require("./model/Authorization/IdTokenAdditionalInfo");
const Location_1 = require("./model/Location");
const LatestStatusNotification_1 = require("./model/Location/LatestStatusNotification");
const TransactionEvent_1 = require("./model/TransactionEvent");
class DefaultSequelizeInstance {
constructor() { }
static getInstance(config, logger) {
if (!DefaultSequelizeInstance.instance) {
DefaultSequelizeInstance.config = config;
DefaultSequelizeInstance.logger = logger
? logger.getSubLogger({ name: this.name })
: new tslog_1.Logger({ name: this.name });
DefaultSequelizeInstance.instance = this.createSequelizeInstance();
}
return DefaultSequelizeInstance.instance;
}
static initializeSequelize() {
return __awaiter(this, arguments, void 0, function* (_sync = false) {
var _a, _b;
let retryCount = 0;
const maxRetries = (_a = this.config.database.maxRetries) !== null && _a !== void 0 ? _a : this.DEFAULT_RETRIES;
const retryDelay = (_b = this.config.database.retryDelay) !== null && _b !== void 0 ? _b : this.DEFAULT_RETRY_DELAY;
while (retryCount < maxRetries) {
try {
yield this.instance.authenticate();
this.logger.info('Database connection has been established successfully');
yield this.syncDb();
break;
}
catch (error) {
retryCount++;
this.logger.error(`Failed to connect to the database (attempt ${retryCount}/${maxRetries}):`, error);
if (retryCount < maxRetries) {
this.logger.info(`Retrying in ${retryDelay / 1000} seconds...`);
yield new Promise((resolve) => setTimeout(resolve, retryDelay));
}
else {
this.logger.error('Max retries reached. Unable to establish database connection.');
}
}
}
});
}
static syncDb() {
return __awaiter(this, void 0, void 0, function* () {
if (this.config.database.alter) {
yield this.instance.sync({ alter: true });
this.logger.info('Database altered');
}
else if (this.config.database.sync) {
yield this.instance.sync({ force: true });
this.logger.info('Database synchronized');
}
});
}
static createSequelizeInstance() {
return new sequelize_typescript_1.Sequelize({
host: this.config.database.host,
port: this.config.database.port,
database: this.config.database.database,
dialect: this.config.database.dialect,
username: this.config.database.username,
password: this.config.database.password,
models: [
_1.AdditionalInfo,
_1.Authorization,
_1.Boot,
_1.Certificate,
_1.InstalledCertificate,
_1.ChangeConfiguration,
_1.ChargingNeeds,
_1.ChargingProfile,
_1.ChargingSchedule,
_1.ChargingStation,
_1.ChargingStationNetworkProfile,
_1.ChargingStationSecurityInfo,
_1.ChargingStationSequence,
_1.Component,
ComponentVariable_1.ComponentVariable,
_1.CompositeSchedule,
_1.Connector,
_1.Evse,
_1.EventData,
_1.IdToken,
IdTokenAdditionalInfo_1.IdTokenAdditionalInfo,
_1.IdTokenInfo,
_1.Location,
_1.MeterValue,
MessageInfo_1.MessageInfo,
_1.OCPPMessage,
_1.Reservation,
_1.SalesTariff,
_1.SecurityEvent,
Location_1.SetNetworkProfile,
_1.ServerNetworkProfile,
_1.Transaction,
TransactionEvent_1.StartTransaction,
Location_1.StatusNotification,
TransactionEvent_1.StopTransaction,
LatestStatusNotification_1.LatestStatusNotification,
Subscription_1.Subscription,
_1.TransactionEvent,
Tariff_1.Tariff,
_1.VariableAttribute,
_1.VariableCharacteristics,
_1.VariableMonitoring,
_1.VariableMonitoringStatus,
DeviceModel_1.VariableStatus,
_1.Variable,
_1.LocalListAuthorization,
_1.LocalListVersion,
_1.LocalListVersionAuthorization,
_1.SendLocalList,
_1.SendLocalListAuthorization,
_1.Tenant,
],
logging: (_sql, _timing) => { },
});
}
}
exports.DefaultSequelizeInstance = DefaultSequelizeInstance;
/**
* Fields
*/
DefaultSequelizeInstance.DEFAULT_RETRIES = 5;
DefaultSequelizeInstance.DEFAULT_RETRY_DELAY = 5000;
DefaultSequelizeInstance.instance = null;
//# sourceMappingURL=util.js.map