This commit is contained in:
2024-11-02 18:01:37 +05:00
parent 2435aa2814
commit c02176d4a7
22 changed files with 563 additions and 32 deletions
+6
View File
@@ -18,6 +18,9 @@ import adminCompaniesRoute from "./routes/admin/adminCompaniesRoute.js";
import adminBuildsRoute from "./routes/admin/adminBuildsRoute.js";
import adminUsersRoute from "./routes/admin/adminUsersRoute.js";
import changePasswordRoute from "./routes/changePassword.js";
import resetRoute from "./routes/reset.js";
import resetConfirmRoute from "./routes/resetConfirm.js";
import addManagerRoute from "./routes/addManager.js";
await connectDB();
@@ -39,6 +42,8 @@ app.use("/login", loginRoute);
app.use("/check", checkRoute);
app.use("/refresh", refreshRoute);
app.use("/register", registerRoute);
app.use("/reset", resetRoute);
app.use("/resetConfirm", resetConfirmRoute);
app.use("/actions", actionsRouter);
app.use("/builds", buildsRouter);
app.use("/scheduled_sessions", scheduledSessionsRoute);
@@ -49,6 +54,7 @@ app.use("/admin/users", adminUsersRoute);
app.use("/companies", authMiddleware, companiesRouter);
app.use("/users", authMiddleware, usersRouter);
app.use("/changePassword", authMiddleware, changePasswordRoute);
app.use("/addManager", authMiddleware, addManagerRoute);
app.listen(port, () => {
console.log(`Server listening on port ${port}`);
+3
View File
@@ -11,6 +11,9 @@ const userSchema = new Schema(
type: String,
required: true,
},
resetCode: {
type: String,
},
companyId: {
type: Schema.Types.ObjectId,
ref: "Company",
+68
View File
@@ -0,0 +1,68 @@
import { Router } from "express";
import { generate } from "generate-password";
import User from "../models/User.js";
import { hashSync } from "bcrypt";
import { createTransport } from "nodemailer";
const router = Router();
router.post("/", async (req, res) => {
const { companyId, username, name, role } = req.body;
try {
const password = generate({
length: 8,
numbers: true,
});
console.log("password", password);
const passwordHash = hashSync(password, 12);
const userExist = await User.exists({ username });
if (userExist) {
return res.json({ error: "User exist" });
}
await User.create({
companyId,
username,
name,
role,
password: passwordHash,
});
let transporter = createTransport({
host: "mail.netangels.ru",
port: 587,
secure: false, // true for 465, false for other ports
auth: {
user: "stream@graff.tech", // generated ethereal user
pass: "zLUbt8Io7dh2F9KT", // generated ethereal password
},
});
// send mail with defined transport object
try {
await transporter.sendMail({
from: "stream@graff.tech", // sender address
to: username, // list of receivers
subject: "Данные аккаунта - stream.graff.tech", // Subject line
html: `<div>
Пароль для входа в аккаунт: <b>${password}</b>
</div>`,
});
} catch (error) {
console.log("error", (error as Error).message);
}
return res.json({ ok: 1 });
} catch (error) {
return res.json({ error: (error as Error).message });
}
});
const addManagerRoute = router;
export default addManagerRoute;
+57
View File
@@ -0,0 +1,57 @@
import bcrypt from "bcrypt";
import { Router } from "express";
import User from "../models/User.js";
import { randomBytes } from "crypto";
import { createTransport } from "nodemailer";
const router = Router();
router.post("/", async (req, res) => {
const { username } = req.body;
try {
const user = await User.findOne({ username });
if (!user) {
return res.json({ error: "Username not found" });
}
const resetCode = randomBytes(32).toString("hex");
await User.findByIdAndUpdate(user._id, { resetCode });
const url = `https://crm.stream.graff.tech/resetConfirm?code=${resetCode}`;
let transporter = createTransport({
host: "mail.netangels.ru",
port: 587,
secure: false, // true for 465, false for other ports
auth: {
user: "stream@graff.tech", // generated ethereal user
pass: "zLUbt8Io7dh2F9KT", // generated ethereal password
},
});
// send mail with defined transport object
try {
await transporter.sendMail({
from: "stream@graff.tech", // sender address
to: username, // list of receivers
subject: "Сброс пароля - stream.graff.tech", // Subject line
html: `<div>
Ссылка для сброса пароля: <a href="${url}" target="_blank">${url}</a>
</div>`,
});
} catch (error) {
console.log("error", (error as Error).message);
}
return res.json({ ok: 1 });
} catch (error) {
return res.json({ error: (error as Error).message });
}
});
const resetRoute = router;
export default resetRoute;
+34
View File
@@ -0,0 +1,34 @@
import bcrypt from "bcrypt";
import { Router } from "express";
import User from "../models/User.js";
import Token from "../models/Token.js";
const router = Router();
router.post("/", async (req, res) => {
const { resetCode, password } = req.body;
try {
const passwordHash = bcrypt.hashSync(password, 12);
const user = await User.findOneAndUpdate(
{ resetCode },
{ password: passwordHash }
);
if (!user) {
return res.json({ error: "Reset code not valid" });
}
await User.findByIdAndUpdate(user._id, { $unset: { resetCode } });
await Token.deleteMany({ userId: user._id });
return res.json({ ok: 1 });
} catch (error) {
return res.json({ error: (error as Error).message });
}
});
const resetConfirmRoute = router;
export default resetConfirmRoute;