Skip to content

Commit 38ac08d

Browse files
committed
feat: add settingsParser
1 parent ea8c4dc commit 38ac08d

2 files changed

Lines changed: 289 additions & 0 deletions

File tree

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
import { parseSettings } from "../settingsParser";
2+
3+
describe("Settings Parser test", () => {
4+
it("should return two settings", () => {
5+
const dummySetting = [
6+
{
7+
setting_name: "Setting 1",
8+
setting_type: "String",
9+
setting_key: "setting1",
10+
setting_value: null,
11+
setting_required: false,
12+
},
13+
{
14+
setting_name: "Setting 2",
15+
setting_type: "Number",
16+
setting_key: "setting2",
17+
setting_value: null,
18+
setting_required: false,
19+
},
20+
];
21+
const settings = parseSettings(dummySetting);
22+
expect(Object.keys(settings).length).toBe(2);
23+
});
24+
25+
it("should return two settings and one required error", () => {
26+
const dummySetting = [
27+
{
28+
setting_name: "Setting 1",
29+
setting_type: "String",
30+
setting_key: "setting1",
31+
setting_value: null,
32+
setting_required: true,
33+
},
34+
{
35+
setting_name: "Setting 2",
36+
setting_type: "Number",
37+
setting_key: "setting2",
38+
setting_value: 5,
39+
setting_required: true,
40+
},
41+
];
42+
const settings = parseSettings(dummySetting, true);
43+
console.log(settings);
44+
expect(Object.keys(settings).length).toBe(3);
45+
expect(settings.errors.length).toBe(1);
46+
});
47+
48+
it("should return two settings, one nested setting and one required error", () => {
49+
const dummySetting = [
50+
{
51+
setting_name: "Setting 1",
52+
setting_type: "String",
53+
setting_key: "setting1",
54+
setting_value: null,
55+
setting_required: true,
56+
},
57+
{
58+
setting_name: "Setting 2",
59+
setting_type: "Number",
60+
setting_key: "setting2",
61+
setting_value: 5,
62+
setting_required: true,
63+
},
64+
{
65+
setting_name: "Setting 3",
66+
setting_type: "Array",
67+
setting_key: "setting3",
68+
setting_required: true,
69+
setting_value: [
70+
{
71+
setting_name: "Setting 4",
72+
setting_type: "Number",
73+
setting_key: "setting4",
74+
setting_value: null,
75+
setting_required: true,
76+
},
77+
{
78+
setting_name: "Setting 5",
79+
setting_type: "String",
80+
setting_key: "setting5",
81+
setting_value: 5,
82+
setting_required: true,
83+
},
84+
],
85+
},
86+
];
87+
const settings = parseSettings(dummySetting, true);
88+
console.log(settings);
89+
expect(Object.keys(settings.setting3).length).toBe(2);
90+
expect(settings.errors.length).toBe(3);
91+
});
92+
93+
it("should return two settings and one type error one required error", () => {
94+
const dummySetting = [
95+
{
96+
setting_name: "Setting 1",
97+
setting_type: "String",
98+
setting_key: "setting1",
99+
setting_value: 5,
100+
setting_required: true,
101+
},
102+
{
103+
setting_name: "Setting 2",
104+
setting_type: "Number",
105+
setting_key: "setting2",
106+
setting_value: null,
107+
setting_required: true,
108+
},
109+
];
110+
const settings = parseSettings(dummySetting, true);
111+
console.log(settings);
112+
expect(Object.keys(settings).length).toBe(3);
113+
expect(settings.errors.length).toBe(2);
114+
});
115+
});

src/utils/settingsParser.js

