mirror of
https://github.com/monkeytypegame/monkeytype.git
synced 2025-10-03 20:15:45 +08:00
Added config save
This commit is contained in:
parent
519abe07bf
commit
72a09dab3a
5 changed files with 96 additions and 102 deletions
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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,
|
||||
};
|
||||
}
|
||||
});
|
||||
|
||||
/*
|
||||
|
|
|
@ -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)) {
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue