mvom
Version:
Multivalue Object Mapper
100 lines (90 loc) • 3.56 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _dateFns = require("date-fns");
var _errors = require("../errors");
/** ISOTime Data Transformer */
class ISOTimeDataTransformer {
/** Database time format is in milliseconds */
constructor(dbFormat = 's') {
this.isDbInMs = dbFormat === 'ms';
}
/**
* Transform mv style time data to ISO 8601 approved time format (HH:mm:ss.SSS)
* @throws {@link TransformDataError} Database value could not be transformed to external format
*/
transformFromDb(value) {
if (value == null) {
return null;
}
const internalTime = Number(value);
if (!Number.isInteger(internalTime) || internalTime < 0) {
throw new _errors.TransformDataError({
transformClass: this.constructor.name,
transformValue: value
});
}
if (internalTime > 86400000 || !this.isDbInMs && internalTime > 86400) {
throw new _errors.TransformDataError({
transformClass: this.constructor.name,
transformValue: value
});
}
return this.convertInternalTimeToISOTime(internalTime);
}
/**
* Transform ISO 8601 approved time format (HH:mm:ss.SSS) to mv style time data
* @throws {@link TransformDataError} Value could not be transformed to database format
*/
transformToDb(value) {
if (value == null) {
return null;
}
if (typeof value !== 'string') {
throw new _errors.TransformDataError({
transformClass: this.constructor.name,
transformValue: value
});
}
const isoTimeRegex = /(\d{2}):(\d{2}):(\d{2})\.(\d{3})/; // hh:mm:ss.SSS
const match = isoTimeRegex.exec(value);
if (match == null) {
throw new _errors.TransformDataError({
transformClass: this.constructor.name,
transformValue: value
});
}
const [, hour, minute, second, millisecond] = match;
return this.convertISOTimeToInternalTime(hour, minute, second, millisecond);
}
/** Transform query constants to internal u2 time format */
transformToQuery(value) {
return value === '' || value == null ? '' : this.transformToDb(value);
}
/** Convert internal time to ISOTime format */
convertInternalTimeToISOTime(internalTime) {
let workingValue = internalTime;
const multiplier = this.isDbInMs ? 1000 : 1;
const hours = String(Math.floor(workingValue / (3600 * multiplier))).padStart(2, '0');
workingValue %= 3600 * multiplier;
const minutes = String(Math.floor(workingValue / (60 * multiplier))).padStart(2, '0');
workingValue %= 60 * multiplier;
const seconds = String(Math.floor(workingValue / multiplier)).padStart(2, '0');
workingValue %= multiplier;
const milliseconds = this.isDbInMs ? String(workingValue).padStart(3, '0') : '000';
return `${hours}:${minutes}:${seconds}.${milliseconds}`;
}
/** Convert hours, minutes, seconds, and milliseconds to multivalue internal time format */
convertISOTimeToInternalTime(hour, minute, second, millisecond) {
let internalTime;
if (this.isDbInMs) {
internalTime = (0, _dateFns.hoursToMilliseconds)(Number(hour)) + (0, _dateFns.minutesToMilliseconds)(Number(minute)) + (0, _dateFns.secondsToMilliseconds)(Number(second)) + Number(millisecond);
} else {
internalTime = (0, _dateFns.hoursToSeconds)(Number(hour)) + (0, _dateFns.minutesToSeconds)(Number(minute)) + Number(second);
}
return String(internalTime);
}
}
var _default = exports.default = ISOTimeDataTransformer;