Blocking someone removes notifications between you

Also note in the CI guide that the build caches need disk space where
Docker keeps its data.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-14 22:19:49 -04:00
co-authored by Claude Opus 5.5
parent f112a3515c
commit e00f7da1d1
4 changed files with 19 additions and 1 deletions
+2
View File
@@ -9,6 +9,7 @@ import { db, schema } from '../db';
import { requireUser } from '../lib/auth';
import { HttpError } from '../lib/http';
import { FOLLOWS_CHANGED_CHANNEL, redis } from '../lib/redis';
import { removeNotificationsBetween } from '../services/notifications';
import { toUserSummary } from '../services/nowPlaying';
import { removeReactionsBetween } from './reactions';
@@ -48,6 +49,7 @@ export async function safetyRoutes(app: FastifyInstance) {
);
});
await removeReactionsBetween(me.id, them.id);
await removeNotificationsBetween(me.id, them.id);
await followsChanged(me.id, them.id);
return { ok: true };
});
+7 -1
View File
@@ -1,4 +1,4 @@
import { and, desc, eq, gt, inArray, isNull, lt } from 'drizzle-orm';
import { and, desc, eq, gt, inArray, isNull, lt, or } from 'drizzle-orm';
import webpush from 'web-push';
import {
notificationPath,
@@ -61,6 +61,12 @@ export async function notify(input: {
return row!.id;
}
/** After a block: neither sees notifications from the other any more. */
export async function removeNotificationsBetween(a: string, b: string) {
const n = schema.notifications;
await db.delete(n).where(or(and(eq(n.userId, a), eq(n.actorId, b)), and(eq(n.userId, b), eq(n.actorId, a))));
}
/** Take back a reaction's notification when the reaction is removed (if it hasn't been seen). */
export async function unnotifyReaction(userId: string, actorId: string, listenId: string) {
const n = schema.notifications;
+7
View File
@@ -67,6 +67,13 @@ describe('notifications', () => {
expect((await inbox(bob.token)).unread).toBe(0);
});
it('blocking removes notifications between the two', async () => {
const { alice } = await setup();
expect((await inbox(alice.token)).notifications).toHaveLength(1);
await app().inject({ method: 'POST', url: '/users/bob/block', headers: bearer(alice.token), payload: {} });
expect((await inbox(alice.token)).notifications).toHaveLength(0);
});
it('saves notification settings', async () => {
const { alice } = await setup();
const me = (await app().inject({ method: 'PATCH', url: '/me', headers: bearer(alice.token), payload: { notifyPrefs: { follow: false } } })).json();