Skip to main content

validateRequired

function validateRequired(processedEntity: any, requiredDefaults: Record<string, unknown>): string | undefined;

Returns a string message if any keys of requiredDefaults are missing in processedEntity. This can be used to validate fields that must be provided.

class CustomBaseEntity extends Entity {
static validate(processedEntity) {
return validateRequired(processedEntity, this.defaults) || super.validate(processedEntity);
}
}

Partial/full results

This can be useful to automatically validate for partial results

class SummaryAnalysis extends Entity {
readonly id: string = '';
readonly createdAt = Temporal.Instant.fromEpochSeconds(0);
readonly meanValue: number = 0;
readonly title: string = '';
}

class FullAnalysis extends SummaryAnalysis {
readonly graph: number[] = [];

static validate(processedEntity) {
return validateRequired(processedEntity, this.defaults) || super.validate(processedEntity);
}
}

Optional fields

In case we have a field that won't always be present (like lastRun here), we can simply 'exclude' it from the fields we require.

class FullAnalysis extends SummaryAnalysis {
readonly graph: number[] = [];
readonly lastRun? = Temporal.Instant.fromEpochSeconds(0);

static schema = {
lastRun: Temporal.Instant.from,
}

static validate(processedEntity) {
return validateRequired(processedEntity, exclude(this.defaults, ['lastRun']));
}
}
exclude()
exclude
function exclude<O extends Record<string, unknown>>(
obj: O,
keys: string[],
): Partial<O> {
const r: any = {};
Object.keys(obj).forEach(k => {
if (!keys.includes(k)) r[k] = obj[k];
});
return r;
}

Full results only have optional fields

In case every field of the 'full' resource was optional:

class FullAnalysis extends SummaryAnalysis {
readonly graph?: number[] = [];
readonly lastRun? = Temporal.Instant.fromEpochSeconds(0);

static schema = {
lastRun: Temporal.Instant.from,
}

static validate(processedEntity) {
return validateRequired(processedEntity, exclude(this.defaults, ['graph', 'lastRun']));
}
}

This code would not successfully know to fetch the 'full' resource if the summary is already provided. There would be no way of knowing whether the fields simply don't exist for that data, or were not fetched. In this case, it is best to provide a null default for at least one field.

class FullAnalysis extends SummaryAnalysis {
readonly graph: number[] = null;
readonly lastRun? = Temporal.Instant.fromEpochSeconds(0);

static schema = {
lastRun: Temporal.Instant.from,
}

static validate(processedEntity) {
return validateRequired(processedEntity, exclude(this.defaults, ['lastRun']));
}
}

This enables the client to understand whether the 'full' resource has been fetched at all.