change validation of mandatory Command-parameters

This commit is contained in:
clauspeterhuebner 2026-02-04 23:42:08 +01:00
parent e9e8fbac98
commit 5d69d3720c
3 changed files with 35 additions and 4 deletions

View File

@ -1,10 +1,14 @@
import { Command } from './Command'; import { Command } from './Command';
export abstract class BaseCommand<T = any> implements Command<T> { export abstract class BaseCommand<T = any> implements Command<T> {
protected constructor(protected readonly params: any = {}) {} protected abstract requiredFields: string[];
protected constructor(protected readonly params: any = {}) {
this.validateRequiredFields();
}
abstract execute(): Promise<T>; abstract execute(): Promise<T>;
/*
validate(): boolean { validate(): boolean {
return true; // Default implementation, override in subclasses return true; // Default implementation, override in subclasses
} }
@ -12,4 +16,23 @@ export abstract class BaseCommand<T = any> implements Command<T> {
protected validateParams(requiredParams: string[]): boolean { protected validateParams(requiredParams: string[]): boolean {
return requiredParams.every(param => this.params[param] !== undefined); return requiredParams.every(param => this.params[param] !== undefined);
} }
*/
private validateRequiredFields(): void {
const missingFields = this.requiredFields.filter(field =>
this.params[field] === undefined || this.params[field] === null || this.params[field] === ''
);
if (missingFields.length > 0) {
throw new Error(`Missing required fields for ${this.constructor.name}: ${missingFields.join(', ')}`);
}
}
validate(): boolean {
return this.requiredFields.every(field =>
this.params[field] !== undefined &&
this.params[field] !== null &&
this.params[field] !== ''
);
}
} }

View File

@ -15,9 +15,12 @@ const createLogger = (method: string) =>
export class CommandExecutor { export class CommandExecutor {
async executeCommand<T>(command: Command<T>): Promise<CommandResult> { async executeCommand<T>(command: Command<T>): Promise<CommandResult> {
const methodLogger = createLogger(`executeCommand`) const methodLogger = createLogger(`executeCommand`)
methodLogger.debug(`executeCommand() command=${command.constructor.name}`)
try { try {
if (command.validate && !command.validate()) { if (command.validate && !command.validate()) {
return { success: false, error: 'Command validation failed' }; const errmsg = `Command validation failed for command=${command.constructor.name}`
methodLogger.error(errmsg)
return { success: false, error: errmsg };
} }
methodLogger.debug(`executeCommand() executing command=${command.constructor.name}`) methodLogger.debug(`executeCommand() executing command=${command.constructor.name}`)
const result = await command.execute(); const result = await command.execute();

View File

@ -9,6 +9,7 @@ const createLogger = (method: string) =>
export class SendEmailCommand extends BaseCommand<{ success: boolean }> { export class SendEmailCommand extends BaseCommand<{ success: boolean }> {
static readonly SEND_MAIL_COMMAND = 'SEND_MAIL_COMMAND'; static readonly SEND_MAIL_COMMAND = 'SEND_MAIL_COMMAND';
protected requiredFields: string[] = ['mailType', 'senderComUuid', 'senderGradidoId', 'receiverComUuid', 'receiverGradidoId'];
constructor(params: { constructor(params: {
mailType: string, mailType: string,
@ -23,7 +24,11 @@ export class SendEmailCommand extends BaseCommand<{ success: boolean }> {
} }
validate(): boolean { validate(): boolean {
return this.validateParams(['mailType', 'senderComUuid', 'senderGradidoId', 'receiverComUuid', 'receiverGradidoId']); const baseValid = super.validate();
if (!baseValid) {
return false;
}
return true;
} }
async execute(): Promise<{ success: boolean }> { async execute(): Promise<{ success: boolean }> {