mirror of
				https://codeberg.org/yeentown/barkey.git
				synced 2025-11-04 07:24:13 +00:00 
			
		
		
		
	Refactor (#7394)
* wip * wip * wip * wip * wip * Update define.ts * Update update.ts * Update user.ts * wip * wip * Update request.ts * URL * wip * wip * wip * wip * Update invite.ts * Update create.ts
This commit is contained in:
		
							parent
							
								
									62cc14c93b
								
							
						
					
					
						commit
						ce340aba7a
					
				
					 109 changed files with 252 additions and 201 deletions
				
			
		| 
						 | 
				
			
			@ -1,3 +1,4 @@
 | 
			
		|||
import { URL } from 'url';
 | 
			
		||||
import config from '@/config';
 | 
			
		||||
import { toASCII } from 'punycode';
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,7 @@
 | 
			
		|||
import * as fs from 'fs';
 | 
			
		||||
import * as stream from 'stream';
 | 
			
		||||
import * as util from 'util';
 | 
			
		||||
import { URL } from 'url';
 | 
			
		||||
import fetch from 'node-fetch';
 | 
			
		||||
import { getAgentByUrl } from './fetch';
 | 
			
		||||
import { AbortController } from 'abort-controller';
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,7 +9,7 @@ export type PackedApp = SchemaType<typeof packedAppSchema>;
 | 
			
		|||
export class AppRepository extends Repository<App> {
 | 
			
		||||
	public async pack(
 | 
			
		||||
		src: App['id'] | App,
 | 
			
		||||
		me?: any,
 | 
			
		||||
		me?: { id: User['id'] } | null | undefined,
 | 
			
		||||
		options?: {
 | 
			
		||||
			detail?: boolean,
 | 
			
		||||
			includeSecret?: boolean,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,12 +2,13 @@ import { EntityRepository, Repository } from 'typeorm';
 | 
			
		|||
import { Apps } from '..';
 | 
			
		||||
import { AuthSession } from '../entities/auth-session';
 | 
			
		||||
import { awaitAll } from '../../prelude/await-all';
 | 
			
		||||
import { User } from '../entities/user';
 | 
			
		||||
 | 
			
		||||
@EntityRepository(AuthSession)
 | 
			
		||||
export class AuthSessionRepository extends Repository<AuthSession> {
 | 
			
		||||
	public async pack(
 | 
			
		||||
		src: AuthSession['id'] | AuthSession,
 | 
			
		||||
		me?: any
 | 
			
		||||
		me?: { id: User['id'] } | null | undefined
 | 
			
		||||
	) {
 | 
			
		||||
		const session = typeof src === 'object' ? src : await this.findOneOrFail(src);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,6 +3,7 @@ import { Users } from '..';
 | 
			
		|||
import { Blocking } from '../entities/blocking';
 | 
			
		||||
import { awaitAll } from '../../prelude/await-all';
 | 
			
		||||
import { SchemaType } from '@/misc/schema';
 | 
			
		||||
import { User } from '../entities/user';
 | 
			
		||||
 | 
			
		||||
export type PackedBlocking = SchemaType<typeof packedBlockingSchema>;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -10,7 +11,7 @@ export type PackedBlocking = SchemaType<typeof packedBlockingSchema>;
 | 
			
		|||
export class BlockingRepository extends Repository<Blocking> {
 | 
			
		||||
	public async pack(
 | 
			
		||||
		src: Blocking['id'] | Blocking,
 | 
			
		||||
		me?: any
 | 
			
		||||
		me?: { id: User['id'] } | null | undefined
 | 
			
		||||
	): Promise<PackedBlocking> {
 | 
			
		||||
		const blocking = typeof src === 'object' ? src : await this.findOneOrFail(src);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -26,7 +27,7 @@ export class BlockingRepository extends Repository<Blocking> {
 | 
			
		|||
 | 
			
		||||
	public packMany(
 | 
			
		||||
		blockings: any[],
 | 
			
		||||
		me: any
 | 
			
		||||
		me: { id: User['id'] }
 | 
			
		||||
	) {
 | 
			
		||||
		return Promise.all(blockings.map(x => this.pack(x, me)));
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,19 +10,19 @@ export type PackedChannel = SchemaType<typeof packedChannelSchema>;
 | 
			
		|||
export class ChannelRepository extends Repository<Channel> {
 | 
			
		||||
	public async pack(
 | 
			
		||||
		src: Channel['id'] | Channel,
 | 
			
		||||
		me?: User['id'] | User | null | undefined,
 | 
			
		||||
		me?: { id: User['id'] } | null | undefined,
 | 
			
		||||
	): Promise<PackedChannel> {
 | 
			
		||||
		const channel = typeof src === 'object' ? src : await this.findOneOrFail(src);
 | 
			
		||||
		const meId = me ? typeof me === 'string' ? me : me.id : null;
 | 
			
		||||
		const meId = me ? me.id : null;
 | 
			
		||||
 | 
			
		||||
		const banner = channel.bannerId ? await DriveFiles.findOne(channel.bannerId) : null;
 | 
			
		||||
 | 
			
		||||
		const hasUnreadNote = me ? (await NoteUnreads.findOne({ noteChannelId: channel.id, userId: meId })) != null : undefined;
 | 
			
		||||
		const hasUnreadNote = meId ? (await NoteUnreads.findOne({ noteChannelId: channel.id, userId: meId })) != null : undefined;
 | 
			
		||||
 | 
			
		||||
		const following = await ChannelFollowings.findOne({
 | 
			
		||||
		const following = meId ? await ChannelFollowings.findOne({
 | 
			
		||||
			followerId: meId,
 | 
			
		||||
			followeeId: channel.id,
 | 
			
		||||
		});
 | 
			
		||||
		}) : null;
 | 
			
		||||
 | 
			
		||||
		return {
 | 
			
		||||
			id: channel.id,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -53,7 +53,7 @@ export class DriveFileRepository extends Repository<DriveFile> {
 | 
			
		|||
		return thumbnail ? (file.thumbnailUrl || (isImage ? (file.webpublicUrl || file.url) : null)) : (file.webpublicUrl || file.url);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public async calcDriveUsageOf(user: User['id'] | User): Promise<number> {
 | 
			
		||||
	public async calcDriveUsageOf(user: User['id'] | { id: User['id'] }): Promise<number> {
 | 
			
		||||
		const id = typeof user === 'object' ? user.id : user;
 | 
			
		||||
 | 
			
		||||
		const { sum } = await this
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,12 +1,13 @@
 | 
			
		|||
import { EntityRepository, Repository } from 'typeorm';
 | 
			
		||||
import { FollowRequest } from '../entities/follow-request';
 | 
			
		||||
import { Users } from '..';
 | 
			
		||||
import { User } from '../entities/user';
 | 
			
		||||
 | 
			
		||||
@EntityRepository(FollowRequest)
 | 
			
		||||
export class FollowRequestRepository extends Repository<FollowRequest> {
 | 
			
		||||
	public async pack(
 | 
			
		||||
		src: FollowRequest['id'] | FollowRequest,
 | 
			
		||||
		me?: any
 | 
			
		||||
		me?: { id: User['id'] } | null | undefined
 | 
			
		||||
	) {
 | 
			
		||||
		const request = typeof src === 'object' ? src : await this.findOneOrFail(src);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,6 +3,7 @@ import { Users } from '..';
 | 
			
		|||
import { Following } from '../entities/following';
 | 
			
		||||
import { awaitAll } from '../../prelude/await-all';
 | 
			
		||||
import { SchemaType } from '@/misc/schema';
 | 
			
		||||
import { User } from '../entities/user';
 | 
			
		||||
 | 
			
		||||
type LocalFollowerFollowing = Following & {
 | 
			
		||||
	followerHost: null;
 | 
			
		||||
| 
						 | 
				
			
			@ -50,7 +51,7 @@ export class FollowingRepository extends Repository<Following> {
 | 
			
		|||
 | 
			
		||||
	public async pack(
 | 
			
		||||
		src: Following['id'] | Following,
 | 
			
		||||
		me?: any,
 | 
			
		||||
		me?: { id: User['id'] } | null | undefined,
 | 
			
		||||
		opts?: {
 | 
			
		||||
			populateFollowee?: boolean;
 | 
			
		||||
			populateFollower?: boolean;
 | 
			
		||||
| 
						 | 
				
			
			@ -76,7 +77,7 @@ export class FollowingRepository extends Repository<Following> {
 | 
			
		|||
 | 
			
		||||
	public packMany(
 | 
			
		||||
		followings: any[],
 | 
			
		||||
		me?: any,
 | 
			
		||||
		me?: { id: User['id'] } | null | undefined,
 | 
			
		||||
		opts?: {
 | 
			
		||||
			populateFollowee?: boolean;
 | 
			
		||||
			populateFollower?: boolean;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,3 +1,4 @@
 | 
			
		|||
import { User } from '@/models/entities/user';
 | 
			
		||||
import { EntityRepository, Repository } from 'typeorm';
 | 
			
		||||
import { Users } from '../../..';
 | 
			
		||||
import { ReversiGame } from '../../../entities/games/reversi/game';
 | 
			
		||||
| 
						 | 
				
			
			@ -6,7 +7,7 @@ import { ReversiGame } from '../../../entities/games/reversi/game';
 | 
			
		|||
export class ReversiGameRepository extends Repository<ReversiGame> {
 | 
			
		||||
	public async pack(
 | 
			
		||||
		src: ReversiGame['id'] | ReversiGame,
 | 
			
		||||
		me?: any,
 | 
			
		||||
		me?: { id: User['id'] } | null | undefined,
 | 
			
		||||
		options?: {
 | 
			
		||||
			detail?: boolean
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -16,7 +17,6 @@ export class ReversiGameRepository extends Repository<ReversiGame> {
 | 
			
		|||
		}, options);
 | 
			
		||||
 | 
			
		||||
		const game = typeof src === 'object' ? src : await this.findOneOrFail(src);
 | 
			
		||||
		const meId = me ? typeof me === 'string' ? me : me.id : null;
 | 
			
		||||
 | 
			
		||||
		return {
 | 
			
		||||
			id: game.id,
 | 
			
		||||
| 
						 | 
				
			
			@ -30,10 +30,10 @@ export class ReversiGameRepository extends Repository<ReversiGame> {
 | 
			
		|||
			user2Accepted: game.user2Accepted,
 | 
			
		||||
			user1Id: game.user1Id,
 | 
			
		||||
			user2Id: game.user2Id,
 | 
			
		||||
			user1: await Users.pack(game.user1Id, meId),
 | 
			
		||||
			user2: await Users.pack(game.user2Id, meId),
 | 
			
		||||
			user1: await Users.pack(game.user1Id, me),
 | 
			
		||||
			user2: await Users.pack(game.user2Id, me),
 | 
			
		||||
			winnerId: game.winnerId,
 | 
			
		||||
			winner: game.winnerId ? await Users.pack(game.winnerId, meId) : null,
 | 
			
		||||
			winner: game.winnerId ? await Users.pack(game.winnerId, me) : null,
 | 
			
		||||
			surrendered: game.surrendered,
 | 
			
		||||
			black: game.black,
 | 
			
		||||
			bw: game.bw,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,12 +2,13 @@ import { EntityRepository, Repository } from 'typeorm';
 | 
			
		|||
import { ReversiMatching } from '../../../entities/games/reversi/matching';
 | 
			
		||||
import { Users } from '../../..';
 | 
			
		||||
import { awaitAll } from '../../../../prelude/await-all';
 | 
			
		||||
import { User } from '@/models/entities/user';
 | 
			
		||||
 | 
			
		||||
@EntityRepository(ReversiMatching)
 | 
			
		||||
export class ReversiMatchingRepository extends Repository<ReversiMatching> {
 | 
			
		||||
	public async pack(
 | 
			
		||||
		src: ReversiMatching['id'] | ReversiMatching,
 | 
			
		||||
		me: any
 | 
			
		||||
		me: { id: User['id'] }
 | 
			
		||||
	) {
 | 
			
		||||
		const matching = typeof src === 'object' ? src : await this.findOneOrFail(src);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,6 +2,7 @@ import { EntityRepository, Repository } from 'typeorm';
 | 
			
		|||
import { MessagingMessage } from '../entities/messaging-message';
 | 
			
		||||
import { Users, DriveFiles, UserGroups } from '..';
 | 
			
		||||
import { SchemaType } from '@/misc/schema';
 | 
			
		||||
import { User } from '../entities/user';
 | 
			
		||||
 | 
			
		||||
export type PackedMessagingMessage = SchemaType<typeof packedMessagingMessageSchema>;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -13,7 +14,7 @@ export class MessagingMessageRepository extends Repository<MessagingMessage> {
 | 
			
		|||
 | 
			
		||||
	public async pack(
 | 
			
		||||
		src: MessagingMessage['id'] | MessagingMessage,
 | 
			
		||||
		me?: any,
 | 
			
		||||
		me?: { id: User['id'] } | null | undefined,
 | 
			
		||||
		options?: {
 | 
			
		||||
			populateRecipient?: boolean,
 | 
			
		||||
			populateGroup?: boolean,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,6 +3,7 @@ import { Users } from '..';
 | 
			
		|||
import { Muting } from '../entities/muting';
 | 
			
		||||
import { awaitAll } from '../../prelude/await-all';
 | 
			
		||||
import { SchemaType } from '@/misc/schema';
 | 
			
		||||
import { User } from '../entities/user';
 | 
			
		||||
 | 
			
		||||
export type PackedMuting = SchemaType<typeof packedMutingSchema>;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -10,7 +11,7 @@ export type PackedMuting = SchemaType<typeof packedMutingSchema>;
 | 
			
		|||
export class MutingRepository extends Repository<Muting> {
 | 
			
		||||
	public async pack(
 | 
			
		||||
		src: Muting['id'] | Muting,
 | 
			
		||||
		me?: any
 | 
			
		||||
		me?: { id: User['id'] } | null | undefined
 | 
			
		||||
	): Promise<PackedMuting> {
 | 
			
		||||
		const muting = typeof src === 'object' ? src : await this.findOneOrFail(src);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -26,7 +27,7 @@ export class MutingRepository extends Repository<Muting> {
 | 
			
		|||
 | 
			
		||||
	public packMany(
 | 
			
		||||
		mutings: any[],
 | 
			
		||||
		me: any
 | 
			
		||||
		me: { id: User['id'] }
 | 
			
		||||
	) {
 | 
			
		||||
		return Promise.all(mutings.map(x => this.pack(x, me)));
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,12 +1,13 @@
 | 
			
		|||
import { EntityRepository, Repository } from 'typeorm';
 | 
			
		||||
import { NoteFavorite } from '../entities/note-favorite';
 | 
			
		||||
import { Notes } from '..';
 | 
			
		||||
import { User } from '../entities/user';
 | 
			
		||||
 | 
			
		||||
@EntityRepository(NoteFavorite)
 | 
			
		||||
export class NoteFavoriteRepository extends Repository<NoteFavorite> {
 | 
			
		||||
	public async pack(
 | 
			
		||||
		src: NoteFavorite['id'] | NoteFavorite,
 | 
			
		||||
		me?: any
 | 
			
		||||
		me?: { id: User['id'] } | null | undefined
 | 
			
		||||
	) {
 | 
			
		||||
		const favorite = typeof src === 'object' ? src : await this.findOneOrFail(src);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -20,7 +21,7 @@ export class NoteFavoriteRepository extends Repository<NoteFavorite> {
 | 
			
		|||
 | 
			
		||||
	public packMany(
 | 
			
		||||
		favorites: any[],
 | 
			
		||||
		me: any
 | 
			
		||||
		me: { id: User['id'] }
 | 
			
		||||
	) {
 | 
			
		||||
		return Promise.all(favorites.map(x => this.pack(x, me)));
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,6 +3,7 @@ import { NoteReaction } from '../entities/note-reaction';
 | 
			
		|||
import { Users } from '..';
 | 
			
		||||
import { SchemaType } from '@/misc/schema';
 | 
			
		||||
import { convertLegacyReaction } from '@/misc/reaction-lib';
 | 
			
		||||
import { User } from '../entities/user';
 | 
			
		||||
 | 
			
		||||
export type PackedNoteReaction = SchemaType<typeof packedNoteReactionSchema>;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -10,7 +11,7 @@ export type PackedNoteReaction = SchemaType<typeof packedNoteReactionSchema>;
 | 
			
		|||
export class NoteReactionRepository extends Repository<NoteReaction> {
 | 
			
		||||
	public async pack(
 | 
			
		||||
		src: NoteReaction['id'] | NoteReaction,
 | 
			
		||||
		me?: any
 | 
			
		||||
		me?: { id: User['id'] } | null | undefined
 | 
			
		||||
	): Promise<PackedNoteReaction> {
 | 
			
		||||
		const reaction = typeof src === 'object' ? src : await this.findOneOrFail(src);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -79,7 +79,7 @@ export class NoteRepository extends Repository<Note> {
 | 
			
		|||
 | 
			
		||||
	public async pack(
 | 
			
		||||
		src: Note['id'] | Note,
 | 
			
		||||
		me?: User['id'] | User | null | undefined,
 | 
			
		||||
		me?: { id: User['id'] } | null | undefined,
 | 
			
		||||
		options?: {
 | 
			
		||||
			detail?: boolean;
 | 
			
		||||
			skipHide?: boolean;
 | 
			
		||||
| 
						 | 
				
			
			@ -93,7 +93,7 @@ export class NoteRepository extends Repository<Note> {
 | 
			
		|||
			skipHide: false
 | 
			
		||||
		}, options);
 | 
			
		||||
 | 
			
		||||
		const meId = me ? typeof me === 'string' ? me : me.id : null;
 | 
			
		||||
		const meId = me ? me.id : null;
 | 
			
		||||
		const note = typeof src === 'object' ? src : await this.findOneOrFail(src);
 | 
			
		||||
		const host = note.userHost;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -174,7 +174,7 @@ export class NoteRepository extends Repository<Note> {
 | 
			
		|||
			id: note.id,
 | 
			
		||||
			createdAt: note.createdAt.toISOString(),
 | 
			
		||||
			userId: note.userId,
 | 
			
		||||
			user: Users.pack(note.user || note.userId, meId, {
 | 
			
		||||
			user: Users.pack(note.user || note.userId, me, {
 | 
			
		||||
				detail: false,
 | 
			
		||||
			}),
 | 
			
		||||
			text: text,
 | 
			
		||||
| 
						 | 
				
			
			@ -204,12 +204,12 @@ export class NoteRepository extends Repository<Note> {
 | 
			
		|||
			_prId_: (note as any)._prId_ || undefined,
 | 
			
		||||
 | 
			
		||||
			...(opts.detail ? {
 | 
			
		||||
				reply: note.replyId ? this.pack(note.reply || note.replyId, meId, {
 | 
			
		||||
				reply: note.replyId ? this.pack(note.reply || note.replyId, me, {
 | 
			
		||||
					detail: false,
 | 
			
		||||
					_hint_: options?._hint_
 | 
			
		||||
				}) : undefined,
 | 
			
		||||
 | 
			
		||||
				renote: note.renoteId ? this.pack(note.renote || note.renoteId, meId, {
 | 
			
		||||
				renote: note.renoteId ? this.pack(note.renote || note.renoteId, me, {
 | 
			
		||||
					detail: true,
 | 
			
		||||
					_hint_: options?._hint_
 | 
			
		||||
				}) : undefined,
 | 
			
		||||
| 
						 | 
				
			
			@ -236,7 +236,7 @@ export class NoteRepository extends Repository<Note> {
 | 
			
		|||
 | 
			
		||||
	public async packMany(
 | 
			
		||||
		notes: Note[],
 | 
			
		||||
		me?: User['id'] | User | null | undefined,
 | 
			
		||||
		me?: { id: User['id'] } | null | undefined,
 | 
			
		||||
		options?: {
 | 
			
		||||
			detail?: boolean;
 | 
			
		||||
			skipHide?: boolean;
 | 
			
		||||
| 
						 | 
				
			
			@ -244,7 +244,7 @@ export class NoteRepository extends Repository<Note> {
 | 
			
		|||
	) {
 | 
			
		||||
		if (notes.length === 0) return [];
 | 
			
		||||
 | 
			
		||||
		const meId = me ? typeof me === 'string' ? me : me.id : null;
 | 
			
		||||
		const meId = me ? me.id : null;
 | 
			
		||||
		const myReactionsMap = new Map<Note['id'], NoteReaction | null>();
 | 
			
		||||
		if (meId) {
 | 
			
		||||
			const renoteIds = notes.filter(n => n.renoteId != null).map(n => n.renoteId!);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -31,38 +31,38 @@ export class NotificationRepository extends Repository<Notification> {
 | 
			
		|||
			userId: notification.notifierId,
 | 
			
		||||
			user: notification.notifierId ? Users.pack(notification.notifier || notification.notifierId) : null,
 | 
			
		||||
			...(notification.type === 'mention' ? {
 | 
			
		||||
				note: Notes.pack(notification.note || notification.noteId!, notification.notifieeId, {
 | 
			
		||||
				note: Notes.pack(notification.note || notification.noteId!, { id: notification.notifieeId }, {
 | 
			
		||||
					detail: true,
 | 
			
		||||
					_hint_: options._hintForEachNotes_
 | 
			
		||||
				}),
 | 
			
		||||
			} : {}),
 | 
			
		||||
			...(notification.type === 'reply' ? {
 | 
			
		||||
				note: Notes.pack(notification.note || notification.noteId!, notification.notifieeId, {
 | 
			
		||||
				note: Notes.pack(notification.note || notification.noteId!, { id: notification.notifieeId }, {
 | 
			
		||||
					detail: true,
 | 
			
		||||
					_hint_: options._hintForEachNotes_
 | 
			
		||||
				}),
 | 
			
		||||
			} : {}),
 | 
			
		||||
			...(notification.type === 'renote' ? {
 | 
			
		||||
				note: Notes.pack(notification.note || notification.noteId!, notification.notifieeId, {
 | 
			
		||||
				note: Notes.pack(notification.note || notification.noteId!, { id: notification.notifieeId }, {
 | 
			
		||||
					detail: true,
 | 
			
		||||
					_hint_: options._hintForEachNotes_
 | 
			
		||||
				}),
 | 
			
		||||
			} : {}),
 | 
			
		||||
			...(notification.type === 'quote' ? {
 | 
			
		||||
				note: Notes.pack(notification.note || notification.noteId!, notification.notifieeId, {
 | 
			
		||||
				note: Notes.pack(notification.note || notification.noteId!, { id: notification.notifieeId }, {
 | 
			
		||||
					detail: true,
 | 
			
		||||
					_hint_: options._hintForEachNotes_
 | 
			
		||||
				}),
 | 
			
		||||
			} : {}),
 | 
			
		||||
			...(notification.type === 'reaction' ? {
 | 
			
		||||
				note: Notes.pack(notification.note || notification.noteId!, notification.notifieeId, {
 | 
			
		||||
				note: Notes.pack(notification.note || notification.noteId!, { id: notification.notifieeId }, {
 | 
			
		||||
					detail: true,
 | 
			
		||||
					_hint_: options._hintForEachNotes_
 | 
			
		||||
				}),
 | 
			
		||||
				reaction: notification.reaction
 | 
			
		||||
			} : {}),
 | 
			
		||||
			...(notification.type === 'pollVote' ? {
 | 
			
		||||
				note: Notes.pack(notification.note || notification.noteId!, notification.notifieeId, {
 | 
			
		||||
				note: Notes.pack(notification.note || notification.noteId!, { id: notification.notifieeId }, {
 | 
			
		||||
					detail: true,
 | 
			
		||||
					_hint_: options._hintForEachNotes_
 | 
			
		||||
				}),
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,12 +1,13 @@
 | 
			
		|||
import { EntityRepository, Repository } from 'typeorm';
 | 
			
		||||
import { PageLike } from '../entities/page-like';
 | 
			
		||||
import { Pages } from '..';
 | 
			
		||||
import { User } from '../entities/user';
 | 
			
		||||
 | 
			
		||||
@EntityRepository(PageLike)
 | 
			
		||||
export class PageLikeRepository extends Repository<PageLike> {
 | 
			
		||||
	public async pack(
 | 
			
		||||
		src: PageLike['id'] | PageLike,
 | 
			
		||||
		me?: any
 | 
			
		||||
		me?: { id: User['id'] } | null | undefined
 | 
			
		||||
	) {
 | 
			
		||||
		const like = typeof src === 'object' ? src : await this.findOneOrFail(src);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -18,7 +19,7 @@ export class PageLikeRepository extends Repository<PageLike> {
 | 
			
		|||
 | 
			
		||||
	public packMany(
 | 
			
		||||
		likes: any[],
 | 
			
		||||
		me: any
 | 
			
		||||
		me: { id: User['id'] }
 | 
			
		||||
	) {
 | 
			
		||||
		return Promise.all(likes.map(x => this.pack(x, me)));
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,9 +12,9 @@ export type PackedPage = SchemaType<typeof packedPageSchema>;
 | 
			
		|||
export class PageRepository extends Repository<Page> {
 | 
			
		||||
	public async pack(
 | 
			
		||||
		src: Page['id'] | Page,
 | 
			
		||||
		me?: User['id'] | User | null | undefined,
 | 
			
		||||
		me?: { id: User['id'] } | null | undefined,
 | 
			
		||||
	): Promise<PackedPage> {
 | 
			
		||||
		const meId = me ? typeof me === 'string' ? me : me.id : null;
 | 
			
		||||
		const meId = me ? me.id : null;
 | 
			
		||||
		const page = typeof src === 'object' ? src : await this.findOneOrFail(src);
 | 
			
		||||
 | 
			
		||||
		const attachedFiles: Promise<DriveFile | undefined>[] = [];
 | 
			
		||||
| 
						 | 
				
			
			@ -84,7 +84,7 @@ export class PageRepository extends Repository<Page> {
 | 
			
		|||
 | 
			
		||||
	public packMany(
 | 
			
		||||
		pages: Page[],
 | 
			
		||||
		me?: User['id'] | User | null | undefined,
 | 
			
		||||
		me?: { id: User['id'] } | null | undefined,
 | 
			
		||||
	) {
 | 
			
		||||
		return Promise.all(pages.map(x => this.pack(x, me)));
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -147,7 +147,7 @@ export class UserRepository extends Repository<User> {
 | 
			
		|||
 | 
			
		||||
	public async pack(
 | 
			
		||||
		src: User['id'] | User,
 | 
			
		||||
		me?: User['id'] | User | null | undefined,
 | 
			
		||||
		me?: { id: User['id'] } | null | undefined,
 | 
			
		||||
		options?: {
 | 
			
		||||
			detail?: boolean,
 | 
			
		||||
			includeSecrets?: boolean,
 | 
			
		||||
| 
						 | 
				
			
			@ -159,7 +159,7 @@ export class UserRepository extends Repository<User> {
 | 
			
		|||
		}, options);
 | 
			
		||||
 | 
			
		||||
		const user = typeof src === 'object' ? src : await this.findOneOrFail(src);
 | 
			
		||||
		const meId = me ? typeof me === 'string' ? me : me.id : null;
 | 
			
		||||
		const meId = me ? me.id : null;
 | 
			
		||||
 | 
			
		||||
		const relation = meId && (meId !== user.id) && opts.detail ? await this.getRelation(meId, user.id) : null;
 | 
			
		||||
		const pins = opts.detail ? await UserNotePinings.createQueryBuilder('pin')
 | 
			
		||||
| 
						 | 
				
			
			@ -213,11 +213,11 @@ export class UserRepository extends Repository<User> {
 | 
			
		|||
				followingCount: user.followingCount,
 | 
			
		||||
				notesCount: user.notesCount,
 | 
			
		||||
				pinnedNoteIds: pins.map(pin => pin.noteId),
 | 
			
		||||
				pinnedNotes: Notes.packMany(pins.map(pin => pin.note!), meId, {
 | 
			
		||||
				pinnedNotes: Notes.packMany(pins.map(pin => pin.note!), me, {
 | 
			
		||||
					detail: true
 | 
			
		||||
				}),
 | 
			
		||||
				pinnedPageId: profile!.pinnedPageId,
 | 
			
		||||
				pinnedPage: profile!.pinnedPageId ? Pages.pack(profile!.pinnedPageId, meId) : null,
 | 
			
		||||
				pinnedPage: profile!.pinnedPageId ? Pages.pack(profile!.pinnedPageId, me) : null,
 | 
			
		||||
				twoFactorEnabled: profile!.twoFactorEnabled,
 | 
			
		||||
				usePasswordLessLogin: profile!.usePasswordLessLogin,
 | 
			
		||||
				securityKeys: profile!.twoFactorEnabled
 | 
			
		||||
| 
						 | 
				
			
			@ -286,7 +286,7 @@ export class UserRepository extends Repository<User> {
 | 
			
		|||
 | 
			
		||||
	public packMany(
 | 
			
		||||
		users: (User['id'] | User)[],
 | 
			
		||||
		me?: User['id'] | User | null | undefined,
 | 
			
		||||
		me?: { id: User['id'] } | null | undefined,
 | 
			
		||||
		options?: {
 | 
			
		||||
			detail?: boolean,
 | 
			
		||||
			includeSecrets?: boolean,
 | 
			
		||||
| 
						 | 
				
			
			@ -295,11 +295,15 @@ export class UserRepository extends Repository<User> {
 | 
			
		|||
		return Promise.all(users.map(u => this.pack(u, me, options)));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public isLocalUser(user: User): user is ILocalUser {
 | 
			
		||||
	public isLocalUser(user: User): user is ILocalUser;
 | 
			
		||||
	public isLocalUser<T extends { host: User['host'] }>(user: T): user is T & { host: null; };
 | 
			
		||||
	public isLocalUser(user: User | { host: User['host'] }): boolean {
 | 
			
		||||
		return user.host == null;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public isRemoteUser(user: User): user is IRemoteUser {
 | 
			
		||||
	public isRemoteUser(user: User): user is IRemoteUser;
 | 
			
		||||
	public isRemoteUser<T extends { host: User['host'] }>(user: T): user is T & { host: string; };
 | 
			
		||||
	public isRemoteUser(user: User | { host: User['host'] }): boolean {
 | 
			
		||||
		return !this.isLocalUser(user);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,7 +1,7 @@
 | 
			
		|||
import * as httpSignature from 'http-signature';
 | 
			
		||||
 | 
			
		||||
import config from '@/config';
 | 
			
		||||
import { ILocalUser } from '../models/entities/user';
 | 
			
		||||
import { User } from '../models/entities/user';
 | 
			
		||||
import { program } from '../argv';
 | 
			
		||||
 | 
			
		||||
import processDeliver from './processors/deliver';
 | 
			
		||||
| 
						 | 
				
			
			@ -65,7 +65,7 @@ objectStorageQueue
 | 
			
		|||
	.on('error', (job: any, err: Error) => objectStorageLogger.error(`error ${err}`, { job, e: renderError(err) }))
 | 
			
		||||
	.on('stalled', (job) => objectStorageLogger.warn(`stalled id=${job.id}`));
 | 
			
		||||
 | 
			
		||||
export function deliver(user: ILocalUser, content: any, to: any) {
 | 
			
		||||
export function deliver(user: { id: User['id']; host: null; }, content: any, to: any) {
 | 
			
		||||
	if (content == null) return null;
 | 
			
		||||
 | 
			
		||||
	const data = {
 | 
			
		||||
| 
						 | 
				
			
			@ -102,7 +102,7 @@ export function inbox(activity: any, signature: httpSignature.IParsedSignature)
 | 
			
		|||
	});
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function createDeleteDriveFilesJob(user: ILocalUser) {
 | 
			
		||||
export function createDeleteDriveFilesJob(user: { id: User['id'] }) {
 | 
			
		||||
	return dbQueue.add('deleteDriveFiles', {
 | 
			
		||||
		user: user
 | 
			
		||||
	}, {
 | 
			
		||||
| 
						 | 
				
			
			@ -111,7 +111,7 @@ export function createDeleteDriveFilesJob(user: ILocalUser) {
 | 
			
		|||
	});
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function createExportNotesJob(user: ILocalUser) {
 | 
			
		||||
export function createExportNotesJob(user: { id: User['id'] }) {
 | 
			
		||||
	return dbQueue.add('exportNotes', {
 | 
			
		||||
		user: user
 | 
			
		||||
	}, {
 | 
			
		||||
| 
						 | 
				
			
			@ -120,7 +120,7 @@ export function createExportNotesJob(user: ILocalUser) {
 | 
			
		|||
	});
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function createExportFollowingJob(user: ILocalUser) {
 | 
			
		||||
export function createExportFollowingJob(user: { id: User['id'] }) {
 | 
			
		||||
	return dbQueue.add('exportFollowing', {
 | 
			
		||||
		user: user
 | 
			
		||||
	}, {
 | 
			
		||||
| 
						 | 
				
			
			@ -129,7 +129,7 @@ export function createExportFollowingJob(user: ILocalUser) {
 | 
			
		|||
	});
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function createExportMuteJob(user: ILocalUser) {
 | 
			
		||||
export function createExportMuteJob(user: { id: User['id'] }) {
 | 
			
		||||
	return dbQueue.add('exportMute', {
 | 
			
		||||
		user: user
 | 
			
		||||
	}, {
 | 
			
		||||
| 
						 | 
				
			
			@ -138,7 +138,7 @@ export function createExportMuteJob(user: ILocalUser) {
 | 
			
		|||
	});
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function createExportBlockingJob(user: ILocalUser) {
 | 
			
		||||
export function createExportBlockingJob(user: { id: User['id'] }) {
 | 
			
		||||
	return dbQueue.add('exportBlocking', {
 | 
			
		||||
		user: user
 | 
			
		||||
	}, {
 | 
			
		||||
| 
						 | 
				
			
			@ -147,7 +147,7 @@ export function createExportBlockingJob(user: ILocalUser) {
 | 
			
		|||
	});
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function createExportUserListsJob(user: ILocalUser) {
 | 
			
		||||
export function createExportUserListsJob(user: { id: User['id'] }) {
 | 
			
		||||
	return dbQueue.add('exportUserLists', {
 | 
			
		||||
		user: user
 | 
			
		||||
	}, {
 | 
			
		||||
| 
						 | 
				
			
			@ -156,7 +156,7 @@ export function createExportUserListsJob(user: ILocalUser) {
 | 
			
		|||
	});
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function createImportFollowingJob(user: ILocalUser, fileId: DriveFile['id']) {
 | 
			
		||||
export function createImportFollowingJob(user: { id: User['id'] }, fileId: DriveFile['id']) {
 | 
			
		||||
	return dbQueue.add('importFollowing', {
 | 
			
		||||
		user: user,
 | 
			
		||||
		fileId: fileId
 | 
			
		||||
| 
						 | 
				
			
			@ -166,7 +166,7 @@ export function createImportFollowingJob(user: ILocalUser, fileId: DriveFile['id
 | 
			
		|||
	});
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function createImportUserListsJob(user: ILocalUser, fileId: DriveFile['id']) {
 | 
			
		||||
export function createImportUserListsJob(user: { id: User['id'] }, fileId: DriveFile['id']) {
 | 
			
		||||
	return dbQueue.add('importUserLists', {
 | 
			
		||||
		user: user,
 | 
			
		||||
		fileId: fileId
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,3 +1,4 @@
 | 
			
		|||
import { URL } from 'url';
 | 
			
		||||
import * as Bull from 'bull';
 | 
			
		||||
import request from '../../remote/activitypub/request';
 | 
			
		||||
import { registerOrFetchInstanceDoc } from '../../services/register-or-fetch-instance-doc';
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,3 +1,4 @@
 | 
			
		|||
import { URL } from 'url';
 | 
			
		||||
import * as Bull from 'bull';
 | 
			
		||||
import * as httpSignature from 'http-signature';
 | 
			
		||||
import perform from '../../remote/activitypub/perform';
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
import { Users, Followings } from '../../models';
 | 
			
		||||
import { ILocalUser, IRemoteUser } from '../../models/entities/user';
 | 
			
		||||
import { ILocalUser, IRemoteUser, User } from '../../models/entities/user';
 | 
			
		||||
import { deliver } from '../../queue';
 | 
			
		||||
 | 
			
		||||
//#region types
 | 
			
		||||
| 
						 | 
				
			
			@ -24,7 +24,7 @@ const isDirect = (recipe: any): recipe is IDirectRecipe =>
 | 
			
		|||
//#endregion
 | 
			
		||||
 | 
			
		||||
export default class DeliverManager {
 | 
			
		||||
	private actor: ILocalUser;
 | 
			
		||||
	private actor: { id: User['id']; host: null; };
 | 
			
		||||
	private activity: any;
 | 
			
		||||
	private recipes: IRecipe[] = [];
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -33,7 +33,7 @@ export default class DeliverManager {
 | 
			
		|||
	 * @param actor Actor
 | 
			
		||||
	 * @param activity Activity to deliver
 | 
			
		||||
	 */
 | 
			
		||||
	constructor(actor: ILocalUser, activity: any) {
 | 
			
		||||
	constructor(actor: { id: User['id']; host: null; }, activity: any) {
 | 
			
		||||
		this.actor = actor;
 | 
			
		||||
		this.activity = activity;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,3 +1,4 @@
 | 
			
		|||
import { URL } from 'url';
 | 
			
		||||
import * as promiseLimit from 'promise-limit';
 | 
			
		||||
 | 
			
		||||
import config from '@/config';
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,7 +1,7 @@
 | 
			
		|||
import config from '@/config';
 | 
			
		||||
import { ILocalUser } from '../../../models/entities/user';
 | 
			
		||||
import { User } from '../../../models/entities/user';
 | 
			
		||||
 | 
			
		||||
export default (object: any, user: ILocalUser) => ({
 | 
			
		||||
export default (object: any, user: { id: User['id']; host: null }) => ({
 | 
			
		||||
	type: 'Delete',
 | 
			
		||||
	actor: `${config.url}/users/${user.id}`,
 | 
			
		||||
	object
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,7 @@ import config from '@/config';
 | 
			
		|||
import { User } from '../../../models/entities/user';
 | 
			
		||||
import { Users } from '../../../models';
 | 
			
		||||
 | 
			
		||||
export default (follower: User, followee: User, requestId?: string) => {
 | 
			
		||||
export default (follower: { id: User['id']; host: User['host']; uri: User['host'] }, followee: { id: User['id']; host: User['host']; uri: User['host'] }, requestId?: string) => {
 | 
			
		||||
	const follow = {
 | 
			
		||||
		type: 'Follow',
 | 
			
		||||
		actor: Users.isLocalUser(follower) ? `${config.url}/users/${follower.id}` : follower.uri,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,8 +2,8 @@ import config from '@/config';
 | 
			
		|||
import { v4 as uuid } from 'uuid';
 | 
			
		||||
import { IActivity } from '../type';
 | 
			
		||||
import { LdSignature } from '../misc/ld-signature';
 | 
			
		||||
import { ILocalUser } from '../../../models/entities/user';
 | 
			
		||||
import { getUserKeypair } from '@/misc/keypair-store';
 | 
			
		||||
import { User } from '@/models/entities/user';
 | 
			
		||||
 | 
			
		||||
export const renderActivity = (x: any): IActivity | null => {
 | 
			
		||||
	if (x == null) return null;
 | 
			
		||||
| 
						 | 
				
			
			@ -20,7 +20,7 @@ export const renderActivity = (x: any): IActivity | null => {
 | 
			
		|||
	}, x);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const attachLdSignature = async (activity: any, user: ILocalUser): Promise<IActivity | null> => {
 | 
			
		||||
export const attachLdSignature = async (activity: any, user: { id: User['id']; host: null; }): Promise<IActivity | null> => {
 | 
			
		||||
	if (activity == null) return null;
 | 
			
		||||
 | 
			
		||||
	const keypair = await getUserKeypair(user.id);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,3 +1,4 @@
 | 
			
		|||
import { URL } from 'url';
 | 
			
		||||
import renderImage from './image';
 | 
			
		||||
import renderKey from './key';
 | 
			
		||||
import config from '@/config';
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,9 +1,9 @@
 | 
			
		|||
import config from '@/config';
 | 
			
		||||
import { ILocalUser } from '../../../models/entities/user';
 | 
			
		||||
import { User } from '@/models/entities/user';
 | 
			
		||||
import { Note } from '../../../models/entities/note';
 | 
			
		||||
import { Poll } from '../../../models/entities/poll';
 | 
			
		||||
 | 
			
		||||
export default async function renderQuestion(user: ILocalUser, note: Note, poll: Poll) {
 | 
			
		||||
export default async function renderQuestion(user: { id: User['id'] }, note: Note, poll: Poll) {
 | 
			
		||||
	const question = {
 | 
			
		||||
		type: 'Question',
 | 
			
		||||
		id: `${config.url}/questions/${note.id}`,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,8 +1,8 @@
 | 
			
		|||
import config from '@/config';
 | 
			
		||||
import { ILocalUser } from '../../../models/entities/user';
 | 
			
		||||
import { User } from '@/models/entities/user';
 | 
			
		||||
import { MessagingMessage } from '../../../models/entities/messaging-message';
 | 
			
		||||
 | 
			
		||||
export const renderReadActivity = (user: ILocalUser, message: MessagingMessage) => ({
 | 
			
		||||
export const renderReadActivity = (user: { id: User['id'] }, message: MessagingMessage) => ({
 | 
			
		||||
	type: 'Read',
 | 
			
		||||
	actor: `${config.url}/users/${user.id}`,
 | 
			
		||||
	object: message.uri
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,7 +1,7 @@
 | 
			
		|||
import config from '@/config';
 | 
			
		||||
import { ILocalUser } from '../../../models/entities/user';
 | 
			
		||||
import { User } from '@/models/entities/user';
 | 
			
		||||
 | 
			
		||||
export default (object: any, user: ILocalUser) => ({
 | 
			
		||||
export default (object: any, user: { id: User['id'] }) => ({
 | 
			
		||||
	type: 'Reject',
 | 
			
		||||
	actor: `${config.url}/users/${user.id}`,
 | 
			
		||||
	object
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,7 +1,7 @@
 | 
			
		|||
import config from '@/config';
 | 
			
		||||
import { ILocalUser } from '../../../models/entities/user';
 | 
			
		||||
import { User } from '@/models/entities/user';
 | 
			
		||||
 | 
			
		||||
export default (user: ILocalUser, target: any, object: any) => ({
 | 
			
		||||
export default (user: { id: User['id'] }, target: any, object: any) => ({
 | 
			
		||||
	type: 'Remove',
 | 
			
		||||
	actor: `${config.url}/users/${user.id}`,
 | 
			
		||||
	target,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,7 +1,7 @@
 | 
			
		|||
import config from '@/config';
 | 
			
		||||
import { ILocalUser, User } from '../../../models/entities/user';
 | 
			
		||||
 | 
			
		||||
export default (object: any, user: ILocalUser | User) => ({
 | 
			
		||||
export default (object: any, user: { id: User['id'] }) => ({
 | 
			
		||||
	type: 'Undo',
 | 
			
		||||
	actor: `${config.url}/users/${user.id}`,
 | 
			
		||||
	object
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,7 +1,7 @@
 | 
			
		|||
import config from '@/config';
 | 
			
		||||
import { ILocalUser } from '../../../models/entities/user';
 | 
			
		||||
import { User } from '@/models/entities/user';
 | 
			
		||||
 | 
			
		||||
export default (object: any, user: ILocalUser) => {
 | 
			
		||||
export default (object: any, user: { id: User['id'] }) => {
 | 
			
		||||
	const activity = {
 | 
			
		||||
		id: `${config.url}/users/${user.id}#updates/${new Date().getTime()}`,
 | 
			
		||||
		actor: `${config.url}/users/${user.id}`,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,10 +1,10 @@
 | 
			
		|||
import config from '@/config';
 | 
			
		||||
import { Note } from '../../../models/entities/note';
 | 
			
		||||
import { IRemoteUser, ILocalUser } from '../../../models/entities/user';
 | 
			
		||||
import { IRemoteUser, User } from '../../../models/entities/user';
 | 
			
		||||
import { PollVote } from '../../../models/entities/poll-vote';
 | 
			
		||||
import { Poll } from '../../../models/entities/poll';
 | 
			
		||||
 | 
			
		||||
export default async function renderVote(user: ILocalUser, vote: PollVote, note: Note, poll: Poll, pollOwner: IRemoteUser): Promise<any> {
 | 
			
		||||
export default async function renderVote(user: { id: User['id'] }, vote: PollVote, note: Note, poll: Poll, pollOwner: IRemoteUser): Promise<any> {
 | 
			
		||||
	return {
 | 
			
		||||
		id: `${config.url}/users/${user.id}#votes/${vote.id}/activity`,
 | 
			
		||||
		actor: `${config.url}/users/${user.id}`,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,14 +4,14 @@ import { sign } from 'http-signature';
 | 
			
		|||
import * as crypto from 'crypto';
 | 
			
		||||
 | 
			
		||||
import config from '@/config';
 | 
			
		||||
import { ILocalUser } from '../../models/entities/user';
 | 
			
		||||
import { User } from '@/models/entities/user';
 | 
			
		||||
import { getAgentByUrl } from '@/misc/fetch';
 | 
			
		||||
import { URL } from 'url';
 | 
			
		||||
import got from 'got';
 | 
			
		||||
import * as Got from 'got';
 | 
			
		||||
import { getUserKeypair } from '@/misc/keypair-store';
 | 
			
		||||
 | 
			
		||||
export default async (user: ILocalUser, url: string, object: any) => {
 | 
			
		||||
export default async (user: { id: User['id'] }, url: string, object: any) => {
 | 
			
		||||
	const timeout = 10 * 1000;
 | 
			
		||||
 | 
			
		||||
	const { protocol, hostname, port, pathname, search } = new URL(url);
 | 
			
		||||
| 
						 | 
				
			
			@ -24,7 +24,7 @@ export default async (user: ILocalUser, url: string, object: any) => {
 | 
			
		|||
 | 
			
		||||
	const keypair = await getUserKeypair(user.id);
 | 
			
		||||
 | 
			
		||||
	await new Promise((resolve, reject) => {
 | 
			
		||||
	await new Promise<void>((resolve, reject) => {
 | 
			
		||||
		const req = https.request({
 | 
			
		||||
			agent: getAgentByUrl(new URL(`https://example.net`)),
 | 
			
		||||
			protocol,
 | 
			
		||||
| 
						 | 
				
			
			@ -69,7 +69,7 @@ export default async (user: ILocalUser, url: string, object: any) => {
 | 
			
		|||
 * @param user http-signature user
 | 
			
		||||
 * @param url URL to fetch
 | 
			
		||||
 */
 | 
			
		||||
export async function signedGet(url: string, user: ILocalUser) {
 | 
			
		||||
export async function signedGet(url: string, user: { id: User['id'] }) {
 | 
			
		||||
	const timeout = 10 * 1000;
 | 
			
		||||
 | 
			
		||||
	const keypair = await getUserKeypair(user.id);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,3 +1,4 @@
 | 
			
		|||
import { URL } from 'url';
 | 
			
		||||
import webFinger from './webfinger';
 | 
			
		||||
import config from '@/config';
 | 
			
		||||
import { createPerson, updatePerson } from './activitypub/models/person';
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,3 +1,4 @@
 | 
			
		|||
import { URL } from 'url';
 | 
			
		||||
import { getJson } from '@/misc/fetch';
 | 
			
		||||
import { query as urlQuery } from '../prelude/url';
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,7 @@ import { User } from '../../../models/entities/user';
 | 
			
		|||
import { Blockings } from '../../../models';
 | 
			
		||||
import { SelectQueryBuilder } from 'typeorm';
 | 
			
		||||
 | 
			
		||||
export function generateBlockQueryForUsers(q: SelectQueryBuilder<any>, me: User) {
 | 
			
		||||
export function generateBlockQueryForUsers(q: SelectQueryBuilder<any>, me: { id: User['id'] }) {
 | 
			
		||||
	const blockingQuery = Blockings.createQueryBuilder('blocking')
 | 
			
		||||
		.select('blocking.blockeeId')
 | 
			
		||||
		.where('blocking.blockerId = :blockerId', { blockerId: me.id });
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,7 @@ import { User } from '../../../models/entities/user';
 | 
			
		|||
import { ChannelFollowings } from '../../../models';
 | 
			
		||||
import { Brackets, SelectQueryBuilder } from 'typeorm';
 | 
			
		||||
 | 
			
		||||
export function generateChannelQuery(q: SelectQueryBuilder<any>, me?: User | null) {
 | 
			
		||||
export function generateChannelQuery(q: SelectQueryBuilder<any>, me?: { id: User['id'] } | null) {
 | 
			
		||||
	if (me == null) {
 | 
			
		||||
		q.andWhere('note.channelId IS NULL');
 | 
			
		||||
	} else {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,7 @@ import { User } from '../../../models/entities/user';
 | 
			
		|||
import { MutedNotes } from '../../../models';
 | 
			
		||||
import { SelectQueryBuilder } from 'typeorm';
 | 
			
		||||
 | 
			
		||||
export function generateMutedNoteQuery(q: SelectQueryBuilder<any>, me: User) {
 | 
			
		||||
export function generateMutedNoteQuery(q: SelectQueryBuilder<any>, me: { id: User['id'] }) {
 | 
			
		||||
	const mutedQuery = MutedNotes.createQueryBuilder('muted')
 | 
			
		||||
		.select('muted.noteId')
 | 
			
		||||
		.where('muted.userId = :userId', { userId: me.id });
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,7 @@ import { User } from '../../../models/entities/user';
 | 
			
		|||
import { Mutings } from '../../../models';
 | 
			
		||||
import { SelectQueryBuilder, Brackets } from 'typeorm';
 | 
			
		||||
 | 
			
		||||
export function generateMutedUserQuery(q: SelectQueryBuilder<any>, me: User, exclude?: User) {
 | 
			
		||||
export function generateMutedUserQuery(q: SelectQueryBuilder<any>, me: { id: User['id'] }, exclude?: User) {
 | 
			
		||||
	const mutingQuery = Mutings.createQueryBuilder('muting')
 | 
			
		||||
		.select('muting.muteeId')
 | 
			
		||||
		.where('muting.muterId = :muterId', { muterId: me.id });
 | 
			
		||||
| 
						 | 
				
			
			@ -28,7 +28,7 @@ export function generateMutedUserQuery(q: SelectQueryBuilder<any>, me: User, exc
 | 
			
		|||
	q.setParameters(mutingQuery.getParameters());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function generateMutedUserQueryForUsers(q: SelectQueryBuilder<any>, me: User) {
 | 
			
		||||
export function generateMutedUserQueryForUsers(q: SelectQueryBuilder<any>, me: { id: User['id'] }) {
 | 
			
		||||
	const mutingQuery = Mutings.createQueryBuilder('muting')
 | 
			
		||||
		.select('muting.muteeId')
 | 
			
		||||
		.where('muting.muterId = :muterId', { muterId: me.id });
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,7 +1,7 @@
 | 
			
		|||
import { User } from '../../../models/entities/user';
 | 
			
		||||
import { Brackets, SelectQueryBuilder } from 'typeorm';
 | 
			
		||||
 | 
			
		||||
export function generateRepliesQuery(q: SelectQueryBuilder<any>, me?: User | null) {
 | 
			
		||||
export function generateRepliesQuery(q: SelectQueryBuilder<any>, me?: { id: User['id'] } | null) {
 | 
			
		||||
	if (me == null) {
 | 
			
		||||
		q.andWhere(new Brackets(qb => { qb
 | 
			
		||||
			.where(`note.replyId IS NULL`) // 返信ではない
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,7 @@ import { User } from '../../../models/entities/user';
 | 
			
		|||
import { Followings } from '../../../models';
 | 
			
		||||
import { Brackets, SelectQueryBuilder } from 'typeorm';
 | 
			
		||||
 | 
			
		||||
export function generateVisibilityQuery(q: SelectQueryBuilder<any>, me?: User | null) {
 | 
			
		||||
export function generateVisibilityQuery(q: SelectQueryBuilder<any>, me?: { id: User['id'] } | null) {
 | 
			
		||||
	if (me == null) {
 | 
			
		||||
		q.andWhere(new Brackets(qb => { qb
 | 
			
		||||
			.where(`note.visibility = 'public'`)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,7 +1,7 @@
 | 
			
		|||
import { publishMainStream, publishGroupMessagingStream } from '../../../services/stream';
 | 
			
		||||
import { publishMessagingStream } from '../../../services/stream';
 | 
			
		||||
import { publishMessagingIndexStream } from '../../../services/stream';
 | 
			
		||||
import { User, ILocalUser, IRemoteUser } from '../../../models/entities/user';
 | 
			
		||||
import { User, IRemoteUser } from '../../../models/entities/user';
 | 
			
		||||
import { MessagingMessage } from '../../../models/entities/messaging-message';
 | 
			
		||||
import { MessagingMessages, UserGroupJoinings, Users } from '../../../models';
 | 
			
		||||
import { In } from 'typeorm';
 | 
			
		||||
| 
						 | 
				
			
			@ -107,7 +107,7 @@ export async function readGroupMessagingMessage(
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export async function deliverReadActivity(user: ILocalUser, recipient: IRemoteUser, messages: MessagingMessage | MessagingMessage[]) {
 | 
			
		||||
export async function deliverReadActivity(user: { id: User['id']; host: null; }, recipient: IRemoteUser, messages: MessagingMessage | MessagingMessage[]) {
 | 
			
		||||
	messages = toArray(messages).filter(x => x.uri);
 | 
			
		||||
	const contents = messages.map(x => renderReadActivity(user, x));
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,6 +5,18 @@ import { ApiError } from './error';
 | 
			
		|||
import { SchemaType } from '@/misc/schema';
 | 
			
		||||
import { AccessToken } from '../../models/entities/access-token';
 | 
			
		||||
 | 
			
		||||
type SimpleUserInfo = {
 | 
			
		||||
	id: ILocalUser['id'];
 | 
			
		||||
	host: ILocalUser['host'];
 | 
			
		||||
	username: ILocalUser['username'];
 | 
			
		||||
	uri: ILocalUser['uri'];
 | 
			
		||||
	inbox: ILocalUser['inbox'];
 | 
			
		||||
	sharedInbox: ILocalUser['sharedInbox'];
 | 
			
		||||
	isAdmin: ILocalUser['isAdmin'];
 | 
			
		||||
	isModerator: ILocalUser['isModerator'];
 | 
			
		||||
	isSilenced: ILocalUser['isSilenced'];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// TODO: defaultが設定されている場合はその型も考慮する
 | 
			
		||||
type Params<T extends IEndpointMeta> = {
 | 
			
		||||
	[P in keyof T['params']]: NonNullable<T['params']>[P]['transform'] extends Function
 | 
			
		||||
| 
						 | 
				
			
			@ -15,13 +27,12 @@ type Params<T extends IEndpointMeta> = {
 | 
			
		|||
export type Response = Record<string, any> | void;
 | 
			
		||||
 | 
			
		||||
type executor<T extends IEndpointMeta> =
 | 
			
		||||
	(params: Params<T>, user: T['requireCredential'] extends true ? ILocalUser : ILocalUser | null, token: AccessToken | null, file?: any, cleanup?: Function) =>
 | 
			
		||||
	(params: Params<T>, user: T['requireCredential'] extends true ? SimpleUserInfo : SimpleUserInfo | null, token: AccessToken | null, file?: any, cleanup?: Function) =>
 | 
			
		||||
		Promise<T['res'] extends undefined ? Response : SchemaType<NonNullable<T['res']>>>;
 | 
			
		||||
 | 
			
		||||
// TODO: API関数に user まるごと渡すのではなくユーザーIDなどの最小限のプロパティだけ渡すようにしたい(キャッシュとか考えないでよくなるため)
 | 
			
		||||
export default function <T extends IEndpointMeta>(meta: T, cb: executor<T>)
 | 
			
		||||
		: (params: any, user: T['requireCredential'] extends true ? ILocalUser : ILocalUser | null, token: AccessToken | null, file?: any) => Promise<any> {
 | 
			
		||||
	return (params: any, user: T['requireCredential'] extends true ? ILocalUser : ILocalUser | null, token: AccessToken | null, file?: any) => {
 | 
			
		||||
		: (params: any, user: T['requireCredential'] extends true ? SimpleUserInfo : SimpleUserInfo | null, token: AccessToken | null, file?: any) => Promise<any> {
 | 
			
		||||
	return (params: any, user: T['requireCredential'] extends true ? SimpleUserInfo : SimpleUserInfo | null, token: AccessToken | null, file?: any) => {
 | 
			
		||||
		function cleanup() {
 | 
			
		||||
			fs.unlink(file.path, () => {});
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -34,7 +34,8 @@ export const meta = {
 | 
			
		|||
	}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export default define(meta, async (ps, me) => {
 | 
			
		||||
export default define(meta, async (ps, _me) => {
 | 
			
		||||
	const me = _me ? await Users.findOneOrFail(_me.id) : null;
 | 
			
		||||
	const noUsers = (await Users.count({
 | 
			
		||||
		host: null,
 | 
			
		||||
	})) === 0;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -96,9 +96,9 @@ export default define(meta, async (ps) => {
 | 
			
		|||
		emojis = await q.getMany();
 | 
			
		||||
 | 
			
		||||
		emojis = emojis.filter(emoji =>
 | 
			
		||||
			emoji.name.includes(ps.query) ||
 | 
			
		||||
			emoji.aliases.some(a => a.includes(ps.query)) ||
 | 
			
		||||
			emoji.category?.includes(ps.query));
 | 
			
		||||
			emoji.name.includes(ps.query!) ||
 | 
			
		||||
			emoji.aliases.some(a => a.includes(ps.query!)) ||
 | 
			
		||||
			emoji.category?.includes(ps.query!));
 | 
			
		||||
 | 
			
		||||
		emojis.splice(ps.limit! + 1);
 | 
			
		||||
	} else {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,3 +1,4 @@
 | 
			
		|||
import { URL } from 'url';
 | 
			
		||||
import define from '../../../define';
 | 
			
		||||
import { deliverQueue } from '../../../../../queue';
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,3 +1,4 @@
 | 
			
		|||
import { URL } from 'url';
 | 
			
		||||
import define from '../../../define';
 | 
			
		||||
import { inboxQueue } from '../../../../../queue';
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,3 +1,4 @@
 | 
			
		|||
import { URL } from 'url';
 | 
			
		||||
import $ from 'cafy';
 | 
			
		||||
import define from '../../../define';
 | 
			
		||||
import { addRelay } from '../../../../../services/relay';
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -89,7 +89,7 @@ export default define(meta, async (ps, user) => {
 | 
			
		|||
	let userList;
 | 
			
		||||
	let userGroupJoining;
 | 
			
		||||
 | 
			
		||||
	if (ps.src === 'list') {
 | 
			
		||||
	if (ps.src === 'list' && ps.userListId) {
 | 
			
		||||
		userList = await UserLists.findOne({
 | 
			
		||||
			id: ps.userListId,
 | 
			
		||||
			userId: user.id,
 | 
			
		||||
| 
						 | 
				
			
			@ -98,7 +98,7 @@ export default define(meta, async (ps, user) => {
 | 
			
		|||
		if (userList == null) {
 | 
			
		||||
			throw new ApiError(meta.errors.noSuchUserList);
 | 
			
		||||
		}
 | 
			
		||||
	} else if (ps.src === 'group') {
 | 
			
		||||
	} else if (ps.src === 'group' && ps.userGroupId) {
 | 
			
		||||
		userGroupJoining = await UserGroupJoinings.findOne({
 | 
			
		||||
			userGroupId: ps.userGroupId,
 | 
			
		||||
			userId: user.id,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -108,7 +108,7 @@ export default define(meta, async (ps, user) => {
 | 
			
		|||
	let userList;
 | 
			
		||||
	let userGroupJoining;
 | 
			
		||||
 | 
			
		||||
	if (ps.src === 'list') {
 | 
			
		||||
	if (ps.src === 'list' && ps.userListId) {
 | 
			
		||||
		userList = await UserLists.findOne({
 | 
			
		||||
			id: ps.userListId,
 | 
			
		||||
			userId: user.id,
 | 
			
		||||
| 
						 | 
				
			
			@ -117,7 +117,7 @@ export default define(meta, async (ps, user) => {
 | 
			
		|||
		if (userList == null) {
 | 
			
		||||
			throw new ApiError(meta.errors.noSuchUserList);
 | 
			
		||||
		}
 | 
			
		||||
	} else if (ps.src === 'group') {
 | 
			
		||||
	} else if (ps.src === 'group' && ps.userGroupId) {
 | 
			
		||||
		userGroupJoining = await UserGroupJoinings.findOne({
 | 
			
		||||
			userGroupId: ps.userGroupId,
 | 
			
		||||
			userId: user.id,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -46,6 +46,6 @@ export default define(meta, async (ps, user, token) => {
 | 
			
		|||
 | 
			
		||||
	return await Apps.pack(ap, user, {
 | 
			
		||||
		detail: true,
 | 
			
		||||
		includeSecret: isSecure && (ap.userId === user.id)
 | 
			
		||||
		includeSecret: isSecure && (ap.userId === user!.id)
 | 
			
		||||
	});
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -62,7 +62,7 @@ export const meta = {
 | 
			
		|||
};
 | 
			
		||||
 | 
			
		||||
export default define(meta, async (ps, user) => {
 | 
			
		||||
	const blocker = user;
 | 
			
		||||
	const blocker = await Users.findOneOrFail(user.id);
 | 
			
		||||
 | 
			
		||||
	// 自分自身
 | 
			
		||||
	if (user.id === ps.userId) {
 | 
			
		||||
| 
						 | 
				
			
			@ -93,7 +93,7 @@ export default define(meta, async (ps, user) => {
 | 
			
		|||
		noteUserId: blockee.id
 | 
			
		||||
	});
 | 
			
		||||
 | 
			
		||||
	return await Users.pack(blockee.id, user, {
 | 
			
		||||
	return await Users.pack(blockee.id, blocker, {
 | 
			
		||||
		detail: true
 | 
			
		||||
	});
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -126,7 +126,7 @@ export const meta = {
 | 
			
		|||
};
 | 
			
		||||
 | 
			
		||||
export default define(meta, async (ps, user) => {
 | 
			
		||||
	const blocker = user;
 | 
			
		||||
	const blocker = await Users.findOneOrFail(user.id);
 | 
			
		||||
 | 
			
		||||
	// Check if the blockee is yourself
 | 
			
		||||
	if (user.id === ps.userId) {
 | 
			
		||||
| 
						 | 
				
			
			@ -152,7 +152,7 @@ export default define(meta, async (ps, user) => {
 | 
			
		|||
	// Delete blocking
 | 
			
		||||
	await deleteBlocking(blocker, blockee);
 | 
			
		||||
 | 
			
		||||
	return await Users.pack(blockee.id, user, {
 | 
			
		||||
	return await Users.pack(blockee.id, blocker, {
 | 
			
		||||
		detail: true
 | 
			
		||||
	});
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -97,7 +97,7 @@ export default define(meta, async (ps, user) => {
 | 
			
		|||
 | 
			
		||||
	const timeline = await query.take(ps.limit!).getMany();
 | 
			
		||||
 | 
			
		||||
	activeUsersChart.update(user);
 | 
			
		||||
	if (user) activeUsersChart.update(user);
 | 
			
		||||
 | 
			
		||||
	return await Notes.packMany(timeline, user);
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -32,14 +32,14 @@ export const meta = {
 | 
			
		|||
};
 | 
			
		||||
 | 
			
		||||
export default define(meta, async (ps, user) => {
 | 
			
		||||
	const clip = await Clips.save({
 | 
			
		||||
	const clip = await Clips.insert({
 | 
			
		||||
		id: genId(),
 | 
			
		||||
		createdAt: new Date(),
 | 
			
		||||
		userId: user.id,
 | 
			
		||||
		name: ps.name,
 | 
			
		||||
		isPublic: ps.isPublic,
 | 
			
		||||
		description: ps.description,
 | 
			
		||||
	});
 | 
			
		||||
	}).then(x => Clips.findOneOrFail(x.identifiers[0]));
 | 
			
		||||
 | 
			
		||||
	return await Clips.pack(clip);
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -34,7 +34,7 @@ export default define(meta, async (ps, user) => {
 | 
			
		|||
	const instance = await fetchMeta(true);
 | 
			
		||||
 | 
			
		||||
	// Calculate drive usage
 | 
			
		||||
	const usage = await DriveFiles.calcDriveUsageOf(user);
 | 
			
		||||
	const usage = await DriveFiles.calcDriveUsageOf(user.id);
 | 
			
		||||
 | 
			
		||||
	return {
 | 
			
		||||
		capacity: 1024 * 1024 * instance.localDriveCapacityMb,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -68,13 +68,13 @@ export default define(meta, async (ps, user) => {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	// Create folder
 | 
			
		||||
	const folder = await DriveFolders.save({
 | 
			
		||||
	const folder = await DriveFolders.insert({
 | 
			
		||||
		id: genId(),
 | 
			
		||||
		createdAt: new Date(),
 | 
			
		||||
		name: ps.name,
 | 
			
		||||
		parentId: parent !== null ? parent.id : null,
 | 
			
		||||
		userId: user.id
 | 
			
		||||
	});
 | 
			
		||||
	}).then(x => DriveFolders.findOneOrFail(x.identifiers[0]));
 | 
			
		||||
 | 
			
		||||
	const folderObj = await DriveFolders.pack(folder);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,6 @@ import $ from 'cafy';
 | 
			
		|||
import define from '../../define';
 | 
			
		||||
import { Instances } from '../../../../models';
 | 
			
		||||
import { toPuny } from '@/misc/convert-host';
 | 
			
		||||
import config from '@/config';
 | 
			
		||||
 | 
			
		||||
export const meta = {
 | 
			
		||||
	tags: ['federation'],
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -140,7 +140,7 @@ export default define(meta, async (ps, user) => {
 | 
			
		|||
	const query = makePaginationQuery(ReversiGames.createQueryBuilder('game'), ps.sinceId, ps.untilId)
 | 
			
		||||
		.andWhere('game.isStarted = TRUE');
 | 
			
		||||
 | 
			
		||||
	if (ps.my) {
 | 
			
		||||
	if (ps.my && user) {
 | 
			
		||||
		query.andWhere(new Brackets(qb => { qb
 | 
			
		||||
			.where('game.user1Id = :userId', { userId: user.id })
 | 
			
		||||
			.orWhere('game.user2Id = :userId', { userId: user.id });
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -72,7 +72,7 @@ export default define(meta, async (ps, user) => {
 | 
			
		|||
			isLlotheo: false
 | 
			
		||||
		} as Partial<ReversiGame>);
 | 
			
		||||
 | 
			
		||||
		publishReversiStream(exist.parentId, 'matched', await ReversiGames.pack(game, exist.parentId));
 | 
			
		||||
		publishReversiStream(exist.parentId, 'matched', await ReversiGames.pack(game, { id: exist.parentId }));
 | 
			
		||||
 | 
			
		||||
		const other = await ReversiMatchings.count({
 | 
			
		||||
			childId: user.id
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -61,7 +61,7 @@ export default define(meta, async (ps, user) => {
 | 
			
		|||
		throw e;
 | 
			
		||||
	});
 | 
			
		||||
 | 
			
		||||
	return await Users.pack(user, user, {
 | 
			
		||||
	return await Users.pack(user.id, user, {
 | 
			
		||||
		detail: true
 | 
			
		||||
	});
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,3 @@
 | 
			
		|||
import $ from 'cafy';
 | 
			
		||||
import define from '../../../define';
 | 
			
		||||
import { RegistryItems } from '../../../../../models';
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -47,7 +47,7 @@ export default define(meta, async (ps, user) => {
 | 
			
		|||
		throw e;
 | 
			
		||||
	});
 | 
			
		||||
 | 
			
		||||
	return await Users.pack(user, user, {
 | 
			
		||||
	return await Users.pack(user.id, user, {
 | 
			
		||||
		detail: true
 | 
			
		||||
	});
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -205,7 +205,8 @@ export const meta = {
 | 
			
		|||
	}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export default define(meta, async (ps, user, token) => {
 | 
			
		||||
export default define(meta, async (ps, _user, token) => {
 | 
			
		||||
	const user = await Users.findOneOrFail(_user.id);
 | 
			
		||||
	const isSecure = token == null;
 | 
			
		||||
 | 
			
		||||
	const updates = {} as Partial<User>;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,7 +5,7 @@ import define from '../../define';
 | 
			
		|||
import * as ms from 'ms';
 | 
			
		||||
import { getNote } from '../../common/getters';
 | 
			
		||||
import { ApiError } from '../../error';
 | 
			
		||||
import { Notes } from '../../../../models';
 | 
			
		||||
import { Notes, Users } from '../../../../models';
 | 
			
		||||
 | 
			
		||||
export const meta = {
 | 
			
		||||
	desc: {
 | 
			
		||||
| 
						 | 
				
			
			@ -55,6 +55,6 @@ export default define(meta, async (ps, user) => {
 | 
			
		|||
	});
 | 
			
		||||
 | 
			
		||||
	for (const note of renotes) {
 | 
			
		||||
		deleteNote(user, note);
 | 
			
		||||
		deleteNote(await Users.findOneOrFail(user.id), note);
 | 
			
		||||
	}
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -43,7 +43,7 @@ export default define(meta, async (ps, user) => {
 | 
			
		|||
		event: ps.event,
 | 
			
		||||
		var: ps.var,
 | 
			
		||||
		userId: user.id,
 | 
			
		||||
		user: await Users.pack(user, page.userId, {
 | 
			
		||||
		user: await Users.pack(user.id, { id: page.userId }, {
 | 
			
		||||
			detail: true
 | 
			
		||||
		})
 | 
			
		||||
	});
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -31,12 +31,12 @@ export const meta = {
 | 
			
		|||
};
 | 
			
		||||
 | 
			
		||||
export default define(meta, async (ps, user) => {
 | 
			
		||||
	const userGroup = await UserGroups.save({
 | 
			
		||||
	const userGroup = await UserGroups.insert({
 | 
			
		||||
		id: genId(),
 | 
			
		||||
		createdAt: new Date(),
 | 
			
		||||
		userId: user.id,
 | 
			
		||||
		name: ps.name,
 | 
			
		||||
	} as UserGroup);
 | 
			
		||||
	} as UserGroup).then(x => UserGroups.findOneOrFail(x.identifiers[0]));
 | 
			
		||||
 | 
			
		||||
	// Push the owner
 | 
			
		||||
	await UserGroupJoinings.insert({
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -96,12 +96,12 @@ export default define(meta, async (ps, me) => {
 | 
			
		|||
		throw new ApiError(meta.errors.alreadyInvited);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	const invitation = await UserGroupInvitations.save({
 | 
			
		||||
	const invitation = await UserGroupInvitations.insert({
 | 
			
		||||
		id: genId(),
 | 
			
		||||
		createdAt: new Date(),
 | 
			
		||||
		userId: user.id,
 | 
			
		||||
		userGroupId: userGroup.id
 | 
			
		||||
	} as UserGroupInvitation);
 | 
			
		||||
	} as UserGroupInvitation).then(x => UserGroupInvitations.findOneOrFail(x.identifiers[0]));
 | 
			
		||||
 | 
			
		||||
	// 通知を作成
 | 
			
		||||
	createNotification(user.id, 'groupInvited', {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -30,12 +30,12 @@ export const meta = {
 | 
			
		|||
};
 | 
			
		||||
 | 
			
		||||
export default define(meta, async (ps, user) => {
 | 
			
		||||
	const userList = await UserLists.save({
 | 
			
		||||
	const userList = await UserLists.insert({
 | 
			
		||||
		id: genId(),
 | 
			
		||||
		createdAt: new Date(),
 | 
			
		||||
		userId: user.id,
 | 
			
		||||
		name: ps.name,
 | 
			
		||||
	} as UserList);
 | 
			
		||||
	} as UserList).then(x => UserLists.findOneOrFail(x.identifiers[0]));
 | 
			
		||||
 | 
			
		||||
	return await UserLists.pack(userList);
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,6 +6,7 @@ import { ApiError } from '../../error';
 | 
			
		|||
import { ID } from '@/misc/cafy-id';
 | 
			
		||||
import { Users } from '../../../../models';
 | 
			
		||||
import { In } from 'typeorm';
 | 
			
		||||
import { User } from '@/models/entities/user';
 | 
			
		||||
 | 
			
		||||
export const meta = {
 | 
			
		||||
	desc: {
 | 
			
		||||
| 
						 | 
				
			
			@ -81,9 +82,9 @@ export default define(meta, async (ps, me) => {
 | 
			
		|||
		});
 | 
			
		||||
 | 
			
		||||
		// リクエストされた通りに並べ替え
 | 
			
		||||
		const _users = [];
 | 
			
		||||
		const _users: User[] = [];
 | 
			
		||||
		for (const id of ps.userIds) {
 | 
			
		||||
			_users.push(users.find(x => x.id === id));
 | 
			
		||||
			_users.push(users.find(x => x.id === id)!);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return await Promise.all(_users.map(u => Users.pack(u, me, {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,7 +7,7 @@ import Logger from '../../services/logger';
 | 
			
		|||
 | 
			
		||||
const logger = new Logger('limiter');
 | 
			
		||||
 | 
			
		||||
export default (endpoint: IEndpoint, user: User) => new Promise((ok, reject) => {
 | 
			
		||||
export default (endpoint: IEndpoint, user: User) => new Promise<void>((ok, reject) => {
 | 
			
		||||
	const limitation = endpoint.meta.limit!;
 | 
			
		||||
 | 
			
		||||
	const key = limitation.hasOwnProperty('key')
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,7 +26,7 @@ export default class extends Channel {
 | 
			
		|||
					childId: body.id
 | 
			
		||||
				});
 | 
			
		||||
				if (matching == null) return;
 | 
			
		||||
				publishMainStream(matching.childId, 'reversiInvited', await ReversiMatchings.pack(matching, matching.childId));
 | 
			
		||||
				publishMainStream(matching.childId, 'reversiInvited', await ReversiMatchings.pack(matching, { id: matching.childId }));
 | 
			
		||||
				break;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -42,8 +42,9 @@ export default class extends Channel {
 | 
			
		|||
 | 
			
		||||
		// 関係ない返信は除外
 | 
			
		||||
		if (note.reply) {
 | 
			
		||||
			const reply = note.reply as PackedNote;
 | 
			
		||||
			// 「チャンネル接続主への返信」でもなければ、「チャンネル接続主が行った返信」でもなければ、「投稿者の投稿者自身への返信」でもない場合
 | 
			
		||||
			if (note.reply.userId !== this.user!.id && note.userId !== this.user!.id && note.reply.userId !== note.userId) return;
 | 
			
		||||
			if (reply.userId !== this.user!.id && note.userId !== this.user!.id && reply.userId !== note.userId) return;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -50,8 +50,9 @@ export default class extends Channel {
 | 
			
		|||
 | 
			
		||||
		// 関係ない返信は除外
 | 
			
		||||
		if (note.reply) {
 | 
			
		||||
			const reply = note.reply as PackedNote;
 | 
			
		||||
			// 「チャンネル接続主への返信」でもなければ、「チャンネル接続主が行った返信」でもなければ、「投稿者の投稿者自身への返信」でもない場合
 | 
			
		||||
			if (note.reply.userId !== this.user!.id && note.userId !== this.user!.id && note.reply.userId !== note.userId) return;
 | 
			
		||||
			if (reply.userId !== this.user!.id && note.userId !== this.user!.id && reply.userId !== note.userId) return;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -59,8 +59,9 @@ export default class extends Channel {
 | 
			
		|||
 | 
			
		||||
		// 関係ない返信は除外
 | 
			
		||||
		if (note.reply) {
 | 
			
		||||
			const reply = note.reply as PackedNote;
 | 
			
		||||
			// 「チャンネル接続主への返信」でもなければ、「チャンネル接続主が行った返信」でもなければ、「投稿者の投稿者自身への返信」でもない場合
 | 
			
		||||
			if (note.reply.userId !== this.user!.id && note.userId !== this.user!.id && note.reply.userId !== note.userId) return;
 | 
			
		||||
			if (reply.userId !== this.user!.id && note.userId !== this.user!.id && reply.userId !== note.userId) return;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -44,8 +44,9 @@ export default class extends Channel {
 | 
			
		|||
 | 
			
		||||
		// 関係ない返信は除外
 | 
			
		||||
		if (note.reply) {
 | 
			
		||||
			const reply = note.reply as PackedNote;
 | 
			
		||||
			// 「チャンネル接続主への返信」でもなければ、「チャンネル接続主が行った返信」でもなければ、「投稿者の投稿者自身への返信」でもない場合
 | 
			
		||||
			if (note.reply.userId !== this.user!.id && note.userId !== this.user!.id && note.reply.userId !== note.userId) return;
 | 
			
		||||
			if (reply.userId !== this.user!.id && note.userId !== this.user!.id && reply.userId !== note.userId) return;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -156,8 +156,8 @@ export default class Connection {
 | 
			
		|||
		};
 | 
			
		||||
 | 
			
		||||
		add(note);
 | 
			
		||||
		if (note.reply) add(note.reply);
 | 
			
		||||
		if (note.renote) add(note.renote);
 | 
			
		||||
		if (note.reply) add(note.reply as PackedNote);
 | 
			
		||||
		if (note.renote) add(note.renote as PackedNote);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@autobind
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -89,7 +89,7 @@ router.get('/verify-email/:code', async ctx => {
 | 
			
		|||
			emailVerifyCode: null
 | 
			
		||||
		});
 | 
			
		||||
 | 
			
		||||
		publishMainStream(profile.userId, 'meUpdated', await Users.pack(profile.userId, profile.userId, {
 | 
			
		||||
		publishMainStream(profile.userId, 'meUpdated', await Users.pack(profile.userId, { id: profile.userId }, {
 | 
			
		||||
			detail: true,
 | 
			
		||||
			includeSecrets: true
 | 
			
		||||
		}));
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,7 +6,7 @@ import { isMutedUserRelated } from '@/misc/is-muted-user-related';
 | 
			
		|||
import { publishAntennaStream, publishMainStream } from './stream';
 | 
			
		||||
import { User } from '../models/entities/user';
 | 
			
		||||
 | 
			
		||||
export async function addNoteToAntenna(antenna: Antenna, note: Note, noteUser: User) {
 | 
			
		||||
export async function addNoteToAntenna(antenna: Antenna, note: Note, noteUser: { id: User['id']; }) {
 | 
			
		||||
	// 通知しない設定になっているか、自分自身の投稿なら既読にする
 | 
			
		||||
	const read = !antenna.notify || (antenna.userId === noteUser.id);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -35,7 +35,7 @@ export default class ActiveUsersChart extends Chart<ActiveUsersLog> {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	@autobind
 | 
			
		||||
	public async update(user: User) {
 | 
			
		||||
	public async update(user: { id: User['id'], host: User['host'] }) {
 | 
			
		||||
		const update: Obj = {
 | 
			
		||||
			users: [user.id]
 | 
			
		||||
		};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -35,7 +35,7 @@ export default class HashtagChart extends Chart<HashtagLog> {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	@autobind
 | 
			
		||||
	public async update(hashtag: string, user: User) {
 | 
			
		||||
	public async update(hashtag: string, user: { id: User['id'], host: User['host'] }) {
 | 
			
		||||
		const update: Obj = {
 | 
			
		||||
			users: [user.id]
 | 
			
		||||
		};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -100,7 +100,7 @@ export default class PerUserFollowingChart extends Chart<PerUserFollowingLog> {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	@autobind
 | 
			
		||||
	public async update(follower: User, followee: User, isFollow: boolean) {
 | 
			
		||||
	public async update(follower: { id: User['id']; host: User['host']; }, followee: { id: User['id']; host: User['host']; }, isFollow: boolean) {
 | 
			
		||||
		const update: Obj = {};
 | 
			
		||||
 | 
			
		||||
		update.total = isFollow ? 1 : -1;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -46,7 +46,7 @@ export default class PerUserNotesChart extends Chart<PerUserNotesLog> {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	@autobind
 | 
			
		||||
	public async update(user: User, note: Note, isAdditional: boolean) {
 | 
			
		||||
	public async update(user: { id: User['id'] }, note: Note, isAdditional: boolean) {
 | 
			
		||||
		const update: Obj = {
 | 
			
		||||
			diffs: {}
 | 
			
		||||
		};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -36,7 +36,7 @@ export default class PerUserReactionsChart extends Chart<PerUserReactionsLog> {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	@autobind
 | 
			
		||||
	public async update(user: User, note: Note) {
 | 
			
		||||
	public async update(user: { id: User['id'], host: User['host'] }, note: Note) {
 | 
			
		||||
		this.inc({
 | 
			
		||||
			[Users.isLocalUser(user) ? 'local' : 'remote']: { count: 1 }
 | 
			
		||||
		}, note.userId);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -59,7 +59,7 @@ export default class UsersChart extends Chart<UsersLog> {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	@autobind
 | 
			
		||||
	public async update(user: User, isAdditional: boolean) {
 | 
			
		||||
	public async update(user: { id: User['id'], host: User['host'] }, isAdditional: boolean) {
 | 
			
		||||
		const update: Obj = {};
 | 
			
		||||
 | 
			
		||||
		update.total = isAdditional ? 1 : -1;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -302,7 +302,7 @@ async function deleteOldFile(user: IRemoteUser) {
 | 
			
		|||
 * @return Created drive file
 | 
			
		||||
 */
 | 
			
		||||
export default async function(
 | 
			
		||||
	user: User | null,
 | 
			
		||||
	user: { id: User['id']; host: User['host'] } | null,
 | 
			
		||||
	path: string,
 | 
			
		||||
	name: string | null = null,
 | 
			
		||||
	comment: string | null = null,
 | 
			
		||||
| 
						 | 
				
			
			@ -347,7 +347,7 @@ export default async function(
 | 
			
		|||
				throw new Error('no-free-space');
 | 
			
		||||
			} else {
 | 
			
		||||
				// (アバターまたはバナーを含まず)最も古いファイルを削除する
 | 
			
		||||
				deleteOldFile(user as IRemoteUser);
 | 
			
		||||
				deleteOldFile(await Users.findOneOrFail(user.id) as IRemoteUser);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,3 +1,4 @@
 | 
			
		|||
import { URL } from 'url';
 | 
			
		||||
import * as S3 from 'aws-sdk/clients/s3';
 | 
			
		||||
import { Meta } from '../../models/entities/meta';
 | 
			
		||||
import { getAgentByUrl } from '@/misc/fetch';
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,3 +1,4 @@
 | 
			
		|||
import { URL } from 'url';
 | 
			
		||||
import create from './add-file';
 | 
			
		||||
import { User } from '../../models/entities/user';
 | 
			
		||||
import { driveLogger } from './logger';
 | 
			
		||||
| 
						 | 
				
			
			@ -11,7 +12,7 @@ const logger = driveLogger.createSubLogger('downloader');
 | 
			
		|||
 | 
			
		||||
export default async (
 | 
			
		||||
	url: string,
 | 
			
		||||
	user: User | null,
 | 
			
		||||
	user: { id: User['id']; host: User['host'] } | null,
 | 
			
		||||
	folderId: DriveFolder['id'] | null = null,
 | 
			
		||||
	uri: string | null = null,
 | 
			
		||||
	sensitive = false,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -17,7 +17,7 @@ import { isDuplicateKeyValueError } from '@/misc/is-duplicate-key-value-error';
 | 
			
		|||
 | 
			
		||||
const logger = new Logger('following/create');
 | 
			
		||||
 | 
			
		||||
export async function insertFollowingDoc(followee: User, follower: User) {
 | 
			
		||||
export async function insertFollowingDoc(followee: { id: User['id']; host: User['host']; uri: User['host']; inbox: User['inbox']; sharedInbox: User['sharedInbox'] }, follower: { id: User['id']; host: User['host']; uri: User['host']; inbox: User['inbox']; sharedInbox: User['sharedInbox'] }) {
 | 
			
		||||
	if (follower.id === followee.id) return;
 | 
			
		||||
 | 
			
		||||
	let alreadyFollowed = false;
 | 
			
		||||
| 
						 | 
				
			
			@ -86,7 +86,7 @@ export async function insertFollowingDoc(followee: User, follower: User) {
 | 
			
		|||
 | 
			
		||||
	// Publish follow event
 | 
			
		||||
	if (Users.isLocalUser(follower)) {
 | 
			
		||||
		Users.pack(followee, follower, {
 | 
			
		||||
		Users.pack(followee.id, follower, {
 | 
			
		||||
			detail: true
 | 
			
		||||
		}).then(packed => {
 | 
			
		||||
			publishUserEvent(follower.id, 'follow', packed);
 | 
			
		||||
| 
						 | 
				
			
			@ -96,7 +96,7 @@ export async function insertFollowingDoc(followee: User, follower: User) {
 | 
			
		|||
 | 
			
		||||
	// Publish followed event
 | 
			
		||||
	if (Users.isLocalUser(followee)) {
 | 
			
		||||
		Users.pack(follower, followee).then(packed => publishMainStream(followee.id, 'followed', packed));
 | 
			
		||||
		Users.pack(follower.id, followee).then(packed => publishMainStream(followee.id, 'followed', packed));
 | 
			
		||||
 | 
			
		||||
		// 通知を作成
 | 
			
		||||
		createNotification(followee.id, 'follow', {
 | 
			
		||||
| 
						 | 
				
			
			@ -105,7 +105,12 @@ export async function insertFollowingDoc(followee: User, follower: User) {
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export default async function(follower: User, followee: User, requestId?: string) {
 | 
			
		||||
export default async function(_follower: { id: User['id'] }, _followee: { id: User['id'] }, requestId?: string) {
 | 
			
		||||
	const [follower, followee] = await Promise.all([
 | 
			
		||||
		Users.findOneOrFail(_follower.id),
 | 
			
		||||
		Users.findOneOrFail(_followee.id)
 | 
			
		||||
	]);
 | 
			
		||||
 | 
			
		||||
	// check blocking
 | 
			
		||||
	const [blocking, blocked] = await Promise.all([
 | 
			
		||||
		Blockings.findOne({
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,7 +11,7 @@ import { instanceChart, perUserFollowingChart } from '../chart';
 | 
			
		|||
 | 
			
		||||
const logger = new Logger('following/delete');
 | 
			
		||||
 | 
			
		||||
export default async function(follower: User, followee: User, silent = false) {
 | 
			
		||||
export default async function(follower: { id: User['id']; host: User['host']; uri: User['host']; inbox: User['inbox']; sharedInbox: User['sharedInbox']; }, followee: { id: User['id']; host: User['host']; uri: User['host']; inbox: User['inbox']; sharedInbox: User['sharedInbox']; }, silent = false) {
 | 
			
		||||
	const following = await Followings.findOne({
 | 
			
		||||
		followerId: follower.id,
 | 
			
		||||
		followeeId: followee.id
 | 
			
		||||
| 
						 | 
				
			
			@ -28,7 +28,7 @@ export default async function(follower: User, followee: User, silent = false) {
 | 
			
		|||
 | 
			
		||||
	// Publish unfollow event
 | 
			
		||||
	if (!silent && Users.isLocalUser(follower)) {
 | 
			
		||||
		Users.pack(followee, follower, {
 | 
			
		||||
		Users.pack(followee.id, follower, {
 | 
			
		||||
			detail: true
 | 
			
		||||
		}).then(packed => {
 | 
			
		||||
			publishUserEvent(follower.id, 'unfollow', packed);
 | 
			
		||||
| 
						 | 
				
			
			@ -42,7 +42,7 @@ export default async function(follower: User, followee: User, silent = false) {
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export async function decrementFollowing(follower: User, followee: User) {
 | 
			
		||||
export async function decrementFollowing(follower: { id: User['id']; host: User['host']; }, followee: { id: User['id']; host: User['host']; }) {
 | 
			
		||||
	//#region Decrement following count
 | 
			
		||||
	Users.decrement({ id: follower.id }, 'followingCount', 1);
 | 
			
		||||
	//#endregion
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,7 +6,7 @@ import { FollowRequests, Users } from '../../../models';
 | 
			
		|||
 * 指定したユーザー宛てのフォローリクエストをすべて承認
 | 
			
		||||
 * @param user ユーザー
 | 
			
		||||
 */
 | 
			
		||||
export default async function(user: User) {
 | 
			
		||||
export default async function(user: { id: User['id']; host: User['host']; uri: User['host']; inbox: User['inbox']; sharedInbox: User['sharedInbox']; }) {
 | 
			
		||||
	const requests = await FollowRequests.find({
 | 
			
		||||
		followeeId: user.id
 | 
			
		||||
	});
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -8,7 +8,7 @@ import { User, ILocalUser } from '../../../models/entities/user';
 | 
			
		|||
import { FollowRequests, Users } from '../../../models';
 | 
			
		||||
import { IdentifiableError } from '@/misc/identifiable-error';
 | 
			
		||||
 | 
			
		||||
export default async function(followee: User, follower: User) {
 | 
			
		||||
export default async function(followee: { id: User['id']; host: User['host']; uri: User['host']; inbox: User['inbox']; sharedInbox: User['sharedInbox']; }, follower: User) {
 | 
			
		||||
	const request = await FollowRequests.findOne({
 | 
			
		||||
		followeeId: followee.id,
 | 
			
		||||
		followerId: follower.id
 | 
			
		||||
| 
						 | 
				
			
			@ -20,12 +20,12 @@ export default async function(followee: User, follower: User) {
 | 
			
		|||
 | 
			
		||||
	await insertFollowingDoc(followee, follower);
 | 
			
		||||
 | 
			
		||||
	if (Users.isRemoteUser(follower)) {
 | 
			
		||||
		const content = renderActivity(renderAccept(renderFollow(follower, followee, request.requestId!), followee as ILocalUser));
 | 
			
		||||
		deliver(followee as ILocalUser, content, follower.inbox);
 | 
			
		||||
	if (Users.isRemoteUser(follower) && Users.isLocalUser(followee)) {
 | 
			
		||||
		const content = renderActivity(renderAccept(renderFollow(follower, followee, request.requestId!), followee));
 | 
			
		||||
		deliver(followee, content, follower.inbox);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	Users.pack(followee, followee, {
 | 
			
		||||
	Users.pack(followee.id, followee, {
 | 
			
		||||
		detail: true
 | 
			
		||||
	}).then(packed => publishMainStream(followee.id, 'meUpdated', packed));
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,10 +7,13 @@ import { IdentifiableError } from '@/misc/identifiable-error';
 | 
			
		|||
import { User, ILocalUser } from '../../../models/entities/user';
 | 
			
		||||
import { Users, FollowRequests } from '../../../models';
 | 
			
		||||
 | 
			
		||||
export default async function(followee: User, follower: User) {
 | 
			
		||||
export default async function(followee: { id: User['id']; host: User['host']; uri: User['host']; inbox: User['inbox'] }, follower: { id: User['id']; host: User['host']; uri: User['host'] }) {
 | 
			
		||||
	if (Users.isRemoteUser(followee)) {
 | 
			
		||||
		const content = renderActivity(renderUndo(renderFollow(follower, followee), follower));
 | 
			
		||||
		deliver(follower as ILocalUser, content, followee.inbox);
 | 
			
		||||
 | 
			
		||||
		if (Users.isLocalUser(follower)) { // 本来このチェックは不要だけどTSに怒られるので
 | 
			
		||||
			deliver(follower, content, followee.inbox);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	const request = await FollowRequests.findOne({
 | 
			
		||||
| 
						 | 
				
			
			@ -27,7 +30,7 @@ export default async function(followee: User, follower: User) {
 | 
			
		|||
		followerId: follower.id
 | 
			
		||||
	});
 | 
			
		||||
 | 
			
		||||
	Users.pack(followee, followee, {
 | 
			
		||||
	Users.pack(followee.id, followee, {
 | 
			
		||||
		detail: true
 | 
			
		||||
	}).then(packed => publishMainStream(followee.id, 'meUpdated', packed));
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,7 +7,7 @@ import { Blockings, FollowRequests, Users } from '../../../models';
 | 
			
		|||
import { genId } from '@/misc/gen-id';
 | 
			
		||||
import { createNotification } from '../../create-notification';
 | 
			
		||||
 | 
			
		||||
export default async function(follower: User, followee: User, requestId?: string) {
 | 
			
		||||
export default async function(follower: { id: User['id']; host: User['host']; uri: User['host']; inbox: User['inbox']; sharedInbox: User['sharedInbox']; }, followee: { id: User['id']; host: User['host']; uri: User['host']; inbox: User['inbox']; sharedInbox: User['sharedInbox']; }, requestId?: string) {
 | 
			
		||||
	if (follower.id === followee.id) return;
 | 
			
		||||
 | 
			
		||||
	// check blocking
 | 
			
		||||
| 
						 | 
				
			
			@ -43,9 +43,9 @@ export default async function(follower: User, followee: User, requestId?: string
 | 
			
		|||
 | 
			
		||||
	// Publish receiveRequest event
 | 
			
		||||
	if (Users.isLocalUser(followee)) {
 | 
			
		||||
		Users.pack(follower, followee).then(packed => publishMainStream(followee.id, 'receiveFollowRequest', packed));
 | 
			
		||||
		Users.pack(follower.id, followee).then(packed => publishMainStream(followee.id, 'receiveFollowRequest', packed));
 | 
			
		||||
 | 
			
		||||
		Users.pack(followee, followee, {
 | 
			
		||||
		Users.pack(followee.id, followee, {
 | 
			
		||||
			detail: true
 | 
			
		||||
		}).then(packed => publishMainStream(followee.id, 'meUpdated', packed));
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,15 +7,15 @@ import { User, ILocalUser } from '../../../models/entities/user';
 | 
			
		|||
import { Users, FollowRequests, Followings } from '../../../models';
 | 
			
		||||
import { decrementFollowing } from '../delete';
 | 
			
		||||
 | 
			
		||||
export default async function(followee: User, follower: User) {
 | 
			
		||||
	if (Users.isRemoteUser(follower)) {
 | 
			
		||||
export default async function(followee: { id: User['id']; host: User['host']; uri: User['host'] }, follower: User) {
 | 
			
		||||
	if (Users.isRemoteUser(follower) && Users.isLocalUser(followee)) {
 | 
			
		||||
		const request = await FollowRequests.findOne({
 | 
			
		||||
			followeeId: followee.id,
 | 
			
		||||
			followerId: follower.id
 | 
			
		||||
		});
 | 
			
		||||
 | 
			
		||||
		const content = renderActivity(renderReject(renderFollow(follower, followee, request!.requestId!), followee as ILocalUser));
 | 
			
		||||
		deliver(followee as ILocalUser, content, follower.inbox);
 | 
			
		||||
		const content = renderActivity(renderReject(renderFollow(follower, followee, request!.requestId!), followee));
 | 
			
		||||
		deliver(followee, content, follower.inbox);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	const request = await FollowRequests.findOne({
 | 
			
		||||
| 
						 | 
				
			
			@ -37,7 +37,7 @@ export default async function(followee: User, follower: User) {
 | 
			
		|||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	Users.pack(followee, follower, {
 | 
			
		||||
	Users.pack(followee.id, follower, {
 | 
			
		||||
		detail: true
 | 
			
		||||
	}).then(packed => {
 | 
			
		||||
		publishUserEvent(follower.id, 'unfollow', packed);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -16,7 +16,7 @@ import { deliverToRelays } from '../relay';
 | 
			
		|||
 * @param user
 | 
			
		||||
 * @param noteId
 | 
			
		||||
 */
 | 
			
		||||
export async function addPinned(user: User, noteId: Note['id']) {
 | 
			
		||||
export async function addPinned(user: { id: User['id']; host: User['host']; }, noteId: Note['id']) {
 | 
			
		||||
	// Fetch pinee
 | 
			
		||||
	const note = await Notes.findOne({
 | 
			
		||||
		id: noteId,
 | 
			
		||||
| 
						 | 
				
			
			@ -55,7 +55,7 @@ export async function addPinned(user: User, noteId: Note['id']) {
 | 
			
		|||
 * @param user
 | 
			
		||||
 * @param noteId
 | 
			
		||||
 */
 | 
			
		||||
export async function removePinned(user: User, noteId: Note['id']) {
 | 
			
		||||
export async function removePinned(user: { id: User['id']; host: User['host']; }, noteId: Note['id']) {
 | 
			
		||||
	// Fetch unpinee
 | 
			
		||||
	const note = await Notes.findOne({
 | 
			
		||||
		id: noteId,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
Some files were not shown because too many files have changed in this diff Show more
		Loading…
	
	Add table
		
		Reference in a new issue