mirror of
https://github.com/awatertrevi/infisical.git
synced 2026-09-22 13:39:35 +00:00
Added secret reminder service
This commit is contained in:
committed by
Akhil Mohan
parent
e4f00f74e9
commit
987f0c9081
1
backend-pg/src/services/secret-reminder/index.ts
Normal file
1
backend-pg/src/services/secret-reminder/index.ts
Normal file
@@ -0,0 +1 @@
|
||||
export { secretReminderServiceFactory } from "./secret-reminder-service";
|
||||
@@ -0,0 +1,101 @@
|
||||
import { BadRequestError } from "@app/lib/errors";
|
||||
import { logger } from "@app/lib/logger";
|
||||
|
||||
import { TSecretReminderQueueFactory } from "./secret-reminder-queue";
|
||||
import {
|
||||
TCreateSecretReminderDTO,
|
||||
TDeleteSecretReminderDTO,
|
||||
THandleReminderDTO
|
||||
} from "./secret-reminder-types";
|
||||
|
||||
type TSecretReminderServiceFactoryDep = {
|
||||
secretReminderQueue: TSecretReminderQueueFactory;
|
||||
};
|
||||
|
||||
export type TSecretReminderServiceFactory = ReturnType<typeof secretReminderServiceFactory>;
|
||||
|
||||
export const secretReminderServiceFactory = ({
|
||||
secretReminderQueue
|
||||
}: TSecretReminderServiceFactoryDep) => {
|
||||
const createReminder = async ({ oldSecret, newSecret, projectId }: TCreateSecretReminderDTO) => {
|
||||
try {
|
||||
if (oldSecret.id !== newSecret.id) {
|
||||
throw new BadRequestError({
|
||||
name: "SecretReminderIdMismatch",
|
||||
message: "Existing secret didn't match the updated secret ID."
|
||||
});
|
||||
}
|
||||
|
||||
if (!newSecret.secretReminderRepeatDays) {
|
||||
throw new BadRequestError({
|
||||
name: "SecretReminderRepeatDaysMissing",
|
||||
message: "Secret reminder repeat days is missing."
|
||||
});
|
||||
}
|
||||
|
||||
// If the secret already has a reminder, we should remove the existing one first.
|
||||
if (oldSecret.secretReminderRepeatDays) {
|
||||
await secretReminderQueue.removeFromQueue(oldSecret.id, oldSecret.secretReminderRepeatDays);
|
||||
}
|
||||
|
||||
await secretReminderQueue.addToQueue({
|
||||
note: newSecret.secretReminderNote,
|
||||
projectId,
|
||||
repeatDays: newSecret.secretReminderRepeatDays,
|
||||
secretId: newSecret.id
|
||||
});
|
||||
} catch (err) {
|
||||
logger.error(err, "Failed to create secret reminder.");
|
||||
throw new BadRequestError({
|
||||
name: "SecretReminderCreateFailed",
|
||||
message: "Failed to create secret reminder."
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
const deleteReminder = async ({ secretId, repeatDays }: TDeleteSecretReminderDTO) => {
|
||||
try {
|
||||
await secretReminderQueue.removeFromQueue(secretId, repeatDays);
|
||||
} catch (err) {
|
||||
logger.error(err, "Failed to remove secret reminder from queue.");
|
||||
throw new BadRequestError({
|
||||
name: "SecretReminderDeleteFailed",
|
||||
message: "Failed to delete secret reminder."
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
// A handler function to cut down on code duplication in the future.
|
||||
const handleReminder = async ({ newSecret, oldSecret, projectId }: THandleReminderDTO) => {
|
||||
const { secretReminderRepeatDays, secretReminderNote } = newSecret;
|
||||
|
||||
if (newSecret.type !== "personal" && secretReminderRepeatDays !== undefined) {
|
||||
if (
|
||||
(secretReminderRepeatDays &&
|
||||
oldSecret.secretReminderRepeatDays !== secretReminderRepeatDays) ||
|
||||
(secretReminderNote && oldSecret.secretReminderNote !== secretReminderNote)
|
||||
) {
|
||||
await createReminder({
|
||||
oldSecret,
|
||||
newSecret,
|
||||
projectId
|
||||
});
|
||||
} else if (
|
||||
secretReminderRepeatDays === null &&
|
||||
secretReminderNote === null &&
|
||||
oldSecret.secretReminderRepeatDays
|
||||
) {
|
||||
await deleteReminder({
|
||||
secretId: oldSecret.id,
|
||||
repeatDays: oldSecret.secretReminderRepeatDays
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
return {
|
||||
createReminder,
|
||||
deleteReminder,
|
||||
handleReminder
|
||||
};
|
||||
};
|
||||
Reference in New Issue
Block a user