ngrx-model
Version:
Model classes for integrating ngrx store with a REST API
45 lines (37 loc) • 1.46 kB
text/typescript
import { map, each, clone, get, isFunction, isArray } from 'lodash';
export interface IConverter<TDataType> {
fromServer(raw: any, parent?: any): TDataType;
toServer(data: TDataType, parent?: any): any,
}
export interface ITransformMapping {
[index: string]: IConverter<any> | ITransformMapping;
}
export interface IConverterService {
applyTransform(data: any, transform: IConverter<any> | ITransformMapping, toServer: boolean): any;
}
export class ConverterService {
applyTransform(data: any, transform: IConverter<any> | ITransformMapping, toServer: boolean, parent?: any): any {
if (transform == null || (parent == null && !data)) {
return data;
}
if (isArray(data)) {
return map(data, (item: any): any => { return this.applyTransform(item, transform, toServer); });
}
if (this.isConverter(transform)) {
let transformFunc: { (data: any, parent?: any): any } = toServer
? (<IConverter<any>>transform).toServer
: (<IConverter<any>>transform).fromServer;
return transformFunc(data, parent);
} else {
let mappedData: any = clone(data);
each(transform, (childTransform: any, key: string): any => {
mappedData[key] = this.applyTransform(get(mappedData, key), childTransform, toServer, mappedData);
});
return mappedData;
}
}
private isConverter(object: any): boolean {
return isFunction(object.fromServer)
|| isFunction(object.toServer);
}
}