75 lines
2.0 KiB
JavaScript
Executable File

import { Schematized } from "@lib"
import { User } from "@models"
import UpdateUserData from "../services/updateUserData"
const AllowedPublicUpdateFields = [
"fullName",
"avatar",
"email",
"cover",
"description",
"location",
"links",
]
const MaxStringsLengths = {
fullName: 120,
email: 320,
description: 2000,
}
export default {
method: "POST",
route: "/self/update_data",
middlewares: ["withAuthentication"],
fn: Schematized({
required: ["update"],
select: ["update"],
}, async (req, res) => {
const user_id = req.user._id.toString()
let update = {}
AllowedPublicUpdateFields.forEach((key) => {
if (typeof req.selection.update[key] !== "undefined") {
// sanitize update
// check maximung strings length
if (typeof req.selection.update[key] === "string" && MaxStringsLengths[key]) {
if (req.selection.update[key].length > MaxStringsLengths[key]) {
// create a substring
req.selection.update[key] = req.selection.update[key].substring(0, MaxStringsLengths[key])
}
}
update[key] = req.selection.update[key]
}
})
// check if email is already in use
if (typeof update.email !== "undefined") {
const user = await User.findOne({
email: update.email,
})
if (user) {
return res.status(400).json({
error: "Email is already in use",
})
}
}
UpdateUserData({
user_id: user_id,
update: update,
}).then((user) => {
return res.json({
...user
})
})
.catch((err) => {
return res.json(500).json({
error: err.message
})
})
}),
}