From 0e4a111f81cceed275d9bec2695f6e401fb654d8 Mon Sep 17 00:00:00 2001 From: syuilo Date: Fri, 12 Nov 2021 02:02:25 +0900 Subject: refactoring Resolve #7779 --- .../src/server/api/endpoints/mute/create.ts | 83 ++++++++++++++++++++++ .../src/server/api/endpoints/mute/delete.ts | 73 +++++++++++++++++++ .../backend/src/server/api/endpoints/mute/list.ts | 49 +++++++++++++ 3 files changed, 205 insertions(+) create mode 100644 packages/backend/src/server/api/endpoints/mute/create.ts create mode 100644 packages/backend/src/server/api/endpoints/mute/delete.ts create mode 100644 packages/backend/src/server/api/endpoints/mute/list.ts (limited to 'packages/backend/src/server/api/endpoints/mute') diff --git a/packages/backend/src/server/api/endpoints/mute/create.ts b/packages/backend/src/server/api/endpoints/mute/create.ts new file mode 100644 index 0000000000..3fc64d3eba --- /dev/null +++ b/packages/backend/src/server/api/endpoints/mute/create.ts @@ -0,0 +1,83 @@ +import $ from 'cafy'; +import { ID } from '@/misc/cafy-id'; +import define from '../../define'; +import { ApiError } from '../../error'; +import { getUser } from '../../common/getters'; +import { genId } from '@/misc/gen-id'; +import { Mutings, NoteWatchings } from '@/models/index'; +import { Muting } from '@/models/entities/muting'; +import { publishUserEvent } from '@/services/stream'; + +export const meta = { + tags: ['account'], + + requireCredential: true as const, + + kind: 'write:mutes', + + params: { + userId: { + validator: $.type(ID), + }, + }, + + errors: { + noSuchUser: { + message: 'No such user.', + code: 'NO_SUCH_USER', + id: '6fef56f3-e765-4957-88e5-c6f65329b8a5' + }, + + muteeIsYourself: { + message: 'Mutee is yourself.', + code: 'MUTEE_IS_YOURSELF', + id: 'a4619cb2-5f23-484b-9301-94c903074e10' + }, + + alreadyMuting: { + message: 'You are already muting that user.', + code: 'ALREADY_MUTING', + id: '7e7359cb-160c-4956-b08f-4d1c653cd007' + }, + } +}; + +export default define(meta, async (ps, user) => { + const muter = user; + + // 自分自身 + if (user.id === ps.userId) { + throw new ApiError(meta.errors.muteeIsYourself); + } + + // Get mutee + const mutee = await getUser(ps.userId).catch(e => { + if (e.id === '15348ddd-432d-49c2-8a5a-8069753becff') throw new ApiError(meta.errors.noSuchUser); + throw e; + }); + + // Check if already muting + const exist = await Mutings.findOne({ + muterId: muter.id, + muteeId: mutee.id + }); + + if (exist != null) { + throw new ApiError(meta.errors.alreadyMuting); + } + + // Create mute + await Mutings.insert({ + id: genId(), + createdAt: new Date(), + muterId: muter.id, + muteeId: mutee.id, + } as Muting); + + publishUserEvent(user.id, 'mute', mutee); + + NoteWatchings.delete({ + userId: muter.id, + noteUserId: mutee.id + }); +}); diff --git a/packages/backend/src/server/api/endpoints/mute/delete.ts b/packages/backend/src/server/api/endpoints/mute/delete.ts new file mode 100644 index 0000000000..3ffd1f4562 --- /dev/null +++ b/packages/backend/src/server/api/endpoints/mute/delete.ts @@ -0,0 +1,73 @@ +import $ from 'cafy'; +import { ID } from '@/misc/cafy-id'; +import define from '../../define'; +import { ApiError } from '../../error'; +import { getUser } from '../../common/getters'; +import { Mutings } from '@/models/index'; +import { publishUserEvent } from '@/services/stream'; + +export const meta = { + tags: ['account'], + + requireCredential: true as const, + + kind: 'write:mutes', + + params: { + userId: { + validator: $.type(ID), + }, + }, + + errors: { + noSuchUser: { + message: 'No such user.', + code: 'NO_SUCH_USER', + id: 'b851d00b-8ab1-4a56-8b1b-e24187cb48ef' + }, + + muteeIsYourself: { + message: 'Mutee is yourself.', + code: 'MUTEE_IS_YOURSELF', + id: 'f428b029-6b39-4d48-a1d2-cc1ae6dd5cf9' + }, + + notMuting: { + message: 'You are not muting that user.', + code: 'NOT_MUTING', + id: '5467d020-daa9-4553-81e1-135c0c35a96d' + }, + } +}; + +export default define(meta, async (ps, user) => { + const muter = user; + + // Check if the mutee is yourself + if (user.id === ps.userId) { + throw new ApiError(meta.errors.muteeIsYourself); + } + + // Get mutee + const mutee = await getUser(ps.userId).catch(e => { + if (e.id === '15348ddd-432d-49c2-8a5a-8069753becff') throw new ApiError(meta.errors.noSuchUser); + throw e; + }); + + // Check not muting + const exist = await Mutings.findOne({ + muterId: muter.id, + muteeId: mutee.id + }); + + if (exist == null) { + throw new ApiError(meta.errors.notMuting); + } + + // Delete mute + await Mutings.delete({ + id: exist.id + }); + + publishUserEvent(user.id, 'unmute', mutee); +}); diff --git a/packages/backend/src/server/api/endpoints/mute/list.ts b/packages/backend/src/server/api/endpoints/mute/list.ts new file mode 100644 index 0000000000..ae4c3a719d --- /dev/null +++ b/packages/backend/src/server/api/endpoints/mute/list.ts @@ -0,0 +1,49 @@ +import $ from 'cafy'; +import { ID } from '@/misc/cafy-id'; +import define from '../../define'; +import { makePaginationQuery } from '../../common/make-pagination-query'; +import { Mutings } from '@/models/index'; + +export const meta = { + tags: ['account'], + + requireCredential: true as const, + + kind: 'read:mutes', + + params: { + limit: { + validator: $.optional.num.range(1, 100), + default: 30 + }, + + sinceId: { + validator: $.optional.type(ID), + }, + + untilId: { + validator: $.optional.type(ID), + }, + }, + + res: { + type: 'array' as const, + optional: false as const, nullable: false as const, + items: { + type: 'object' as const, + optional: false as const, nullable: false as const, + ref: 'Muting', + } + }, +}; + +export default define(meta, async (ps, me) => { + const query = makePaginationQuery(Mutings.createQueryBuilder('muting'), ps.sinceId, ps.untilId) + .andWhere(`muting.muterId = :meId`, { meId: me.id }); + + const mutings = await query + .take(ps.limit!) + .getMany(); + + return await Mutings.packMany(mutings, me); +}); -- cgit v1.2.3-freya