Added config save

This commit is contained in:
lukew3 2021-05-22 09:56:51 -04:00
parent 519abe07bf
commit 72a09dab3a
5 changed files with 96 additions and 102 deletions

View file

@ -78,6 +78,7 @@ const userSchema = new Schema(
email: { type: String, required: true },
password: { type: String, required: true },
refreshTokens: [{ type: String, required: true }],
config: { type: Schema.Types.Mixed, default: {} },
},
{
timestamps: true,

View file

@ -9,14 +9,16 @@
- should be objects that are set on new pb
- Move user data to localstorage instead of cookies
- Result is duplicated in analytics
- Does entire result need to be stored in analytics
- Should result be stored in seperate collection and then referenced in user doc and analytics?
- Loader should hide after tag is added, deleted, or edited
- Fix localhost, production, development server detection
- Should results be moved to a seperate collection
- Should be a setting in the .env
- Does the entire test need to be in the analytics collection?
- make sure refresh token won't expire
- make refresh token expire after session if don't remeber me is set?
- Keep jwt and refresh in cookies?
- make sure refresh token won't expire
- make refresh token expire after session if don't remeber me is set?
- Keep jwt and refresh in cookies?
- Get somebody else to check over security due to my lack of expertise

View file

@ -834,10 +834,92 @@ app.get("/api/userResults", authenticateToken, (req, res) => {
res.sendStatus(200);
});
app.post("/api/saveConfig", (req, res) => {
const config = req.body.config;
//parse config object to prevent errors
//save passed config object to database
function isConfigKeyValid(name) {
if (name === null || name === undefined || name === "") return false;
if (name.length > 30) return false;
return /^[0-9a-zA-Z_.\-#+]+$/.test(name);
}
app.post("/api/saveConfig", authenticateToken, (req, res) => {
try {
if (req.name === undefined || req.body.obj === undefined) {
console.error(`error saving config for ${req.name} - missing input`);
return {
resultCode: -1,
message: "Missing input",
};
}
let obj = req.body.obj;
let errorMessage = "";
let err = false;
Object.keys(obj).forEach((key) => {
if (err) return;
if (!isConfigKeyValid(key)) {
err = true;
console.error(`${key} failed regex check`);
errorMessage = `${key} failed regex check`;
}
if (err) return;
if (key === "resultFilters") return;
if (key === "customBackground") return;
let val = obj[key];
if (Array.isArray(val)) {
val.forEach((valarr) => {
if (!isConfigKeyValid(valarr)) {
err = true;
console.error(`${key}: ${valarr} failed regex check`);
errorMessage = `${key}: ${valarr} failed regex check`;
}
});
} else {
if (!isConfigKeyValid(val)) {
err = true;
console.error(`${key}: ${val} failed regex check`);
errorMessage = `${key}: ${val} failed regex check`;
}
}
});
if (err) {
console.error(
`error saving config for ${request.uid} - bad input - ${JSON.stringify(
request.obj
)}`
);
return {
resultCode: -1,
message: "Bad input. " + errorMessage,
};
}
User.findOne({ name: req.name }, (err, user) => {
if (err) res.status(500).send({ error: err });
user.config = obj;
//what does {merge: true} do in firebase
user.save();
})
.then(() => {
return {
resultCode: 1,
message: "Saved",
};
})
.catch((e) => {
console.error(
`error saving config to DB for ${req.name} - ${e.message}`
);
return {
resultCode: -1,
message: e.message,
};
});
} catch (e) {
console.error(`error saving config for ${req.name} - ${e}`);
return {
resultCode: -999,
message: e,
};
}
});
/*

View file

@ -796,97 +796,6 @@ exports.updateResultTags = functions.https.onCall((request, response) => {
}
});
function isConfigKeyValid(name) {
if (name === null || name === undefined || name === "") return false;
if (name.length > 30) return false;
return /^[0-9a-zA-Z_.\-#+]+$/.test(name);
}
exports.saveConfig = functions.https.onCall((request, response) => {
try {
if (request.uid === undefined || request.obj === undefined) {
console.error(`error saving config for ${request.uid} - missing input`);
return {
resultCode: -1,
message: "Missing input",
};
}
let obj = request.obj;
let errorMessage = "";
let err = false;
Object.keys(obj).forEach((key) => {
if (err) return;
if (!isConfigKeyValid(key)) {
err = true;
console.error(`${key} failed regex check`);
errorMessage = `${key} failed regex check`;
}
if (err) return;
if (key === "resultFilters") return;
if (key === "customBackground") return;
let val = obj[key];
if (Array.isArray(val)) {
val.forEach((valarr) => {
if (!isConfigKeyValid(valarr)) {
err = true;
console.error(`${key}: ${valarr} failed regex check`);
errorMessage = `${key}: ${valarr} failed regex check`;
}
});
} else {
if (!isConfigKeyValid(val)) {
err = true;
console.error(`${key}: ${val} failed regex check`);
errorMessage = `${key}: ${val} failed regex check`;
}
}
});
if (err) {
console.error(
`error saving config for ${request.uid} - bad input - ${JSON.stringify(
request.obj
)}`
);
return {
resultCode: -1,
message: "Bad input. " + errorMessage,
};
}
return db
.collection(`users`)
.doc(request.uid)
.set(
{
config: obj,
},
{ merge: true }
)
.then((e) => {
return {
resultCode: 1,
message: "Saved",
};
})
.catch((e) => {
console.error(
`error saving config to DB for ${request.uid} - ${e.message}`
);
return {
resultCode: -1,
message: e.message,
};
});
} catch (e) {
console.error(`error saving config for ${request.uid} - ${e}`);
return {
resultCode: -999,
message: e,
};
}
});
exports.addPreset = functions.https.onCall(async (request, response) => {
try {
if (!isTagPresetNameValid(request.obj.name)) {

View file

@ -441,7 +441,7 @@ export async function saveConfig(config) {
AccountButton.loading(true);
axiosInstance
.post("/api/saveConfig", {
uid: currentUser().uid,
obj: config,
})
.then((response) => {
AccountButton.loading(false);