diff --git a/packages/backend/src/server/api/endpoints/mute/create.ts b/packages/backend/src/server/api/endpoints/mute/create.ts index 01af0d656..683a9bd25 100644 --- a/packages/backend/src/server/api/endpoints/mute/create.ts +++ b/packages/backend/src/server/api/endpoints/mute/create.ts @@ -5,6 +5,7 @@ import { publishUserEvent } from '@/services/stream.js'; import define from '@/server/api/define.js'; import { ApiError } from '@/server/api/error.js'; import { getUser } from '@/server/api/common/getters.js'; +import { createMute } from '@/services/mute/create.js'; export const meta = { tags: ['account'], @@ -51,19 +52,7 @@ export default define(meta, paramDef, async (ps, user) => { return; } - // Create mute - await Mutings.insert({ - id: genId(), - createdAt: new Date(), - expiresAt: ps.expiresAt ? new Date(ps.expiresAt) : null, - muterId: muter.id, - muteeId: mutee.id, - } as Muting); + const expiresAt = ps.expiresAt ? new Date(ps.expiresAt) : null; - publishUserEvent(user.id, 'mute', mutee); - - NoteWatchings.delete({ - userId: muter.id, - noteUserId: mutee.id, - }); + await createMute(muter, mutee, expiresAt); }); diff --git a/packages/backend/src/services/mute/create.ts b/packages/backend/src/services/mute/create.ts new file mode 100644 index 000000000..d12d76fdb --- /dev/null +++ b/packages/backend/src/services/mute/create.ts @@ -0,0 +1,33 @@ +import { genId } from '@/misc/gen-id.js'; +import { Mutings, NoteWatchings } from '@/models/index.js'; +import { Muting } from '@/models/entities/muting.js'; +import { publishUserEvent } from '@/services/stream.js'; +import { User } from '@/models/entities/user.js'; + +export async function createMute(muter: User, mutee: User, expiresAt: Date | null): Promise { + if (expiresAt && ps.expiresAt <= Date.now()) { + return; + } + + await Promise.all([ + // Create mute + Mutings.insert({ + id: genId(), + createdAt: new Date(), + expiresAt, + muterId: muter.id, + muteeId: mutee.id, + } as Muting), + removeWatchings(muter, mutee), + removeWatchings(mutee, muter), + ]); + + publishUserEvent(user.id, 'mute', mutee); +}); + +async function removeWatchings(watcher: User, watched: User): Promise { + await NoteWatchings.delete({ + userId: watcher.id, + noteUserId: watched.id, + }); +}