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
+1 -1
View File
@@ -1,5 +1,5 @@
PORT=3001
MONGO_URI=mongodb://root:p62Z!ZatgY25@194.26.138.94:27017/
JWT_SECRET=yDcdWJgvlj2bJAuovYfQHTvtc3U9xQPw
JWT_ACCESS_EXP=10m
JWT_ACCESS_EXP=1h
JWT_REFRESH_EXP=7d
+1
View File
@@ -15,6 +15,7 @@
"date-fns": "^2.30.0",
"dotenv": "^16.3.1",
"express": "^4.18.2",
"generate-password": "^1.7.1",
"jose": "^5.9.6",
"jsonwebtoken": "^9.0.2",
"mongoose": "^7.5.1",
+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;
+5
View File
@@ -653,6 +653,11 @@ gauge@^3.0.0:
strip-ansi "^6.0.1"
wide-align "^1.1.2"
generate-password@^1.7.1:
version "1.7.1"
resolved "https://registry.yarnpkg.com/generate-password/-/generate-password-1.7.1.tgz#b354255893da7755b033999821d3f1f1a97c1cb4"
integrity sha512-9bVYY+16m7W7GczRBDqXE+VVuCX+bWNrfYKC/2p2JkZukFb2sKxT6E3zZ3mJGz7GMe5iRK0A/WawSL3jQfJuNQ==
get-intrinsic@^1.0.2, get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2:
version "1.2.2"
resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b"