pos-be/src/modules/configuration/data-scheduling/domain/usecases/handlers/data-scheduling-change-stat...

64 lines
2.7 KiB
TypeScript

import { EventsHandler, IEventHandler } from '@nestjs/cqrs';
import { DataSchedulingChangeStatusEvent } from '../../entities/event/data-scheduling-change-status.event';
import { capitalizeEachWord } from 'src/modules/reports/shared/helpers';
import {
DataSchedulingLogEntity,
SCHEDULING_LOG_ACTION_ENUM,
SCHEDULING_LOG_TYPE_ENUM,
} from '../../entities/data-scheduling.entity';
import { Logger } from '@nestjs/common';
import { DataSchedulingLogDataService } from '../../../data/services/data-scheduling-log-data.service';
import { decryptionTotal } from '../../../infrastructure/helpers';
@EventsHandler(DataSchedulingChangeStatusEvent)
export class DataSchedulingChangeStatusHandler
implements IEventHandler<DataSchedulingChangeStatusEvent>
{
private readonly logger = new Logger(DataSchedulingChangeStatusHandler.name);
constructor(private service: DataSchedulingLogDataService) {}
async handle(event: DataSchedulingChangeStatusEvent) {
// Prevent execution if the event data is null, which can happen if triggered from the default percentage update service.
if (event.data?.data) {
const oldData = event?.data?.old;
const newData = event?.data?.data;
const oldStatus = capitalizeEachWord(oldData?.status);
const newStatus = capitalizeEachWord(newData?.status);
const scheduleName = newData?.name || 'an item';
const editorName = newData.editor_name || 'System';
const totalPercentage = decryptionTotal(newData?.indexing_key);
const description = `<div><b>${editorName}</b> changed the status of <b><i>${scheduleName} (${totalPercentage}%)</i></b> schedule from <b><i>${newData?.schedule_date_from}</i></b> to <b><i>${newData.schedule_date_to}</i></b> from <b><i>${oldStatus}</i></b> to <b><i>${newStatus}</i></b>.</div>`;
const payload: DataSchedulingLogEntity = {
type: SCHEDULING_LOG_TYPE_ENUM.DATA_SCHEDULING,
action: SCHEDULING_LOG_ACTION_ENUM.CHANGE_STATUS,
log_created_at: new Date().getTime(),
data_id: newData?.id,
name: newData?.name,
indexing_key: newData?.indexing_key,
schedule_date_from: newData?.schedule_date_from,
schedule_date_to: newData?.schedule_date_to,
status: newData?.status,
creator_id: newData?.creator_id,
creator_name: newData?.creator_name,
editor_id: newData?.editor_id,
editor_name: newData?.editor_name,
created_at: newData?.created_at,
updated_at: newData?.updated_at,
description: description,
};
await this.service.create(payload as any);
this.logger.verbose(
`[SCHEDULING LOG] Change status data for ID: ${payload.data_id}`,
);
}
}
}