From af64b0629c87e4f0de536d9549d0b9bda8fa20ac Mon Sep 17 00:00:00 2001 From: lakshya-dhariwal Date: Sat, 19 Feb 2022 17:04:12 +0530 Subject: [PATCH 01/20] =?UTF-8?q?=F0=9F=8E=89=20Begin=20Notification=20fea?= =?UTF-8?q?ture?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/notifications/notifications.routes.ts | 0 src/api/notifications/notifications.schema.ts | 0 src/api/notifications/notifications.service.ts | 0 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/api/notifications/notifications.routes.ts create mode 100644 src/api/notifications/notifications.schema.ts create mode 100644 src/api/notifications/notifications.service.ts diff --git a/src/api/notifications/notifications.routes.ts b/src/api/notifications/notifications.routes.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/api/notifications/notifications.schema.ts b/src/api/notifications/notifications.schema.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/api/notifications/notifications.service.ts b/src/api/notifications/notifications.service.ts new file mode 100644 index 0000000..e69de29 From 680a0038c24615d04a207150da5b83809fa0a214 Mon Sep 17 00:00:00 2001 From: lakshya-dhariwal Date: Sat, 19 Feb 2022 18:24:11 +0530 Subject: [PATCH 02/20] =?UTF-8?q?=E2=9C=A8=20Notifications=20Request=20Sch?= =?UTF-8?q?ema?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/notifications/notifications.schema.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/api/notifications/notifications.schema.ts b/src/api/notifications/notifications.schema.ts index e69de29..159a03f 100644 --- a/src/api/notifications/notifications.schema.ts +++ b/src/api/notifications/notifications.schema.ts @@ -0,0 +1,11 @@ +import * as yup from "yup"; +import { emailSchema } from "../../models/email"; + +export const notificationsRequestSchema = yup.object({ + emails: yup.array().of(emailSchema).required(), + slug: yup.string().required(), + subject: yup.string().required(), + body: yup.string().required(), +}); + +export type notificationsRequest = yup.InferType; \ No newline at end of file From 267fcbb50d5f9d7d0aeab60adca52c7617df8c85 Mon Sep 17 00:00:00 2001 From: lakshya-dhariwal Date: Sat, 19 Feb 2022 18:43:30 +0530 Subject: [PATCH 03/20] =?UTF-8?q?=E2=9C=A8=20Notification=20Post=20Route?= =?UTF-8?q?=20with=20validations=20&=20types?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/notifications/notifications.routes.ts | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/src/api/notifications/notifications.routes.ts b/src/api/notifications/notifications.routes.ts index e69de29..ef965b1 100644 --- a/src/api/notifications/notifications.routes.ts +++ b/src/api/notifications/notifications.routes.ts @@ -0,0 +1,34 @@ +import { NextFunction, Request, Response, Router } from "express"; +import validateQuery from "../middlewares/validate-query"; +import { validateWebhook } from "../middlewares/validate-webhook"; +import { + notificationsRequestSchema, + notificationsRequest, +} from "./notifications.schema"; +const router = Router(); + +const handleNotifications = ( + req: Request, + res: Response, + next: NextFunction +) => { + try { + const { emails, slug, subject, body } = req.body as notificationsRequest; + //TODO: call function from services + res.status(200).json({ + success: true, + message: "Notifications Sent", + }); + } catch (err) { + next(err); + } +}; + +router.post( + "/notifications", + validateWebhook(), + validateQuery("body", notificationsRequestSchema), + handleNotifications +); + +export default router; From f298ec6a3621b4d36b297c627da1890c6314c6e5 Mon Sep 17 00:00:00 2001 From: Mohd Zaid Date: Sat, 19 Feb 2022 23:55:31 +0530 Subject: [PATCH 04/20] =?UTF-8?q?=E2=9C=A8=20Get=20discord=20id=20of=20use?= =?UTF-8?q?rs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../notifications/notifications.service.ts | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/api/notifications/notifications.service.ts b/src/api/notifications/notifications.service.ts index e69de29..b1844e1 100644 --- a/src/api/notifications/notifications.service.ts +++ b/src/api/notifications/notifications.service.ts @@ -0,0 +1,20 @@ +import { checkInDBSchema } from "../../models/event"; +import { getDbClient } from "../../utils/database"; +import { getDiscordBot } from "../../utils/discord"; + +export const getDiscordID = async (emailArray: Array) => { + const client = await getDiscordBot(); + const db = (await getDbClient()).db().collection("notification-mozohack22"); + let noIDUsers = []; + let userIDArray = []; + try { + emailArray.map(async (email) => { + const user = await db.findOne({ email: email }); + if (!user) return noIDUsers.push(email); + const userId = user.discordID; + return userIDArray.push(userId); + }); + } catch (err) { + console.log(err); + } +}; From bd9ad009ab199005e8b397b8329d855f8bd1dd16 Mon Sep 17 00:00:00 2001 From: lakshya-dhariwal Date: Sun, 20 Feb 2022 15:13:13 +0530 Subject: [PATCH 05/20] =?UTF-8?q?=F0=9F=9A=A7=20notification=20service?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/notifications/notifications.routes.ts | 3 +- .../notifications/notifications.service.ts | 30 +++++++++++++++++-- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/api/notifications/notifications.routes.ts b/src/api/notifications/notifications.routes.ts index ef965b1..221f204 100644 --- a/src/api/notifications/notifications.routes.ts +++ b/src/api/notifications/notifications.routes.ts @@ -1,6 +1,7 @@ import { NextFunction, Request, Response, Router } from "express"; import validateQuery from "../middlewares/validate-query"; import { validateWebhook } from "../middlewares/validate-webhook"; +import { notificationsService } from "./notifications.service"; import { notificationsRequestSchema, notificationsRequest, @@ -13,8 +14,8 @@ const handleNotifications = ( next: NextFunction ) => { try { - const { emails, slug, subject, body } = req.body as notificationsRequest; //TODO: call function from services + notificationsService(req.body as notificationsRequest); res.status(200).json({ success: true, message: "Notifications Sent", diff --git a/src/api/notifications/notifications.service.ts b/src/api/notifications/notifications.service.ts index b1844e1..83f779f 100644 --- a/src/api/notifications/notifications.service.ts +++ b/src/api/notifications/notifications.service.ts @@ -1,12 +1,13 @@ import { checkInDBSchema } from "../../models/event"; import { getDbClient } from "../../utils/database"; import { getDiscordBot } from "../../utils/discord"; +import { notificationsRequest } from "./notifications.schema"; +import { createBasicEmbed } from "../../utils/messages"; export const getDiscordID = async (emailArray: Array) => { - const client = await getDiscordBot(); const db = (await getDbClient()).db().collection("notification-mozohack22"); - let noIDUsers = []; - let userIDArray = []; + let noIDUsers: string[] = []; + let userIDArray: string[] = []; try { emailArray.map(async (email) => { const user = await db.findOne({ email: email }); @@ -14,7 +15,30 @@ export const getDiscordID = async (emailArray: Array) => { const userId = user.discordID; return userIDArray.push(userId); }); + return { userIDArray, noIDUsers }; } catch (err) { console.log(err); } }; + +export const notificationsService = async (data: notificationsRequest) => { + try { + const client = await getDiscordBot(); + const ids = await getDiscordID(data.emails); + const msg = { title: data.subject, message: data.body }; + if (ids && client) { + ids.userIDArray.map((id) => { + const embed = createBasicEmbed(msg, "ANNOUNCEMENT"); + client.users + .fetch(id.toString(), false) + .then((user) => { + user.send(embed); + }) + .catch((err) => { + console.log("Error Occured"); + }); + }); + } + throw { code: 500, error: "Internal Server Error" }; + } catch (error) {} +}; From 8e4bb6d6e6274509cbd44b122db48a01b4211d26 Mon Sep 17 00:00:00 2001 From: lakshya-dhariwal Date: Sun, 20 Feb 2022 15:40:55 +0530 Subject: [PATCH 06/20] =?UTF-8?q?=F0=9F=9A=A7=20Work=20in=20Progress=20-?= =?UTF-8?q?=20Notificaion=20service?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/notifications/notifications.routes.ts | 2 +- .../notifications/notifications.service.ts | 22 +++++++++++++++---- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/api/notifications/notifications.routes.ts b/src/api/notifications/notifications.routes.ts index 221f204..d1a731f 100644 --- a/src/api/notifications/notifications.routes.ts +++ b/src/api/notifications/notifications.routes.ts @@ -15,7 +15,7 @@ const handleNotifications = ( ) => { try { //TODO: call function from services - notificationsService(req.body as notificationsRequest); + notificationsService(req.body as notificationsRequest, res as Response); res.status(200).json({ success: true, message: "Notifications Sent", diff --git a/src/api/notifications/notifications.service.ts b/src/api/notifications/notifications.service.ts index 83f779f..538adef 100644 --- a/src/api/notifications/notifications.service.ts +++ b/src/api/notifications/notifications.service.ts @@ -3,6 +3,7 @@ import { getDbClient } from "../../utils/database"; import { getDiscordBot } from "../../utils/discord"; import { notificationsRequest } from "./notifications.schema"; import { createBasicEmbed } from "../../utils/messages"; +import { Response } from "express"; export const getDiscordID = async (emailArray: Array) => { const db = (await getDbClient()).db().collection("notification-mozohack22"); @@ -21,7 +22,10 @@ export const getDiscordID = async (emailArray: Array) => { } }; -export const notificationsService = async (data: notificationsRequest) => { +export const notificationsService = async ( + data: notificationsRequest, + res: Response +) => { try { const client = await getDiscordBot(); const ids = await getDiscordID(data.emails); @@ -30,15 +34,25 @@ export const notificationsService = async (data: notificationsRequest) => { ids.userIDArray.map((id) => { const embed = createBasicEmbed(msg, "ANNOUNCEMENT"); client.users - .fetch(id.toString(), false) + .fetch(id, false) .then((user) => { user.send(embed); + res + .status(200) + .json({ success: true, message: "Notifications sent" }); }) .catch((err) => { console.log("Error Occured"); }); }); } - throw { code: 500, error: "Internal Server Error" }; - } catch (error) {} + throw { code: 500, message: "Internal Server Error" }; + } catch (error: any) { + res + .status(error.code || 500) + .json({ + success: false, + message: error.message || "Internal Server Error", + }); + } }; From 9f9a6c58b2ce514a8370926acbbf1c456e940822 Mon Sep 17 00:00:00 2001 From: lakshya-dhariwal Date: Sun, 20 Feb 2022 16:30:14 +0530 Subject: [PATCH 07/20] =?UTF-8?q?=E2=9C=A8=20notif=20route=20in=20app.ts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/app.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/api/app.ts b/src/api/app.ts index 55062fd..a294518 100644 --- a/src/api/app.ts +++ b/src/api/app.ts @@ -9,6 +9,7 @@ import { initDbClient } from "../utils/database"; import { initDiscordBot } from "../utils/discord"; import { ERRORS } from "./error/error.constant"; import { join } from "path"; +import notificationsRoutes from "./notifications/notifications.routes"; /** * Initialize Webhook API Server @@ -36,6 +37,7 @@ app.get("/", (req: Request, res: Response, next: NextFunction) => { } }); app.use("/api/v1", rolesRoutes); +app.use("/api/v1", notificationsRoutes); app.use("/api/v1", channelRoutes); app.use("/healthcheck", (req: Request, res: Response, next: NextFunction) => { try { From 8aaaa3218e8c5f20d1aaa02f9236552d276002f9 Mon Sep 17 00:00:00 2001 From: lakshya-dhariwal Date: Sun, 20 Feb 2022 16:42:13 +0530 Subject: [PATCH 08/20] =?UTF-8?q?=E2=9C=A8=20Send=20Notification=20DMs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/notifications/notifications.routes.ts | 12 ++-- .../notifications/notifications.service.ts | 57 ++++++++++++------- 2 files changed, 42 insertions(+), 27 deletions(-) diff --git a/src/api/notifications/notifications.routes.ts b/src/api/notifications/notifications.routes.ts index d1a731f..9461447 100644 --- a/src/api/notifications/notifications.routes.ts +++ b/src/api/notifications/notifications.routes.ts @@ -8,18 +8,18 @@ import { } from "./notifications.schema"; const router = Router(); -const handleNotifications = ( +const handleNotifications = async ( req: Request, res: Response, next: NextFunction ) => { try { //TODO: call function from services - notificationsService(req.body as notificationsRequest, res as Response); - res.status(200).json({ - success: true, - message: "Notifications Sent", - }); + await notificationsService( + req.body as notificationsRequest, + res as Response + ); + } catch (err) { next(err); } diff --git a/src/api/notifications/notifications.service.ts b/src/api/notifications/notifications.service.ts index 538adef..2e70b35 100644 --- a/src/api/notifications/notifications.service.ts +++ b/src/api/notifications/notifications.service.ts @@ -4,18 +4,29 @@ import { getDiscordBot } from "../../utils/discord"; import { notificationsRequest } from "./notifications.schema"; import { createBasicEmbed } from "../../utils/messages"; import { Response } from "express"; +import { Client } from "discord.js"; + +export interface getDiscordIDSchema { + userIDArray: Array; + noIDUsers: Array; +} export const getDiscordID = async (emailArray: Array) => { - const db = (await getDbClient()).db().collection("notification-mozohack22"); + const db = (await getDbClient()).db().collection(`notification-mozohack22`); let noIDUsers: string[] = []; let userIDArray: string[] = []; try { - emailArray.map(async (email) => { - const user = await db.findOne({ email: email }); - if (!user) return noIDUsers.push(email); - const userId = user.discordID; - return userIDArray.push(userId); - }); + for (let index = 0; index < emailArray.length; index++) { + const user = await db.findOne({ + email: emailArray[index], + }); + if (!user) { + noIDUsers.push(emailArray[index]); + } else { + const userId = user.discordID; + userIDArray.push(userId); + } + } return { userIDArray, noIDUsers }; } catch (err) { console.log(err); @@ -27,32 +38,36 @@ export const notificationsService = async ( res: Response ) => { try { - const client = await getDiscordBot(); - const ids = await getDiscordID(data.emails); + const client: Client | undefined = await getDiscordBot(); + const ids:getDiscordIDSchema | undefined = await getDiscordID(data.emails); const msg = { title: data.subject, message: data.body }; - if (ids && client) { - ids.userIDArray.map((id) => { + if (ids&& client) { + console.log(ids.userIDArray); + console.log(ids.userIDArray); + ids.userIDArray.map((id : string) => { const embed = createBasicEmbed(msg, "ANNOUNCEMENT"); client.users .fetch(id, false) .then((user) => { user.send(embed); - res - .status(200) - .json({ success: true, message: "Notifications sent" }); + // return res + // .status(200) + // .json({ success: true, message: "Notifications sent" }); }) .catch((err) => { console.log("Error Occured"); }); }); + res.status(200).json({ + success: true, + message: "Notifications Sent", + }); } - throw { code: 500, message: "Internal Server Error" }; + // throw { code: 500, message: "Internal Server Error :(" }; } catch (error: any) { - res - .status(error.code || 500) - .json({ - success: false, - message: error.message || "Internal Server Error", - }); + res.status(error.code || 500).json({ + success: false, + message: error.message || "Internal Server Error", + }); } }; From 296ba0ee681ca09d396def634ba3ded6a516d8c6 Mon Sep 17 00:00:00 2001 From: lakshya-dhariwal Date: Sun, 20 Feb 2022 16:59:14 +0530 Subject: [PATCH 09/20] =?UTF-8?q?=E2=9C=A8=20error=20handling?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../notifications/notifications.service.ts | 29 ++++++------------- 1 file changed, 9 insertions(+), 20 deletions(-) diff --git a/src/api/notifications/notifications.service.ts b/src/api/notifications/notifications.service.ts index 2e70b35..8032b75 100644 --- a/src/api/notifications/notifications.service.ts +++ b/src/api/notifications/notifications.service.ts @@ -39,34 +39,23 @@ export const notificationsService = async ( ) => { try { const client: Client | undefined = await getDiscordBot(); - const ids:getDiscordIDSchema | undefined = await getDiscordID(data.emails); + const ids: getDiscordIDSchema | undefined = await getDiscordID(data.emails); const msg = { title: data.subject, message: data.body }; - if (ids&& client) { - console.log(ids.userIDArray); - console.log(ids.userIDArray); - ids.userIDArray.map((id : string) => { + if (ids && client) { + ids.userIDArray.map(async (id: string) => { const embed = createBasicEmbed(msg, "ANNOUNCEMENT"); - client.users - .fetch(id, false) - .then((user) => { - user.send(embed); - // return res - // .status(200) - // .json({ success: true, message: "Notifications sent" }); - }) - .catch((err) => { - console.log("Error Occured"); - }); + const user = await client.users.fetch(id, false); + user.send(embed); }); res.status(200).json({ - success: true, - message: "Notifications Sent", + status:true, + success: ids.userIDArray, + failed: ids.noIDUsers, }); } - // throw { code: 500, message: "Internal Server Error :(" }; } catch (error: any) { res.status(error.code || 500).json({ - success: false, + status: false, message: error.message || "Internal Server Error", }); } From 1725830bf342a4f55f12221680f46e28a9988688 Mon Sep 17 00:00:00 2001 From: Mohd Zaid Date: Sun, 20 Feb 2022 17:07:25 +0530 Subject: [PATCH 10/20] =?UTF-8?q?=E2=9C=A8=20pass=20slug=20into=20collecti?= =?UTF-8?q?on?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/notifications/notifications.service.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/api/notifications/notifications.service.ts b/src/api/notifications/notifications.service.ts index 8032b75..c7f8a0e 100644 --- a/src/api/notifications/notifications.service.ts +++ b/src/api/notifications/notifications.service.ts @@ -11,8 +11,8 @@ export interface getDiscordIDSchema { noIDUsers: Array; } -export const getDiscordID = async (emailArray: Array) => { - const db = (await getDbClient()).db().collection(`notification-mozohack22`); +export const getDiscordID = async (emailArray: Array, slug: string) => { + const db = (await getDbClient()).db().collection(`notification-${slug}`); let noIDUsers: string[] = []; let userIDArray: string[] = []; try { @@ -39,7 +39,10 @@ export const notificationsService = async ( ) => { try { const client: Client | undefined = await getDiscordBot(); - const ids: getDiscordIDSchema | undefined = await getDiscordID(data.emails); + const ids: getDiscordIDSchema | undefined = await getDiscordID( + data.emails, + data.slug + ); const msg = { title: data.subject, message: data.body }; if (ids && client) { ids.userIDArray.map(async (id: string) => { @@ -48,7 +51,7 @@ export const notificationsService = async ( user.send(embed); }); res.status(200).json({ - status:true, + status: true, success: ids.userIDArray, failed: ids.noIDUsers, }); From 6ceae1ecb4ef790b6b0ca6bd4f7e8acc7ed5fc68 Mon Sep 17 00:00:00 2001 From: lakshya-dhariwal Date: Sun, 20 Feb 2022 20:54:06 +0530 Subject: [PATCH 11/20] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20change=20subject=20t?= =?UTF-8?q?o=20title?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/notifications/notifications.schema.ts | 2 +- src/api/notifications/notifications.service.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/api/notifications/notifications.schema.ts b/src/api/notifications/notifications.schema.ts index 159a03f..fb1dcd3 100644 --- a/src/api/notifications/notifications.schema.ts +++ b/src/api/notifications/notifications.schema.ts @@ -4,7 +4,7 @@ import { emailSchema } from "../../models/email"; export const notificationsRequestSchema = yup.object({ emails: yup.array().of(emailSchema).required(), slug: yup.string().required(), - subject: yup.string().required(), + title: yup.string().required(), body: yup.string().required(), }); diff --git a/src/api/notifications/notifications.service.ts b/src/api/notifications/notifications.service.ts index c7f8a0e..e118447 100644 --- a/src/api/notifications/notifications.service.ts +++ b/src/api/notifications/notifications.service.ts @@ -43,7 +43,7 @@ export const notificationsService = async ( data.emails, data.slug ); - const msg = { title: data.subject, message: data.body }; + const msg = { title: data.title, message: data.body }; if (ids && client) { ids.userIDArray.map(async (id: string) => { const embed = createBasicEmbed(msg, "ANNOUNCEMENT"); From 04c95335037be1b3d69424c2e7d719535229922d Mon Sep 17 00:00:00 2001 From: lakshya-dhariwal Date: Sun, 20 Feb 2022 21:02:02 +0530 Subject: [PATCH 12/20] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20change=20slug=20base?= =?UTF-8?q?d=20collection=20to=201=20collection?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/notifications/notifications.schema.ts | 1 - src/api/notifications/notifications.service.ts | 9 +++------ 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/api/notifications/notifications.schema.ts b/src/api/notifications/notifications.schema.ts index fb1dcd3..5d3f473 100644 --- a/src/api/notifications/notifications.schema.ts +++ b/src/api/notifications/notifications.schema.ts @@ -3,7 +3,6 @@ import { emailSchema } from "../../models/email"; export const notificationsRequestSchema = yup.object({ emails: yup.array().of(emailSchema).required(), - slug: yup.string().required(), title: yup.string().required(), body: yup.string().required(), }); diff --git a/src/api/notifications/notifications.service.ts b/src/api/notifications/notifications.service.ts index e118447..1b63ee4 100644 --- a/src/api/notifications/notifications.service.ts +++ b/src/api/notifications/notifications.service.ts @@ -11,8 +11,8 @@ export interface getDiscordIDSchema { noIDUsers: Array; } -export const getDiscordID = async (emailArray: Array, slug: string) => { - const db = (await getDbClient()).db().collection(`notification-${slug}`); +export const getDiscordID = async (emailArray: Array) => { + const db = (await getDbClient()).db().collection(`jack-notifications`); let noIDUsers: string[] = []; let userIDArray: string[] = []; try { @@ -39,10 +39,7 @@ export const notificationsService = async ( ) => { try { const client: Client | undefined = await getDiscordBot(); - const ids: getDiscordIDSchema | undefined = await getDiscordID( - data.emails, - data.slug - ); + const ids: getDiscordIDSchema | undefined = await getDiscordID(data.emails); const msg = { title: data.title, message: data.body }; if (ids && client) { ids.userIDArray.map(async (id: string) => { From c27084c5a598fda29b0d9cf90ef933b0b3a36e5f Mon Sep 17 00:00:00 2001 From: lakshya-dhariwal Date: Sun, 20 Feb 2022 21:11:18 +0530 Subject: [PATCH 13/20] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20send=20failed=20and?= =?UTF-8?q?=20success=20emails?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/notifications/notifications.service.ts | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/api/notifications/notifications.service.ts b/src/api/notifications/notifications.service.ts index 1b63ee4..eb43a66 100644 --- a/src/api/notifications/notifications.service.ts +++ b/src/api/notifications/notifications.service.ts @@ -8,26 +8,29 @@ import { Client } from "discord.js"; export interface getDiscordIDSchema { userIDArray: Array; - noIDUsers: Array; + failedEmails: Array; + successEmails: Array; } export const getDiscordID = async (emailArray: Array) => { const db = (await getDbClient()).db().collection(`jack-notifications`); - let noIDUsers: string[] = []; let userIDArray: string[] = []; + let failedEmails: string[] = []; + let successEmails: string[] = []; try { for (let index = 0; index < emailArray.length; index++) { const user = await db.findOne({ email: emailArray[index], }); if (!user) { - noIDUsers.push(emailArray[index]); + failedEmails.push(emailArray[index]); } else { const userId = user.discordID; userIDArray.push(userId); + successEmails.push(emailArray[index]); } } - return { userIDArray, noIDUsers }; + return { userIDArray, failedEmails , successEmails}; } catch (err) { console.log(err); } @@ -49,8 +52,8 @@ export const notificationsService = async ( }); res.status(200).json({ status: true, - success: ids.userIDArray, - failed: ids.noIDUsers, + success: ids.successEmails, + failed: ids.failedEmails, }); } } catch (error: any) { From 143c0066b16d53fd738388596c56c46d2207d11c Mon Sep 17 00:00:00 2001 From: lakshya-dhariwal Date: Sun, 20 Feb 2022 22:50:12 +0530 Subject: [PATCH 14/20] =?UTF-8?q?=E2=9C=A8=20custom=20embed?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/notifications/notifications.service.ts | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/api/notifications/notifications.service.ts b/src/api/notifications/notifications.service.ts index eb43a66..2d269e6 100644 --- a/src/api/notifications/notifications.service.ts +++ b/src/api/notifications/notifications.service.ts @@ -2,9 +2,9 @@ import { checkInDBSchema } from "../../models/event"; import { getDbClient } from "../../utils/database"; import { getDiscordBot } from "../../utils/discord"; import { notificationsRequest } from "./notifications.schema"; -import { createBasicEmbed } from "../../utils/messages"; import { Response } from "express"; -import { Client } from "discord.js"; +import { Client, MessageEmbed } from "discord.js"; +import { CONSTANTS } from "../../utils/constants"; export interface getDiscordIDSchema { userIDArray: Array; @@ -30,7 +30,7 @@ export const getDiscordID = async (emailArray: Array) => { successEmails.push(emailArray[index]); } } - return { userIDArray, failedEmails , successEmails}; + return { userIDArray, failedEmails, successEmails }; } catch (err) { console.log(err); } @@ -43,10 +43,17 @@ export const notificationsService = async ( try { const client: Client | undefined = await getDiscordBot(); const ids: getDiscordIDSchema | undefined = await getDiscordID(data.emails); - const msg = { title: data.title, message: data.body }; if (ids && client) { ids.userIDArray.map(async (id: string) => { - const embed = createBasicEmbed(msg, "ANNOUNCEMENT"); + const embed = new MessageEmbed() + .setColor("#7289da") + .setTitle(data.title) + .setDescription(data.body) + .setThumbnail( + "https://mozohack-mozofest-2022.s3.ap-south-1.amazonaws.com/mozohack/srmkzlla_logo.png" + ) + .setTimestamp() + .setFooter(CONSTANTS.FOOTER, CONSTANTS.FOOTER_LOGO_URL); const user = await client.users.fetch(id, false); user.send(embed); }); From 790e4db276f00224d22f1ee1d1cdea7dea303643 Mon Sep 17 00:00:00 2001 From: lakshya-dhariwal Date: Sun, 20 Feb 2022 22:53:31 +0530 Subject: [PATCH 15/20] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20move=20response=20to?= =?UTF-8?q?=20routes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/notifications/notifications.routes.ts | 4 ++-- src/api/notifications/notifications.service.ts | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/api/notifications/notifications.routes.ts b/src/api/notifications/notifications.routes.ts index 9461447..20e7344 100644 --- a/src/api/notifications/notifications.routes.ts +++ b/src/api/notifications/notifications.routes.ts @@ -15,11 +15,11 @@ const handleNotifications = async ( ) => { try { //TODO: call function from services - await notificationsService( + const response = await notificationsService( req.body as notificationsRequest, res as Response ); - + res.status(200).json(response); } catch (err) { next(err); } diff --git a/src/api/notifications/notifications.service.ts b/src/api/notifications/notifications.service.ts index 2d269e6..7015c40 100644 --- a/src/api/notifications/notifications.service.ts +++ b/src/api/notifications/notifications.service.ts @@ -57,11 +57,12 @@ export const notificationsService = async ( const user = await client.users.fetch(id, false); user.send(embed); }); - res.status(200).json({ + return { status: true, success: ids.successEmails, failed: ids.failedEmails, - }); + } + } } catch (error: any) { res.status(error.code || 500).json({ From 3333ef91441417b90f64f6405b35a542bbdbcbc0 Mon Sep 17 00:00:00 2001 From: lakshya-dhariwal Date: Mon, 21 Feb 2022 18:04:31 +0530 Subject: [PATCH 16/20] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20make=20few=20review?= =?UTF-8?q?=20changes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/notifications/notifications.routes.ts | 1 - src/api/notifications/notifications.service.ts | 12 ++++++------ src/utils/constants.ts | 3 +++ 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/api/notifications/notifications.routes.ts b/src/api/notifications/notifications.routes.ts index 20e7344..0797fad 100644 --- a/src/api/notifications/notifications.routes.ts +++ b/src/api/notifications/notifications.routes.ts @@ -14,7 +14,6 @@ const handleNotifications = async ( next: NextFunction ) => { try { - //TODO: call function from services const response = await notificationsService( req.body as notificationsRequest, res as Response diff --git a/src/api/notifications/notifications.service.ts b/src/api/notifications/notifications.service.ts index 7015c40..7dcfd4e 100644 --- a/src/api/notifications/notifications.service.ts +++ b/src/api/notifications/notifications.service.ts @@ -4,7 +4,7 @@ import { getDiscordBot } from "../../utils/discord"; import { notificationsRequest } from "./notifications.schema"; import { Response } from "express"; import { Client, MessageEmbed } from "discord.js"; -import { CONSTANTS } from "../../utils/constants"; +import { CONSTANTS } from '../../utils/constants'; export interface getDiscordIDSchema { userIDArray: Array; @@ -14,9 +14,9 @@ export interface getDiscordIDSchema { export const getDiscordID = async (emailArray: Array) => { const db = (await getDbClient()).db().collection(`jack-notifications`); - let userIDArray: string[] = []; - let failedEmails: string[] = []; - let successEmails: string[] = []; + const userIDArray: string[] = []; + const failedEmails: string[] = []; + const successEmails: string[] = []; try { for (let index = 0; index < emailArray.length; index++) { const user = await db.findOne({ @@ -46,11 +46,11 @@ export const notificationsService = async ( if (ids && client) { ids.userIDArray.map(async (id: string) => { const embed = new MessageEmbed() - .setColor("#7289da") + .setColor(CONSTANTS.PURPLE_COLOR_HEX) .setTitle(data.title) .setDescription(data.body) .setThumbnail( - "https://mozohack-mozofest-2022.s3.ap-south-1.amazonaws.com/mozohack/srmkzlla_logo.png" + CONSTANTS.SRMKZILLA_GRADIENT_LOGO ) .setTimestamp() .setFooter(CONSTANTS.FOOTER, CONSTANTS.FOOTER_LOGO_URL); diff --git a/src/utils/constants.ts b/src/utils/constants.ts index 2b7a5b5..2dd7b92 100644 --- a/src/utils/constants.ts +++ b/src/utils/constants.ts @@ -407,6 +407,9 @@ export const CONSTANTS = { FOOTER: "Powered by SRMKZILLA and hamster-charged batteries", SRMKZILLA_WHITE_LOGO: "https://jack.srmkzilla.net/assets/srmkzilla_logo_white_mono.png", + SRMKZILLA_GRADIENT_LOGO: + "https://mozohack-mozofest-2022.s3.ap-south-1.amazonaws.com/mozohack/srmkzlla_logo.png", + PURPLE_COLOR_HEX: "#7289da", certificateUserDirectMessage: (eventName: string, username: string) => new MessageEmbed() .setTitle(`${eventName} Certificates`) From 68ccc7b7f0e6891a79643dd8a97e6bed25599df2 Mon Sep 17 00:00:00 2001 From: Mohd Zaid Date: Mon, 21 Feb 2022 19:21:25 +0530 Subject: [PATCH 17/20] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20store=20user=20detai?= =?UTF-8?q?ls=20as=20object?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/notifications/notifications.schema.ts | 15 +++- .../notifications/notifications.service.ts | 72 +++++++++---------- 2 files changed, 48 insertions(+), 39 deletions(-) diff --git a/src/api/notifications/notifications.schema.ts b/src/api/notifications/notifications.schema.ts index 5d3f473..94ec95c 100644 --- a/src/api/notifications/notifications.schema.ts +++ b/src/api/notifications/notifications.schema.ts @@ -7,4 +7,17 @@ export const notificationsRequestSchema = yup.object({ body: yup.string().required(), }); -export type notificationsRequest = yup.InferType; \ No newline at end of file +export type notificationsRequest = yup.InferType< + typeof notificationsRequestSchema +>; + +export interface notificationUserSchema { + email: string; + discordID: string; +} + +export interface getDiscordUserDetailSchema { + userIDArray: Array; + failedEmails: Array; + successEmails: Array; +} diff --git a/src/api/notifications/notifications.service.ts b/src/api/notifications/notifications.service.ts index 7dcfd4e..6b93669 100644 --- a/src/api/notifications/notifications.service.ts +++ b/src/api/notifications/notifications.service.ts @@ -1,36 +1,32 @@ import { checkInDBSchema } from "../../models/event"; import { getDbClient } from "../../utils/database"; import { getDiscordBot } from "../../utils/discord"; -import { notificationsRequest } from "./notifications.schema"; +import { + notificationsRequest, + notificationUserSchema, +} from "./notifications.schema"; import { Response } from "express"; import { Client, MessageEmbed } from "discord.js"; -import { CONSTANTS } from '../../utils/constants'; - -export interface getDiscordIDSchema { - userIDArray: Array; - failedEmails: Array; - successEmails: Array; -} +import { CONSTANTS } from "../../utils/constants"; export const getDiscordID = async (emailArray: Array) => { const db = (await getDbClient()).db().collection(`jack-notifications`); - const userIDArray: string[] = []; + const userIDArray: notificationUserSchema[] = []; const failedEmails: string[] = []; - const successEmails: string[] = []; try { for (let index = 0; index < emailArray.length; index++) { + const userEmail = emailArray[index]; const user = await db.findOne({ - email: emailArray[index], + email: userEmail, }); if (!user) { - failedEmails.push(emailArray[index]); + failedEmails.push(userEmail); } else { - const userId = user.discordID; - userIDArray.push(userId); - successEmails.push(emailArray[index]); + const userID = user.discordID; + userIDArray.push({ email: userEmail, discordID: userID }); } } - return { userIDArray, failedEmails, successEmails }; + return { userIDArray, failedEmails }; } catch (err) { console.log(err); } @@ -41,33 +37,33 @@ export const notificationsService = async ( res: Response ) => { try { - const client: Client | undefined = await getDiscordBot(); - const ids: getDiscordIDSchema | undefined = await getDiscordID(data.emails); - if (ids && client) { - ids.userIDArray.map(async (id: string) => { - const embed = new MessageEmbed() - .setColor(CONSTANTS.PURPLE_COLOR_HEX) - .setTitle(data.title) - .setDescription(data.body) - .setThumbnail( - CONSTANTS.SRMKZILLA_GRADIENT_LOGO - ) - .setTimestamp() - .setFooter(CONSTANTS.FOOTER, CONSTANTS.FOOTER_LOGO_URL); - const user = await client.users.fetch(id, false); - user.send(embed); + const client = await getDiscordBot(); + const notificationArray = await getDiscordID(data.emails); + if (notificationArray?.userIDArray.length && client) { + notificationArray.userIDArray.map(async (userDetails) => { + try { + const embed = new MessageEmbed() + .setColor(CONSTANTS.PURPLE_COLOR_HEX) + .setTitle(data.title) + .setDescription(data.body) + .setThumbnail(CONSTANTS.SRMKZILLA_GRADIENT_LOGO) + .setTimestamp() + .setFooter(CONSTANTS.FOOTER, CONSTANTS.FOOTER_LOGO_URL); + const user = await client.users.fetch(userDetails.discordID, false); + await user.send(embed); + } catch (err) { + notificationArray.failedEmails.push(userDetails.email); + } }); return { status: true, - success: ids.successEmails, - failed: ids.failedEmails, - } - + failed: notificationArray.failedEmails, + }; } } catch (error: any) { - res.status(error.code || 500).json({ - status: false, + throw { + code: error.code || 500, message: error.message || "Internal Server Error", - }); + }; } }; From ce8a4b29a9d3c8b31ceba64320ad33916491746c Mon Sep 17 00:00:00 2001 From: Mohd Zaid Date: Mon, 21 Feb 2022 19:58:07 +0530 Subject: [PATCH 18/20] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Minor=20changes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/notifications/notifications.routes.ts | 5 +- .../notifications/notifications.service.ts | 77 +++++++++---------- 2 files changed, 39 insertions(+), 43 deletions(-) diff --git a/src/api/notifications/notifications.routes.ts b/src/api/notifications/notifications.routes.ts index 0797fad..75ce15f 100644 --- a/src/api/notifications/notifications.routes.ts +++ b/src/api/notifications/notifications.routes.ts @@ -15,10 +15,9 @@ const handleNotifications = async ( ) => { try { const response = await notificationsService( - req.body as notificationsRequest, - res as Response + req.body as notificationsRequest ); - res.status(200).json(response); + res.status(201).json(response); } catch (err) { next(err); } diff --git a/src/api/notifications/notifications.service.ts b/src/api/notifications/notifications.service.ts index 6b93669..9f90aed 100644 --- a/src/api/notifications/notifications.service.ts +++ b/src/api/notifications/notifications.service.ts @@ -5,61 +5,58 @@ import { notificationsRequest, notificationUserSchema, } from "./notifications.schema"; -import { Response } from "express"; -import { Client, MessageEmbed } from "discord.js"; +import { MessageEmbed } from "discord.js"; import { CONSTANTS } from "../../utils/constants"; export const getDiscordID = async (emailArray: Array) => { const db = (await getDbClient()).db().collection(`jack-notifications`); const userIDArray: notificationUserSchema[] = []; const failedEmails: string[] = []; - try { - for (let index = 0; index < emailArray.length; index++) { - const userEmail = emailArray[index]; - const user = await db.findOne({ - email: userEmail, - }); - if (!user) { - failedEmails.push(userEmail); - } else { - const userID = user.discordID; - userIDArray.push({ email: userEmail, discordID: userID }); - } + for (let index = 0; index < emailArray.length; index++) { + const userEmail = emailArray[index]; + const user = await db.findOne({ + email: userEmail, + }); + if (!user) { + failedEmails.push(userEmail); + } else { + const userID = user.discordID; + userIDArray.push({ email: userEmail, discordID: userID }); } - return { userIDArray, failedEmails }; - } catch (err) { - console.log(err); } + return { userIDArray, failedEmails }; }; -export const notificationsService = async ( - data: notificationsRequest, - res: Response -) => { +export const notificationsService = async (data: notificationsRequest) => { try { const client = await getDiscordBot(); const notificationArray = await getDiscordID(data.emails); + const failedUsers = notificationArray.failedEmails; if (notificationArray?.userIDArray.length && client) { - notificationArray.userIDArray.map(async (userDetails) => { - try { - const embed = new MessageEmbed() - .setColor(CONSTANTS.PURPLE_COLOR_HEX) - .setTitle(data.title) - .setDescription(data.body) - .setThumbnail(CONSTANTS.SRMKZILLA_GRADIENT_LOGO) - .setTimestamp() - .setFooter(CONSTANTS.FOOTER, CONSTANTS.FOOTER_LOGO_URL); - const user = await client.users.fetch(userDetails.discordID, false); - await user.send(embed); - } catch (err) { - notificationArray.failedEmails.push(userDetails.email); - } - }); - return { - status: true, - failed: notificationArray.failedEmails, - }; + const notification = await (Promise as any).allSettled( + notificationArray.userIDArray.map(async (userDetails) => { + try { + const embed = new MessageEmbed() + .setColor(CONSTANTS.PURPLE_COLOR_HEX) + .setTitle(data.title) + .setDescription(data.body) + .setThumbnail(CONSTANTS.SRMKZILLA_GRADIENT_LOGO) + .setTimestamp() + .setFooter(CONSTANTS.FOOTER, CONSTANTS.FOOTER_LOGO_URL); + const user = await client.users.fetch(userDetails.discordID, false); + await user.send(embed); + } catch (err) { + console.log(err); + failedUsers.push(userDetails.email); + console.log(userDetails.email, failedUsers); + } + }) + ); } + return { + status: true, + failed: failedUsers, + }; } catch (error: any) { throw { code: error.code || 500, From dadf6afd80e5fd3aa6722c373f4acbfa388fce97 Mon Sep 17 00:00:00 2001 From: Mohd Zaid Date: Mon, 21 Feb 2022 19:59:21 +0530 Subject: [PATCH 19/20] =?UTF-8?q?=F0=9F=94=87=20Remove=20error=20log?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/notifications/notifications.service.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/api/notifications/notifications.service.ts b/src/api/notifications/notifications.service.ts index 9f90aed..82cf7e8 100644 --- a/src/api/notifications/notifications.service.ts +++ b/src/api/notifications/notifications.service.ts @@ -46,9 +46,7 @@ export const notificationsService = async (data: notificationsRequest) => { const user = await client.users.fetch(userDetails.discordID, false); await user.send(embed); } catch (err) { - console.log(err); failedUsers.push(userDetails.email); - console.log(userDetails.email, failedUsers); } }) ); From 733e665750ae3d94951418661f892dbc02a24eb4 Mon Sep 17 00:00:00 2001 From: lakshya-dhariwal Date: Tue, 22 Feb 2022 16:20:01 +0530 Subject: [PATCH 20/20] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20move=20purple=5Fhex?= =?UTF-8?q?=20from=20constant=20to=20color?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/notifications/notifications.service.ts | 4 ++-- src/utils/constants.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/api/notifications/notifications.service.ts b/src/api/notifications/notifications.service.ts index 82cf7e8..849f309 100644 --- a/src/api/notifications/notifications.service.ts +++ b/src/api/notifications/notifications.service.ts @@ -6,7 +6,7 @@ import { notificationUserSchema, } from "./notifications.schema"; import { MessageEmbed } from "discord.js"; -import { CONSTANTS } from "../../utils/constants"; +import { COLORS, CONSTANTS } from "../../utils/constants"; export const getDiscordID = async (emailArray: Array) => { const db = (await getDbClient()).db().collection(`jack-notifications`); @@ -37,7 +37,7 @@ export const notificationsService = async (data: notificationsRequest) => { notificationArray.userIDArray.map(async (userDetails) => { try { const embed = new MessageEmbed() - .setColor(CONSTANTS.PURPLE_COLOR_HEX) + .setColor(COLORS.PURPLE_HEX) .setTitle(data.title) .setDescription(data.body) .setThumbnail(CONSTANTS.SRMKZILLA_GRADIENT_LOGO) diff --git a/src/utils/constants.ts b/src/utils/constants.ts index 2dd7b92..5666d07 100644 --- a/src/utils/constants.ts +++ b/src/utils/constants.ts @@ -409,7 +409,6 @@ export const CONSTANTS = { "https://jack.srmkzilla.net/assets/srmkzilla_logo_white_mono.png", SRMKZILLA_GRADIENT_LOGO: "https://mozohack-mozofest-2022.s3.ap-south-1.amazonaws.com/mozohack/srmkzlla_logo.png", - PURPLE_COLOR_HEX: "#7289da", certificateUserDirectMessage: (eventName: string, username: string) => new MessageEmbed() .setTitle(`${eventName} Certificates`) @@ -472,6 +471,7 @@ export const COLORS = { LEAVE_VOICE: "#ff0066", MOVE_VOICE: "#00ccff", REACTION_ROLE: "#bf00ff", + PURPLE_HEX: "#7289da", }; export const randomMemesEndpoint = () => {