22 *
33 */
44class Model {
5-
65 /**
76 * @return {{} };
87 */
@@ -12,10 +11,66 @@ class Model {
1211
1312 /**
1413 * @param data {{}}
14+ * @return {model }
1515 */
1616 mapResponse ( data ) {
17- throw new Error ( `${ this . constructor . name } ::mapResponse unset, keys: ${ Object . keys ( data )
18- . join ( ', ' ) } `) ;
17+ return this . initializeObjectFromApi ( data , this ) ;
18+ }
19+
20+ /**
21+ * @private
22+ * @param data
23+ * @param assignable
24+ * @return {model }
25+ */
26+ initializeObjectFromApi ( data , assignable ) {
27+ Object . keys ( assignable )
28+ . forEach ( key => {
29+ const value = assignable [ key ] ;
30+ const type = typeof value ;
31+
32+ if ( typeof data [ key ] === type ) {
33+ assignable [ key ] = data [ key ] ;
34+ return ;
35+ }
36+
37+ const defaultValue = this . getDefaultValueFromType ( type , value ) ;
38+
39+ assignable [ key ] = data [ key ] || defaultValue ;
40+ } ) ;
41+
42+ Object . keys ( data )
43+ . forEach ( key => {
44+ if ( typeof assignable [ key ] === 'undefined' ) {
45+ assignable [ key ] = data [ key ] ;
46+ }
47+ } ) ;
48+
49+ return assignable ;
50+ }
51+
52+ /**
53+ * @private
54+ * @param type
55+ * @param defaultModelValue
56+ * @return {* }
57+ */
58+ getDefaultValueFromType ( type , defaultModelValue ) {
59+ let defaultValue ;
60+
61+ if ( type === 'string' ) {
62+ defaultValue = defaultModelValue || '' ;
63+ } else if ( type === 'boolean' ) {
64+ defaultValue = defaultModelValue || false ;
65+ } else if ( type === 'number' ) {
66+ defaultValue = defaultModelValue || 0 ;
67+ } else if ( Array . isArray ( defaultModelValue ) ) {
68+ defaultValue = defaultModelValue || [ ] ;
69+ } else {
70+ defaultValue = defaultModelValue || null ;
71+ }
72+
73+ return defaultValue ;
1974 }
2075}
2176
0 commit comments