139 lines
4.3 KiB
TypeScript
139 lines
4.3 KiB
TypeScript
import axiosServer from '../../../../src/axiosServer';
|
||
import NewPubPage from "../new";
|
||
const common = require('../../../../src/helpers/common');
|
||
export default NewPubPage;
|
||
|
||
import { Assignment, Shift, UserRole, AvailabilityType } from "prisma/prisma-client";
|
||
//import ProtectedRoute from '../../../../components/protectedRoute';
|
||
|
||
// import { monthNamesBG } from "~/src/helpers/const"
|
||
import { monthNamesBG } from "src/helpers/const";
|
||
|
||
function getShiftGroups(shifts: [Shift]) {
|
||
|
||
const groupedShifts = shifts.reduce((groups, shift) => {
|
||
// Extract the year and month from the shift date
|
||
const yearMonth = shift.startTime.substring(0, 7)
|
||
// Initialize the group for the year-month if it doesn't exist
|
||
if (!groups[yearMonth]) {
|
||
groups[yearMonth] = []
|
||
}
|
||
// Add the shift to the group
|
||
groups[yearMonth].push(shift)
|
||
// Return the updated groups object
|
||
return groups
|
||
}, {})
|
||
|
||
// Sort the groups by year-month
|
||
const sortedGroups = Object.keys(groupedShifts).sort((a, b) => {
|
||
// Compare the year-month strings lexicographically
|
||
if (a < b) return -1
|
||
if (a > b) return 1
|
||
return 0
|
||
}).reduce((result, key) => {
|
||
// Rebuild the object with the sorted keys
|
||
result[key] = groupedShifts[key]
|
||
return result
|
||
}, {})
|
||
return sortedGroups;
|
||
}
|
||
|
||
export const getServerSideProps = async (context) => {
|
||
const axios = await axiosServer(context);
|
||
|
||
const prisma = common.getPrismaClient();
|
||
|
||
// const isAdmin = await ProtectedRoute.IsInRole(UserRole.ADMIN); does not work on server side
|
||
context.res.setHeader("Cache-Control", "s-maxage=1, stale-while-revalidate");
|
||
if (!context.query || !context.query.id) {
|
||
return {
|
||
props: {}
|
||
};
|
||
}
|
||
const item = await prisma.publisher.findUnique({
|
||
where: {
|
||
id: context.query.id
|
||
},
|
||
include: {
|
||
availabilities: true,
|
||
assignments: {
|
||
include: {
|
||
shift: true
|
||
}
|
||
}
|
||
}
|
||
});
|
||
if (!item) {
|
||
const user = context.req.session?.user;
|
||
if (!user) {
|
||
return {
|
||
// redirect to '/auth/signin'. assure it is not relative path
|
||
redirect: {
|
||
destination: process.env.NEXT_PUBLIC_PUBLIC_URL + "/auth/signin",
|
||
permanent: false,
|
||
}
|
||
}
|
||
}
|
||
const message = encodeURIComponent(`Този имейл (${user?.email}) не е регистриран. Моля свържете се с администратора.`);
|
||
return {
|
||
redirect: {
|
||
destination: `/message?message=${message}`,
|
||
permanent: false,
|
||
},
|
||
};
|
||
}
|
||
// item.allShifts = item.assignments.map((a: Assignment[]) => a.shift);
|
||
|
||
// ============================================================
|
||
// don't show past availabilities (if user not admin) ToDo: add admin check
|
||
// ============================================================
|
||
item.availabilities = item.availabilities.filter((a) => new Date(a.startTime) >= new Date() || a.type == AvailabilityType.Weekly);
|
||
item.assignments = item.assignments
|
||
.sort((a, b) => b.startTime - a.startTime)
|
||
.reduce((acc, assignment: Assignment) => {
|
||
|
||
const date = new Date(assignment.shift.startTime);
|
||
const year = date.getFullYear();
|
||
const month = date.getMonth();
|
||
const tabId = year + "-" + month;
|
||
const tabName = monthNamesBG[month] + " " + year;
|
||
const day = date.getDate();
|
||
// console.log("shift: year: " + year + " month: " + month + " day: " + day);
|
||
if (!acc.items[tabId]) {
|
||
acc.items[tabId] = [];
|
||
}
|
||
if (!acc.items[tabId][day]) {
|
||
acc.items[tabId][day] = [];
|
||
}
|
||
//remove duplicates
|
||
if (acc.items[tabId][day].find(s => s.id == assignment.shift.id)) {
|
||
return acc;
|
||
}
|
||
// acc.months = acc.months || [];
|
||
if (!acc.months[tabId]) {
|
||
acc.months[tabId] = [];
|
||
}
|
||
|
||
if (!acc.keys.includes(tabId)) {
|
||
acc.months[tabId] = tabName;
|
||
acc.keys.push(tabId);
|
||
}
|
||
|
||
acc.items[tabId][day].push({
|
||
start: assignment.shift.startTime,
|
||
end: assignment.shift.endTime,
|
||
id: assignment.id,
|
||
shiftId: assignment.shift.id,
|
||
isConfirmed: assignment.isConfirmed ? true : false,
|
||
});
|
||
return acc;
|
||
}, { items: {}, keys: [], months: {} });
|
||
// console.log("server item:");
|
||
// console.dir(item, { depth: null });
|
||
return {
|
||
props: {
|
||
item: common.convertDatesToISOStrings(item),
|
||
},
|
||
};
|
||
};
|