From e2e5f3f8856ce43089440cc1aceaaee399a243af Mon Sep 17 00:00:00 2001 From: Dave Richer Date: Thu, 9 Jan 2025 13:28:56 -0800 Subject: [PATCH] feature/IO-3060-Realtime-Notifications-System - Add handlers for Job and Bill Change / Register Routers - Add Tables / Modify Tables / Add permissions. --- hasura/metadata/tables.yaml | 165 ++++++++++++++++++ .../down.sql | 4 + .../up.sql | 2 + .../down.sql | 1 + .../up.sql | 2 + .../down.sql | 3 + .../up.sql | 1 + .../down.sql | 4 + .../up.sql | 2 + .../down.sql | 1 + .../up.sql | 2 + .../eventHandlers/handeJobChange.js | 5 + .../eventHandlers/handleBillChange.js | 5 + server/routes/notificationsRoutes.js | 15 +- 14 files changed, 208 insertions(+), 4 deletions(-) create mode 100644 hasura/migrations/1736452866094_alter_table_public_associations_add_column_notification_settings/down.sql create mode 100644 hasura/migrations/1736452866094_alter_table_public_associations_add_column_notification_settings/up.sql create mode 100644 hasura/migrations/1736455300329_create_table_public_notifications/down.sql create mode 100644 hasura/migrations/1736455300329_create_table_public_notifications/up.sql create mode 100644 hasura/migrations/1736457116827_alter_table_public_notifications_drop_column_scenario/down.sql create mode 100644 hasura/migrations/1736457116827_alter_table_public_notifications_drop_column_scenario/up.sql create mode 100644 hasura/migrations/1736457173242_alter_table_public_notifications_add_column_scenario/down.sql create mode 100644 hasura/migrations/1736457173242_alter_table_public_notifications_add_column_scenario/up.sql create mode 100644 hasura/migrations/1736457615046_create_table_public_job_watchers/down.sql create mode 100644 hasura/migrations/1736457615046_create_table_public_job_watchers/up.sql create mode 100644 server/notifications/eventHandlers/handeJobChange.js create mode 100644 server/notifications/eventHandlers/handleBillChange.js diff --git a/hasura/metadata/tables.yaml b/hasura/metadata/tables.yaml index 240b218a4..d7ddeb768 100644 --- a/hasura/metadata/tables.yaml +++ b/hasura/metadata/tables.yaml @@ -207,6 +207,7 @@ - default_prod_list_view - id - kanban_settings + - notification_settings - qbo_realmId - shopid - useremail @@ -222,6 +223,7 @@ - authlevel - default_prod_list_view - kanban_settings + - notification_settings - qbo_realmId filter: user: @@ -2805,6 +2807,80 @@ _eq: X-Hasura-User-Id - active: _eq: true +- table: + name: job_watchers + schema: public + object_relationships: + - name: job + using: + foreign_key_constraint_on: job_id + - name: user + using: + foreign_key_constraint_on: user_email + insert_permissions: + - role: user + permission: + check: + user: + _and: + - associations: + active: + _eq: true + - authid: + _eq: X-Hasura-User-Id + columns: + - user_email + - created_at + - id + - job_id + comment: "" + select_permissions: + - role: user + permission: + columns: + - user_email + - created_at + - id + - job_id + filter: + user: + _and: + - associations: + active: + _eq: true + - authid: + _eq: X-Hasura-User-Id + comment: "" + update_permissions: + - role: user + permission: + columns: + - user_email + - created_at + - id + - job_id + filter: + user: + _and: + - associations: + active: + _eq: true + - authid: + _eq: X-Hasura-User-Id + check: null + comment: "" + delete_permissions: + - role: user + permission: + filter: + user: + _and: + - associations: + active: + _eq: true + - authid: + _eq: X-Hasura-User-Id + comment: "" - table: name: joblines schema: public @@ -4669,6 +4745,95 @@ _eq: X-Hasura-User-Id - active: _eq: true +- table: + name: notifications + schema: public + object_relationships: + - name: association + using: + foreign_key_constraint_on: association_id + - name: job + using: + foreign_key_constraint_on: job_id + insert_permissions: + - role: user + permission: + check: + association: + _and: + - active: + _eq: true + - user: + authid: + _eq: X-Hasura-User-Id + columns: + - association_id + - created_at + - fcm_data + - fcm_message + - fcm_title + - id + - job_id + - meta + - read + - scenario + - ui_translation_meta + - ui_translation_string + - updated_at + comment: "" + select_permissions: + - role: user + permission: + columns: + - association_id + - created_at + - fcm_data + - fcm_message + - fcm_title + - id + - job_id + - meta + - read + - scenario + - ui_translation_meta + - ui_translation_string + - updated_at + filter: + association: + _and: + - active: + _eq: true + - user: + authid: + _eq: X-Hasura-User-Id + comment: "" + update_permissions: + - role: user + permission: + columns: + - association_id + - created_at + - fcm_data + - fcm_message + - fcm_title + - id + - job_id + - meta + - read + - scenario + - ui_translation_meta + - ui_translation_string + - updated_at + filter: + association: + _and: + - active: + _eq: true + - user: + authid: + _eq: X-Hasura-User-Id + check: null + comment: "" - table: name: owners schema: public diff --git a/hasura/migrations/1736452866094_alter_table_public_associations_add_column_notification_settings/down.sql b/hasura/migrations/1736452866094_alter_table_public_associations_add_column_notification_settings/down.sql new file mode 100644 index 000000000..4e2b8ebd3 --- /dev/null +++ b/hasura/migrations/1736452866094_alter_table_public_associations_add_column_notification_settings/down.sql @@ -0,0 +1,4 @@ +-- Could not auto-generate a down migration. +-- Please write an appropriate down migration for the SQL below: +-- alter table "public"."associations" add column "notification_settings" jsonb +-- null; diff --git a/hasura/migrations/1736452866094_alter_table_public_associations_add_column_notification_settings/up.sql b/hasura/migrations/1736452866094_alter_table_public_associations_add_column_notification_settings/up.sql new file mode 100644 index 000000000..da1bac389 --- /dev/null +++ b/hasura/migrations/1736452866094_alter_table_public_associations_add_column_notification_settings/up.sql @@ -0,0 +1,2 @@ +alter table "public"."associations" add column "notification_settings" jsonb + null; diff --git a/hasura/migrations/1736455300329_create_table_public_notifications/down.sql b/hasura/migrations/1736455300329_create_table_public_notifications/down.sql new file mode 100644 index 000000000..6fc4e3068 --- /dev/null +++ b/hasura/migrations/1736455300329_create_table_public_notifications/down.sql @@ -0,0 +1 @@ +DROP TABLE "public"."notifications"; diff --git a/hasura/migrations/1736455300329_create_table_public_notifications/up.sql b/hasura/migrations/1736455300329_create_table_public_notifications/up.sql new file mode 100644 index 000000000..20c46499b --- /dev/null +++ b/hasura/migrations/1736455300329_create_table_public_notifications/up.sql @@ -0,0 +1,2 @@ +CREATE TABLE "public"."notifications" ("id" uuid NOT NULL DEFAULT gen_random_uuid(), "created_at" timestamptz NOT NULL DEFAULT now(), "updated_at" timestamptz NOT NULL DEFAULT now(), "job_id" uuid NOT NULL, "association_id" uuid NOT NULL, "ui_translation_string" text NOT NULL, "ui_translation_meta" jsonb, "fcm_title" text NOT NULL, "fcm_message" text NOT NULL, "fcm_data" jsonb, "read" timestamptz, "meta" jsonb, "scenario" Integer NOT NULL, PRIMARY KEY ("id") , FOREIGN KEY ("job_id") REFERENCES "public"."jobs"("id") ON UPDATE restrict ON DELETE restrict, FOREIGN KEY ("association_id") REFERENCES "public"."associations"("id") ON UPDATE restrict ON DELETE restrict, UNIQUE ("id"));COMMENT ON TABLE "public"."notifications" IS E'Real Time Notifications System'; +CREATE EXTENSION IF NOT EXISTS pgcrypto; diff --git a/hasura/migrations/1736457116827_alter_table_public_notifications_drop_column_scenario/down.sql b/hasura/migrations/1736457116827_alter_table_public_notifications_drop_column_scenario/down.sql new file mode 100644 index 000000000..38a88b4df --- /dev/null +++ b/hasura/migrations/1736457116827_alter_table_public_notifications_drop_column_scenario/down.sql @@ -0,0 +1,3 @@ +comment on column "public"."notifications"."scenario" is E'Real Time Notifications System'; +alter table "public"."notifications" alter column "scenario" drop not null; +alter table "public"."notifications" add column "scenario" int4; diff --git a/hasura/migrations/1736457116827_alter_table_public_notifications_drop_column_scenario/up.sql b/hasura/migrations/1736457116827_alter_table_public_notifications_drop_column_scenario/up.sql new file mode 100644 index 000000000..19d298dc1 --- /dev/null +++ b/hasura/migrations/1736457116827_alter_table_public_notifications_drop_column_scenario/up.sql @@ -0,0 +1 @@ +alter table "public"."notifications" drop column "scenario" cascade; diff --git a/hasura/migrations/1736457173242_alter_table_public_notifications_add_column_scenario/down.sql b/hasura/migrations/1736457173242_alter_table_public_notifications_add_column_scenario/down.sql new file mode 100644 index 000000000..88746e6fc --- /dev/null +++ b/hasura/migrations/1736457173242_alter_table_public_notifications_add_column_scenario/down.sql @@ -0,0 +1,4 @@ +-- Could not auto-generate a down migration. +-- Please write an appropriate down migration for the SQL below: +-- alter table "public"."notifications" add column "scenario" text +-- not null; diff --git a/hasura/migrations/1736457173242_alter_table_public_notifications_add_column_scenario/up.sql b/hasura/migrations/1736457173242_alter_table_public_notifications_add_column_scenario/up.sql new file mode 100644 index 000000000..7f26cc332 --- /dev/null +++ b/hasura/migrations/1736457173242_alter_table_public_notifications_add_column_scenario/up.sql @@ -0,0 +1,2 @@ +alter table "public"."notifications" add column "scenario" text + not null; diff --git a/hasura/migrations/1736457615046_create_table_public_job_watchers/down.sql b/hasura/migrations/1736457615046_create_table_public_job_watchers/down.sql new file mode 100644 index 000000000..b718e9f8f --- /dev/null +++ b/hasura/migrations/1736457615046_create_table_public_job_watchers/down.sql @@ -0,0 +1 @@ +DROP TABLE "public"."job_watchers"; diff --git a/hasura/migrations/1736457615046_create_table_public_job_watchers/up.sql b/hasura/migrations/1736457615046_create_table_public_job_watchers/up.sql new file mode 100644 index 000000000..1debac3c0 --- /dev/null +++ b/hasura/migrations/1736457615046_create_table_public_job_watchers/up.sql @@ -0,0 +1,2 @@ +CREATE TABLE "public"."job_watchers" ("id" uuid NOT NULL DEFAULT gen_random_uuid(), "job_id" uuid NOT NULL, "user_email" text NOT NULL, "created_at" timestamptz NOT NULL DEFAULT now(), PRIMARY KEY ("id") , FOREIGN KEY ("user_email") REFERENCES "public"."users"("email") ON UPDATE restrict ON DELETE restrict, FOREIGN KEY ("job_id") REFERENCES "public"."jobs"("id") ON UPDATE restrict ON DELETE restrict, UNIQUE ("id"));COMMENT ON TABLE "public"."job_watchers" IS E'Job Watchers'; +CREATE EXTENSION IF NOT EXISTS pgcrypto; diff --git a/server/notifications/eventHandlers/handeJobChange.js b/server/notifications/eventHandlers/handeJobChange.js new file mode 100644 index 000000000..db38d5e87 --- /dev/null +++ b/server/notifications/eventHandlers/handeJobChange.js @@ -0,0 +1,5 @@ +const handleJobChange = (req, res) => { + return res.status(200).json({ message: "Job change handled." }); +}; + +module.exports = handleJobChange; diff --git a/server/notifications/eventHandlers/handleBillChange.js b/server/notifications/eventHandlers/handleBillChange.js new file mode 100644 index 000000000..fcabafe85 --- /dev/null +++ b/server/notifications/eventHandlers/handleBillChange.js @@ -0,0 +1,5 @@ +const handleBillChange = (req, res) => { + return res.status(200).json({ message: "Bill change handled." }); +}; + +module.exports = handleBillChange; diff --git a/server/routes/notificationsRoutes.js b/server/routes/notificationsRoutes.js index cd31b7172..235d71e7f 100644 --- a/server/routes/notificationsRoutes.js +++ b/server/routes/notificationsRoutes.js @@ -1,12 +1,19 @@ const express = require("express"); const validateFirebaseIdTokenMiddleware = require("../middleware/validateFirebaseIdTokenMiddleware"); const { subscribe, unsubscribe, sendNotification } = require("../firebase/firebase-handler"); +const eventAuthorizationMiddleware = require("../middleware/eventAuthorizationMIddleware"); +const handleJobChange = require("../notifications/eventHandlers/handeJobChange"); +const handleBillChange = require("../notifications/eventHandlers/handleBillChange"); + const router = express.Router(); -router.use(validateFirebaseIdTokenMiddleware); +// These are FCM handlers +router.post("/subscribe", validateFirebaseIdTokenMiddleware, subscribe); +router.post("/unsubscribe", validateFirebaseIdTokenMiddleware, unsubscribe); +router.post("/sendtestnotification", validateFirebaseIdTokenMiddleware, sendNotification); -router.post("/subscribe", subscribe); -router.post("/unsubscribe", unsubscribe); -router.post("/sendtestnotification", sendNotification); +// Hasura Entry points for creating notifications +router.post("/events/handleJobChange", eventAuthorizationMiddleware, handleJobChange); +router.post("/events/handleBillChange", eventAuthorizationMiddleware, handleBillChange); module.exports = router;