Skip to content

Commit 39fef66

Browse files
authored
Merge pull request #25 from kingscode/KCI-114
Update model.js value mapping
2 parents 6b58c5c + 8abfe3f commit 39fef66

File tree

3 files changed

+60
-13
lines changed

3 files changed

+60
-13
lines changed

generator/templates/Crud/src/components/Resource.vue

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -145,8 +145,7 @@ export default {
145145
let item;
146146
147147
if (this.modelType) {
148-
item = new this.modelType();
149-
item.mapResponse(response.data.data);
148+
item = new this.modelType().mapResponse(response.data.data);
150149
} else {
151150
item = response.data.data;
152151
}
@@ -239,8 +238,7 @@ export default {
239238
}
240239
241240
if (this.modelType) {
242-
this.updateForm.values = new this.modelType();
243-
this.updateForm.values.mapResponse(selected[0]);
241+
this.updateForm.values = new this.modelType().mapResponse(selected[0]);
244242
} else {
245243
this.updateForm.values = selected[0];
246244
}

generator/templates/Default/src/application/models/model.js

Lines changed: 58 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
*
33
*/
44
class 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

generator/templates/Default/src/application/models/user.js

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,6 @@ class User extends Model {
1111
email: this.email,
1212
};
1313
}
14-
15-
mapResponse(data) {
16-
this.id = data.id;
17-
this.name = data.name;
18-
this.email = data.email;
19-
}
2014
}
2115

2216
export default User;

0 commit comments

Comments
 (0)