diff --git a/packages/common/src/ResourceSchedule.ts b/packages/common/src/ResourceSchedule.ts index 2bbbbb4a4..fd4921f8f 100644 --- a/packages/common/src/ResourceSchedule.ts +++ b/packages/common/src/ResourceSchedule.ts @@ -1,6 +1,5 @@ import { RRule, RRuleSet } from "rrule"; import { - TResource, TResourceScheduleData, TScheduleItemOpenClose, TTimezoneName, @@ -69,29 +68,29 @@ export function getScheduleItemPeriod( ): TScheduleItemOpenClose { const openTimeValue = item.fromTime.value; const closeTimeValue = item.toTime.value; - const firstOccurenceDate = item.recurrenceRule.all((_, i) => i < 1)[0]; + const firstOccurrenceDate = item.recurrenceRule.all((_, i) => i < 1)[0]; const firstCloseDt = makeSchedulePeriodDate( - firstOccurenceDate, + firstOccurrenceDate, closeTimeValue ); - // rrule doesn't know of the time so its first occurence could be past close + // rrule doesn't know of the time so its first occurrence could be past close if (firstCloseDt.getTime() > dt.getTime()) { - const openDt = makeSchedulePeriodDate(firstOccurenceDate, openTimeValue); + const openDt = makeSchedulePeriodDate(firstOccurrenceDate, openTimeValue); return { open: openDt, close: firstCloseDt, }; } - // the first occurence is past close so retrieve first occurence after the given date - const secondOccurenceDate = item.recurrenceRule.after(dt); + // the first occurrence is past close so retrieve first occurrence after the given date + const secondOccurrenceDate = item.recurrenceRule.after(dt); const secondCloseDt = makeSchedulePeriodDate( - secondOccurenceDate, + secondOccurrenceDate, closeTimeValue ); const secondOpenDt = makeSchedulePeriodDate( - secondOccurenceDate, + secondOccurrenceDate, closeTimeValue ); return { @@ -101,13 +100,13 @@ export function getScheduleItemPeriod( } /** - * Represents the reoccuring schedule of a resource (ex: Mon, Wed, Fri from 8am - 10pm) + * Represents the recurring schedule of a resource (ex: Mon, Wed, Fri from 8am - 10pm) * Based on the iCalendar standard (https://icalendar.org/iCalendar-RFC-5545) * Wraps the rrule library (https://github.com/jakubroztocil/rrule) in order to add * comments for schedule rules (ex: Mon 8am-12pm for residents, 1pm-4pm for non-residents) */ export default class ResourceSchedule { - private _items: TScheduleItem[]; + private readonly _items: TScheduleItem[]; /** * Whether the Resource is always open. */ @@ -214,11 +213,7 @@ export default class ResourceSchedule { return null; } - if (at.getTime() > nextScheduleItemPeriod.open.getTime()) { - return true; - } - - return false; + return at.getTime() > nextScheduleItemPeriod.open.getTime(); } /** @@ -244,10 +239,8 @@ export default class ResourceSchedule { if (!r.toTime || typeof r.toTime !== "string") { return false; } - if (r.comment && typeof r.comment !== "string") { - return false; - } - return true; + + return !(r.comment && typeof r.comment !== "string"); }) ) { throw new Error( diff --git a/packages/server/README.md b/packages/server/README.md index e5e95f842..e2c481558 100644 --- a/packages/server/README.md +++ b/packages/server/README.md @@ -69,7 +69,7 @@ This file contains placeholders for various API keys that you may or may not nee yarn workspace @upswyng/server dev ``` -Runs the server in the development mode. Open [http:/localhost:3000](http:/localhost:3000) to view it in the browser. +Runs the server in the development mode. Open [http://localhost:3000](http://localhost:3000) to view it in the browser. If you want to work on the [provider portal](http://localhost:3000/provider), you can log in with this google user: diff --git a/packages/server/src/models/Category.ts b/packages/server/src/models/Category.ts index c182d2d4d..3c4e1a068 100644 --- a/packages/server/src/models/Category.ts +++ b/packages/server/src/models/Category.ts @@ -1,12 +1,11 @@ +import mongoose, { Document, Schema } from "mongoose"; +import removeUndefinedFields from "../utility/removeUndefinedFields"; import Subcategory, { TSubcategoryDocument, subcategoryDocumentToSubcategory, } from "./Subcategory"; -import { TCategory, TSubcategory } from "@upswyng/types"; -import mongoose, { Document, Schema } from "mongoose"; - import { ObjectId } from "bson"; -import removeUndefinedFields from "../utility/removeUndefinedFields"; +import { TCategory } from "@upswyng/types"; export interface TCategoryDocument extends Document { _id: ObjectId; @@ -91,7 +90,7 @@ CategorySchema.statics.findOrCreate = async function( CategorySchema.statics.getCategoryList = async function(): Promise< TCategoryDocument[] > { - return await this.find().populate("subcategories"); + return this.find().populate("subcategories"); }; CategorySchema.statics.getByStub = async function( diff --git a/packages/server/src/models/Hotline.ts b/packages/server/src/models/Hotline.ts index a1a55aba9..f94d55496 100644 --- a/packages/server/src/models/Hotline.ts +++ b/packages/server/src/models/Hotline.ts @@ -49,7 +49,7 @@ const HotlineSchema = new Schema( ); HotlineSchema.statics.getAll = async function(): Promise { - return await this.find({}); + return this.find({}); }; const HotlineModel = mongoose.model("Hotline", HotlineSchema); diff --git a/packages/server/src/models/Resource.ts b/packages/server/src/models/Resource.ts index 0cdc447f8..999c61038 100644 --- a/packages/server/src/models/Resource.ts +++ b/packages/server/src/models/Resource.ts @@ -4,7 +4,6 @@ import { TLegacyResource, TResource, TResourceScheduleData, - TSubcategory, } from "@upswyng/types"; import { TSubcategoryDocument, @@ -49,7 +48,7 @@ export interface TResourceDocument extends Document { /** * Convert a resource document from the database into our `TResource` type. - * Explicity enumerate keys so we make TypeScript happy. + * Explicitly enumerate keys so we make TypeScript happy. */ export const resourceDocumentToResource = async ( r: TResourceDocument @@ -331,7 +330,7 @@ ResourceSchema.statics.getByResourceId = async function( resourceId: ObjectId, includeDeleted: boolean = false ): Promise { - return await this.findOne({ + return this.findOne({ resourceId, deleted: { $in: [false, includeDeleted] }, }) @@ -346,7 +345,7 @@ ResourceSchema.statics.getByResourceId = async function( ResourceSchema.statics.getByRecordId = async function( _id: ObjectId ): Promise { - return await this.findOne({ _id }) + return this.findOne({ _id }) .populate({ path: "subcategories", populate: { path: "parentCategory" } }) .populate("createdBy") .populate("lastModifiedBy"); @@ -358,7 +357,7 @@ ResourceSchema.statics.getByRecordId = async function( ResourceSchema.statics.getByResourceIds = async function( resourceIds: ObjectId[] ): Promise { - return await this.find({ + return this.find({ resourceId: { $in: resourceIds }, }) .populate({ path: "subcategories", populate: { path: "parentCategory" } }) @@ -372,7 +371,7 @@ ResourceSchema.statics.getByResourceIds = async function( ResourceSchema.statics.getAll = async function( includeDeleted: boolean = false ): Promise { - return await this.find({ deleted: { $in: [false, includeDeleted] } }) + return this.find({ deleted: { $in: [false, includeDeleted] } }) .populate({ path: "subcategories", populate: { path: "parentCategory" } }) .populate("createdBy") .populate("lastModifiedBy"); @@ -384,7 +383,7 @@ ResourceSchema.statics.getAll = async function( ResourceSchema.statics.getUncategorized = async function(): Promise< TResourceDocument[] > { - return await this.find({ + return this.find({ "subcategories.0": { $exists: false }, deleted: false, }) diff --git a/packages/server/src/models/ResourceIssue.ts b/packages/server/src/models/ResourceIssue.ts index 4d5c3f261..b7325d425 100644 --- a/packages/server/src/models/ResourceIssue.ts +++ b/packages/server/src/models/ResourceIssue.ts @@ -104,23 +104,22 @@ ResourceIssueSchema.statics.newWithoutResourceId = function( }) as TResourceIssueDocument; }; +const ResourceIssue = mongoose.model( + "ResourceIssue", + ResourceIssueSchema +); + ResourceIssueSchema.statics.getForResource = async function( resourceId: ObjectId, includeResolved = false ): Promise { // ensure that a resource exists with this ID - // eslint-disable-next-line @typescript-eslint/no-use-before-define - return await ResourceIssue.find({ + return ResourceIssue.find({ resourceId, resolved: { $in: [false, includeResolved] }, }).sort({ createdAt: -1 }); }; -const ResourceIssue = mongoose.model( - "ResourceIssue", - ResourceIssueSchema -); - export default ResourceIssue as typeof ResourceIssue & { /** * Creates a new Resource Issue but __does not__ save it. Does not include a Resource ID; diff --git a/packages/server/src/models/Subcategory.ts b/packages/server/src/models/Subcategory.ts index 9617d64bd..732dcde7e 100644 --- a/packages/server/src/models/Subcategory.ts +++ b/packages/server/src/models/Subcategory.ts @@ -112,11 +112,11 @@ SubcategorySchema.statics.getSubcategoryList = async function( includeResources = false ) { if (includeResources) { - return await this.find() + return this.find() .populate("parentCategory") .populate("resources"); } - return await this.find() + return this.find() .populate("parentCategory") .map(r => { delete r.resources; diff --git a/packages/server/src/models/User.ts b/packages/server/src/models/User.ts index 2fea0b308..bf0e2a52e 100644 --- a/packages/server/src/models/User.ts +++ b/packages/server/src/models/User.ts @@ -130,8 +130,7 @@ UserSchema.statics.findOrCreateGoogleUser = async function( } else if (!user) { try { const newUser = new self({ google: { sub, email } }); - const result = await newUser.save(); - return result; + return newUser.save(); } catch (e) { console.error(`Error creating new user:\t${e}`); throw e; @@ -143,7 +142,7 @@ UserSchema.statics.findOrCreateGoogleUser = async function( if (email) { user.google.email = email; } - return await user.save(); + return user.save(); } return user; }; @@ -167,8 +166,7 @@ UserSchema.statics.findOrCreateSlackUser = async function( const newUser = new self({ slack: { email, name, userId: slackUserId, teamId }, }); - const result = await newUser.save(); - return result; + return newUser.save(); } catch (e) { console.error(`Error creating new user:\t${e}`); throw e; @@ -184,7 +182,7 @@ UserSchema.statics.findOrCreateSlackUser = async function( user.slack.email = email; user.slack.teamId = teamId; user.slack.name = name; - return await user.save(); + return user.save(); } return user; }; diff --git a/packages/server/src/routes/api/bot/test-job.ts b/packages/server/src/routes/api/bot/test-job.ts index c572883ca..0fed771ab 100644 --- a/packages/server/src/routes/api/bot/test-job.ts +++ b/packages/server/src/routes/api/bot/test-job.ts @@ -19,7 +19,12 @@ async function makeTestJob(req, res, _next, user: TUser) { } } // TODO: Better Failure handling - mq.addJobTest(jobName, delay ? delay * 1000 : null, undefined, user._id); // this is taking too long, so don't await it. + await mq.addJobTest( + jobName, + delay ? delay * 1000 : null, + undefined, + user._id + ); // this is taking too long, so don't await it. const blocks = [ { type: "section", diff --git a/packages/server/src/routes/api/resource/issues/_setResolved.ts b/packages/server/src/routes/api/resource/issues/_setResolved.ts index 46307815e..7a29b17ab 100644 --- a/packages/server/src/routes/api/resource/issues/_setResolved.ts +++ b/packages/server/src/routes/api/resource/issues/_setResolved.ts @@ -56,47 +56,47 @@ export async function setResolved(resolved: boolean, req, res, next) { message: `Service Provider issue with _id ${_id} could not be found`, }) ); - } else { + } + + try { + issue.resolved = resolved; + await issue.save(); + // Create Event Log try { - issue.resolved = resolved; - await issue.save(); - // Create Event Log - try { - const resource = await Resource.getByResourceId(issue.resourceId); - const kind: EventLogKind = resolved - ? EventLogKind.ResourceIssueResolved - : EventLogKind.ResourceIssueReopened; - const newDocument = await new EventLog({ - actor: user._id, - detail: { - kind, - resourceId: issue.resourceId.toHexString(), - resourceName: resource.name, - resourceIssueSeverity: issue.severity, - resourceIssueKind: issue.kind, - resourceIssueId: issue._id.toHexString(), - }, + const resource = await Resource.getByResourceId(issue.resourceId); + const kind: EventLogKind = resolved + ? EventLogKind.ResourceIssueResolved + : EventLogKind.ResourceIssueReopened; + const newDocument = await new EventLog({ + actor: user._id, + detail: { kind, - }).save(); - await newDocument.populate("actor").execPopulate(); - await postEventLogMessage(eventLogDocumentToEventLog(newDocument)); - } catch (e) { - console.error(e); - } - res.writeHead(204); - res.end(); + resourceId: issue.resourceId.toHexString(), + resourceName: resource.name, + resourceIssueSeverity: issue.severity, + resourceIssueKind: issue.kind, + resourceIssueId: issue._id.toHexString(), + }, + kind, + }).save(); + await newDocument.populate("actor").execPopulate(); + await postEventLogMessage(eventLogDocumentToEventLog(newDocument)); } catch (e) { - res.writeHead(500, { - "Content-Type": "application/json", - }); - res.end( - JSON.stringify({ - message: `Error setting Service Provider issue with _id ${_id} to ${ - resolved ? "resolved" : "unresolved" - }: ${e.message}`, - }) - ); - return; + console.error(e); } + res.writeHead(204); + res.end(); + } catch (e) { + res.writeHead(500, { + "Content-Type": "application/json", + }); + res.end( + JSON.stringify({ + message: `Error setting Service Provider issue with _id ${_id} to ${ + resolved ? "resolved" : "unresolved" + }: ${e.message}`, + }) + ); + return; } } diff --git a/packages/server/src/routes/api/resource/issues/resolve/[_id].ts b/packages/server/src/routes/api/resource/issues/resolve/[_id].ts index 56966a723..9dc16d14d 100644 --- a/packages/server/src/routes/api/resource/issues/resolve/[_id].ts +++ b/packages/server/src/routes/api/resource/issues/resolve/[_id].ts @@ -4,5 +4,5 @@ import { setResolved } from "../_setResolved"; * API endpoint to set a `ResourceIssue`'s `resolved` field to `true`. */ export async function post(req, res, next) { - return await setResolved(true, req, res, next); + return setResolved(true, req, res, next); } diff --git a/packages/server/src/routes/api/resource/issues/unresolve/[_id].ts b/packages/server/src/routes/api/resource/issues/unresolve/[_id].ts index 9e09918df..6c2b3269c 100644 --- a/packages/server/src/routes/api/resource/issues/unresolve/[_id].ts +++ b/packages/server/src/routes/api/resource/issues/unresolve/[_id].ts @@ -4,5 +4,5 @@ import { setResolved } from "../_setResolved"; * API endpoint to set a `ResourceIssue`'s `resolved` field to `false`. */ export async function post(req, res, next) { - return await setResolved(false, req, res, next); + return setResolved(false, req, res, next); } diff --git a/packages/server/src/routes/provider/alert/create.svelte b/packages/server/src/routes/provider/alert/create.svelte index 8858de108..03f89c420 100644 --- a/packages/server/src/routes/provider/alert/create.svelte +++ b/packages/server/src/routes/provider/alert/create.svelte @@ -7,7 +7,7 @@