ts-db-helper
Version:
Simple ORM based on TypeScript
210 lines • 9.37 kB
JavaScript
import { ModelManager } from '../managers/model-manager';
import { FieldSerializerConfigurator } from './field-serializers/field-serializer.configurator';
import { SerializerError } from '../errors/serializer.error';
import { BooleanFieldSerializer } from './field-serializers/boolean.field-serializer';
import { StringFieldSerializer } from './field-serializers/string.field-serializer';
import { RealFieldSerializer } from './field-serializers/real.field-serializer';
import { IntegerFieldSerializer } from './field-serializers/integer.field-serializer';
import { FieldSerializer } from './field-serializers/field-serializer';
import { Observable } from 'rxjs/Observable';
var Serializer = /** @class */ (function () {
function Serializer(target, many) {
this.many = many;
this.partial = false;
if (this.model && target instanceof this.model) {
this.instance = target;
}
else if (this.model && Array.isArray(target) && target[0] instanceof this.model) {
this.many = true;
this.instances = target;
}
else if (target) {
this.data = target;
}
else if (target !== undefined && (target === true || target === false)) {
this.many = target;
}
}
Serializer.prototype.setData = function (data) {
this.data = data;
};
Serializer.prototype.setInstance = function (instance) {
this.instance = instance;
};
Serializer.prototype.setInstances = function (instances) {
this.instances = instances;
};
Serializer.prototype.setPartialParse = function (partial) {
this.partial = partial;
};
Serializer.prototype.getData = function () {
var _this = this;
if (this.data) {
return Observable.create(function (observer) {
observer.next(_this.data);
observer.complete();
});
}
else {
var observables = [];
if (this.many) {
this.data = [];
var construct = this.constructor;
for (var _i = 0, _a = this.instances; _i < _a.length; _i++) {
var instance = _a[_i];
var serializer = new construct(instance);
observables.push(serializer.getData());
}
return Observable.combineLatest().map(function (results) {
_this.data = results;
return _this.data;
});
}
else {
this.data = {};
for (var _b = 0, _c = this.fields; _b < _c.length; _b++) {
var field = _c[_b];
var fieldSerializer = void 0;
if (field instanceof FieldSerializer) {
fieldSerializer = field;
}
else {
switch (this.instance.getCommonFieldType(field).toLocaleLowerCase()) {
case 'integer':
fieldSerializer = new IntegerFieldSerializer(field, field, this.getFieldConfig(field));
break;
case 'number':
case 'real':
case 'double':
case 'float':
case 'decimal':
fieldSerializer = new RealFieldSerializer(field, field, this.getFieldConfig(field));
break;
case 'string':
case 'text':
case 'varchar':// should be contains
fieldSerializer = new StringFieldSerializer(field, field, this.getFieldConfig(field));
break;
case 'boolean':
fieldSerializer = new BooleanFieldSerializer(field, field, this.getFieldConfig(field));
break;
default:
fieldSerializer = new StringFieldSerializer(field, field, this.getFieldConfig(field));
}
}
observables.push(fieldSerializer.serialize(this.instance, this.data));
}
return Observable.combineLatest().map(function () {
return _this.data;
});
}
}
};
Serializer.prototype.getInstance = function () {
var _this = this;
if (this.instance || this.instances) {
return Observable.create(function (observer) {
observer.next(_this.instance || _this.instances);
observer.complete();
});
}
else if (!this.data) {
return Observable.create(function (observer) {
observer.next(null);
observer.complete();
});
}
else {
if (this.many && Array.isArray(this.data)) {
var observables = [];
this.instances = [];
var construct = this.constructor;
for (var _i = 0, _a = this.data; _i < _a.length; _i++) {
var data = _a[_i];
var serializer = new construct(data);
observables.push(serializer.getInstance());
}
return Observable.combineLatest().map(function (results) {
_this.instances = results;
return _this.instances;
});
}
else if (!this.many && !Array.isArray(this.data)) {
var observables = [];
this.instance = new this.model();
for (var _b = 0, _c = this.fields; _b < _c.length; _b++) {
var field = _c[_b];
var fieldSerializer = void 0;
if (field instanceof FieldSerializer) {
fieldSerializer = field;
}
else {
switch (this.instance.getCommonFieldType(field).toLocaleLowerCase()) {
case 'integer':
fieldSerializer = new IntegerFieldSerializer(field, field);
break;
case 'number':
case 'real':
case 'double':
case 'float':
case 'decimal':
fieldSerializer = new RealFieldSerializer(field, field);
break;
case 'string':
case 'text':
case 'varchar':// should be contains
fieldSerializer = new StringFieldSerializer(field, field);
break;
case 'boolean':
fieldSerializer = new BooleanFieldSerializer(field, field);
break;
default:
fieldSerializer = new StringFieldSerializer(field, field);
}
}
observables.push(fieldSerializer.deserialize(this.data, this.instance));
}
return Observable.combineLatest().map(function (errs) {
var errors = [];
for (var _i = 0, errs_1 = errs; _i < errs_1.length; _i++) {
var error = errs_1[_i];
if (error) {
errors.push(error);
}
}
if (errors.length) {
throw new SerializerError('Deserialization failed', errors);
}
return _this.instance;
});
}
else {
return Observable.create(function (observer) {
observer.next(null);
observer.complete();
});
}
}
};
Serializer.prototype.getFieldConfig = function (field) {
var column = ModelManager.getInstance().getModel(this.model).fields[field];
if (!column) {
throw new Error('Model "' + this.model.name + '" has no field "' + field +
'" but is declared in Serializer "' + this.constructor.name + '"');
}
var config = new FieldSerializerConfigurator();
if (column.primaryKey) {
config.isOptional = false;
}
if (column.defaultValue) {
config.defaultValue = column.defaultValue;
}
return config;
};
Serializer.prototype.isValid = function () {
return null;
};
return Serializer;
}());
export { Serializer };
//# sourceMappingURL=serializer.js.map