wip
This commit is contained in:
		@@ -7,6 +7,7 @@ import type { Blocking } from '@/models/entities/Blocking.js';
 | 
			
		||||
import type { User } from '@/models/entities/User.js';
 | 
			
		||||
import { bindThis } from '@/decorators.js';
 | 
			
		||||
import { UserEntityService } from './UserEntityService.js';
 | 
			
		||||
import { Serialized } from 'schema-type';
 | 
			
		||||
 | 
			
		||||
@Injectable()
 | 
			
		||||
export class BlockingEntityService {
 | 
			
		||||
@@ -22,7 +23,7 @@ export class BlockingEntityService {
 | 
			
		||||
	public async pack(
 | 
			
		||||
		src: Blocking['id'] | Blocking,
 | 
			
		||||
		me?: { id: User['id'] } | null | undefined,
 | 
			
		||||
	): Promise<Packed<'Blocking'>> {
 | 
			
		||||
	): Promise<Serialized<Packed<'Blocking'>>> {
 | 
			
		||||
		const blocking = typeof src === 'object' ? src : await this.blockingsRepository.findOneByOrFail({ id: src });
 | 
			
		||||
 | 
			
		||||
		return await awaitAll({
 | 
			
		||||
@@ -39,7 +40,7 @@ export class BlockingEntityService {
 | 
			
		||||
	public packMany(
 | 
			
		||||
		blockings: any[],
 | 
			
		||||
		me: { id: User['id'] },
 | 
			
		||||
	) {
 | 
			
		||||
	): Promise<Serialized<Packed<'Blocking'>>[]> {
 | 
			
		||||
		return Promise.all(blockings.map(x => this.pack(x, me)));
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -8,56 +8,10 @@ import { DI } from '@/di-symbols.js';
 | 
			
		||||
import { ApiError } from '../../error.js';
 | 
			
		||||
import { GetterService } from '@/server/api/GetterService.js';
 | 
			
		||||
 | 
			
		||||
export const meta = {
 | 
			
		||||
	tags: ['account'],
 | 
			
		||||
 | 
			
		||||
	limit: {
 | 
			
		||||
		duration: ms('1hour'),
 | 
			
		||||
		max: 100,
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	requireCredential: true,
 | 
			
		||||
 | 
			
		||||
	kind: 'write:blocks',
 | 
			
		||||
 | 
			
		||||
	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',
 | 
			
		||||
		optional: false, nullable: false,
 | 
			
		||||
		ref: 'UserDetailedNotMe',
 | 
			
		||||
	},
 | 
			
		||||
} as const;
 | 
			
		||||
 | 
			
		||||
export const paramDef = {
 | 
			
		||||
	type: 'object',
 | 
			
		||||
	properties: {
 | 
			
		||||
		userId: { type: 'string', format: 'misskey:id' },
 | 
			
		||||
	},
 | 
			
		||||
	required: ['userId'],
 | 
			
		||||
} as const;
 | 
			
		||||
 | 
			
		||||
// eslint-disable-next-line import/no-default-export
 | 
			
		||||
@Injectable()
 | 
			
		||||
export default class extends Endpoint<typeof meta, typeof paramDef> {
 | 
			
		||||
export default class extends Endpoint<'blocking/delete'> {
 | 
			
		||||
	name = 'blocking/delete' as const;
 | 
			
		||||
	constructor(
 | 
			
		||||
		@Inject(DI.usersRepository)
 | 
			
		||||
		private usersRepository: UsersRepository,
 | 
			
		||||
@@ -69,17 +23,17 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
 | 
			
		||||
		private getterService: GetterService,
 | 
			
		||||
		private userBlockingService: UserBlockingService,
 | 
			
		||||
	) {
 | 
			
		||||
		super(meta, paramDef, async (ps, me) => {
 | 
			
		||||
		super(async (ps, me) => {
 | 
			
		||||
			const blocker = await this.usersRepository.findOneByOrFail({ id: me.id });
 | 
			
		||||
 | 
			
		||||
			// Check if the blockee is yourself
 | 
			
		||||
			if (me.id === ps.userId) {
 | 
			
		||||
				throw new ApiError(meta.errors.blockeeIsYourself);
 | 
			
		||||
				throw new ApiError(this.meta.errors.blockeeIsYourself);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			// Get blockee
 | 
			
		||||
			const blockee = await this.getterService.getUser(ps.userId).catch(err => {
 | 
			
		||||
				if (err.id === '15348ddd-432d-49c2-8a5a-8069753becff') throw new ApiError(meta.errors.noSuchUser);
 | 
			
		||||
				if (err.id === '15348ddd-432d-49c2-8a5a-8069753becff') throw new ApiError(this.meta.errors.noSuchUser);
 | 
			
		||||
				throw err;
 | 
			
		||||
			});
 | 
			
		||||
 | 
			
		||||
@@ -90,7 +44,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
 | 
			
		||||
			});
 | 
			
		||||
 | 
			
		||||
			if (exist == null) {
 | 
			
		||||
				throw new ApiError(meta.errors.notBlocking);
 | 
			
		||||
				throw new ApiError(this.meta.errors.notBlocking);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			// Delete blocking
 | 
			
		||||
 
 | 
			
		||||
@@ -5,37 +5,10 @@ import { QueryService } from '@/core/QueryService.js';
 | 
			
		||||
import { BlockingEntityService } from '@/core/entities/BlockingEntityService.js';
 | 
			
		||||
import { DI } from '@/di-symbols.js';
 | 
			
		||||
 | 
			
		||||
export const meta = {
 | 
			
		||||
	tags: ['account'],
 | 
			
		||||
 | 
			
		||||
	requireCredential: true,
 | 
			
		||||
 | 
			
		||||
	kind: 'read:blocks',
 | 
			
		||||
 | 
			
		||||
	res: {
 | 
			
		||||
		type: 'array',
 | 
			
		||||
		optional: false, nullable: false,
 | 
			
		||||
		items: {
 | 
			
		||||
			type: 'object',
 | 
			
		||||
			optional: false, nullable: false,
 | 
			
		||||
			ref: 'Blocking',
 | 
			
		||||
		},
 | 
			
		||||
	},
 | 
			
		||||
} as const;
 | 
			
		||||
 | 
			
		||||
export const paramDef = {
 | 
			
		||||
	type: 'object',
 | 
			
		||||
	properties: {
 | 
			
		||||
		limit: { type: 'integer', minimum: 1, maximum: 100, default: 30 },
 | 
			
		||||
		sinceId: { type: 'string', format: 'misskey:id' },
 | 
			
		||||
		untilId: { type: 'string', format: 'misskey:id' },
 | 
			
		||||
	},
 | 
			
		||||
	required: [],
 | 
			
		||||
} as const;
 | 
			
		||||
 | 
			
		||||
// eslint-disable-next-line import/no-default-export
 | 
			
		||||
@Injectable()
 | 
			
		||||
export default class extends Endpoint<typeof meta, typeof paramDef> {
 | 
			
		||||
export default class extends Endpoint<'blocking/list'> {
 | 
			
		||||
	name = 'blocking/list' as const;
 | 
			
		||||
	constructor(
 | 
			
		||||
		@Inject(DI.blockingsRepository)
 | 
			
		||||
		private blockingsRepository: BlockingsRepository,
 | 
			
		||||
@@ -43,7 +16,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
 | 
			
		||||
		private blockingEntityService: BlockingEntityService,
 | 
			
		||||
		private queryService: QueryService,
 | 
			
		||||
	) {
 | 
			
		||||
		super(meta, paramDef, async (ps, me) => {
 | 
			
		||||
		super(async (ps, me) => {
 | 
			
		||||
			const query = this.queryService.makePaginationQuery(this.blockingsRepository.createQueryBuilder('blocking'), ps.sinceId, ps.untilId)
 | 
			
		||||
				.andWhere('blocking.blockerId = :meId', { meId: me.id });
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -2522,6 +2522,76 @@ export const endpoints = {
 | 
			
		||||
			},
 | 
			
		||||
		}],
 | 
			
		||||
	},
 | 
			
		||||
	'blocking/delete': {
 | 
			
		||||
		tags: ['account'],
 | 
			
		||||
	
 | 
			
		||||
		limit: {
 | 
			
		||||
			duration: ms('1hour'),
 | 
			
		||||
			max: 100,
 | 
			
		||||
		},
 | 
			
		||||
	
 | 
			
		||||
		requireCredential: true,
 | 
			
		||||
	
 | 
			
		||||
		kind: 'write:blocks',
 | 
			
		||||
	
 | 
			
		||||
		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',
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		defines: [{
 | 
			
		||||
			req: {
 | 
			
		||||
				type: 'object',
 | 
			
		||||
				properties: {
 | 
			
		||||
					userId: { type: 'string', format: 'misskey:id' },
 | 
			
		||||
				},
 | 
			
		||||
				required: ['userId'],
 | 
			
		||||
			},
 | 
			
		||||
			res: {
 | 
			
		||||
				$ref: 'https://misskey-hub.net/api/schemas/UserDetailedNotMe',
 | 
			
		||||
			},
 | 
			
		||||
		}],
 | 
			
		||||
	},
 | 
			
		||||
	'blocking/list': {
 | 
			
		||||
		tags: ['account'],
 | 
			
		||||
	
 | 
			
		||||
		requireCredential: true,
 | 
			
		||||
	
 | 
			
		||||
		kind: 'read:blocks',
 | 
			
		||||
 | 
			
		||||
		defines: [{
 | 
			
		||||
			req: {
 | 
			
		||||
				type: 'object',
 | 
			
		||||
				properties: {
 | 
			
		||||
					limit: { type: 'integer', minimum: 1, maximum: 100, default: 30 },
 | 
			
		||||
					sinceId: { type: 'string', format: 'misskey:id' },
 | 
			
		||||
					untilId: { type: 'string', format: 'misskey:id' },
 | 
			
		||||
				},
 | 
			
		||||
				required: [],
 | 
			
		||||
			},
 | 
			
		||||
			res: {
 | 
			
		||||
				type: 'array',
 | 
			
		||||
				items: {
 | 
			
		||||
					$ref: 'https://misskey-hub.net/api/schemas/Blocking',
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		}],
 | 
			
		||||
	},
 | 
			
		||||
	//#endregion
 | 
			
		||||
} as const satisfies { [x: string]: IEndpointMeta; };
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user