From e00f7da1d15c479120161f082152826f73a60b8d Mon Sep 17 00:00:00 2001 From: chris Date: Wed, 14 Oct 2026 22:19:49 -0400 Subject: [PATCH] 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 --- apps/api/src/routes/safety.ts | 2 ++ apps/api/src/services/notifications.ts | 8 +++++++- apps/api/test/notifications.test.ts | 7 +++++++ docs/ANDROID-CI.md | 3 +++ 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/apps/api/src/routes/safety.ts b/apps/api/src/routes/safety.ts index 358c763..aabf626 100644 --- a/apps/api/src/routes/safety.ts +++ b/apps/api/src/routes/safety.ts @@ -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 }; }); diff --git a/apps/api/src/services/notifications.ts b/apps/api/src/services/notifications.ts index 6db59c9..00f046b 100644 --- a/apps/api/src/services/notifications.ts +++ b/apps/api/src/services/notifications.ts @@ -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; diff --git a/apps/api/test/notifications.test.ts b/apps/api/test/notifications.test.ts index c55591a..74e645a 100644 --- a/apps/api/test/notifications.test.ts +++ b/apps/api/test/notifications.test.ts @@ -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(); diff --git a/docs/ANDROID-CI.md b/docs/ANDROID-CI.md index c2e1a73..0e0bfe5 100644 --- a/docs/ANDROID-CI.md +++ b/docs/ANDROID-CI.md @@ -22,6 +22,9 @@ The pieces: The server needs about 8 GB of free memory during a build and about 15 GB of disk for the image and caches. A first build takes 30-40 minutes; later ones reuse the Gradle cache. +The caches are Docker volumes, which live wherever Docker keeps its data (usually `/var/lib/docker`). +Check that disk has room (`df -h /var/lib/docker`): if it fills up, everything else using Docker on the +server, including databases, stops writing. 1. **Turn on Actions** if it's off. In Gitea's `app.ini`, set: ```ini