286 lines
6.8 KiB
TypeScript
286 lines
6.8 KiB
TypeScript
import { Router } from "express";
|
|
import { parseISO, startOfDay, endOfDay } from "date-fns";
|
|
import Company from "../models/Company.js";
|
|
import ScheduledSession from "../models/ScheduledSession.js";
|
|
import Schedule from "../models/Schedule.js";
|
|
import User from "../models/User.js";
|
|
|
|
const router = Router();
|
|
|
|
// router.get("/", async (_req, res) => {
|
|
// const companies = await Company.find();
|
|
|
|
// res.json(companies);
|
|
// });
|
|
|
|
router.get("/:id", async (req, res) => {
|
|
if (req.params.id != res.locals.user.companyId) {
|
|
res.json({ error: "Access denied" });
|
|
return;
|
|
}
|
|
|
|
const company = await Company.findById(req.params.id);
|
|
|
|
res.json(company);
|
|
});
|
|
|
|
router.get("/:id/builds", async (req, res) => {
|
|
if (req.params.id != res.locals.user.companyId) {
|
|
res.json({ error: "Access denied" });
|
|
return;
|
|
}
|
|
|
|
const company: any = await Company.findById(req.params.id).populate("builds");
|
|
const { builds } = company;
|
|
|
|
res.json(builds);
|
|
});
|
|
|
|
router.get("/:id/users", async (req, res) => {
|
|
if (req.params.id != res.locals.user.companyId) {
|
|
res.json({ error: "Access denied" });
|
|
return;
|
|
}
|
|
|
|
const company: any = await Company.findById(req.params.id).populate("users");
|
|
const { users } = company;
|
|
|
|
res.json(users);
|
|
});
|
|
|
|
router.get("/:id/builds/:buildId/users", async (req, res) => {
|
|
if (req.params.id != res.locals.user.companyId) {
|
|
res.json({ error: "Access denied" });
|
|
return;
|
|
}
|
|
|
|
const buildUsers: any = await User.find({
|
|
buildIds: req.params.buildId,
|
|
});
|
|
|
|
const users = [];
|
|
|
|
for (const buildUser of buildUsers) {
|
|
const user = await User.findById(buildUser.userId);
|
|
users.push(user);
|
|
}
|
|
|
|
res.json(users);
|
|
});
|
|
|
|
router.get("/:id/builds/:buildId/scheduled_sessions", async (req, res) => {
|
|
if (req.params.id != res.locals.user.companyId) {
|
|
res.json({ error: "Access denied" });
|
|
return;
|
|
}
|
|
|
|
if (!req.query.date) {
|
|
res.json({ error: "Query parameter `date` is required" });
|
|
return;
|
|
}
|
|
|
|
const date = parseISO(req.query.date as string);
|
|
|
|
const company: any = await Company.findById(req.params.id).populate({
|
|
path: "builds",
|
|
match: {
|
|
_id: req.params.buildId,
|
|
},
|
|
populate: {
|
|
path: "scheduledSessions",
|
|
match: {
|
|
startAt: {
|
|
$gte: startOfDay(date),
|
|
$lte: endOfDay(date),
|
|
},
|
|
},
|
|
},
|
|
});
|
|
|
|
const { scheduledSessions } = company.builds[0];
|
|
|
|
res.json(scheduledSessions);
|
|
});
|
|
|
|
// router.post(
|
|
// "/:id/builds/:buildId/scheduled_sessions",
|
|
// async (req, res) => {
|
|
// if (req.params.id != res.locals.user.companyId) {
|
|
// res.json({ error: "Access denied" });
|
|
// return;
|
|
// }
|
|
|
|
// if (!req.params.buildId) {
|
|
// res.json({ error: "req.params.buildId" });
|
|
// return;
|
|
// }
|
|
|
|
// const scheduledSession = await ScheduledSession.create({
|
|
// companyId: req.params.id,
|
|
// buildId: req.params.buildId,
|
|
// ...req.body,
|
|
// });
|
|
|
|
// res.json(scheduledSession);
|
|
// }
|
|
// );
|
|
|
|
router.put("/:id/scheduled_sessions/:scheduledSessionId", async (req, res) => {
|
|
if (req.params.id != res.locals.user.companyId) {
|
|
res.json({ error: "Access denied" });
|
|
return;
|
|
}
|
|
|
|
try {
|
|
const scheduledSession = await ScheduledSession.findById(
|
|
req.params.scheduledSessionId
|
|
);
|
|
|
|
const scheduledSessionAtSameTime = await ScheduledSession.findOne({
|
|
startAt: scheduledSession?.startAt,
|
|
userId: req.body.userId,
|
|
});
|
|
|
|
if (scheduledSessionAtSameTime && req.body.userId !== null) {
|
|
await ScheduledSession.updateMany(
|
|
{
|
|
userId: req.body.userId,
|
|
startAt: scheduledSession?.startAt,
|
|
},
|
|
{
|
|
userId: null,
|
|
}
|
|
);
|
|
|
|
await ScheduledSession.findByIdAndUpdate(req.params.scheduledSessionId, {
|
|
userId: req.body.userId,
|
|
});
|
|
res.json({ error: "Scheduled session at same time" });
|
|
return;
|
|
}
|
|
|
|
const updatedScheduledSession = await ScheduledSession.findByIdAndUpdate(
|
|
req.params.scheduledSessionId,
|
|
req.body,
|
|
{
|
|
new: true,
|
|
upsert: true,
|
|
}
|
|
);
|
|
|
|
res.json(updatedScheduledSession);
|
|
} catch (error) {
|
|
if (error instanceof Error) {
|
|
res.json({ error });
|
|
}
|
|
}
|
|
});
|
|
|
|
router.get(
|
|
"/:id/builds/:buildId/scheduled_sessions/:scheduledSessionId/availableManagers",
|
|
async (req, res) => {
|
|
if (!req.query.startAt) {
|
|
res.json({ error: "Query parameter `startAt` is required" });
|
|
return;
|
|
}
|
|
|
|
try {
|
|
const scheduledSession = await ScheduledSession.findById(
|
|
req.params.scheduledSessionId
|
|
);
|
|
|
|
if (!scheduledSession) {
|
|
res.json({ error: "Scheduled session not found" });
|
|
return;
|
|
}
|
|
|
|
const buildUsers = await User.find({ buildIds: req.params.buildId });
|
|
let buildUserIds = buildUsers.map((buildUser) => buildUser.toString());
|
|
|
|
const scheduledSessionsAtTime = await ScheduledSession.find({
|
|
buildId: req.params.buildId,
|
|
startAt: req.query.startAt,
|
|
});
|
|
|
|
const scheduledSessionAtTimeUserIds: any[] = [];
|
|
|
|
for (const scheduledSessionAtTime of scheduledSessionsAtTime) {
|
|
if (scheduledSessionAtTime.userId) {
|
|
scheduledSessionAtTimeUserIds.push(
|
|
scheduledSessionAtTime.userId.toString()
|
|
);
|
|
}
|
|
}
|
|
|
|
const filteredUserIds: any[] = buildUserIds.filter(
|
|
(buildUserId) => !scheduledSessionAtTimeUserIds.includes(buildUserId)
|
|
);
|
|
|
|
if (scheduledSession.userId) {
|
|
filteredUserIds.push(scheduledSession.userId);
|
|
}
|
|
|
|
res.json(filteredUserIds);
|
|
} catch (error) {
|
|
if (error instanceof Error) {
|
|
res.json({ error });
|
|
}
|
|
}
|
|
}
|
|
);
|
|
|
|
router.get("/:id/builds/:buildId/schedules", async (req, res) => {
|
|
if (req.params.id != res.locals.user.companyId) {
|
|
res.json({ error: "Access denied" });
|
|
return;
|
|
}
|
|
|
|
const schedules = await Schedule.find({
|
|
companyId: req.params.id,
|
|
buildId: req.params.buildId,
|
|
});
|
|
|
|
res.json(schedules);
|
|
});
|
|
|
|
router.post("/:id/builds/:buildId/schedules", async (req, res) => {
|
|
if (req.params.id != res.locals.user.companyId) {
|
|
res.json({ error: "Access denied" });
|
|
return;
|
|
}
|
|
|
|
try {
|
|
const schedule = await Schedule.create({
|
|
companyId: req.params.id,
|
|
buildId: req.params.buildId,
|
|
...req.body,
|
|
});
|
|
res.json(schedule);
|
|
} catch (error) {
|
|
if (error instanceof Error) {
|
|
res.json({ error: error.message });
|
|
}
|
|
}
|
|
});
|
|
|
|
router.get(
|
|
"/:companyId/builds/:buildId/last_scheduled_session",
|
|
async (req, res) => {
|
|
const { buildId } = req.params;
|
|
|
|
try {
|
|
const lastScheduledSession = await ScheduledSession.findOne({
|
|
buildId,
|
|
}).sort({ startAt: -1 });
|
|
|
|
res.json(lastScheduledSession);
|
|
} catch (error) {
|
|
res.json({ error: (error as Error).message });
|
|
}
|
|
}
|
|
);
|
|
|
|
const companiesRouter = router;
|
|
|
|
export default companiesRouter;
|