From 07ff0a6b5eaa90098a8ef5edcc263604ab781470 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Wed, 28 Jan 2026 22:14:35 +0100 Subject: [PATCH] feat(backend): db script disable notifications (#9131) --- backend/package.json | 4 +- backend/src/db/disable-notifications.ts | 61 +++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 backend/src/db/disable-notifications.ts diff --git a/backend/package.json b/backend/package.json index 945752503..48ae83019 100644 --- a/backend/package.json +++ b/backend/package.json @@ -23,10 +23,12 @@ "db:data:categories": "ts-node --require tsconfig-paths/register src/db/categories.ts", "db:migrate": "migrate --compiler 'ts:./src/db/compiler.ts' --migrations-dir ./src/db/migrations --store ./src/db/migrate/store.ts", "db:migrate:create": "migrate --compiler 'ts:./src/db/compiler.ts' --migrations-dir ./src/db/migrations --template-file ./src/db/migrate/template.ts --date-format 'yyyymmddHHmmss' create", + "db:func:disable:notifications": "ts-node --require tsconfig-paths/register src/db/disable-notifications.ts", "prod:migrate": "migrate --migrations-dir ./build/src/db/migrations --store ./build/src/db/migrate/store.js", "prod:db:data:branding": "node build/src/db/data-branding.js", "prod:db:data:categories": "node build/src/db/categories.js", - "prod:db:data:admin": "node build/src/db/admin.js" + "prod:db:data:admin": "node build/src/db/admin.js", + "prod:db:func:disable:notifications": "node build/src/db/disable-notifications.js" }, "dependencies": { "@aws-sdk/client-s3": "^3.975.0", diff --git a/backend/src/db/disable-notifications.ts b/backend/src/db/disable-notifications.ts new file mode 100644 index 000000000..344c835a4 --- /dev/null +++ b/backend/src/db/disable-notifications.ts @@ -0,0 +1,61 @@ +import databaseContext from '@context/database' + +const run = async () => { + const args = process.argv.slice(2) + + if (args.length !== 1) { + // eslint-disable-next-line no-console + console.error('Usage: yarn run db:func:disable-notifications ') + // eslint-disable-next-line n/no-process-exit + process.exit(1) + } + + const email = args[0] + + const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/ + if (!emailRegex.test(email)) { + // eslint-disable-next-line no-console + console.error('Error: Invalid email address format') + // eslint-disable-next-line n/no-process-exit + process.exit(1) + } + + const { write } = databaseContext() + + const result = ( + await write({ + query: ` + MATCH (:EmailAddress {email: $email})-[:BELONGS_TO]->(user:User) + SET user.emailNotificationsFollowingUsers = false + SET user.emailNotificationsPostInGroup = false + SET user.emailNotificationsCommentOnObservedPost = false + SET user.emailNotificationsMention = false + SET user.emailNotificationsChatMessage = false + SET user.emailNotificationsGroupMemberJoined = false + SET user.emailNotificationsGroupMemberLeft = false + SET user.emailNotificationsGroupMemberRemoved = false + SET user.emailNotificationsGroupMemberRoleChanged = false + RETURN toString(count(user)) as count + `, + variables: { + email, + }, + }) + ).records[0].get('count') as string + + if (result !== '1') { + // eslint-disable-next-line no-console + console.error(`User with email address ${email} not found`) + // eslint-disable-next-line n/no-process-exit + process.exit(1) + } + + // eslint-disable-next-line no-console + console.log(`Notifications for User with email address ${email} disabled`) + // eslint-disable-next-line n/no-process-exit + process.exit(0) +} + +void (async function () { + await run() +})()