UNPKG

@citrineos/data

Version:

The OCPP data module which includes all persistence layer implementation.

65 lines 3.71 kB
// SPDX-FileCopyrightText: 2025 Contributors to the CitrineOS Project // // SPDX-License-Identifier: Apache-2.0 import { MessageState } from '@citrineos/base'; import { Sequelize } from 'sequelize-typescript'; import { Logger } from 'tslog'; import { OCPPMessage } from '../model/index.js'; import { SequelizeRepository } from './Base.js'; export class SequelizeOCPPMessageRepository extends SequelizeRepository { constructor(config, logger, sequelizeInstance) { super(config, OCPPMessage.MODEL_NAME, logger, sequelizeInstance); } async createOCPPMessage(tenantId, message) { if (message.correlationId) { const correlatedMessages = await this.readAllByQuery(tenantId, { where: { tenantId, correlationId: message.correlationId, requestMessageId: null, }, }); if (correlatedMessages.length > 0) { if (correlatedMessages.length > 1) { this.logger.warn(`Multiple correlated messages found for correlationId ${message.correlationId} and tenantId ${tenantId}. This should not happen.`); } const correlatedMessage = correlatedMessages.sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime())[0]; // Get the oldest message // Update the action of the correlated message if it's missing and we have it in the incoming message, or vice versa if (correlatedMessage.action === undefined && message.action) { correlatedMessage.action = message.action; await correlatedMessage.save(); } else if (message.action === undefined && correlatedMessage.action) { message.action = correlatedMessage.action; } if (message.state === MessageState.Request) { this.logger.debug(`Saving request message found for correlationId ${message.correlationId} and tenantId ${tenantId}, will update response`); const createdMessage = await this.create(tenantId, OCPPMessage.build({ ...message })); correlatedMessage.requestMessageId = createdMessage.id; await correlatedMessage.save(); return createdMessage; } else { this.logger.debug(`Saving response message found for correlationId ${message.correlationId} and tenantId ${tenantId} with action ${correlatedMessage.action}`); message.requestMessageId = correlatedMessage.id; return this.create(tenantId, OCPPMessage.build({ ...message })); } } else { // No correlated message found, ideally because this is the request message arriving before the response this.logger.debug(`No correlated message found for correlationId ${message.correlationId} and tenantId ${tenantId} with action ${message.action}. Saving message as-is.`); return this.create(tenantId, OCPPMessage.build({ ...message })); } } else { this.logger.warn(`No correlationId found for message with tenantId ${tenantId} and action ${message.action}. Saving message as-is without correlation.`); return this.create(tenantId, OCPPMessage.build({ ...message })); } } async getRequestByCorrelationId(tenantId, correlationId) { return this.readOnlyOneByQuery(tenantId, { where: { tenantId, correlationId, requestMessageId: null }, }); } } //# sourceMappingURL=OCPPMessage.js.map