@decaf-ts/db-decorators
Version:
Agnostic database decorators and repository
85 lines • 9.7 kB
JavaScript
;
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.TimestampValidator = void 0;
const decorator_validation_1 = require("@decaf-ts/decorator-validation");
const constants_1 = require("./../constants.cjs");
/**
* @description A validator that ensures timestamp values are only updated with newer timestamps.
* @summary Validates the update of a timestamp by comparing the new timestamp with the old one, ensuring the new timestamp is more recent.
* @param {Date|string|number} value - The timestamp value to validate
* @param {Date|string|number} oldValue - The previous timestamp to compare against
* @param {string} [message] - Optional custom error message
* @class TimestampValidator
* @example
* // Using TimestampValidator with a timestamp property
* class Document {
* @timestamp()
* updatedAt: Date;
*
* title: string;
*
* constructor(title: string) {
* this.title = title;
* this.updatedAt = new Date();
* }
* }
*
* // This will trigger validation error when trying to update with an older timestamp
* const doc = new Document('My Document');
* const oldDate = new Date(2020, 0, 1);
* doc.updatedAt = oldDate; // Will be prevented by TimestampValidator
* @category Validators
*/
let TimestampValidator = class TimestampValidator extends decorator_validation_1.Validator {
constructor() {
super(constants_1.DEFAULT_ERROR_MESSAGES.TIMESTAMP.INVALID);
}
/**
* @description Implementation of the base validator's hasErrors method.
* @summary This method is required by the Validator interface but not used in this validator as validation only happens during updates.
* @param {any} value - The timestamp value to validate
* @param {any[]} args - Additional arguments
* @return {string | undefined} Always returns undefined as this validator only works during updates
*/
// eslint-disable-next-line @typescript-eslint/no-unused-vars
hasErrors(value, ...args) {
return undefined;
}
/**
* @description Validates that a timestamp is newer than its previous value.
* @summary Checks if a timestamp has been updated with a more recent value by converting both values to Date objects and comparing them.
* @param {Date|string|number} value - The new timestamp value to validate
* @param {Date|string|number} oldValue - The original timestamp to compare against
* @param {string} [message] - Optional custom error message to override the default
* @return {string | undefined} An error message if validation fails (new timestamp is not newer), undefined otherwise
*/
updateHasErrors(value, oldValue, message) {
if (value === undefined)
return;
message = message || this.getMessage(message || this.message);
try {
value = new Date(value);
oldValue = new Date(oldValue);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
}
catch (e) {
return message;
}
return value <= oldValue ? message : undefined;
}
};
exports.TimestampValidator = TimestampValidator;
exports.TimestampValidator = TimestampValidator = __decorate([
(0, decorator_validation_1.validator)(constants_1.UpdateValidationKeys.TIMESTAMP),
__metadata("design:paramtypes", [])
], TimestampValidator);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGltZXN0YW1wVmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3ZhbGlkYXRpb24vdmFsaWRhdG9ycy9UaW1lc3RhbXBWYWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEseUVBQXNFO0FBQ3RFLGtEQUE0RTtBQUU1RTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQkc7QUFFSSxJQUFNLGtCQUFrQixHQUF4QixNQUFNLGtCQUFtQixTQUFRLGdDQUFTO0lBQy9DO1FBQ0UsS0FBSyxDQUFDLGtDQUFzQixDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsNkRBQTZEO0lBQzdELFNBQVMsQ0FBQyxLQUFVLEVBQUUsR0FBRyxJQUFXO1FBQ2xDLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksZUFBZSxDQUNwQixLQUE2QixFQUM3QixRQUFnQyxFQUNoQyxPQUFnQjtRQUVoQixJQUFJLEtBQUssS0FBSyxTQUFTO1lBQUUsT0FBTztRQUVoQyxPQUFPLEdBQUcsT0FBTyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUU5RCxJQUFJLENBQUM7WUFDSCxLQUFLLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDeEIsUUFBUSxHQUFHLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzlCLDZEQUE2RDtRQUMvRCxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUM7UUFFRCxPQUFPLEtBQUssSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ2pELENBQUM7Q0FDRixDQUFBO0FBNUNZLGdEQUFrQjs2QkFBbEIsa0JBQWtCO0lBRDlCLElBQUEsZ0NBQVMsRUFBQyxnQ0FBb0IsQ0FBQyxTQUFTLENBQUM7O0dBQzdCLGtCQUFrQixDQTRDOUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB2YWxpZGF0b3IsIFZhbGlkYXRvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IERFRkFVTFRfRVJST1JfTUVTU0FHRVMsIFVwZGF0ZVZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBIHZhbGlkYXRvciB0aGF0IGVuc3VyZXMgdGltZXN0YW1wIHZhbHVlcyBhcmUgb25seSB1cGRhdGVkIHdpdGggbmV3ZXIgdGltZXN0YW1wcy5cbiAqIEBzdW1tYXJ5IFZhbGlkYXRlcyB0aGUgdXBkYXRlIG9mIGEgdGltZXN0YW1wIGJ5IGNvbXBhcmluZyB0aGUgbmV3IHRpbWVzdGFtcCB3aXRoIHRoZSBvbGQgb25lLCBlbnN1cmluZyB0aGUgbmV3IHRpbWVzdGFtcCBpcyBtb3JlIHJlY2VudC5cbiAqIEBwYXJhbSB7RGF0ZXxzdHJpbmd8bnVtYmVyfSB2YWx1ZSAtIFRoZSB0aW1lc3RhbXAgdmFsdWUgdG8gdmFsaWRhdGVcbiAqIEBwYXJhbSB7RGF0ZXxzdHJpbmd8bnVtYmVyfSBvbGRWYWx1ZSAtIFRoZSBwcmV2aW91cyB0aW1lc3RhbXAgdG8gY29tcGFyZSBhZ2FpbnN0XG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIC0gT3B0aW9uYWwgY3VzdG9tIGVycm9yIG1lc3NhZ2VcbiAqIEBjbGFzcyBUaW1lc3RhbXBWYWxpZGF0b3JcbiAqIEBleGFtcGxlXG4gKiAvLyBVc2luZyBUaW1lc3RhbXBWYWxpZGF0b3Igd2l0aCBhIHRpbWVzdGFtcCBwcm9wZXJ0eVxuICogY2xhc3MgRG9jdW1lbnQge1xuICogICBAdGltZXN0YW1wKClcbiAqICAgdXBkYXRlZEF0OiBEYXRlO1xuICogICBcbiAqICAgdGl0bGU6IHN0cmluZztcbiAqICAgXG4gKiAgIGNvbnN0cnVjdG9yKHRpdGxlOiBzdHJpbmcpIHtcbiAqICAgICB0aGlzLnRpdGxlID0gdGl0bGU7XG4gKiAgICAgdGhpcy51cGRhdGVkQXQgPSBuZXcgRGF0ZSgpO1xuICogICB9XG4gKiB9XG4gKiBcbiAqIC8vIFRoaXMgd2lsbCB0cmlnZ2VyIHZhbGlkYXRpb24gZXJyb3Igd2hlbiB0cnlpbmcgdG8gdXBkYXRlIHdpdGggYW4gb2xkZXIgdGltZXN0YW1wXG4gKiBjb25zdCBkb2MgPSBuZXcgRG9jdW1lbnQoJ015IERvY3VtZW50Jyk7XG4gKiBjb25zdCBvbGREYXRlID0gbmV3IERhdGUoMjAyMCwgMCwgMSk7XG4gKiBkb2MudXBkYXRlZEF0ID0gb2xkRGF0ZTsgLy8gV2lsbCBiZSBwcmV2ZW50ZWQgYnkgVGltZXN0YW1wVmFsaWRhdG9yXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdG9yc1xuICovXG5AdmFsaWRhdG9yKFVwZGF0ZVZhbGlkYXRpb25LZXlzLlRJTUVTVEFNUClcbmV4cG9ydCBjbGFzcyBUaW1lc3RhbXBWYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3Ige1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihERUZBVUxUX0VSUk9SX01FU1NBR0VTLlRJTUVTVEFNUC5JTlZBTElEKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW1wbGVtZW50YXRpb24gb2YgdGhlIGJhc2UgdmFsaWRhdG9yJ3MgaGFzRXJyb3JzIG1ldGhvZC5cbiAgICogQHN1bW1hcnkgVGhpcyBtZXRob2QgaXMgcmVxdWlyZWQgYnkgdGhlIFZhbGlkYXRvciBpbnRlcmZhY2UgYnV0IG5vdCB1c2VkIGluIHRoaXMgdmFsaWRhdG9yIGFzIHZhbGlkYXRpb24gb25seSBoYXBwZW5zIGR1cmluZyB1cGRhdGVzLlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBUaGUgdGltZXN0YW1wIHZhbHVlIHRvIHZhbGlkYXRlXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9IEFsd2F5cyByZXR1cm5zIHVuZGVmaW5lZCBhcyB0aGlzIHZhbGlkYXRvciBvbmx5IHdvcmtzIGR1cmluZyB1cGRhdGVzXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGhhc0Vycm9ycyh2YWx1ZTogYW55LCAuLi5hcmdzOiBhbnlbXSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVmFsaWRhdGVzIHRoYXQgYSB0aW1lc3RhbXAgaXMgbmV3ZXIgdGhhbiBpdHMgcHJldmlvdXMgdmFsdWUuXG4gICAqIEBzdW1tYXJ5IENoZWNrcyBpZiBhIHRpbWVzdGFtcCBoYXMgYmVlbiB1cGRhdGVkIHdpdGggYSBtb3JlIHJlY2VudCB2YWx1ZSBieSBjb252ZXJ0aW5nIGJvdGggdmFsdWVzIHRvIERhdGUgb2JqZWN0cyBhbmQgY29tcGFyaW5nIHRoZW0uXG4gICAqIEBwYXJhbSB7RGF0ZXxzdHJpbmd8bnVtYmVyfSB2YWx1ZSAtIFRoZSBuZXcgdGltZXN0YW1wIHZhbHVlIHRvIHZhbGlkYXRlXG4gICAqIEBwYXJhbSB7RGF0ZXxzdHJpbmd8bnVtYmVyfSBvbGRWYWx1ZSAtIFRoZSBvcmlnaW5hbCB0aW1lc3RhbXAgdG8gY29tcGFyZSBhZ2FpbnN0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gLSBPcHRpb25hbCBjdXN0b20gZXJyb3IgbWVzc2FnZSB0byBvdmVycmlkZSB0aGUgZGVmYXVsdFxuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9IEFuIGVycm9yIG1lc3NhZ2UgaWYgdmFsaWRhdGlvbiBmYWlscyAobmV3IHRpbWVzdGFtcCBpcyBub3QgbmV3ZXIpLCB1bmRlZmluZWQgb3RoZXJ3aXNlXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlSGFzRXJyb3JzKFxuICAgIHZhbHVlOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyLFxuICAgIG9sZFZhbHVlOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1lc3NhZ2U/OiBzdHJpbmdcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuXG4gICAgbWVzc2FnZSA9IG1lc3NhZ2UgfHwgdGhpcy5nZXRNZXNzYWdlKG1lc3NhZ2UgfHwgdGhpcy5tZXNzYWdlKTtcblxuICAgIHRyeSB7XG4gICAgICB2YWx1ZSA9IG5ldyBEYXRlKHZhbHVlKTtcbiAgICAgIG9sZFZhbHVlID0gbmV3IERhdGUob2xkVmFsdWUpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZSA8PSBvbGRWYWx1ZSA/IG1lc3NhZ2UgOiB1bmRlZmluZWQ7XG4gIH1cbn1cbiJdfQ==