upd
This commit is contained in:
@@ -7,7 +7,7 @@ import { createTransport } from "nodemailer";
|
||||
const router = Router();
|
||||
|
||||
router.post("/", async (req, res) => {
|
||||
const { companyId, username, name, role } = req.body;
|
||||
const { companyId, username, name, role, buildIds } = req.body;
|
||||
|
||||
try {
|
||||
const password = generate({
|
||||
@@ -31,6 +31,7 @@ router.post("/", async (req, res) => {
|
||||
name,
|
||||
role,
|
||||
password: passwordHash,
|
||||
buildIds,
|
||||
});
|
||||
|
||||
let transporter = createTransport({
|
||||
|
||||
@@ -53,12 +53,12 @@ router.get("/companies/:companyId/builds/:buildId", async (req, res) => {
|
||||
|
||||
router.get("/:buildId", async (req, res) => {
|
||||
if (!req.params.buildId) {
|
||||
res.json({ error: "Parameter `buildId` is required" });
|
||||
res.status(400).json({ error: "Parameter `buildId` is required" });
|
||||
return;
|
||||
}
|
||||
|
||||
if (!req.query.date) {
|
||||
res.json({ error: "Query parameter `date` is required" });
|
||||
res.status(400).json({ error: "Query parameter `date` is required" });
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -78,120 +78,118 @@ router.get("/:buildId", async (req, res) => {
|
||||
router.post("/", async (req, res) => {
|
||||
const { companyId, buildId, slot, startAt, client, duration } = req.body;
|
||||
|
||||
console.log("client", client);
|
||||
|
||||
if (!companyId || !buildId || !startAt || !slot) {
|
||||
return res.json({
|
||||
status: "error",
|
||||
message: "Parameters `buildId`, `startAt`, `slot` are required!", // Параметры `buildId`, `startAt`, `slot` обязательны!
|
||||
});
|
||||
}
|
||||
|
||||
const startAtISO = parseISO(startAt);
|
||||
|
||||
if (!isValid(startAtISO)) {
|
||||
return res.json({
|
||||
return res.status(400).json({
|
||||
status: "error",
|
||||
message: "Invalid date format", // Неверный формат даты
|
||||
message: "Invalid date format",
|
||||
});
|
||||
}
|
||||
|
||||
const build = await Build.findById(buildId);
|
||||
|
||||
if (!build) {
|
||||
return res.json({
|
||||
return res.status(400).json({
|
||||
status: "error",
|
||||
message: "An assembly with such a `buildId` was not found", // Сборка с таким `buildId` не найдена
|
||||
message: "An assembly with such a `buildId` was not found",
|
||||
});
|
||||
}
|
||||
|
||||
if (duration) {
|
||||
const scheduledSessions = await ScheduledSession.find({
|
||||
companyId,
|
||||
buildId,
|
||||
slot,
|
||||
startAt: {
|
||||
$gte: startOfDay(startAtISO),
|
||||
$lte: endOfDay(startAtISO),
|
||||
const endAtISO = addMinutes(startAtISO, duration);
|
||||
|
||||
// Check for overlapping sessions first
|
||||
const scheduledSessions = await ScheduledSession.find({
|
||||
companyId,
|
||||
buildId,
|
||||
slot,
|
||||
startAt: {
|
||||
$gte: startOfDay(startAtISO),
|
||||
$lte: endOfDay(startAtISO),
|
||||
},
|
||||
});
|
||||
|
||||
if (scheduledSessions.length) {
|
||||
const overlappingSessions = [];
|
||||
|
||||
for (const session of scheduledSessions) {
|
||||
if (
|
||||
areIntervalsOverlapping(
|
||||
{
|
||||
start: session.startAt,
|
||||
end: session.endAt,
|
||||
},
|
||||
{ start: startAtISO, end: endAtISO }
|
||||
)
|
||||
) {
|
||||
overlappingSessions.push(session);
|
||||
}
|
||||
}
|
||||
|
||||
if (overlappingSessions.length > 0) {
|
||||
return res.status(400).json({
|
||||
status: "error",
|
||||
message:
|
||||
"Невозможно создать сеанс, поскольку он пересекается со временем другого сеанса",
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Then check duration
|
||||
if (duration < 30) {
|
||||
return res.status(400).json({
|
||||
status: "error",
|
||||
message: "Продолжительность сеанса должна быть не менее 30 минут",
|
||||
});
|
||||
}
|
||||
|
||||
const scheduledSession = await ScheduledSession.create({
|
||||
companyId,
|
||||
buildId,
|
||||
slot,
|
||||
startAt: startAtISO,
|
||||
duration,
|
||||
endAt: endAtISO,
|
||||
client,
|
||||
});
|
||||
|
||||
const url = `https://stream.graff.tech/scheduled/${scheduledSession.id}`;
|
||||
|
||||
// <-- Send an mail
|
||||
|
||||
if (client?.email) {
|
||||
console.log("client?.email", client?.email);
|
||||
// create reusable transporter object using the default SMTP transport
|
||||
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
|
||||
},
|
||||
});
|
||||
|
||||
const endAtISO = addMinutes(startAtISO, duration);
|
||||
|
||||
if (scheduledSessions.length) {
|
||||
const overlappingSessions = [];
|
||||
|
||||
for (const session of scheduledSessions) {
|
||||
if (
|
||||
areIntervalsOverlapping(
|
||||
{
|
||||
start: session.startAt,
|
||||
end: addMinutes(session.endAt, duration),
|
||||
},
|
||||
{ start: startAtISO, end: endAtISO }
|
||||
)
|
||||
) {
|
||||
overlappingSessions.push(session);
|
||||
}
|
||||
}
|
||||
|
||||
// if (overlappingSessions.length >= build.sessionLimit) {
|
||||
// return res.json({
|
||||
// status: "error",
|
||||
// message:
|
||||
// "It is not possible to create a session because it overlaps with the time of another session", // Невозможно создать сеанс, поскольку он перекрывается со временем другого сеанса.
|
||||
// });
|
||||
// }
|
||||
}
|
||||
|
||||
const scheduledSession = await ScheduledSession.create({
|
||||
companyId,
|
||||
buildId,
|
||||
slot,
|
||||
startAt: startAtISO,
|
||||
duration,
|
||||
endAt: endAtISO,
|
||||
client,
|
||||
});
|
||||
|
||||
const url = `https://stream.graff.tech/scheduled/${scheduledSession.id}`;
|
||||
|
||||
// <-- Send an mail
|
||||
|
||||
if (client?.email) {
|
||||
console.log("client?.email", client?.email);
|
||||
// create reusable transporter object using the default SMTP transport
|
||||
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: client.email, // list of receivers
|
||||
subject: "Приглашение на демонстрацию - stream.graff.tech", // Subject line
|
||||
html: `<div>
|
||||
Ссылка для подключения к демонстрации: <a href="${url}" target="_blank">${url}</a>
|
||||
</div>`,
|
||||
});
|
||||
|
||||
// send mail with defined transport object
|
||||
try {
|
||||
await transporter.sendMail({
|
||||
from: "stream@graff.tech", // sender address
|
||||
to: client.email, // 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);
|
||||
}
|
||||
} catch (error) {
|
||||
console.log("error", (error as Error).message);
|
||||
}
|
||||
|
||||
return res.json({
|
||||
status: "success",
|
||||
scheduledSessionId: scheduledSession.id,
|
||||
url: `https://stream.graff.tech/scheduled/${scheduledSession.id}`,
|
||||
});
|
||||
}
|
||||
|
||||
return res.json({
|
||||
status: "success",
|
||||
scheduledSessionId: scheduledSession.id,
|
||||
url: `https://stream.graff.tech/scheduled/${scheduledSession.id}`,
|
||||
});
|
||||
});
|
||||
|
||||
router.put("/:id", async (req, res) => {
|
||||
@@ -237,7 +235,23 @@ router.delete("/:id", async (req, res) => {
|
||||
}
|
||||
}
|
||||
|
||||
if (scheduledSession?.activeSessionId) {
|
||||
if (!scheduledSession) {
|
||||
return res.json({ status: "error", message: "Session not found" });
|
||||
}
|
||||
|
||||
if (scheduledSession.activeSessionId) {
|
||||
// Check if more than 10 minutes have passed since session start
|
||||
const startTime = new Date(scheduledSession.startAt);
|
||||
const tenMinutesAfterStart = addMinutes(startTime, 10);
|
||||
const now = new Date();
|
||||
|
||||
if (now > tenMinutesAfterStart) {
|
||||
return res.json({
|
||||
status: "error",
|
||||
message: "Cannot delete session after 10 minutes from start"
|
||||
});
|
||||
}
|
||||
|
||||
try {
|
||||
await ScheduledSession.findByIdAndDelete(scheduledSessionId);
|
||||
await got
|
||||
|
||||
Reference in New Issue
Block a user