refactor to reduce complexity

deepsource-autofix-76c6eb20
Dan Gowans 2022-10-31 09:21:53 -04:00
parent 8edf9e62a4
commit eda8483e62
2 changed files with 323 additions and 287 deletions

View File

@ -2,50 +2,24 @@ import ical, { ICalEventStatus } from "ical-generator";
import { getWorkOrderMilestones } from "../../helpers/lotOccupancyDB/getWorkOrderMilestones.js"; import { getWorkOrderMilestones } from "../../helpers/lotOccupancyDB/getWorkOrderMilestones.js";
import * as configFunctions from "../../helpers/functions.config.js"; import * as configFunctions from "../../helpers/functions.config.js";
import { getPrintConfig } from "../../helpers/functions.print.js"; import { getPrintConfig } from "../../helpers/functions.print.js";
const calendarCompany = "cityssm.github.io";
const calendarProduct = configFunctions.getProperty("application.applicationName");
const timeStringSplitRegex = /[ :-]/; const timeStringSplitRegex = /[ :-]/;
function escapeHTML(stringToEscape) { function escapeHTML(stringToEscape) {
return stringToEscape.replace(/[^\d A-Za-z]/g, (c) => "&#" + c.codePointAt(0) + ";"); return stringToEscape.replace(/[^\d A-Za-z]/g, (c) => "&#" + c.codePointAt(0) + ";");
} }
export const handler = (request, response) => { function getUrlRoot(request) {
const urlRoot = "http://" + return ("http://" +
request.hostname + request.hostname +
(configFunctions.getProperty("application.httpPort") === 80 (configFunctions.getProperty("application.httpPort") === 80
? "" ? ""
: ":" + configFunctions.getProperty("application.httpPort")) + : ":" + configFunctions.getProperty("application.httpPort")) +
configFunctions.getProperty("reverseProxy.urlPrefix"); configFunctions.getProperty("reverseProxy.urlPrefix"));
const workOrderMilestoneFilters = { }
workOrderTypeIds: request.query.workOrderTypeIds, function getWorkOrderUrl(request, milestone) {
workOrderMilestoneTypeIds: request.query.workOrderMilestoneTypeIds return getUrlRoot(request) + "/workOrders/" + milestone.workOrderId;
}; }
if (request.query.workOrderId) { function buildEventSummary(milestone) {
workOrderMilestoneFilters.workOrderId = request.query.workOrderId;
}
else {
workOrderMilestoneFilters.workOrderMilestoneDateFilter = "recent";
}
const workOrderMilestones = getWorkOrderMilestones(workOrderMilestoneFilters, {
includeWorkOrders: true,
orderBy: "date"
});
const calendar = ical({
name: "Work Order Milestone Calendar",
url: urlRoot + "/workOrders"
});
if (request.query.workOrderId && workOrderMilestones.length > 0) {
calendar.name("Work Order #" + workOrderMilestones[0].workOrderNumber);
calendar.url(urlRoot + "/workOrders/" + workOrderMilestones[0].workOrderId);
}
calendar.prodId({
company: "cityssm.github.io",
product: configFunctions.getProperty("application.applicationName")
});
for (const milestone of workOrderMilestones) {
const milestoneTimePieces = (milestone.workOrderMilestoneDateString +
" " +
milestone.workOrderMilestoneTimeString).split(timeStringSplitRegex);
const milestoneDate = new Date(Number.parseInt(milestoneTimePieces[0], 10), Number.parseInt(milestoneTimePieces[1], 10) - 1, Number.parseInt(milestoneTimePieces[2], 10), Number.parseInt(milestoneTimePieces[3], 10), Number.parseInt(milestoneTimePieces[4], 10));
const milestoneEndDate = new Date(milestoneDate.getTime());
milestoneEndDate.setHours(milestoneEndDate.getHours() + 1);
let summary = (milestone.workOrderMilestoneCompletionDate ? "✔ " : "") + let summary = (milestone.workOrderMilestoneCompletionDate ? "✔ " : "") +
(milestone.workOrderMilestoneTypeId (milestone.workOrderMilestoneTypeId
? milestone.workOrderMilestoneType ? milestone.workOrderMilestoneType
@ -67,20 +41,11 @@ export const handler = (request, response) => {
summary += " plus " + (occupantCount - 1); summary += " plus " + (occupantCount - 1);
} }
} }
const workOrderURL = urlRoot + "/workOrders/" + milestone.workOrderId; return summary;
const eventData = { }
start: milestoneDate, function buildEventDescriptionHTML(request, milestone) {
created: new Date(milestone.recordCreate_timeMillis), const urlRoot = getUrlRoot(request);
stamp: new Date(milestone.recordCreate_timeMillis), const workOrderUrl = getWorkOrderUrl(request, milestone);
lastModified: new Date(Math.max(milestone.recordUpdate_timeMillis, milestone.workOrderRecordUpdate_timeMillis)),
allDay: !milestone.workOrderMilestoneTime,
summary,
url: workOrderURL
};
if (!eventData.allDay) {
eventData.end = milestoneEndDate;
}
const calendarEvent = calendar.createEvent(eventData);
let descriptionHTML = "<h1>Milestone Description</h1>" + let descriptionHTML = "<h1>Milestone Description</h1>" +
"<p>" + "<p>" +
escapeHTML(milestone.workOrderMilestoneDescription) + escapeHTML(milestone.workOrderMilestoneDescription) +
@ -89,16 +54,14 @@ export const handler = (request, response) => {
milestone.workOrderNumber + milestone.workOrderNumber +
"</h2>" + "</h2>" +
("<p>" + escapeHTML(milestone.workOrderDescription) + "</p>") + ("<p>" + escapeHTML(milestone.workOrderDescription) + "</p>") +
("<p>" + workOrderURL + "</p>"); ("<p>" + workOrderUrl + "</p>");
if (milestone.workOrderLotOccupancies.length > 0) { if (milestone.workOrderLotOccupancies.length > 0) {
descriptionHTML += descriptionHTML +=
"<h2>Related " + "<h2>Related " +
escapeHTML(configFunctions.getProperty("aliases.occupancies")) + escapeHTML(configFunctions.getProperty("aliases.occupancies")) +
"</h2>" + "</h2>" +
'<table border="1"><thead><tr>' + '<table border="1"><thead><tr>' +
("<th>" + ("<th>" + escapeHTML(configFunctions.getProperty("aliases.occupancy")) + " Type</th>") +
escapeHTML(configFunctions.getProperty("aliases.occupancy")) +
" Type</th>") +
("<th>" + escapeHTML(configFunctions.getProperty("aliases.lot")) + "</th>") + ("<th>" + escapeHTML(configFunctions.getProperty("aliases.lot")) + "</th>") +
"<th>Start Date</th>" + "<th>Start Date</th>" +
"<th>End Date</th>" + "<th>End Date</th>" +
@ -121,13 +84,15 @@ export const handler = (request, response) => {
"</td>") + "</td>") +
("<td>" + occupancy.occupancyStartDateString + "</td>") + ("<td>" + occupancy.occupancyStartDateString + "</td>") +
"<td>" + "<td>" +
(occupancy.occupancyEndDate (occupancy.occupancyEndDate ? occupancy.occupancyEndDateString : "(No End Date)") +
? occupancy.occupancyEndDateString
: "(No End Date)") +
"</td>" + "</td>" +
"<td>"; "<td>";
for (const occupant of occupancy.lotOccupancyOccupants) { for (const occupant of occupancy.lotOccupancyOccupants) {
descriptionHTML += escapeHTML(occupant.lotOccupantType) + ": " + escapeHTML(occupant.occupantName) + "<br />"; descriptionHTML +=
escapeHTML(occupant.lotOccupantType) +
": " +
escapeHTML(occupant.occupantName) +
"<br />";
} }
descriptionHTML += "</td>" + "</tr>"; descriptionHTML += "</td>" + "</tr>";
} }
@ -141,10 +106,7 @@ export const handler = (request, response) => {
'<table border="1"><thead><tr>' + '<table border="1"><thead><tr>' +
("<th>" + escapeHTML(configFunctions.getProperty("aliases.lot")) + " Type</th>") + ("<th>" + escapeHTML(configFunctions.getProperty("aliases.lot")) + " Type</th>") +
("<th>" + escapeHTML(configFunctions.getProperty("aliases.map")) + "</th>") + ("<th>" + escapeHTML(configFunctions.getProperty("aliases.map")) + "</th>") +
("<th>" + ("<th>" + escapeHTML(configFunctions.getProperty("aliases.lot")) + " Type" + "</th>") +
escapeHTML(configFunctions.getProperty("aliases.lot")) +
" Type" +
"</th>") +
"<th>Status</th>" + "<th>Status</th>" +
"</tr></thead>" + "</tr></thead>" +
"<tbody>"; "<tbody>";
@ -176,17 +138,66 @@ export const handler = (request, response) => {
"<p>" + "<p>" +
escapeHTML(printConfig.title) + escapeHTML(printConfig.title) +
"<br />" + "<br />" +
(urlRoot + (urlRoot + "/print/" + printName + "/?workOrderId=" + milestone.workOrderId) +
"/print/" +
printName +
"/?workOrderId=" +
milestone.workOrderId) +
"</p>"; "</p>";
} }
} }
} }
return descriptionHTML;
}
export const handler = (request, response) => {
const urlRoot = getUrlRoot(request);
const workOrderMilestoneFilters = {
workOrderTypeIds: request.query.workOrderTypeIds,
workOrderMilestoneTypeIds: request.query.workOrderMilestoneTypeIds
};
if (request.query.workOrderId) {
workOrderMilestoneFilters.workOrderId = request.query.workOrderId;
}
else {
workOrderMilestoneFilters.workOrderMilestoneDateFilter = "recent";
}
const workOrderMilestones = getWorkOrderMilestones(workOrderMilestoneFilters, {
includeWorkOrders: true,
orderBy: "date"
});
const calendar = ical({
name: "Work Order Milestone Calendar",
url: urlRoot + "/workOrders"
});
if (request.query.workOrderId && workOrderMilestones.length > 0) {
calendar.name("Work Order #" + workOrderMilestones[0].workOrderNumber);
calendar.url(urlRoot + "/workOrders/" + workOrderMilestones[0].workOrderId);
}
calendar.prodId({
company: calendarCompany,
product: calendarProduct
});
for (const milestone of workOrderMilestones) {
const milestoneTimePieces = (milestone.workOrderMilestoneDateString +
" " +
milestone.workOrderMilestoneTimeString).split(timeStringSplitRegex);
const milestoneDate = new Date(Number.parseInt(milestoneTimePieces[0], 10), Number.parseInt(milestoneTimePieces[1], 10) - 1, Number.parseInt(milestoneTimePieces[2], 10), Number.parseInt(milestoneTimePieces[3], 10), Number.parseInt(milestoneTimePieces[4], 10));
const milestoneEndDate = new Date(milestoneDate.getTime());
milestoneEndDate.setHours(milestoneEndDate.getHours() + 1);
const summary = buildEventSummary(milestone);
const workOrderUrl = getWorkOrderUrl(request, milestone);
const eventData = {
start: milestoneDate,
created: new Date(milestone.recordCreate_timeMillis),
stamp: new Date(milestone.recordCreate_timeMillis),
lastModified: new Date(Math.max(milestone.recordUpdate_timeMillis, milestone.workOrderRecordUpdate_timeMillis)),
allDay: !milestone.workOrderMilestoneTime,
summary,
url: workOrderUrl
};
if (!eventData.allDay) {
eventData.end = milestoneEndDate;
}
const calendarEvent = calendar.createEvent(eventData);
const descriptionHTML = buildEventDescriptionHTML(request, milestone);
calendarEvent.description({ calendarEvent.description({
plain: workOrderURL, plain: workOrderUrl,
html: descriptionHTML html: descriptionHTML
}); });
if (milestone.workOrderMilestoneCompletionDate) { if (milestone.workOrderMilestoneCompletionDate) {

View File

@ -7,89 +7,38 @@ import {
WorkOrderMilestoneFilters WorkOrderMilestoneFilters
} from "../../helpers/lotOccupancyDB/getWorkOrderMilestones.js"; } from "../../helpers/lotOccupancyDB/getWorkOrderMilestones.js";
import type { RequestHandler } from "express"; import type { RequestHandler, Request } from "express";
import * as configFunctions from "../../helpers/functions.config.js"; import * as configFunctions from "../../helpers/functions.config.js";
import { getPrintConfig } from "../../helpers/functions.print.js"; import { getPrintConfig } from "../../helpers/functions.print.js";
import type * as recordTypes from "../../types/recordTypes";
const calendarCompany = "cityssm.github.io";
const calendarProduct = configFunctions.getProperty("application.applicationName");
const timeStringSplitRegex = /[ :-]/; const timeStringSplitRegex = /[ :-]/;
function escapeHTML(stringToEscape: string) { function escapeHTML(stringToEscape: string) {
return stringToEscape.replace(/[^\d A-Za-z]/g, (c) => "&#" + c.codePointAt(0) + ";"); return stringToEscape.replace(/[^\d A-Za-z]/g, (c) => "&#" + c.codePointAt(0) + ";");
} }
export const handler: RequestHandler = (request, response) => { function getUrlRoot(request: Request): string {
const urlRoot = return (
"http://" + "http://" +
request.hostname + request.hostname +
(configFunctions.getProperty("application.httpPort") === 80 (configFunctions.getProperty("application.httpPort") === 80
? "" ? ""
: ":" + configFunctions.getProperty("application.httpPort")) + : ":" + configFunctions.getProperty("application.httpPort")) +
configFunctions.getProperty("reverseProxy.urlPrefix"); configFunctions.getProperty("reverseProxy.urlPrefix")
/*
* Get work order milestones
*/
const workOrderMilestoneFilters: WorkOrderMilestoneFilters = {
workOrderTypeIds: request.query.workOrderTypeIds as string,
workOrderMilestoneTypeIds: request.query.workOrderMilestoneTypeIds as string
};
if (request.query.workOrderId) {
workOrderMilestoneFilters.workOrderId = request.query.workOrderId as string;
} else {
workOrderMilestoneFilters.workOrderMilestoneDateFilter = "recent";
}
const workOrderMilestones = getWorkOrderMilestones(workOrderMilestoneFilters, {
includeWorkOrders: true,
orderBy: "date"
});
/*
* Create calendar object
*/
const calendar = ical({
name: "Work Order Milestone Calendar",
url: urlRoot + "/workOrders"
});
if (request.query.workOrderId && workOrderMilestones.length > 0) {
calendar.name("Work Order #" + workOrderMilestones[0].workOrderNumber);
calendar.url(urlRoot + "/workOrders/" + workOrderMilestones[0].workOrderId);
}
calendar.prodId({
company: "cityssm.github.io",
product: configFunctions.getProperty("application.applicationName")
});
/*
* Loop through milestones
*/
for (const milestone of workOrderMilestones) {
const milestoneTimePieces = (
milestone.workOrderMilestoneDateString +
" " +
milestone.workOrderMilestoneTimeString
).split(timeStringSplitRegex);
const milestoneDate = new Date(
Number.parseInt(milestoneTimePieces[0], 10),
Number.parseInt(milestoneTimePieces[1], 10) - 1,
Number.parseInt(milestoneTimePieces[2], 10),
Number.parseInt(milestoneTimePieces[3], 10),
Number.parseInt(milestoneTimePieces[4], 10)
); );
}
const milestoneEndDate = new Date(milestoneDate.getTime()); function getWorkOrderUrl(request: Request, milestone: recordTypes.WorkOrderMilestone) {
milestoneEndDate.setHours(milestoneEndDate.getHours() + 1); return getUrlRoot(request) + "/workOrders/" + milestone.workOrderId;
}
// Build summary (title in Outlook)
function buildEventSummary(milestone: recordTypes.WorkOrderMilestone): string {
let summary = let summary =
(milestone.workOrderMilestoneCompletionDate ? "✔ " : "") + (milestone.workOrderMilestoneCompletionDate ? "✔ " : "") +
(milestone.workOrderMilestoneTypeId (milestone.workOrderMilestoneTypeId
@ -119,34 +68,15 @@ export const handler: RequestHandler = (request, response) => {
} }
} }
// Build URL return summary;
}
const workOrderURL = urlRoot + "/workOrders/" + milestone.workOrderId; function buildEventDescriptionHTML(
request: Request,
// Create event milestone: recordTypes.WorkOrderMilestone
): string {
const eventData: ICalEventData = { const urlRoot = getUrlRoot(request);
start: milestoneDate, const workOrderUrl = getWorkOrderUrl(request, milestone);
created: new Date(milestone.recordCreate_timeMillis),
stamp: new Date(milestone.recordCreate_timeMillis),
lastModified: new Date(
Math.max(
milestone.recordUpdate_timeMillis,
milestone.workOrderRecordUpdate_timeMillis
)
),
allDay: !milestone.workOrderMilestoneTime,
summary,
url: workOrderURL
};
if (!eventData.allDay) {
eventData.end = milestoneEndDate;
}
const calendarEvent = calendar.createEvent(eventData);
// Build description
let descriptionHTML = let descriptionHTML =
"<h1>Milestone Description</h1>" + "<h1>Milestone Description</h1>" +
@ -157,7 +87,7 @@ export const handler: RequestHandler = (request, response) => {
milestone.workOrderNumber + milestone.workOrderNumber +
"</h2>" + "</h2>" +
("<p>" + escapeHTML(milestone.workOrderDescription) + "</p>") + ("<p>" + escapeHTML(milestone.workOrderDescription) + "</p>") +
("<p>" + workOrderURL + "</p>"); ("<p>" + workOrderUrl + "</p>");
if (milestone.workOrderLotOccupancies.length > 0) { if (milestone.workOrderLotOccupancies.length > 0) {
descriptionHTML += descriptionHTML +=
@ -165,9 +95,7 @@ export const handler: RequestHandler = (request, response) => {
escapeHTML(configFunctions.getProperty("aliases.occupancies")) + escapeHTML(configFunctions.getProperty("aliases.occupancies")) +
"</h2>" + "</h2>" +
'<table border="1"><thead><tr>' + '<table border="1"><thead><tr>' +
("<th>" + ("<th>" + escapeHTML(configFunctions.getProperty("aliases.occupancy")) + " Type</th>") +
escapeHTML(configFunctions.getProperty("aliases.occupancy")) +
" Type</th>") +
("<th>" + escapeHTML(configFunctions.getProperty("aliases.lot")) + "</th>") + ("<th>" + escapeHTML(configFunctions.getProperty("aliases.lot")) + "</th>") +
"<th>Start Date</th>" + "<th>Start Date</th>" +
"<th>End Date</th>" + "<th>End Date</th>" +
@ -191,14 +119,16 @@ export const handler: RequestHandler = (request, response) => {
"</td>") + "</td>") +
("<td>" + occupancy.occupancyStartDateString + "</td>") + ("<td>" + occupancy.occupancyStartDateString + "</td>") +
"<td>" + "<td>" +
(occupancy.occupancyEndDate (occupancy.occupancyEndDate ? occupancy.occupancyEndDateString : "(No End Date)") +
? occupancy.occupancyEndDateString
: "(No End Date)") +
"</td>" + "</td>" +
"<td>"; "<td>";
for (const occupant of occupancy.lotOccupancyOccupants) { for (const occupant of occupancy.lotOccupancyOccupants) {
descriptionHTML += escapeHTML(occupant.lotOccupantType) + ": " + escapeHTML(occupant.occupantName) + "<br />"; descriptionHTML +=
escapeHTML(occupant.lotOccupantType) +
": " +
escapeHTML(occupant.occupantName) +
"<br />";
} }
descriptionHTML += "</td>" + "</tr>"; descriptionHTML += "</td>" + "</tr>";
@ -215,10 +145,7 @@ export const handler: RequestHandler = (request, response) => {
'<table border="1"><thead><tr>' + '<table border="1"><thead><tr>' +
("<th>" + escapeHTML(configFunctions.getProperty("aliases.lot")) + " Type</th>") + ("<th>" + escapeHTML(configFunctions.getProperty("aliases.lot")) + " Type</th>") +
("<th>" + escapeHTML(configFunctions.getProperty("aliases.map")) + "</th>") + ("<th>" + escapeHTML(configFunctions.getProperty("aliases.map")) + "</th>") +
("<th>" + ("<th>" + escapeHTML(configFunctions.getProperty("aliases.lot")) + " Type" + "</th>") +
escapeHTML(configFunctions.getProperty("aliases.lot")) +
" Type" +
"</th>") +
"<th>Status</th>" + "<th>Status</th>" +
"</tr></thead>" + "</tr></thead>" +
"<tbody>"; "<tbody>";
@ -256,18 +183,116 @@ export const handler: RequestHandler = (request, response) => {
"<p>" + "<p>" +
escapeHTML(printConfig.title) + escapeHTML(printConfig.title) +
"<br />" + "<br />" +
(urlRoot + (urlRoot + "/print/" + printName + "/?workOrderId=" + milestone.workOrderId) +
"/print/" +
printName +
"/?workOrderId=" +
milestone.workOrderId) +
"</p>"; "</p>";
} }
} }
} }
return descriptionHTML;
}
export const handler: RequestHandler = (request, response) => {
const urlRoot = getUrlRoot(request);
/*
* Get work order milestones
*/
const workOrderMilestoneFilters: WorkOrderMilestoneFilters = {
workOrderTypeIds: request.query.workOrderTypeIds as string,
workOrderMilestoneTypeIds: request.query.workOrderMilestoneTypeIds as string
};
if (request.query.workOrderId) {
workOrderMilestoneFilters.workOrderId = request.query.workOrderId as string;
} else {
workOrderMilestoneFilters.workOrderMilestoneDateFilter = "recent";
}
const workOrderMilestones = getWorkOrderMilestones(workOrderMilestoneFilters, {
includeWorkOrders: true,
orderBy: "date"
});
/*
* Create calendar object
*/
const calendar = ical({
name: "Work Order Milestone Calendar",
url: urlRoot + "/workOrders"
});
if (request.query.workOrderId && workOrderMilestones.length > 0) {
calendar.name("Work Order #" + workOrderMilestones[0].workOrderNumber);
calendar.url(urlRoot + "/workOrders/" + workOrderMilestones[0].workOrderId);
}
calendar.prodId({
company: calendarCompany,
product: calendarProduct
});
/*
* Loop through milestones
*/
for (const milestone of workOrderMilestones) {
const milestoneTimePieces = (
milestone.workOrderMilestoneDateString +
" " +
milestone.workOrderMilestoneTimeString
).split(timeStringSplitRegex);
const milestoneDate = new Date(
Number.parseInt(milestoneTimePieces[0], 10),
Number.parseInt(milestoneTimePieces[1], 10) - 1,
Number.parseInt(milestoneTimePieces[2], 10),
Number.parseInt(milestoneTimePieces[3], 10),
Number.parseInt(milestoneTimePieces[4], 10)
);
const milestoneEndDate = new Date(milestoneDate.getTime());
milestoneEndDate.setHours(milestoneEndDate.getHours() + 1);
// Build summary (title in Outlook)
const summary = buildEventSummary(milestone);
// Build URL
const workOrderUrl = getWorkOrderUrl(request, milestone);
// Create event
const eventData: ICalEventData = {
start: milestoneDate,
created: new Date(milestone.recordCreate_timeMillis),
stamp: new Date(milestone.recordCreate_timeMillis),
lastModified: new Date(
Math.max(
milestone.recordUpdate_timeMillis,
milestone.workOrderRecordUpdate_timeMillis
)
),
allDay: !milestone.workOrderMilestoneTime,
summary,
url: workOrderUrl
};
if (!eventData.allDay) {
eventData.end = milestoneEndDate;
}
const calendarEvent = calendar.createEvent(eventData);
// Build description
const descriptionHTML = buildEventDescriptionHTML(request, milestone);
calendarEvent.description({ calendarEvent.description({
plain: workOrderURL, plain: workOrderUrl,
html: descriptionHTML html: descriptionHTML
}); });