89
									
								
								packages/backend/src/server/api/endpoints/blocking/create.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								packages/backend/src/server/api/endpoints/blocking/create.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,89 @@ | ||||
| import $ from 'cafy'; | ||||
| import { ID } from '@/misc/cafy-id'; | ||||
| import * as ms from 'ms'; | ||||
| import create from '@/services/blocking/create'; | ||||
| import define from '../../define'; | ||||
| import { ApiError } from '../../error'; | ||||
| import { getUser } from '../../common/getters'; | ||||
| import { Blockings, NoteWatchings, Users } from '@/models/index'; | ||||
|  | ||||
| export const meta = { | ||||
| 	tags: ['account'], | ||||
|  | ||||
| 	limit: { | ||||
| 		duration: ms('1hour'), | ||||
| 		max: 100 | ||||
| 	}, | ||||
|  | ||||
| 	requireCredential: true as const, | ||||
|  | ||||
| 	kind: 'write:blocks', | ||||
|  | ||||
| 	params: { | ||||
| 		userId: { | ||||
| 			validator: $.type(ID), | ||||
| 		} | ||||
| 	}, | ||||
|  | ||||
| 	errors: { | ||||
| 		noSuchUser: { | ||||
| 			message: 'No such user.', | ||||
| 			code: 'NO_SUCH_USER', | ||||
| 			id: '7cc4f851-e2f1-4621-9633-ec9e1d00c01e' | ||||
| 		}, | ||||
|  | ||||
| 		blockeeIsYourself: { | ||||
| 			message: 'Blockee is yourself.', | ||||
| 			code: 'BLOCKEE_IS_YOURSELF', | ||||
| 			id: '88b19138-f28d-42c0-8499-6a31bbd0fdc6' | ||||
| 		}, | ||||
|  | ||||
| 		alreadyBlocking: { | ||||
| 			message: 'You are already blocking that user.', | ||||
| 			code: 'ALREADY_BLOCKING', | ||||
| 			id: '787fed64-acb9-464a-82eb-afbd745b9614' | ||||
| 		}, | ||||
| 	}, | ||||
|  | ||||
| 	res: { | ||||
| 		type: 'object' as const, | ||||
| 		optional: false as const, nullable: false as const, | ||||
| 		ref: 'User' | ||||
| 	} | ||||
| }; | ||||
|  | ||||
| export default define(meta, async (ps, user) => { | ||||
| 	const blocker = await Users.findOneOrFail(user.id); | ||||
|  | ||||
| 	// 自分自身 | ||||
| 	if (user.id === ps.userId) { | ||||
| 		throw new ApiError(meta.errors.blockeeIsYourself); | ||||
| 	} | ||||
|  | ||||
| 	// Get blockee | ||||
| 	const blockee = 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 blocking | ||||
| 	const exist = await Blockings.findOne({ | ||||
| 		blockerId: blocker.id, | ||||
| 		blockeeId: blockee.id | ||||
| 	}); | ||||
|  | ||||
| 	if (exist != null) { | ||||
| 		throw new ApiError(meta.errors.alreadyBlocking); | ||||
| 	} | ||||
|  | ||||
| 	await create(blocker, blockee); | ||||
|  | ||||
| 	NoteWatchings.delete({ | ||||
| 		userId: blocker.id, | ||||
| 		noteUserId: blockee.id | ||||
| 	}); | ||||
|  | ||||
| 	return await Users.pack(blockee.id, blocker, { | ||||
| 		detail: true | ||||
| 	}); | ||||
| }); | ||||
							
								
								
									
										85
									
								
								packages/backend/src/server/api/endpoints/blocking/delete.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								packages/backend/src/server/api/endpoints/blocking/delete.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,85 @@ | ||||
