From edd78eaeba0ab130ba62bd40451d28fa7ecf5d62 Mon Sep 17 00:00:00 2001 From: Daniel Hougaard <62331820+DanielHougaard@users.noreply.github.com> Date: Mon, 22 Jan 2024 23:54:21 +0400 Subject: [PATCH] Refactor --- backend-pg/src/queue/queue-service.ts | 4 ++ backend-pg/src/server/routes/index.ts | 6 +- .../src/services/secret/secret-queue.ts | 62 ++++++++++++++++++- 3 files changed, 69 insertions(+), 3 deletions(-) diff --git a/backend-pg/src/queue/queue-service.ts b/backend-pg/src/queue/queue-service.ts index b3c7070ac..8e3b54498 100644 --- a/backend-pg/src/queue/queue-service.ts +++ b/backend-pg/src/queue/queue-service.ts @@ -112,6 +112,10 @@ export const queueServiceFactory = (redisUrl: string) => { opts: JobsOptions & { jobId?: string } ) => { const q = queueContainer[name]; + + console.log("name", name); + console.log("query", q); + await q.add(job, data, opts); }; diff --git a/backend-pg/src/server/routes/index.ts b/backend-pg/src/server/routes/index.ts index 5e5abfcb4..4d0886426 100644 --- a/backend-pg/src/server/routes/index.ts +++ b/backend-pg/src/server/routes/index.ts @@ -350,7 +350,11 @@ export const registerRoutes = async ( integrationDAL, secretImportDAL, projectEnvDAL, - webhookDAL + webhookDAL, + orgDAL, + projectMembershipDAL, + smtpService, + projectDAL }); const secretService = secretServiceFactory({ diff --git a/backend-pg/src/services/secret/secret-queue.ts b/backend-pg/src/services/secret/secret-queue.ts index 910899f3d..5648e16fe 100644 --- a/backend-pg/src/services/secret/secret-queue.ts +++ b/backend-pg/src/services/secret/secret-queue.ts @@ -10,11 +10,15 @@ import { QueueJobs, QueueName, TQueueServiceFactory } from "@app/queue"; import { TIntegrationDALFactory } from "../integration/integration-dal"; import { TIntegrationAuthServiceFactory } from "../integration-auth/integration-auth-service"; import { syncIntegrationSecrets } from "../integration-auth/integration-sync-secret"; +import { TOrgDALFactory } from "../org/org-dal"; +import { TProjectDALFactory } from "../project/project-dal"; import { TProjectBotServiceFactory } from "../project-bot/project-bot-service"; import { TProjectEnvDALFactory } from "../project-env/project-env-dal"; +import { TProjectMembershipDALFactory } from "../project-membership/project-membership-dal"; import { TSecretFolderDALFactory } from "../secret-folder/secret-folder-dal"; import { TSecretImportDALFactory } from "../secret-import/secret-import-dal"; import { fnSecretsFromImports } from "../secret-import/secret-import-fns"; +import { SmtpTemplates, TSmtpService } from "../smtp/smtp-service"; import { TWebhookDALFactory } from "../webhook/webhook-dal"; import { fnTriggerWebhook } from "../webhook/webhook-fns"; import { TSecretDALFactory } from "./secret-dal"; @@ -37,6 +41,10 @@ type TSecretQueueFactoryDep = { secretImportDAL: Pick; webhookDAL: Pick; projectEnvDAL: Pick; + projectDAL: Pick; + projectMembershipDAL: Pick; + smtpService: TSmtpService; + orgDAL: Pick; }; export type TGetSecrets = { @@ -54,7 +62,11 @@ export const secretQueueFactory = ({ secretImportDAL, folderDAL, webhookDAL, - projectEnvDAL + projectEnvDAL, + orgDAL, + smtpService, + projectDAL, + projectMembershipDAL }: TSecretQueueFactoryDep) => { const syncIntegrations = async (dto: TGetSecrets) => { await queueService.queue(QueueName.IntegrationSync, QueueJobs.IntegrationSync, dto, { @@ -124,6 +136,8 @@ export const secretQueueFactory = ({ }); } + console.log("Secret reminder thingies:)!"); + console.log(queueService); // If the secret already has a reminder, we should remove the existing one first. if (oldSecret.secretReminderRepeatDays) { await removeSecretReminder({ @@ -148,7 +162,8 @@ export const secretQueueFactory = ({ every: appCfg.NODE_ENV === "development" ? secondsToMillis(newSecret.secretReminderRepeatDays) - : daysToMillisecond(newSecret.secretReminderRepeatDays) + : daysToMillisecond(newSecret.secretReminderRepeatDays), + immediately: true } } ); @@ -331,6 +346,49 @@ export const secretQueueFactory = ({ logger.info("Secret integration sync ended", job.id); }); + queueService.start(QueueName.SecretReminder, async ({ data }) => { + logger.info(`secretReminderQueue.process: [secretDocument=${data.secretId}]`); + + const { projectId } = data; + + const organization = await orgDAL.findOrgByProjectId(projectId); + const project = await projectDAL.findById(projectId); + + if (!organization) { + logger.info( + `secretReminderQueue.process: [secretDocument=${data.secretId}] no organization found` + ); + return; + } + + if (!project) { + logger.info( + `secretReminderQueue.process: [secretDocument=${data.secretId}] no project found` + ); + return; + } + + const projectMembers = await projectMembershipDAL.findAllProjectMembers(projectId); + + if (!projectMembers || !projectMembers.length) { + logger.info( + `secretReminderQueue.process: [secretDocument=${data.secretId}] no project members found` + ); + return; + } + + await smtpService.sendMail({ + template: SmtpTemplates.SecretReminder, + subjectLine: "Infisical secret reminder", + recipients: [...projectMembers.map((m) => m.user.email)], + substitutions: { + reminderNote: data.note, // May not be present. + projectName: project.name, + organizationName: organization.name + } + }); + }); + queueService.listen(QueueName.IntegrationSync, "failed", (job, err) => { logger.error("Failed to sync integration", job?.data, err); });