From 8e01c538449a7463ba04d127882a7c211e478b81 Mon Sep 17 00:00:00 2001 From: NathanWEdwards Date: Sun, 29 Jan 2023 13:03:51 +0000 Subject: [PATCH] Add SMS notification when a reminder is already set. --- ...-up-for-reminder-reminder-already-set.puml | 8 ++ docs/use-cases.md | 3 + pages/api/sms/[instance]/index.ts | 105 +++++++++++++----- utils/sms-response.ts | 7 ++ 4 files changed, 97 insertions(+), 26 deletions(-) create mode 100755 docs/diagrams/case-found-sign-up-for-reminder-reminder-already-set.puml diff --git a/docs/diagrams/case-found-sign-up-for-reminder-reminder-already-set.puml b/docs/diagrams/case-found-sign-up-for-reminder-reminder-already-set.puml new file mode 100755 index 0000000..f9e7ad6 --- /dev/null +++ b/docs/diagrams/case-found-sign-up-for-reminder-reminder-already-set.puml @@ -0,0 +1,8 @@ +@startuml +skinparam sequenceMessageAlign center + +User -> Server: 01-AB-23456 +Server -> User: We found case "01-AB-23456" on 7/28/2022 1:00 PM @ Family/Criminal Courtroom 2A Chittenden, VT.\nReply with YES if you would like a courtesy reminder the day before or reply with NO to start over. +User -> Server: Yes +Server -> User: A reminder to notify you on case "01-AB-23456" taking place on 7/28/2022 1:00 PM @ Family/Criminal\n Courtroom 2A Chittenden, VT has already been set. +@enduml \ No newline at end of file diff --git a/docs/use-cases.md b/docs/use-cases.md index 0e65dc0..e2245ed 100644 --- a/docs/use-cases.md +++ b/docs/use-cases.md @@ -16,6 +16,9 @@ [![User finds a case but doesn't sign up for notification](https://tinyurl.com/2e5hkbzp)](https://tinyurl.com/2e5hkbzp) +## User signs up to receive a reminder the user has already signed up to receive a notification on +[![User has already signed up to receive a reminder](https://tinyurl.com/2375cj3f)] + ## User finds multiple cases [![User finds multiple cases](https://tinyurl.com/2nab39j3)](https://tinyurl.com/2nab39j3) diff --git a/pages/api/sms/[instance]/index.ts b/pages/api/sms/[instance]/index.ts index 7e0afb9..3a1e2cc 100644 --- a/pages/api/sms/[instance]/index.ts +++ b/pages/api/sms/[instance]/index.ts @@ -135,23 +135,50 @@ const handleText = async (req:NextApiRequest, res:NextApiResponse, input:string, // let's check for a yes if (response.toLowerCase() === 'yes') { let c = cases[0]; - await ReminderDao.create({ + + // check if a reminder is already active + const reminders = await ReminderDao.find({ + active: true, uid: c.uid, number: c.number, phone, - }); + }).exec(); - logger.info(`${phone} (${instance})[${state}]: reminder set`, { metadata: { - service: `/api/sms/${instance}`, - cookies, - instance, - input, - phone, - case: c, - state, - result: 'reminder set', - }}); - res.send(smsResponse.reminderYes(c).toString()); + if (reminders.length === 0) { + // create a new reminder document + // if no 'active' reminder documents are found + // matching the case uid, docket number, and phone number + await ReminderDao.create({ + uid: c.uid, + number: c.number, + phone, + }); + logger.info(`${phone} (${instance})[${state}]: reminder set`, { metadata: { + service: `/api/sms/${instance}`, + cookies, + instance, + input, + phone, + case: c, + state, + result: 'reminder set', + }}); + res.send(smsResponse.reminderYes(c).toString()); + } else { + // at least one reminder document in the collection already exists + // for the phone number `phone` to be reminded about case docket `c.number` + logger.info(`${phone} (${instance})[${state}]: reminder already set`, { metadata: { + service: `/api/sms/${instance}`, + cookies, + instance, + input, + phone, + case: c, + state, + result: 'reminder already set', + }}); + res.send(smsResponse.reminderActive(c).toString(), instanceMethods.getTimezone()); + } } // send help due to unexpected response else { @@ -179,23 +206,49 @@ const handleText = async (req:NextApiRequest, res:NextApiResponse, input:string, // if a number was given lets check to see if it maps to a case index if (response === parseInt(response).toString() && index >= 0 && index < cases.length) { let c = cases[index]; - await ReminderDao.create({ + // check if a reminder is already active + const reminders = await ReminderDao.find({ + active: true, uid: c.uid, number: c.number, phone, - }); + }).exec(); - logger.info(`${phone} (${instance})[${state}]: reminder set`, { metadata: { - service: `/api/sms/${instance}`, - cookies, - instance, - input, - phone, - case: c, - state, - result: 'reminder set', - }}); - res.send(smsResponse.reminderYes(c).toString()); + if (reminders.length === 0) { + // create a new reminder document + // if no 'active' reminder documents are found + // matching the case uid, docket number, and phone number + await ReminderDao.create({ + uid: c.uid, + number: c.number, + phone, + }); + logger.info(`${phone} (${instance})[${state}]: reminder set`, { metadata: { + service: `/api/sms/${instance}`, + cookies, + instance, + input, + phone, + case: c, + state, + result: 'reminder set', + }}); + res.send(smsResponse.reminderYes(c).toString()); + } else { + // at least one reminder document in the collection already exists + // for the phone number `phone` to be reminded about case docket `c.number` + logger.info(`${phone} (${instance})[${state}]: reminder already set`, { metadata: { + service: `/api/sms/${instance}`, + cookies, + instance, + input, + phone, + case: c, + state, + result: 'reminder already set', + }}); + res.send(smsResponse.reminderActive(c).toString(), instanceMethods.getTimezone()); + } } // send help due to unexpected response else { diff --git a/utils/sms-response.ts b/utils/sms-response.ts index db58fdb..05592ab 100644 --- a/utils/sms-response.ts +++ b/utils/sms-response.ts @@ -53,11 +53,18 @@ const reminderNo = (website:string) => { return resp; }; +const reminderActive = (c:Case, timezone = 'America/New_York')) => { + var resp = new MessagingResponse(); + resp.message(`A reminder to notify you on case "${c.number}" taking place on ${moment(c.date).tz(timezone).format('l LT')} @ ${c.address} has already been set.`); + return resp; +} + export default { caseNotFound, caseFound, error, help, + reminderActive, reminderNo, reminderYes, }; \ No newline at end of file