upd
This commit is contained in:
+1
-1
@@ -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
|
||||
@@ -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",
|
||||
|
||||
@@ -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}`);
|
||||
|
||||
@@ -11,6 +11,9 @@ const userSchema = new Schema(
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
resetCode: {
|
||||
type: String,
|
||||
},
|
||||
companyId: {
|
||||
type: Schema.Types.ObjectId,
|
||||
ref: "Company",
|
||||
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user