From 5d69d3720c723cad2183279b77673d947b4f6e45 Mon Sep 17 00:00:00 2001
From: clauspeterhuebner
Date: Wed, 4 Feb 2026 23:42:08 +0100
Subject: [PATCH] change validation of mandatory Command-parameters
---
core/src/command/BaseCommand.ts | 27 +++++++++++++++++--
core/src/command/CommandExecutor.ts | 5 +++-
core/src/command/commands/SendEmailCommand.ts | 7 ++++-
3 files changed, 35 insertions(+), 4 deletions(-)
diff --git a/core/src/command/BaseCommand.ts b/core/src/command/BaseCommand.ts
index a2c75d902..b1386d6ab 100644
--- a/core/src/command/BaseCommand.ts
+++ b/core/src/command/BaseCommand.ts
@@ -1,10 +1,14 @@
import { Command } from './Command';
export abstract class BaseCommand implements Command {
- protected constructor(protected readonly params: any = {}) {}
+ protected abstract requiredFields: string[];
+
+ protected constructor(protected readonly params: any = {}) {
+ this.validateRequiredFields();
+ }
abstract execute(): Promise;
-
+/*
validate(): boolean {
return true; // Default implementation, override in subclasses
}
@@ -12,4 +16,23 @@ export abstract class BaseCommand implements Command {
protected validateParams(requiredParams: string[]): boolean {
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] !== ''
+ );
+ }
+
}
diff --git a/core/src/command/CommandExecutor.ts b/core/src/command/CommandExecutor.ts
index ec7209d20..c0cf397a5 100644
--- a/core/src/command/CommandExecutor.ts
+++ b/core/src/command/CommandExecutor.ts
@@ -15,9 +15,12 @@ const createLogger = (method: string) =>
export class CommandExecutor {
async executeCommand(command: Command): Promise {
const methodLogger = createLogger(`executeCommand`)
+ methodLogger.debug(`executeCommand() command=${command.constructor.name}`)
try {
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}`)
const result = await command.execute();
diff --git a/core/src/command/commands/SendEmailCommand.ts b/core/src/command/commands/SendEmailCommand.ts
index f9abc51c7..2caf51b76 100644
--- a/core/src/command/commands/SendEmailCommand.ts
+++ b/core/src/command/commands/SendEmailCommand.ts
@@ -9,6 +9,7 @@ const createLogger = (method: string) =>
export class SendEmailCommand extends BaseCommand<{ success: boolean }> {
static readonly SEND_MAIL_COMMAND = 'SEND_MAIL_COMMAND';
+ protected requiredFields: string[] = ['mailType', 'senderComUuid', 'senderGradidoId', 'receiverComUuid', 'receiverGradidoId'];
constructor(params: {
mailType: string,
@@ -23,7 +24,11 @@ export class SendEmailCommand extends BaseCommand<{ success: 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 }> {