Lines changed: 174 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,174 @@
1+
//import { mockSettings } from "./mocks/settings";
2+
3+
export const settingsSchema = [
4+
{
5+
setting_name: "Email Verification Callback",
6+
setting_type: "String",
7+
setting_key: "emailVerifyCallback",
8+
setting_required: true,
9+
setting_value: null,
10+
},
11+
{
12+
setting_name: "Password Reset Callback",
13+
setting_type: "String",
14+
setting_key: "passwordResetCallback",
15+
setting_required: true,
16+
setting_value: null,
17+
},
18+
{
19+
setting_name: "Login Success Callback",
20+
setting_type: "String",
21+
setting_key: "successCallback",
22+
setting_required: true,
23+
setting_value: null,
24+
},
25+
{
26+
setting_name: "MongoDB URI",
27+
setting_type: "String",
28+
setting_key: "mongoDbUri",
29+
setting_required: true,
30+
setting_value: null,
31+
},
32+
{
33+
setting_name: "Facebook Credentials",
34+
setting_type: "Array",
35+
setting_key: "facebookAuthProvider",
36+
setting_required: false,
37+
setting_value: [
38+
{
39+
setting_name: "Facebook Application ID",
40+
setting_type: "String",
41+
setting_key: "appID",
42+
setting_value: null,
43+
setting_required: true,
44+
},
45+
{
46+
setting_name: "Facebook Application Secret",
47+
setting_type: "String",
48+
setting_key: "appSecret",
49+
setting_value: null,
50+
setting_required: true,
51+
},
52+
],
53+
},
54+
{
55+
setting_name: "Twitter Credentials",
56+
setting_type: "Array",
57+
setting_key: "twitterAuthProvider",
58+
setting_required: false,
59+
setting_value: [
60+
{
61+
setting_name: "Twitter Consumer Key",
62+
setting_type: "String",
63+
setting_key: "key",
64+
setting_value: null,
65+
setting_required: true,
66+
},
67+
{
68+
setting_name: "Twitter Consumer Secret",
69+
setting_type: "String",
70+
setting_key: "secret",
71+
setting_value: null,
72+
setting_required: true,
73+
},
74+
],
75+
},
76+
{
77+
setting_name: "Github Credentials",
78+
setting_type: "Array",
79+
setting_key: "githubAuthProvider",
80+
setting_required: false,
81+
setting_value: [
82+
{
83+
setting_name: "Github Client ID",
84+
setting_type: "String",
85+
setting_key: "clientID",
86+
setting_value: null,
87+
setting_required: true,
88+
},
89+
{
90+
setting_name: "Github Client Secret",
91+
setting_type: "String",
92+
setting_key: "clientSecret",
93+
setting_value: null,
94+
setting_required: true,
95+
},
96+
],
97+
},
98+
{
99+
setting_name: "Google Credentials",
100+
setting_type: "Array",
101+
setting_key: "googleAuthProvider",
102+
setting_required: false,
103+
setting_value: [
104+
{
105+
setting_name: "Google Client ID",
106+
setting_type: "String",
107+
setting_key: "clientID",
108+
setting_value: null,
109+
setting_required: true,
110+
},
111+
{
112+
setting_name: "Google Client Secret",
113+
setting_type: "String",
114+
setting_key: "clientSecret",
115+
setting_value: null,
116+
setting_required: true,
117+
},
118+
],
119+
},
120+
];
121+
122+
export const parseSettings = (
123+
data,
124+
validate = false,
125+
errors = [],
126+
isRecursion = false,
127+
parentKey = ""
128+
) => {
129+
const settings = data.reduce((acc, item) => {
130+
if (item["setting_type"] == "Array") {
131+
const newTemp = parseSettings(
132+
item.setting_value,
133+
item["setting_required"] && validate, //only validate if parent is required
134+
errors,
135+
true,
136+
item["setting_key"]
137+
);
138+
return { ...acc, [item["setting_key"]]: newTemp };
139+
}
140+
const temp = acc;
141+
temp[item.setting_key] = item.setting_value;
142+
143+
//do validation here
144+
if (validate) {
145+
if (item["setting_required"] && !item["setting_value"]) {
146+
errors.push(
147+
`RequiredError: ${parentKey ? parentKey + "." : ""}${
148+
item["setting_key"]
149+
} is a required setting`
150+
);
151+
} else if (
152+
item["setting_type"].toLowerCase() !==
153+
(typeof item["setting_value"]).toLowerCase()
154+
) {
155+
errors.push(
156+
`TypeError: ${parentKey ? parentKey + "." : ""}${
157+
item["setting_key"]
158+
} should be a/an ${item["setting_type"]}`
159+
);
160+
}
161+
}
162+
163+
return { ...acc, ...temp };
164+
}, {});
165+
166+
//Don't attach errors in recursion
167+
if (validate && !isRecursion && errors.length) {
168+
settings.errors = errors;
169+
}
170+
171+
return settings;
172+
};
173+
174+
// console.log(parseSettings(mockSettings, true));

0 commit comments

Comments
 (0)