| import $ from 'cafy'; | ||||
| import { ID } from '@/misc/cafy-id'; | ||||
| import * as ms from 'ms'; | ||||
| import deleteBlocking from '@/services/blocking/delete'; | ||||
| import define from '../../define'; | ||||
| import { ApiError } from '../../error'; | ||||
| import { getUser } from '../../common/getters'; | ||||
| import { Blockings, Users } from '@/models/index'; | ||||
|  | ||||
| export const meta = { | ||||
| 	tags: ['account'], | ||||
|  | ||||
| 	limit: { | ||||
| 		duration: ms('1hour'), | ||||
| 		max: 100 | ||||
| 	}, | ||||
|  | ||||
| 	requireCredential: true as const, | ||||
|  | ||||
| 	kind: 'write:blocks', | ||||
|  | ||||
| 	params: { | ||||
| 		userId: { | ||||
| 			validator: $.type(ID), | ||||
| 		} | ||||
| 	}, | ||||
|  | ||||
| 	errors: { | ||||
| 		noSuchUser: { | ||||
| 			message: 'No such user.', | ||||
| 			code: 'NO_SUCH_USER', | ||||
| 			id: '8621d8bf-c358-4303-a066-5ea78610eb3f' | ||||
| 		}, | ||||
|  | ||||
| 		blockeeIsYourself: { | ||||
| 			message: 'Blockee is yourself.', | ||||
| 			code: 'BLOCKEE_IS_YOURSELF', | ||||
| 			id: '06f6fac6-524b-473c-a354-e97a40ae6eac' | ||||
| 		}, | ||||
|  | ||||
| 		notBlocking: { | ||||
| 			message: 'You are not blocking that user.', | ||||
| 			code: 'NOT_BLOCKING', | ||||
| 			id: '291b2efa-60c6-45c0-9f6a-045c8f9b02cd' | ||||
| 		}, | ||||
| 	}, | ||||
|  | ||||
| 	res: { | ||||
| 		type: 'object' as const, | ||||
| 		optional: false as const, nullable: false as const, | ||||
| 		ref: 'User', | ||||
| 	}, | ||||
| }; | ||||
|  | ||||
| export default define(meta, async (ps, user) => { | ||||
| 	const blocker = await Users.findOneOrFail(user.id); | ||||
|  | ||||
| 	// Check if the blockee is yourself | ||||
| 	if (user.id === ps.userId) { | ||||
| 		throw new ApiError(meta.errors.blockeeIsYourself); | ||||
| 	} | ||||
|  | ||||
| 	// Get blockee | ||||
| 	const blockee = await getUser(ps.userId).catch(e => { | ||||
| 		if (e.id === '15348ddd-432d-49c2-8a5a-8069753becff') throw new ApiError(meta.errors.noSuchUser); | ||||
| 		throw e; | ||||
| 	}); | ||||
|  | ||||
| 	// Check not blocking | ||||
| 	const exist = await Blockings.findOne({ | ||||
| 		blockerId: blocker.id, | ||||
| 		blockeeId: blockee.id | ||||
| 	}); | ||||
|  | ||||
| 	if (exist == null) { | ||||
| 		throw new ApiError(meta.errors.notBlocking); | ||||
| 	} | ||||
|  | ||||
| 	// Delete blocking | ||||
| 	await deleteBlocking(blocker, blockee); | ||||
|  | ||||
| 	return await Users.pack(blockee.id, blocker, { | ||||
| 		detail: true | ||||
| 	}); | ||||
| }); | ||||
							
								
								
									
										49
									
								
								packages/backend/src/server/api/endpoints/blocking/list.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								packages/backend/src/server/api/endpoints/blocking/list.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,49 @@ | ||||
| import $ from 'cafy'; | ||||
| import { ID } from '@/misc/cafy-id'; | ||||
| import define from '../../define'; | ||||
| import { Blockings } from '@/models/index'; | ||||
| import { makePaginationQuery } from '../../common/make-pagination-query'; | ||||
|  | ||||
| export const meta = { | ||||
| 	tags: ['account'], | ||||
|  | ||||
| 	requireCredential: true as const, | ||||
|  | ||||
| 	kind: 'read:blocks', | ||||
|  | ||||
| 	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: 'Blocking', | ||||
| 		} | ||||
| 	}, | ||||
| }; | ||||
|  | ||||
| export default define(meta, async (ps, me) => { | ||||
| 	const query = makePaginationQuery(Blockings.createQueryBuilder('blocking'), ps.sinceId, ps.untilId) | ||||
| 		.andWhere(`blocking.blockerId = :meId`, { meId: me.id }); | ||||
|  | ||||
| 	const blockings = await query | ||||
| 		.take(ps.limit!) | ||||
| 		.getMany(); | ||||
|  | ||||
| 	return await Blockings.packMany(blockings, me); | ||||
| }); | ||||
		Reference in New Issue
	
	Block a user
	 syuilo
					syuilo