Merge tag '2023.9.0' into merge-upstream

This commit is contained in:
riku6460
2023-09-25 12:43:07 +09:00
1235 changed files with 19016 additions and 13835 deletions

View File

@@ -5,12 +5,12 @@
import { Inject, Injectable } from '@nestjs/common';
import { DI } from '@/di-symbols.js';
import type { AbuseUserReportsRepository } from '@/models/index.js';
import type { AbuseUserReportsRepository } from '@/models/_.js';
import { awaitAll } from '@/misc/prelude/await-all.js';
import type { MiAbuseUserReport } from '@/models/entities/AbuseUserReport.js';
import type { MiAbuseUserReport } from '@/models/AbuseUserReport.js';
import { bindThis } from '@/decorators.js';
import { Packed } from '@/misc/json-schema.js';
import type { MiUser } from '@/models/entities/User.js';
import type { MiUser } from '@/models/User.js';
import { UserEntityService } from './UserEntityService.js';
@Injectable()

View File

@@ -8,10 +8,11 @@ import { DI } from '@/di-symbols.js';
import type {
AnnouncementReadsRepository,
AnnouncementsRepository,
} from '@/models/index.js';
MiAnnouncement,
MiUser,
} from '@/models/_.js';
import type { Packed } from '@/misc/json-schema.js';
import { bindThis } from '@/decorators.js';
import { MiAnnouncement, MiUser } from '@/models/index.js';
@Injectable()
export class AnnouncementEntityService {

View File

@@ -5,9 +5,9 @@
import { Inject, Injectable } from '@nestjs/common';
import { DI } from '@/di-symbols.js';
import type { AntennasRepository } from '@/models/index.js';
import type { AntennasRepository } from '@/models/_.js';
import type { Packed } from '@/misc/json-schema.js';
import type { MiAntenna } from '@/models/entities/Antenna.js';
import type { MiAntenna } from '@/models/Antenna.js';
import { bindThis } from '@/decorators.js';
@Injectable()

View File

@@ -5,10 +5,10 @@
import { Inject, Injectable } from '@nestjs/common';
import { DI } from '@/di-symbols.js';
import type { AccessTokensRepository, AppsRepository } from '@/models/index.js';
import type { AccessTokensRepository, AppsRepository } from '@/models/_.js';
import type { Packed } from '@/misc/json-schema.js';
import type { MiApp } from '@/models/entities/App.js';
import type { MiUser } from '@/models/entities/User.js';
import type { MiApp } from '@/models/App.js';
import type { MiUser } from '@/models/User.js';
import { bindThis } from '@/decorators.js';
@Injectable()
@@ -25,7 +25,7 @@ export class AppEntityService {
@bindThis
public async pack(
src: MiApp['id'] | MiApp,
me: { id: MiUser['id'] } | null | undefined,
me?: { id: MiUser['id'] } | null | undefined,
options?: {
detail?: boolean,
includeSecret?: boolean,

View File

@@ -5,10 +5,10 @@
import { Inject, Injectable } from '@nestjs/common';
import { DI } from '@/di-symbols.js';
import type { AuthSessionsRepository } from '@/models/index.js';
import type { AuthSessionsRepository } from '@/models/_.js';
import { awaitAll } from '@/misc/prelude/await-all.js';
import type { MiAuthSession } from '@/models/entities/AuthSession.js';
import type { MiUser } from '@/models/entities/User.js';
import type { MiAuthSession } from '@/models/AuthSession.js';
import type { MiUser } from '@/models/User.js';
import { bindThis } from '@/decorators.js';
import { AppEntityService } from './AppEntityService.js';
@@ -25,7 +25,7 @@ export class AuthSessionEntityService {
@bindThis
public async pack(
src: MiAuthSession['id'] | MiAuthSession,
me: { id: MiUser['id'] } | null | undefined,
me?: { id: MiUser['id'] } | null | undefined,
) {
const session = typeof src === 'object' ? src : await this.authSessionsRepository.findOneByOrFail({ id: src });

View File

@@ -5,11 +5,11 @@
import { Inject, Injectable } from '@nestjs/common';
import { DI } from '@/di-symbols.js';
import type { BlockingsRepository } from '@/models/index.js';
import type { BlockingsRepository } from '@/models/_.js';
import { awaitAll } from '@/misc/prelude/await-all.js';
import type { Packed } from '@/misc/json-schema.js';
import type { MiBlocking } from '@/models/entities/Blocking.js';
import type { MiUser } from '@/models/entities/User.js';
import type { MiBlocking } from '@/models/Blocking.js';
import type { MiUser } from '@/models/User.js';
import { bindThis } from '@/decorators.js';
import { UserEntityService } from './UserEntityService.js';
@@ -26,7 +26,7 @@ export class BlockingEntityService {
@bindThis
public async pack(
src: MiBlocking['id'] | MiBlocking,
me: { id: MiUser['id'] } | null | undefined,
me?: { id: MiUser['id'] } | null | undefined,
): Promise<Packed<'Blocking'>> {
const blocking = typeof src === 'object' ? src : await this.blockingsRepository.findOneByOrFail({ id: src });
@@ -43,7 +43,7 @@ export class BlockingEntityService {
@bindThis
public async packMany(
blockings: (MiBlocking['id'] | MiBlocking)[],
me: { id: MiUser['id'] } | null | undefined,
me: { id: MiUser['id'] },
) : Promise<Packed<'Blocking'>[]> {
return (await Promise.allSettled(blockings.map(x => this.pack(x, me))))
.filter(result => result.status === 'fulfilled')

View File

@@ -6,17 +6,11 @@
import { Inject, Injectable } from '@nestjs/common';
import { In } from 'typeorm';
import { DI } from '@/di-symbols.js';
import type {
ChannelFavoritesRepository,
ChannelFollowingsRepository,
ChannelsRepository,
DriveFilesRepository,
NotesRepository,
NoteUnreadsRepository,
} from '@/models/index.js';
import type { ChannelFavoritesRepository, ChannelFollowingsRepository, ChannelsRepository, DriveFilesRepository, NoteUnreadsRepository, NotesRepository } from '@/models/_.js';
import type { Packed } from '@/misc/json-schema.js';
import type { MiUser } from '@/models/entities/User.js';
import type { MiChannel } from '@/models/entities/Channel.js';
import type { } from '@/models/Blocking.js';
import type { MiUser } from '@/models/User.js';
import type { MiChannel } from '@/models/Channel.js';
import { bindThis } from '@/decorators.js';
import { DriveFileEntityService } from './DriveFileEntityService.js';
import { NoteEntityService } from './NoteEntityService.js';
@@ -50,7 +44,7 @@ export class ChannelEntityService {
@bindThis
public async pack(
src: MiChannel['id'] | MiChannel,
me: { id: MiUser['id'] } | null | undefined,
me?: { id: MiUser['id'] } | null | undefined,
detailed?: boolean,
): Promise<Packed<'Channel'>> {
const channel = typeof src === 'object' ? src : await this.channelsRepository.findOneByOrFail({ id: src });
@@ -98,6 +92,7 @@ export class ChannelEntityService {
isArchived: channel.isArchived,
usersCount: channel.usersCount,
notesCount: channel.notesCount,
isSensitive: channel.isSensitive,
...(me ? {
isFollowing,

View File

@@ -5,10 +5,11 @@
import { Inject, Injectable } from '@nestjs/common';
import { DI } from '@/di-symbols.js';
import type { ClipFavoritesRepository, ClipsRepository, MiUser } from '@/models/index.js';
import type { ClipFavoritesRepository, ClipsRepository, MiUser } from '@/models/_.js';
import { awaitAll } from '@/misc/prelude/await-all.js';
import type { Packed } from '@/misc/json-schema.js';
import type { MiClip } from '@/models/entities/Clip.js';
import type { } from '@/models/Blocking.js';
import type { MiClip } from '@/models/Clip.js';
import { bindThis } from '@/decorators.js';
import { UserEntityService } from './UserEntityService.js';
@@ -28,7 +29,7 @@ export class ClipEntityService {
@bindThis
public async pack(
src: MiClip['id'] | MiClip,
me: { id: MiUser['id'] } | null | undefined,
me?: { id: MiUser['id'] } | null | undefined,
): Promise<Packed<'Clip'>> {
const meId = me ? me.id : null;
const clip = typeof src === 'object' ? src : await this.clipsRepository.findOneByOrFail({ id: src });
@@ -50,7 +51,7 @@ export class ClipEntityService {
@bindThis
public async packMany(
clips: (MiClip['id'] | MiClip)[],
me: { id: MiUser['id'] } | null | undefined,
me?: { id: MiUser['id'] } | null | undefined,
) : Promise<Packed<'Clip'>[]> {
return (await Promise.allSettled(clips.map(x => this.pack(x, me))))
.filter(result => result.status === 'fulfilled')

View File

@@ -4,14 +4,14 @@
*/
import { forwardRef, Inject, Injectable } from '@nestjs/common';
import { DataSource, In } from 'typeorm';
import { In } from 'typeorm';
import { DI } from '@/di-symbols.js';
import type { DriveFilesRepository, NotesRepository } from '@/models/index.js';
import type { DriveFilesRepository } from '@/models/_.js';
import type { Config } from '@/config.js';
import type { Packed } from '@/misc/json-schema.js';
import { awaitAll } from '@/misc/prelude/await-all.js';
import type { MiUser } from '@/models/entities/User.js';
import type { MiDriveFile } from '@/models/entities/DriveFile.js';
import type { MiUser } from '@/models/User.js';
import type { MiDriveFile } from '@/models/DriveFile.js';
import { appendQuery, query } from '@/misc/prelude/url.js';
import { deepClone } from '@/misc/clone.js';
import { bindThis } from '@/decorators.js';
@@ -34,12 +34,6 @@ export class DriveFileEntityService {
@Inject(DI.config)
private config: Config,
@Inject(DI.db)
private db: DataSource,
@Inject(DI.notesRepository)
private notesRepository: NotesRepository,
@Inject(DI.driveFilesRepository)
private driveFilesRepository: DriveFilesRepository,

View File

@@ -5,10 +5,11 @@
import { Inject, Injectable } from '@nestjs/common';
import { DI } from '@/di-symbols.js';
import type { DriveFilesRepository, DriveFoldersRepository } from '@/models/index.js';
import type { DriveFilesRepository, DriveFoldersRepository } from '@/models/_.js';
import { awaitAll } from '@/misc/prelude/await-all.js';
import type { Packed } from '@/misc/json-schema.js';
import type { MiDriveFolder } from '@/models/entities/DriveFolder.js';
import type { } from '@/models/Blocking.js';
import type { MiDriveFolder } from '@/models/DriveFolder.js';
import { bindThis } from '@/decorators.js';
@Injectable()

View File

@@ -5,9 +5,10 @@
import { Inject, Injectable } from '@nestjs/common';
import { DI } from '@/di-symbols.js';
import type { EmojisRepository } from '@/models/index.js';
import type { EmojisRepository } from '@/models/_.js';
import type { Packed } from '@/misc/json-schema.js';
import type { MiEmoji } from '@/models/entities/Emoji.js';
import type { } from '@/models/Blocking.js';
import type { MiEmoji } from '@/models/Emoji.js';
import { bindThis } from '@/decorators.js';
@Injectable()

View File

@@ -5,11 +5,12 @@
import { Inject, Injectable } from '@nestjs/common';
import { DI } from '@/di-symbols.js';
import type { FlashLikesRepository, FlashsRepository } from '@/models/index.js';
import type { FlashsRepository, FlashLikesRepository } from '@/models/_.js';
import { awaitAll } from '@/misc/prelude/await-all.js';
import type { Packed } from '@/misc/json-schema.js';
import type { MiUser } from '@/models/entities/User.js';
import type { MiFlash } from '@/models/entities/Flash.js';
import type { } from '@/models/Blocking.js';
import type { MiUser } from '@/models/User.js';
import type { MiFlash } from '@/models/Flash.js';
import { bindThis } from '@/decorators.js';
import { UserEntityService } from './UserEntityService.js';
@@ -29,7 +30,7 @@ export class FlashEntityService {
@bindThis
public async pack(
src: MiFlash['id'] | MiFlash,
me: { id: MiUser['id'] } | null | undefined,
me?: { id: MiUser['id'] } | null | undefined,
): Promise<Packed<'Flash'>> {
const meId = me ? me.id : null;
const flash = typeof src === 'object' ? src : await this.flashsRepository.findOneByOrFail({ id: src });
@@ -50,8 +51,8 @@ export class FlashEntityService {
@bindThis
public async packMany(
flashs: (MiFlash['id'] | MiFlash)[],
me: { id: MiUser['id'] } | null | undefined,
flashs: MiFlash[],
me?: { id: MiUser['id'] } | null | undefined,
) : Promise<Packed<'Flash'>[]> {
return (await Promise.allSettled(flashs.map(x => this.pack(x, me))))
.filter(result => result.status === 'fulfilled')

View File

@@ -5,9 +5,10 @@
import { Inject, Injectable } from '@nestjs/common';
import { DI } from '@/di-symbols.js';
import type { FlashLikesRepository } from '@/models/index.js';
import type { MiUser } from '@/models/entities/User.js';
import type { MiFlashLike } from '@/models/entities/FlashLike.js';
import type { FlashLikesRepository } from '@/models/_.js';
import type { } from '@/models/Blocking.js';
import type { MiUser } from '@/models/User.js';
import type { MiFlashLike } from '@/models/FlashLike.js';
import { bindThis } from '@/decorators.js';
import { Packed } from '@/misc/json-schema.js';
import { FlashEntityService } from './FlashEntityService.js';
@@ -25,7 +26,7 @@ export class FlashLikeEntityService {
@bindThis
public async pack(
src: MiFlashLike['id'] | MiFlashLike,
me: { id: MiUser['id'] } | null | undefined,
me?: { id: MiUser['id'] } | null | undefined,
) : Promise<Packed<'FlashLike'>> {
const like = typeof src === 'object' ? src : await this.flashLikesRepository.findOneByOrFail({ id: src });
@@ -38,7 +39,7 @@ export class FlashLikeEntityService {
@bindThis
public async packMany(
likes: (MiFlashLike['id'] | MiFlashLike)[],
me: { id: MiUser['id'] } | null | undefined,
me: { id: MiUser['id'] },
) : Promise<Packed<'FlashLike'>[]> {
return (await Promise.allSettled(likes.map(x => this.pack(x, me))))
.filter(result => result.status === 'fulfilled')

View File

@@ -5,9 +5,10 @@
import { Inject, Injectable } from '@nestjs/common';
import { DI } from '@/di-symbols.js';
import type { FollowRequestsRepository } from '@/models/index.js';
import type { MiUser } from '@/models/entities/User.js';
import type { MiFollowRequest } from '@/models/entities/FollowRequest.js';
import type { FollowRequestsRepository } from '@/models/_.js';
import type { } from '@/models/Blocking.js';
import type { MiUser } from '@/models/User.js';
import type { MiFollowRequest } from '@/models/FollowRequest.js';
import { bindThis } from '@/decorators.js';
import { Packed } from '@/misc/json-schema.js';
import { UserEntityService } from './UserEntityService.js';
@@ -25,7 +26,7 @@ export class FollowRequestEntityService {
@bindThis
public async pack(
src: MiFollowRequest['id'] | MiFollowRequest,
me: { id: MiUser['id'] } | null | undefined,
me?: { id: MiUser['id'] } | null | undefined,
) : Promise<Packed<'FollowRequest'>> {
const request = typeof src === 'object' ? src : await this.followRequestsRepository.findOneByOrFail({ id: src });

View File

@@ -5,11 +5,12 @@
import { Inject, Injectable } from '@nestjs/common';
import { DI } from '@/di-symbols.js';
import type { FollowingsRepository } from '@/models/index.js';
import type { FollowingsRepository } from '@/models/_.js';
import { awaitAll } from '@/misc/prelude/await-all.js';
import type { Packed } from '@/misc/json-schema.js';
import type { MiUser } from '@/models/entities/User.js';
import type { MiFollowing } from '@/models/entities/Following.js';
import type { } from '@/models/Blocking.js';
import type { MiUser } from '@/models/User.js';
import type { MiFollowing } from '@/models/Following.js';
import { bindThis } from '@/decorators.js';
import { UserEntityService } from './UserEntityService.js';
@@ -70,7 +71,7 @@ export class FollowingEntityService {
@bindThis
public async pack(
src: MiFollowing['id'] | MiFollowing,
me: { id: MiUser['id'] } | null | undefined,
me?: { id: MiUser['id'] } | null | undefined,
opts?: {
populateFollowee?: boolean;
populateFollower?: boolean;
@@ -97,7 +98,7 @@ export class FollowingEntityService {
@bindThis
public async packMany(
followings: (MiFollowing['id'] | MiFollowing)[],
me: { id: MiUser['id'] } | null | undefined,
me?: { id: MiUser['id'] } | null | undefined,
opts?: {
populateFollowee?: boolean;
populateFollower?: boolean;

View File

@@ -5,11 +5,12 @@
import { Inject, Injectable } from '@nestjs/common';
import { DI } from '@/di-symbols.js';
import type { GalleryLikesRepository } from '@/models/index.js';
import type { MiGalleryLike } from '@/models/entities/GalleryLike.js';
import type { GalleryLikesRepository } from '@/models/_.js';
import type { } from '@/models/Blocking.js';
import type { MiGalleryLike } from '@/models/GalleryLike.js';
import { bindThis } from '@/decorators.js';
import { Packed } from '@/misc/json-schema.js';
import type { MiUser } from '@/models/entities/User.js';
import type { MiUser } from '@/models/User.js';
import { GalleryPostEntityService } from './GalleryPostEntityService.js';
@Injectable()

View File

@@ -5,11 +5,12 @@
import { Inject, Injectable } from '@nestjs/common';
import { DI } from '@/di-symbols.js';
import type { GalleryLikesRepository, GalleryPostsRepository } from '@/models/index.js';
import type { GalleryLikesRepository, GalleryPostsRepository } from '@/models/_.js';
import { awaitAll } from '@/misc/prelude/await-all.js';
import type { Packed } from '@/misc/json-schema.js';
import type { MiUser } from '@/models/entities/User.js';
import type { MiGalleryPost } from '@/models/entities/GalleryPost.js';
import type { } from '@/models/Blocking.js';
import type { MiUser } from '@/models/User.js';
import type { MiGalleryPost } from '@/models/GalleryPost.js';
import { bindThis } from '@/decorators.js';
import { UserEntityService } from './UserEntityService.js';
import { DriveFileEntityService } from './DriveFileEntityService.js';
@@ -31,7 +32,7 @@ export class GalleryPostEntityService {
@bindThis
public async pack(
src: MiGalleryPost['id'] | MiGalleryPost,
me: { id: MiUser['id'] } | null | undefined,
me?: { id: MiUser['id'] } | null | undefined,
): Promise<Packed<'GalleryPost'>> {
const meId = me ? me.id : null;
const post = typeof src === 'object' ? src : await this.galleryPostsRepository.findOneByOrFail({ id: src });
@@ -56,8 +57,8 @@ export class GalleryPostEntityService {
@bindThis
public async packMany(
posts: (MiGalleryPost['id'] | MiGalleryPost)[],
me: { id: MiUser['id'] } | null | undefined,
posts: MiGalleryPost[],
me?: { id: MiUser['id'] } | null | undefined,
) : Promise<Packed<'GalleryPost'>[]> {
return (await Promise.allSettled(posts.map(x => this.pack(x, me))))
.filter(result => result.status === 'fulfilled')

View File

@@ -3,21 +3,15 @@
* SPDX-License-Identifier: AGPL-3.0-only
*/
import { Inject, Injectable } from '@nestjs/common';
import { DI } from '@/di-symbols.js';
import type { HashtagsRepository } from '@/models/index.js';
import { Injectable } from '@nestjs/common';
import type { Packed } from '@/misc/json-schema.js';
import type { MiHashtag } from '@/models/entities/Hashtag.js';
import type { } from '@/models/Blocking.js';
import type { MiHashtag } from '@/models/Hashtag.js';
import { bindThis } from '@/decorators.js';
import { UserEntityService } from './UserEntityService.js';
@Injectable()
export class HashtagEntityService {
constructor(
@Inject(DI.hashtagsRepository)
private hashtagsRepository: HashtagsRepository,
private userEntityService: UserEntityService,
) {
}

View File

@@ -3,11 +3,10 @@
* SPDX-License-Identifier: AGPL-3.0-only
*/
import { Inject, Injectable } from '@nestjs/common';
import { DI } from '@/di-symbols.js';
import type { InstancesRepository } from '@/models/index.js';
import { Injectable } from '@nestjs/common';
import type { Packed } from '@/misc/json-schema.js';
import type { MiInstance } from '@/models/entities/Instance.js';
import type { } from '@/models/Blocking.js';
import type { MiInstance } from '@/models/Instance.js';
import { MetaService } from '@/core/MetaService.js';
import { bindThis } from '@/decorators.js';
import { UtilityService } from '../UtilityService.js';
@@ -15,9 +14,6 @@ import { UtilityService } from '../UtilityService.js';
@Injectable()
export class InstanceEntityService {
constructor(
@Inject(DI.instancesRepository)
private instancesRepository: InstancesRepository,
private metaService: MetaService,
private utilityService: UtilityService,

View File

@@ -5,11 +5,11 @@
import { Inject, Injectable } from '@nestjs/common';
import { DI } from '@/di-symbols.js';
import type { RegistrationTicketsRepository } from '@/models/index.js';
import type { RegistrationTicketsRepository } from '@/models/_.js';
import { awaitAll } from '@/misc/prelude/await-all.js';
import type { Packed } from '@/misc/json-schema.js';
import type { MiUser } from '@/models/entities/User.js';
import type { MiRegistrationTicket } from '@/models/entities/RegistrationTicket.js';
import type { MiUser } from '@/models/User.js';
import type { MiRegistrationTicket } from '@/models/RegistrationTicket.js';
import { bindThis } from '@/decorators.js';
import { UserEntityService } from './UserEntityService.js';
@@ -26,7 +26,7 @@ export class InviteCodeEntityService {
@bindThis
public async pack(
src: MiRegistrationTicket['id'] | MiRegistrationTicket,
me: { id: MiUser['id'] } | null | undefined,
me?: { id: MiUser['id'] } | null | undefined,
): Promise<Packed<'InviteCode'>> {
const target = typeof src === 'object' ? src : await this.registrationTicketsRepository.findOneOrFail({
where: {
@@ -50,7 +50,7 @@ export class InviteCodeEntityService {
@bindThis
public async packMany(
targets: (MiRegistrationTicket['id'] | MiRegistrationTicket)[],
me: { id: MiUser['id'] } | null | undefined,
me: { id: MiUser['id'] },
) : Promise<Packed<'InviteCode'>[]> {
return (await Promise.allSettled(targets.map(x => this.pack(x, me))))
.filter(result => result.status === 'fulfilled')

View File

@@ -5,10 +5,11 @@
import { Inject, Injectable } from '@nestjs/common';
import { DI } from '@/di-symbols.js';
import type { ModerationLogsRepository } from '@/models/index.js';
import type { ModerationLogsRepository } from '@/models/_.js';
import { awaitAll } from '@/misc/prelude/await-all.js';
import type { MiUser } from '@/models/entities/User.js';
import type { MiModerationLog } from '@/models/entities/ModerationLog.js';
import type { } from '@/models/Blocking.js';
import type { MiUser } from '@/models/User.js';
import type { MiModerationLog } from '@/models/ModerationLog.js';
import { bindThis } from '@/decorators.js';
import { Packed } from '@/misc/json-schema.js';
import { UserEntityService } from './UserEntityService.js';

View File

@@ -5,11 +5,12 @@
import { Inject, Injectable } from '@nestjs/common';
import { DI } from '@/di-symbols.js';
import type { MutingsRepository } from '@/models/index.js';
import type { MutingsRepository } from '@/models/_.js';
import { awaitAll } from '@/misc/prelude/await-all.js';
import type { Packed } from '@/misc/json-schema.js';
import type { MiUser } from '@/models/entities/User.js';
import type { MiMuting } from '@/models/entities/Muting.js';
import type { } from '@/models/Blocking.js';
import type { MiUser } from '@/models/User.js';
import type { MiMuting } from '@/models/Muting.js';
import { bindThis } from '@/decorators.js';
import { UserEntityService } from './UserEntityService.js';
@@ -26,7 +27,7 @@ export class MutingEntityService {
@bindThis
public async pack(
src: MiMuting['id'] | MiMuting,
me: { id: MiUser['id'] } | null | undefined,
me?: { id: MiUser['id'] } | null | undefined,
): Promise<Packed<'Muting'>> {
const muting = typeof src === 'object' ? src : await this.mutingsRepository.findOneByOrFail({ id: src });
@@ -44,7 +45,7 @@ export class MutingEntityService {
@bindThis
public async packMany(
mutings: (MiMuting['id'] | MiMuting)[],
me: { id: MiUser['id'] } | null | undefined,
me: { id: MiUser['id'] },
) : Promise<Packed<'Muting'>[]> {
return (await Promise.allSettled(mutings.map(x => this.pack(x, me))))
.filter(result => result.status === 'fulfilled')

View File

@@ -4,26 +4,17 @@
*/
import { Inject, Injectable } from '@nestjs/common';
import { DataSource, In } from 'typeorm';
import { In } from 'typeorm';
import * as mfm from 'mfm-js';
import { ModuleRef } from '@nestjs/core';
import { DI } from '@/di-symbols.js';
import type { Packed } from '@/misc/json-schema.js';
import { nyaize } from '@/misc/nyaize.js';
import { awaitAll } from '@/misc/prelude/await-all.js';
import type { MiUser } from '@/models/entities/User.js';
import type { MiNote } from '@/models/entities/Note.js';
import type { MiNoteReaction } from '@/models/entities/NoteReaction.js';
import type {
ChannelsRepository,
DriveFilesRepository,
FollowingsRepository,
NoteReactionsRepository,
NotesRepository,
PollsRepository,
PollVotesRepository,
UsersRepository,
} from '@/models/index.js';
import type { MiUser } from '@/models/User.js';
import type { MiNote } from '@/models/Note.js';
import type { MiNoteReaction } from '@/models/NoteReaction.js';
import type { UsersRepository, NotesRepository, FollowingsRepository, PollsRepository, PollVotesRepository, NoteReactionsRepository, ChannelsRepository } from '@/models/_.js';
import { bindThis } from '@/decorators.js';
import { isNotNull } from '@/misc/is-not-null.js';
import type { OnModuleInit } from '@nestjs/common';
@@ -42,9 +33,6 @@ export class NoteEntityService implements OnModuleInit {
constructor(
private moduleRef: ModuleRef,
@Inject(DI.db)
private db: DataSource,
@Inject(DI.usersRepository)
private usersRepository: UsersRepository,
@@ -66,9 +54,6 @@ export class NoteEntityService implements OnModuleInit {
@Inject(DI.channelsRepository)
private channelsRepository: ChannelsRepository,
@Inject(DI.driveFilesRepository)
private driveFilesRepository: DriveFilesRepository,
//private userEntityService: UserEntityService,
//private driveFileEntityService: DriveFileEntityService,
//private customEmojiService: CustomEmojiService,
@@ -288,7 +273,7 @@ export class NoteEntityService implements OnModuleInit {
@bindThis
public async pack(
src: MiNote['id'] | MiNote,
me: { id: MiUser['id'] } | null | undefined,
me?: { id: MiUser['id'] } | null | undefined,
options?: {
detail?: boolean;
skipHide?: boolean;
@@ -352,12 +337,15 @@ export class NoteEntityService implements OnModuleInit {
id: channel.id,
name: channel.name,
color: channel.color,
isSensitive: channel.isSensitive,
} : undefined,
mentions: note.mentions.length > 0 ? note.mentions : undefined,
uri: note.uri ?? undefined,
url: note.url ?? undefined,
...(opts.detail ? {
clippedCount: note.clippedCount,
reply: note.replyId ? this.pack(note.reply ?? note.replyId, me, {
detail: false,
_hint_: options?._hint_,
@@ -405,7 +393,7 @@ export class NoteEntityService implements OnModuleInit {
@bindThis
public async packMany(
notes: MiNote[],
me: { id: MiUser['id'] } | null | undefined,
me?: { id: MiUser['id'] } | null | undefined,
options?: {
detail?: boolean;
skipHide?: boolean;

View File

@@ -5,9 +5,10 @@
import { Inject, Injectable } from '@nestjs/common';
import { DI } from '@/di-symbols.js';
import type { NoteFavoritesRepository } from '@/models/index.js';
import type { MiUser } from '@/models/entities/User.js';
import type { MiNoteFavorite } from '@/models/entities/NoteFavorite.js';
import type { NoteFavoritesRepository } from '@/models/_.js';
import type { } from '@/models/Blocking.js';
import type { MiUser } from '@/models/User.js';
import type { MiNoteFavorite } from '@/models/NoteFavorite.js';
import { bindThis } from '@/decorators.js';
import { Packed } from '@/misc/json-schema.js';
import { NoteEntityService } from './NoteEntityService.js';
@@ -25,7 +26,7 @@ export class NoteFavoriteEntityService {
@bindThis
public async pack(
src: MiNoteFavorite['id'] | MiNoteFavorite,
me: { id: MiUser['id'] } | null | undefined,
me?: { id: MiUser['id'] } | null | undefined,
) : Promise<Packed<'NoteFavorite'>> {
const favorite = typeof src === 'object' ? src : await this.noteFavoritesRepository.findOneByOrFail({ id: src });
@@ -40,7 +41,7 @@ export class NoteFavoriteEntityService {
@bindThis
public async packMany(
favorites: (MiNoteFavorite['id'] | MiNoteFavorite)[],
me: { id: MiUser['id'] } | null | undefined,
me: { id: MiUser['id'] },
) : Promise<Packed<'NoteFavorite'>[]> {
return (await Promise.allSettled(favorites.map(x => this.pack(x, me))))
.filter(result => result.status === 'fulfilled')

View File

@@ -6,12 +6,13 @@
import { Inject, Injectable } from '@nestjs/common';
import { ModuleRef } from '@nestjs/core';
import { DI } from '@/di-symbols.js';
import type { NoteReactionsRepository } from '@/models/index.js';
import type { NoteReactionsRepository } from '@/models/_.js';
import type { Packed } from '@/misc/json-schema.js';
import { bindThis } from '@/decorators.js';
import type { MiUser } from '@/models/entities/User.js';
import type { MiNoteReaction } from '@/models/entities/NoteReaction.js';
import type { OnModuleInit } from '@nestjs/common';
import type { } from '@/models/Blocking.js';
import type { MiUser } from '@/models/User.js';
import type { MiNoteReaction } from '@/models/NoteReaction.js';
import type { ReactionService } from '../ReactionService.js';
import type { UserEntityService } from './UserEntityService.js';
import type { NoteEntityService } from './NoteEntityService.js';
@@ -43,7 +44,7 @@ export class NoteReactionEntityService implements OnModuleInit {
@bindThis
public async pack(
src: MiNoteReaction['id'] | MiNoteReaction,
me: { id: MiUser['id'] } | null | undefined,
me?: { id: MiUser['id'] } | null | undefined,
options?: {
withNote: boolean;
},

View File

@@ -7,27 +7,20 @@ import { Inject, Injectable } from '@nestjs/common';
import { ModuleRef } from '@nestjs/core';
import { In } from 'typeorm';
import { DI } from '@/di-symbols.js';
import type {
AccessTokensRepository,
FollowRequestsRepository,
NoteReactionsRepository,
NotesRepository,
UsersRepository,
} from '@/models/index.js';
import type { AccessTokensRepository, FollowRequestsRepository, NotesRepository, MiUser, UsersRepository } from '@/models/_.js';
import { awaitAll } from '@/misc/prelude/await-all.js';
import type { MiNotification } from '@/models/entities/Notification.js';
import type { MiNote } from '@/models/entities/Note.js';
import type { MiNotification } from '@/models/Notification.js';
import type { MiNote } from '@/models/Note.js';
import type { Packed } from '@/misc/json-schema.js';
import { bindThis } from '@/decorators.js';
import { isNotNull } from '@/misc/is-not-null.js';
import { notificationTypes } from '@/types.js';
import type { MiUser } from '@/models/entities/User.js';
import type { OnModuleInit } from '@nestjs/common';
import type { CustomEmojiService } from '../CustomEmojiService.js';
import type { UserEntityService } from './UserEntityService.js';
import type { NoteEntityService } from './NoteEntityService.js';
const NOTE_REQUIRED_NOTIFICATION_TYPES = new Set(['mention', 'reply', 'renote', 'quote', 'reaction', 'pollEnded'] as (typeof notificationTypes[number])[]);
const NOTE_REQUIRED_NOTIFICATION_TYPES = new Set(['note', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollEnded'] as (typeof notificationTypes[number])[]);
@Injectable()
export class NotificationEntityService implements OnModuleInit {
@@ -44,9 +37,6 @@ export class NotificationEntityService implements OnModuleInit {
@Inject(DI.usersRepository)
private usersRepository: UsersRepository,
@Inject(DI.noteReactionsRepository)
private noteReactionsRepository: NoteReactionsRepository,
@Inject(DI.followRequestsRepository)
private followRequestsRepository: FollowRequestsRepository,

View File

@@ -5,12 +5,13 @@
import { Inject, Injectable } from '@nestjs/common';
import { DI } from '@/di-symbols.js';
import type { DriveFilesRepository, PageLikesRepository, PagesRepository } from '@/models/index.js';
import type { DriveFilesRepository, PagesRepository, PageLikesRepository } from '@/models/_.js';
import { awaitAll } from '@/misc/prelude/await-all.js';
import type { Packed } from '@/misc/json-schema.js';
import type { MiUser } from '@/models/entities/User.js';
import type { MiPage } from '@/models/entities/Page.js';
import type { MiDriveFile } from '@/models/entities/DriveFile.js';
import type { } from '@/models/Blocking.js';
import type { MiUser } from '@/models/User.js';
import type { MiPage } from '@/models/Page.js';
import type { MiDriveFile } from '@/models/DriveFile.js';
import { bindThis } from '@/decorators.js';
import { UserEntityService } from './UserEntityService.js';
import { DriveFileEntityService } from './DriveFileEntityService.js';
@@ -35,7 +36,7 @@ export class PageEntityService {
@bindThis
public async pack(
src: MiPage['id'] | MiPage,
me: { id: MiUser['id'] } | null | undefined,
me?: { id: MiUser['id'] } | null | undefined,
): Promise<Packed<'Page'>> {
const meId = me ? me.id : null;
const page = typeof src === 'object' ? src : await this.pagesRepository.findOneByOrFail({ id: src });
@@ -108,7 +109,7 @@ export class PageEntityService {
@bindThis
public async packMany(
pages: (MiPage['id'] | MiPage)[],
me: { id: MiUser['id'] } | null | undefined,
me?: { id: MiUser['id'] } | null | undefined,
) : Promise<Packed<'Page'>[]> {
return (await Promise.allSettled(pages.map(x => this.pack(x, me))))
.filter(result => result.status === 'fulfilled')

View File

@@ -5,9 +5,10 @@
import { Inject, Injectable } from '@nestjs/common';
import { DI } from '@/di-symbols.js';
import type { PageLikesRepository } from '@/models/index.js';
import type { MiUser } from '@/models/entities/User.js';
import type { MiPageLike } from '@/models/entities/PageLike.js';
import type { PageLikesRepository } from '@/models/_.js';
import type { } from '@/models/Blocking.js';
import type { MiUser } from '@/models/User.js';
import type { MiPageLike } from '@/models/PageLike.js';
import { bindThis } from '@/decorators.js';
import { Packed } from '@/misc/json-schema.js';
import { PageEntityService } from './PageEntityService.js';
@@ -25,7 +26,7 @@ export class PageLikeEntityService {
@bindThis
public async pack(
src: MiPageLike['id'] | MiPageLike,
me: { id: MiUser['id'] } | null | undefined,
me?: { id: MiUser['id'] } | null | undefined,
) : Promise<Packed<'PageLike'>> {
const like = typeof src === 'object' ? src : await this.pageLikesRepository.findOneByOrFail({ id: src });
@@ -38,7 +39,7 @@ export class PageLikeEntityService {
@bindThis
public async packMany(
likes: (MiPageLike['id'] | MiPageLike)[],
me: { id: MiUser['id'] } | null | undefined,
me: { id: MiUser['id'] },
) : Promise<Packed<'PageLike'>[]> {
return (await Promise.allSettled(likes.map(x => this.pack(x, me))))
.filter(result => result.status === 'fulfilled')

View File

@@ -5,11 +5,12 @@
import { Inject, Injectable } from '@nestjs/common';
import { DI } from '@/di-symbols.js';
import type { RenoteMutingsRepository } from '@/models/index.js';
import type { RenoteMutingsRepository } from '@/models/_.js';
import { awaitAll } from '@/misc/prelude/await-all.js';
import type { Packed } from '@/misc/json-schema.js';
import type { MiUser } from '@/models/entities/User.js';
import type { MiRenoteMuting } from '@/models/entities/RenoteMuting.js';
import type { } from '@/models/Blocking.js';
import type { MiUser } from '@/models/User.js';
import type { MiRenoteMuting } from '@/models/RenoteMuting.js';
import { bindThis } from '@/decorators.js';
import { UserEntityService } from './UserEntityService.js';
@@ -26,7 +27,7 @@ export class RenoteMutingEntityService {
@bindThis
public async pack(
src: MiRenoteMuting['id'] | MiRenoteMuting,
me: { id: MiUser['id'] } | null | undefined,
me?: { id: MiUser['id'] } | null | undefined,
): Promise<Packed<'RenoteMuting'>> {
const muting = typeof src === 'object' ? src : await this.renoteMutingsRepository.findOneByOrFail({ id: src });
@@ -43,7 +44,7 @@ export class RenoteMutingEntityService {
@bindThis
public async packMany(
mutings: (MiRenoteMuting['id'] | MiRenoteMuting)[],
me: { id: MiUser['id'] } | null | undefined,
me: { id: MiUser['id'] },
) : Promise<Packed<'RenoteMuting'>[]> {
return (await Promise.allSettled(mutings.map(u => this.pack(u, me))))
.filter(result => result.status === 'fulfilled')

View File

@@ -6,14 +6,13 @@
import { Inject, Injectable } from '@nestjs/common';
import { Brackets } from 'typeorm';
import { DI } from '@/di-symbols.js';
import type { RoleAssignmentsRepository, RolesRepository } from '@/models/index.js';
import type { RoleAssignmentsRepository, RolesRepository } from '@/models/_.js';
import { awaitAll } from '@/misc/prelude/await-all.js';
import type { MiUser } from '@/models/entities/User.js';
import type { MiRole } from '@/models/entities/Role.js';
import type { MiUser } from '@/models/User.js';
import type { MiRole } from '@/models/Role.js';
import { bindThis } from '@/decorators.js';
import { DEFAULT_POLICIES } from '@/core/RoleService.js';
import { Packed } from '@/misc/json-schema.js';
import { UserEntityService } from './UserEntityService.js';
@Injectable()
export class RoleEntityService {
@@ -23,15 +22,13 @@ export class RoleEntityService {
@Inject(DI.roleAssignmentsRepository)
private roleAssignmentsRepository: RoleAssignmentsRepository,
private userEntityService: UserEntityService,
) {
}
@bindThis
public async pack(
src: MiRole['id'] | MiRole,
me: { id: MiUser['id'] } | null | undefined,
me?: { id: MiUser['id'] } | null | undefined,
) : Promise<Packed<'Role'>> {
const role = typeof src === 'object' ? src : await this.rolesRepository.findOneByOrFail({ id: src });
@@ -77,7 +74,7 @@ export class RoleEntityService {
@bindThis
public async packMany(
roles: (MiRole['id'] | MiRole)[],
me: { id: MiUser['id'] } | null | undefined,
me: { id: MiUser['id'] },
) : Promise<Packed<'Role'>[]> {
return (await Promise.allSettled(roles.map(x => this.pack(x, me))))
.filter(result => result.status === 'fulfilled')

View File

@@ -3,20 +3,14 @@
* SPDX-License-Identifier: AGPL-3.0-only
*/
import { Inject, Injectable } from '@nestjs/common';
import { DI } from '@/di-symbols.js';
import type { SigninsRepository } from '@/models/index.js';
import type { MiSignin } from '@/models/entities/Signin.js';
import { Injectable } from '@nestjs/common';
import type { } from '@/models/Blocking.js';
import type { MiSignin } from '@/models/Signin.js';
import { bindThis } from '@/decorators.js';
import { UserEntityService } from './UserEntityService.js';
@Injectable()
export class SigninEntityService {
constructor(
@Inject(DI.signinsRepository)
private signinsRepository: SigninsRepository,
private userEntityService: UserEntityService,
) {
}

View File

@@ -13,35 +13,9 @@ import type { Packed } from '@/misc/json-schema.js';
import type { Promiseable } from '@/misc/prelude/await-all.js';
import { awaitAll } from '@/misc/prelude/await-all.js';
import { USER_ACTIVE_THRESHOLD, USER_ONLINE_THRESHOLD } from '@/const.js';
import type { MiLocalUser, MiPartialLocalUser, MiPartialRemoteUser, MiRemoteUser, MiUser } from '@/models/entities/User.js';
import {
birthdaySchema,
descriptionSchema,
localUsernameSchema,
locationSchema,
nameSchema,
passwordSchema,
} from '@/models/entities/User.js';
import type {
AnnouncementReadsRepository,
AnnouncementsRepository,
BlockingsRepository,
ChannelFollowingsRepository,
DriveFilesRepository,
FollowingsRepository,
FollowRequestsRepository,
InstancesRepository,
MutingsRepository,
NoteUnreadsRepository,
PagesRepository,
RenoteMutingsRepository,
UserMemoRepository,
UserNotePiningsRepository,
MiUserProfile,
UserProfilesRepository,
UserSecurityKeysRepository,
UsersRepository,
} from '@/models/index.js';
import type { MiLocalUser, MiPartialLocalUser, MiPartialRemoteUser, MiRemoteUser, MiUser } from '@/models/User.js';
import { birthdaySchema, descriptionSchema, localUsernameSchema, locationSchema, nameSchema, passwordSchema } from '@/models/User.js';
import type { UsersRepository, UserSecurityKeysRepository, FollowingsRepository, FollowRequestsRepository, BlockingsRepository, MutingsRepository, DriveFilesRepository, NoteUnreadsRepository, UserNotePiningsRepository, UserProfilesRepository, AnnouncementReadsRepository, AnnouncementsRepository, MiUserProfile, RenoteMutingsRepository, UserMemoRepository } from '@/models/_.js';
import { bindThis } from '@/decorators.js';
import { RoleService } from '@/core/RoleService.js';
import { ApPersonService } from '@/core/activitypub/models/ApPersonService.js';
@@ -124,27 +98,18 @@ export class UserEntityService implements OnModuleInit {
@Inject(DI.noteUnreadsRepository)
private noteUnreadsRepository: NoteUnreadsRepository,
@Inject(DI.channelFollowingsRepository)
private channelFollowingsRepository: ChannelFollowingsRepository,
@Inject(DI.userNotePiningsRepository)
private userNotePiningsRepository: UserNotePiningsRepository,
@Inject(DI.userProfilesRepository)
private userProfilesRepository: UserProfilesRepository,
@Inject(DI.instancesRepository)
private instancesRepository: InstancesRepository,
@Inject(DI.announcementReadsRepository)
private announcementReadsRepository: AnnouncementReadsRepository,
@Inject(DI.announcementsRepository)
private announcementsRepository: AnnouncementsRepository,
@Inject(DI.pagesRepository)
private pagesRepository: PagesRepository,
@Inject(DI.userMemosRepository)
private userMemosRepository: UserMemoRepository,
@@ -182,15 +147,14 @@ export class UserEntityService implements OnModuleInit {
@bindThis
public async getRelation(me: MiUser['id'], target: MiUser['id']) {
const following = await this.followingsRepository.findOneBy({
followerId: me,
followeeId: target,
});
return awaitAll({
id: target,
isFollowing: this.followingsRepository.count({
where: {
followerId: me,
followeeId: target,
},
take: 1,
}).then(n => n > 0),
following,
isFollowing: following != null,
isFollowed: this.followingsRepository.count({
where: {
followerId: target,
@@ -313,7 +277,7 @@ export class UserEntityService implements OnModuleInit {
public async pack<ExpectsMe extends boolean | null = null, D extends boolean = false>(
src: MiUser['id'] | MiUser,
me: { id: MiUser['id'] } | null | undefined,
me?: { id: MiUser['id']; } | null | undefined,
options?: {
detail?: D,
includeSecrets?: boolean,
@@ -423,6 +387,7 @@ export class UserEntityService implements OnModuleInit {
birthday: profile!.birthday,
lang: profile!.lang,
fields: profile!.fields,
verifiedLinks: profile!.verifiedLinks,
followersCount: followersCount ?? 0,
followingCount: followingCount ?? 0,
notesCount: user.notesCount,
@@ -473,7 +438,7 @@ export class UserEntityService implements OnModuleInit {
preventAiLearning: profile!.preventAiLearning,
isExplorable: user.isExplorable,
isDeleted: user.isDeleted,
twoFactorBackupCodes: profile?.twoFactorBackupSecret?.length === 20 ? 'full' : (profile?.twoFactorBackupSecret?.length ?? 0) > 0 ? 'partial' : 'none',
twoFactorBackupCodesStock: profile?.twoFactorBackupSecret?.length === 20 ? 'full' : (profile?.twoFactorBackupSecret?.length ?? 0) > 0 ? 'partial' : 'none',
hideOnlineStatus: user.hideOnlineStatus,
hasUnreadSpecifiedNotes: this.noteUnreadsRepository.count({
where: { userId: user.id, isSpecified: true },
@@ -524,6 +489,7 @@ export class UserEntityService implements OnModuleInit {
isBlocked: relation.isBlocked,
isMuted: relation.isMuted,
isRenoteMuted: relation.isRenoteMuted,
notify: relation.following?.notify ?? 'none',
} : {}),
} as Promiseable<Packed<'User'>> as Promiseable<IsMeAndIsUserDetailed<ExpectsMe, D>>;
@@ -532,7 +498,7 @@ export class UserEntityService implements OnModuleInit {
public async packMany<D extends boolean = false>(
users: (MiUser['id'] | MiUser)[],
me: { id: MiUser['id'] } | null | undefined,
me?: { id: MiUser['id'] } | null | undefined,
options?: {
detail?: D,
includeSecrets?: boolean,

View File

@@ -5,11 +5,11 @@
import { Inject, Injectable } from '@nestjs/common';
import { DI } from '@/di-symbols.js';
import type { UserListJoiningsRepository, UserListsRepository } from '@/models/index.js';
import type { UserListJoiningsRepository, UserListsRepository } from '@/models/_.js';
import type { Packed } from '@/misc/json-schema.js';
import type { MiUserList } from '@/models/entities/UserList.js';
import type { } from '@/models/Blocking.js';
import type { MiUserList } from '@/models/UserList.js';
import { bindThis } from '@/decorators.js';
import { UserEntityService } from './UserEntityService.js';
@Injectable()
export class UserListEntityService {
@@ -19,8 +19,6 @@ export class UserListEntityService {
@Inject(DI.userListJoiningsRepository)
private userListJoiningsRepository: UserListJoiningsRepository,
private userEntityService: UserEntityService,
) {
}