import { User, ActivationCode } from "@db_models" // set waiting time to 1 minute const waitingTime = 60 * 1000 export default async (user_id, event = "account:activation") => { if (!user_id) { throw new OperationError(400, "Missing user_id") } const user = await User.findOne({ _id: user_id, }).select("+email") if (!user) { throw new OperationError(404, "User not found") } if (user.activated) { throw new OperationError(400, "User already activated") } let activationCode = await ActivationCode.findOne({ user_id: user._id, }) if (activationCode) { // check if activation code is too recent if (activationCode.date.getTime() + waitingTime > new Date().getTime()) { throw new OperationError(400, "Activation code timeout, please try again later") } await ActivationCode.deleteOne({ user_id: user._id.toString() }) } activationCode = await ActivationCode.create({ event: event, user_id: user._id.toString(), code: Math.floor(Math.random() * 900000) + 100000, date: new Date(), }) ipc.invoke("ems", "account:activation:send", { activation_code: activationCode.code, user: user.toObject(), }) return activationCode.toObject() }