summaryrefslogtreecommitdiff
path: root/packages/backend/src/core
diff options
context:
space:
mode:
authorMar0xy <marie@kaifa.ch>2023-10-16 23:38:21 +0200
committerMar0xy <marie@kaifa.ch>2023-10-16 23:38:21 +0200
commit68886b9ab5fc1cf50033b382b85e0a068fdbb7d6 (patch)
tree33dda5f8a6be49b148c49eafdcea8cdd9ded4b7a /packages/backend/src/core
parentup: dev version (diff)
parentupdate deps (diff)
downloadsharkey-68886b9ab5fc1cf50033b382b85e0a068fdbb7d6.tar.gz
sharkey-68886b9ab5fc1cf50033b382b85e0a068fdbb7d6.tar.bz2
sharkey-68886b9ab5fc1cf50033b382b85e0a068fdbb7d6.zip
merge: upstream performance changes & instance silencing
Diffstat (limited to 'packages/backend/src/core')
-rw-r--r--packages/backend/src/core/AccountMoveService.ts10
-rw-r--r--packages/backend/src/core/AnnouncementService.ts10
-rw-r--r--packages/backend/src/core/AntennaService.ts4
-rw-r--r--packages/backend/src/core/ClipService.ts5
-rw-r--r--packages/backend/src/core/CreateSystemUserService.ts3
-rw-r--r--packages/backend/src/core/CustomEmojiService.ts2
-rw-r--r--packages/backend/src/core/DriveService.ts3
-rw-r--r--packages/backend/src/core/FederatedInstanceService.ts2
-rw-r--r--packages/backend/src/core/HashtagService.ts4
-rw-r--r--packages/backend/src/core/IdService.ts20
-rw-r--r--packages/backend/src/core/ModerationLogService.ts3
-rw-r--r--packages/backend/src/core/NoteCreateService.ts13
-rw-r--r--packages/backend/src/core/NoteEditService.ts13
-rw-r--r--packages/backend/src/core/NotePiningService.ts3
-rw-r--r--packages/backend/src/core/NoteReadService.ts2
-rw-r--r--packages/backend/src/core/NotificationService.ts2
-rw-r--r--packages/backend/src/core/PollService.ts4
-rw-r--r--packages/backend/src/core/QueryService.ts8
-rw-r--r--packages/backend/src/core/ReactionService.ts3
-rw-r--r--packages/backend/src/core/RelayService.ts2
-rw-r--r--packages/backend/src/core/RoleService.ts17
-rw-r--r--packages/backend/src/core/SearchService.ts2
-rw-r--r--packages/backend/src/core/SignupService.ts3
-rw-r--r--packages/backend/src/core/UserBlockingService.ts3
-rw-r--r--packages/backend/src/core/UserFollowingService.ts17
-rw-r--r--packages/backend/src/core/UserListService.ts3
-rw-r--r--packages/backend/src/core/UserMutingService.ts3
-rw-r--r--packages/backend/src/core/UtilityService.ts6
-rw-r--r--packages/backend/src/core/WebhookService.ts3
-rw-r--r--packages/backend/src/core/activitypub/ApInboxService.ts3
-rw-r--r--packages/backend/src/core/activitypub/ApRendererService.ts10
-rw-r--r--packages/backend/src/core/activitypub/models/ApNoteService.ts2
-rw-r--r--packages/backend/src/core/activitypub/models/ApPersonService.ts6
-rw-r--r--packages/backend/src/core/chart/charts/active-users.ts19
-rw-r--r--packages/backend/src/core/entities/AbuseUserReportEntityService.ts4
-rw-r--r--packages/backend/src/core/entities/AntennaEntityService.ts6
-rw-r--r--packages/backend/src/core/entities/BlockingEntityService.ts4
-rw-r--r--packages/backend/src/core/entities/ChannelEntityService.ts4
-rw-r--r--packages/backend/src/core/entities/ClipEntityService.ts4
-rw-r--r--packages/backend/src/core/entities/DriveFileEntityService.ts6
-rw-r--r--packages/backend/src/core/entities/DriveFolderEntityService.ts5
-rw-r--r--packages/backend/src/core/entities/FlashEntityService.ts4
-rw-r--r--packages/backend/src/core/entities/FollowingEntityService.ts4
-rw-r--r--packages/backend/src/core/entities/GalleryPostEntityService.ts4
-rw-r--r--packages/backend/src/core/entities/InstanceEntityService.ts4
-rw-r--r--packages/backend/src/core/entities/InviteCodeEntityService.ts4
-rw-r--r--packages/backend/src/core/entities/ModerationLogEntityService.ts4
-rw-r--r--packages/backend/src/core/entities/MutingEntityService.ts4
-rw-r--r--packages/backend/src/core/entities/NoteEntityService.ts5
-rw-r--r--packages/backend/src/core/entities/NoteFavoriteEntityService.ts4
-rw-r--r--packages/backend/src/core/entities/NoteReactionEntityService.ts6
-rw-r--r--packages/backend/src/core/entities/PageEntityService.ts4
-rw-r--r--packages/backend/src/core/entities/RenoteMutingEntityService.ts4
-rw-r--r--packages/backend/src/core/entities/RoleEntityService.ts5
-rw-r--r--packages/backend/src/core/entities/UserEntityService.ts12
-rw-r--r--packages/backend/src/core/entities/UserListEntityService.ts6
56 files changed, 180 insertions, 140 deletions
diff --git a/packages/backend/src/core/AccountMoveService.ts b/packages/backend/src/core/AccountMoveService.ts
index db64f42754..350aa6ba24 100644
--- a/packages/backend/src/core/AccountMoveService.ts
+++ b/packages/backend/src/core/AccountMoveService.ts
@@ -180,13 +180,13 @@ export class AccountMoveService {
{ muteeId: dst.id, expiresAt: IsNull() },
).then(mutings => mutings.map(muting => muting.muterId));
- const newMutings: Map<string, { muterId: string; muteeId: string; createdAt: Date; expiresAt: Date | null; }> = new Map();
+ const newMutings: Map<string, { muterId: string; muteeId: string; expiresAt: Date | null; }> = new Map();
// 重複しないようにIDを生成
const genId = (): string => {
let id: string;
do {
- id = this.idService.genId();
+ id = this.idService.gen();
} while (newMutings.has(id));
return id;
};
@@ -194,7 +194,6 @@ export class AccountMoveService {
if (existingMutingsMuterUserIds.includes(muting.muterId)) continue; // skip if already muted indefinitely
newMutings.set(genId(), {
...muting,
- createdAt: new Date(),
muteeId: dst.id,
});
}
@@ -228,20 +227,19 @@ export class AccountMoveService {
},
}).then(memberships => memberships.map(membership => membership.userListId));
- const newMemberships: Map<string, { createdAt: Date; userId: string; userListId: string; userListUserId: string; }> = new Map();
+ const newMemberships: Map<string, { userId: string; userListId: string; userListUserId: string; }> = new Map();
// 重複しないようにIDを生成
const genId = (): string => {
let id: string;
do {
- id = this.idService.genId();
+ id = this.idService.gen();
} while (newMemberships.has(id));
return id;
};
for (const membership of oldMemberships) {
if (existingUserListIds.includes(membership.userListId)) continue; // skip if dst exists in this user's list
newMemberships.set(genId(), {
- createdAt: new Date(),
userId: dst.id,
userListId: membership.userListId,
userListUserId: membership.userListUserId,
diff --git a/packages/backend/src/core/AnnouncementService.ts b/packages/backend/src/core/AnnouncementService.ts
index a5330db53f..ec1a082d78 100644
--- a/packages/backend/src/core/AnnouncementService.ts
+++ b/packages/backend/src/core/AnnouncementService.ts
@@ -53,7 +53,7 @@ export class AnnouncementService {
}))
.andWhere(new Brackets(qb => {
qb.orWhere('announcement.forExistingUsers = false');
- qb.orWhere('announcement.createdAt > :createdAt', { createdAt: user.createdAt });
+ qb.orWhere('announcement.id > :userId', { userId: user.id });
}))
.andWhere(`announcement.id NOT IN (${ readsQuery.getQuery() })`);
@@ -65,8 +65,7 @@ export class AnnouncementService {
@bindThis
public async create(values: Partial<MiAnnouncement>, moderator?: MiUser): Promise<{ raw: MiAnnouncement; packed: Packed<'Announcement'> }> {
const announcement = await this.announcementsRepository.insert({
- id: this.idService.genId(),
- createdAt: new Date(),
+ id: this.idService.gen(),
updatedAt: null,
title: values.title,
text: values.text,
@@ -179,8 +178,7 @@ export class AnnouncementService {
public async read(user: MiUser, announcementId: MiAnnouncement['id']): Promise<void> {
try {
await this.announcementReadsRepository.insert({
- id: this.idService.genId(),
- createdAt: new Date(),
+ id: this.idService.gen(),
announcementId: announcementId,
userId: user.id,
});
@@ -204,7 +202,7 @@ export class AnnouncementService {
const reads = me ? (options?.reads ?? await this.getReads(me.id)) : [];
return announcements.map(announcement => ({
id: announcement.id,
- createdAt: announcement.createdAt.toISOString(),
+ createdAt: this.idService.parse(announcement.id).date.toISOString(),
updatedAt: announcement.updatedAt?.toISOString() ?? null,
text: announcement.text,
title: announcement.title,
diff --git a/packages/backend/src/core/AntennaService.ts b/packages/backend/src/core/AntennaService.ts
index ca7624b1d4..94c8ad0cf1 100644
--- a/packages/backend/src/core/AntennaService.ts
+++ b/packages/backend/src/core/AntennaService.ts
@@ -57,14 +57,12 @@ export class AntennaService implements OnApplicationShutdown {
case 'antennaCreated':
this.antennas.push({
...body,
- createdAt: new Date(body.createdAt),
lastUsedAt: new Date(body.lastUsedAt),
});
break;
case 'antennaUpdated':
this.antennas[this.antennas.findIndex(a => a.id === body.id)] = {
...body,
- createdAt: new Date(body.createdAt),
lastUsedAt: new Date(body.lastUsedAt),
};
break;
@@ -100,6 +98,8 @@ export class AntennaService implements OnApplicationShutdown {
if (note.visibility === 'specified') return false;
if (note.visibility === 'followers') return false;
+ if (antenna.localOnly && noteUser.host != null) return false;
+
if (!antenna.withReplies && note.replyId != null) return false;
if (antenna.src === 'home') {
diff --git a/packages/backend/src/core/ClipService.ts b/packages/backend/src/core/ClipService.ts
index 3d9982e80f..e94f1eb531 100644
--- a/packages/backend/src/core/ClipService.ts
+++ b/packages/backend/src/core/ClipService.ts
@@ -46,8 +46,7 @@ export class ClipService {
}
const clip = await this.clipsRepository.insert({
- id: this.idService.genId(),
- createdAt: new Date(),
+ id: this.idService.gen(),
userId: me.id,
name: name,
isPublic: isPublic,
@@ -109,7 +108,7 @@ export class ClipService {
try {
await this.clipNotesRepository.insert({
- id: this.idService.genId(),
+ id: this.idService.gen(),
noteId: noteId,
clipId: clip.id,
});
diff --git a/packages/backend/src/core/CreateSystemUserService.ts b/packages/backend/src/core/CreateSystemUserService.ts
index 0bd694b377..f1ebb4f60a 100644
--- a/packages/backend/src/core/CreateSystemUserService.ts
+++ b/packages/backend/src/core/CreateSystemUserService.ts
@@ -53,8 +53,7 @@ export class CreateSystemUserService {
if (exist) throw new Error('the user is already exists');
account = await transactionalEntityManager.insert(MiUser, {
- id: this.idService.genId(),
- createdAt: new Date(),
+ id: this.idService.gen(),
username: username,
usernameLower: username.toLowerCase(),
host: null,
diff --git a/packages/backend/src/core/CustomEmojiService.ts b/packages/backend/src/core/CustomEmojiService.ts
index e69254f727..75335f6ff3 100644
--- a/packages/backend/src/core/CustomEmojiService.ts
+++ b/packages/backend/src/core/CustomEmojiService.ts
@@ -73,7 +73,7 @@ export class CustomEmojiService implements OnApplicationShutdown {
roleIdsThatCanBeUsedThisEmojiAsReaction: MiRole['id'][];
}, moderator?: MiUser): Promise<MiEmoji> {
const emoji = await this.emojisRepository.insert({
- id: this.idService.genId(),
+ id: this.idService.gen(),
updatedAt: new Date(),
name: data.name,
category: data.category,
diff --git a/packages/backend/src/core/DriveService.ts b/packages/backend/src/core/DriveService.ts
index 4b4872a2d6..3f38cf4a22 100644
--- a/packages/backend/src/core/DriveService.ts
+++ b/packages/backend/src/core/DriveService.ts
@@ -568,8 +568,7 @@ export class DriveService {
const folder = await fetchFolder();
let file = new MiDriveFile();
- file.id = this.idService.genId();
- file.createdAt = new Date();
+ file.id = this.idService.gen();
file.userId = user ? user.id : null;
file.userHost = user ? user.host : null;
file.folderId = folder !== null ? folder.id : null;
diff --git a/packages/backend/src/core/FederatedInstanceService.ts b/packages/backend/src/core/FederatedInstanceService.ts
index 61806583c6..e41f010e48 100644
--- a/packages/backend/src/core/FederatedInstanceService.ts
+++ b/packages/backend/src/core/FederatedInstanceService.ts
@@ -56,7 +56,7 @@ export class FederatedInstanceService implements OnApplicationShutdown {
if (index == null) {
const i = await this.instancesRepository.insert({
- id: this.idService.genId(),
+ id: this.idService.gen(),
host,
firstRetrievedAt: new Date(),
}).then(x => this.instancesRepository.findOneByOrFail(x.identifiers[0]));
diff --git a/packages/backend/src/core/HashtagService.ts b/packages/backend/src/core/HashtagService.ts
index ddff28359a..1a2f37be39 100644
--- a/packages/backend/src/core/HashtagService.ts
+++ b/packages/backend/src/core/HashtagService.ts
@@ -120,7 +120,7 @@ export class HashtagService {
} else {
if (isUserAttached) {
this.hashtagsRepository.insert({
- id: this.idService.genId(),
+ id: this.idService.gen(),
name: tag,
mentionedUserIds: [],
mentionedUsersCount: 0,
@@ -137,7 +137,7 @@ export class HashtagService {
} as MiHashtag);
} else {
this.hashtagsRepository.insert({
- id: this.idService.genId(),
+ id: this.idService.gen(),
name: tag,
mentionedUserIds: [user.id],
mentionedUsersCount: 1,
diff --git a/packages/backend/src/core/IdService.ts b/packages/backend/src/core/IdService.ts
index 06c58ad8a1..c98b8ea6fc 100644
--- a/packages/backend/src/core/IdService.ts
+++ b/packages/backend/src/core/IdService.ts
@@ -26,17 +26,21 @@ export class IdService {
this.method = config.id.toLowerCase();
}
+ /**
+ * 時間を元にIDを生成します(省略時は現在日時)
+ * @param time 日時
+ */
@bindThis
- public genId(date?: Date): string {
- if (!date || (date > new Date())) date = new Date();
+ public gen(time?: number): string {
+ const t = (!time || (time > Date.now())) ? Date.now() : time;
switch (this.method) {
- case 'aid': return genAid(date);
- case 'aidx': return genAidx(date);
- case 'meid': return genMeid(date);
- case 'meidg': return genMeidg(date);
- case 'ulid': return ulid(date.getTime());
- case 'objectid': return genObjectId(date);
+ case 'aid': return genAid(t);
+ case 'aidx': return genAidx(t);
+ case 'meid': return genMeid(t);
+ case 'meidg': return genMeidg(t);
+ case 'ulid': return ulid(t);
+ case 'objectid': return genObjectId(t);
default: throw new Error('unrecognized id generation method');
}
}
diff --git a/packages/backend/src/core/ModerationLogService.ts b/packages/backend/src/core/ModerationLogService.ts
index f7f9063d92..8b78d02047 100644
--- a/packages/backend/src/core/ModerationLogService.ts
+++ b/packages/backend/src/core/ModerationLogService.ts
@@ -24,8 +24,7 @@ export class ModerationLogService {
@bindThis
public async log<T extends typeof moderationLogTypes[number]>(moderator: { id: MiUser['id'] }, type: T, info?: ModerationLogPayloads[T]) {
await this.moderationLogsRepository.insert({
- id: this.idService.genId(),
- createdAt: new Date(),
+ id: this.idService.gen(),
userId: moderator.id,
type: type,
info: (info as any) ?? {},
diff --git a/packages/backend/src/core/NoteCreateService.ts b/packages/backend/src/core/NoteCreateService.ts
index ec50f3db43..da7e6b1336 100644
--- a/packages/backend/src/core/NoteCreateService.ts
+++ b/packages/backend/src/core/NoteCreateService.ts
@@ -56,6 +56,7 @@ import { SearchService } from '@/core/SearchService.js';
import { FeaturedService } from '@/core/FeaturedService.js';
import { RedisTimelineService } from '@/core/RedisTimelineService.js';
import { nyaize } from '@/misc/nyaize.js';
+import { UtilityService } from '@/core/UtilityService.js';
type NotificationType = 'reply' | 'renote' | 'quote' | 'mention';
@@ -215,6 +216,7 @@ export class NoteCreateService implements OnApplicationShutdown {
private perUserNotesChart: PerUserNotesChart,
private activeUsersChart: ActiveUsersChart,
private instanceChart: InstanceChart,
+ private utilityService: UtilityService,
) { }
@bindThis
@@ -222,7 +224,6 @@ export class NoteCreateService implements OnApplicationShutdown {
id: MiUser['id'];
username: MiUser['username'];
host: MiUser['host'];
- createdAt: MiUser['createdAt'];
isBot: MiUser['isBot'];
isCat: MiUser['isCat'];
speakAsCat: MiUser['speakAsCat'];
@@ -261,6 +262,12 @@ export class NoteCreateService implements OnApplicationShutdown {
}
}
+ const inSilencedInstance = this.utilityService.isSilencedHost((await this.metaService.fetch()).silencedHosts, user.host);
+
+ if (data.visibility === 'public' && inSilencedInstance && user.host !== null) {
+ data.visibility = 'home';
+ }
+
if (data.renote) {
switch (data.renote.visibility) {
case 'public':
@@ -384,8 +391,7 @@ export class NoteCreateService implements OnApplicationShutdown {
@bindThis
private async insertNote(user: { id: MiUser['id']; host: MiUser['host']; }, data: Option, tags: string[], emojis: string[], mentionedUsers: MinimumUser[]) {
const insert = new MiNote({
- id: this.idService.genId(data.createdAt!),
- createdAt: data.createdAt!,
+ id: this.idService.gen(data.createdAt?.getTime()),
fileIds: data.files ? data.files.map(file => file.id) : [],
replyId: data.reply ? data.reply.id : null,
renoteId: data.renote ? data.renote.id : null,
@@ -484,7 +490,6 @@ export class NoteCreateService implements OnApplicationShutdown {
id: MiUser['id'];
username: MiUser['username'];
host: MiUser['host'];
- createdAt: MiUser['createdAt'];
isBot: MiUser['isBot'];
}, data: Option, silent: boolean, tags: string[], mentionedUsers: MinimumUser[]) {
const meta = await this.metaService.fetch();
diff --git a/packages/backend/src/core/NoteEditService.ts b/packages/backend/src/core/NoteEditService.ts
index 1953863345..69c66d1000 100644
--- a/packages/backend/src/core/NoteEditService.ts
+++ b/packages/backend/src/core/NoteEditService.ts
@@ -53,6 +53,7 @@ import { RedisTimelineService } from '@/core/RedisTimelineService.js';
import { AntennaService } from './AntennaService.js';
import NotesChart from './chart/charts/notes.js';
import PerUserNotesChart from './chart/charts/per-user-notes.js';
+import { UtilityService } from '@/core/UtilityService.js';
type NotificationType = 'reply' | 'renote' | 'quote' | 'mention';
@@ -217,6 +218,7 @@ export class NoteEditService implements OnApplicationShutdown {
private perUserNotesChart: PerUserNotesChart,
private activeUsersChart: ActiveUsersChart,
private instanceChart: InstanceChart,
+ private utilityService: UtilityService,
) { }
@bindThis
@@ -224,7 +226,6 @@ export class NoteEditService implements OnApplicationShutdown {
id: MiUser['id'];
username: MiUser['username'];
host: MiUser['host'];
- createdAt: MiUser['createdAt'];
isBot: MiUser['isBot'];
}, editid: MiNote['id'], data: Option, silent = false): Promise<MiNote> {
if (!editid) {
@@ -275,6 +276,12 @@ export class NoteEditService implements OnApplicationShutdown {
}
}
+ const inSilencedInstance = this.utilityService.isSilencedHost((await this.metaService.fetch()).silencedHosts, user.host);
+
+ if (data.visibility === 'public' && inSilencedInstance && user.host !== null) {
+ data.visibility = 'home';
+ }
+
if (data.renote) {
switch (data.renote.visibility) {
case 'public':
@@ -381,7 +388,7 @@ export class NoteEditService implements OnApplicationShutdown {
}
await this.noteEditRepository.insert({
- id: this.idService.genId(),
+ id: this.idService.gen(),
noteId: oldnote.id,
text: data.text || undefined,
cw: data.cw,
@@ -391,7 +398,6 @@ export class NoteEditService implements OnApplicationShutdown {
const note = new MiNote({
id: oldnote.id,
- createdAt: new Date(oldnote.createdAt!),
updatedAt: data.updatedAt ? data.updatedAt : new Date(),
fileIds: data.files ? data.files.map(file => file.id) : [],
replyId: data.reply ? data.reply.id : null,
@@ -486,7 +492,6 @@ export class NoteEditService implements OnApplicationShutdown {
id: MiUser['id'];
username: MiUser['username'];
host: MiUser['host'];
- createdAt: MiUser['createdAt'];
isBot: MiUser['isBot'];
}, data: Option, silent: boolean, tags: string[], mentionedUsers: MinimumUser[]) {
// Register host
diff --git a/packages/backend/src/core/NotePiningService.ts b/packages/backend/src/core/NotePiningService.ts
index 147554ee9a..52abb4c2a1 100644
--- a/packages/backend/src/core/NotePiningService.ts
+++ b/packages/backend/src/core/NotePiningService.ts
@@ -71,8 +71,7 @@ export class NotePiningService {
}
await this.userNotePiningsRepository.insert({
- id: this.idService.genId(),
- createdAt: new Date(),
+ id: this.idService.gen(),
userId: user.id,
noteId: note.id,
} as MiUserNotePining);
diff --git a/packages/backend/src/core/NoteReadService.ts b/packages/backend/src/core/NoteReadService.ts
index 422e0192cf..03c1735e04 100644
--- a/packages/backend/src/core/NoteReadService.ts
+++ b/packages/backend/src/core/NoteReadService.ts
@@ -57,7 +57,7 @@ export class NoteReadService implements OnApplicationShutdown {
if (isThreadMuted) return;
const unread = {
- id: this.idService.genId(),
+ id: this.idService.gen(),
noteId: note.id,
userId: userId,
isSpecified: params.isSpecified,
diff --git a/packages/backend/src/core/NotificationService.ts b/packages/backend/src/core/NotificationService.ts
index 32d54d2576..c6d5023e65 100644
--- a/packages/backend/src/core/NotificationService.ts
+++ b/packages/backend/src/core/NotificationService.ts
@@ -125,7 +125,7 @@ export class NotificationService implements OnApplicationShutdown {
}
const notification = {
- id: this.idService.genId(),
+ id: this.idService.gen(),
createdAt: new Date(),
type: type,
notifierId: notifierId,
diff --git a/packages/backend/src/core/PollService.ts b/packages/backend/src/core/PollService.ts
index 570f2350f1..9e1b5ca78a 100644
--- a/packages/backend/src/core/PollService.ts
+++ b/packages/backend/src/core/PollService.ts
@@ -72,10 +72,8 @@ export class PollService {
throw new Error('already voted');
}
- // Create vote
await this.pollVotesRepository.insert({
- id: this.idService.genId(),
- createdAt: new Date(),
+ id: this.idService.gen(),
noteId: note.id,
userId: user.id,
choice: choice,
diff --git a/packages/backend/src/core/QueryService.ts b/packages/backend/src/core/QueryService.ts
index 50d1d2e65b..ae8f8a3f19 100644
--- a/packages/backend/src/core/QueryService.ts
+++ b/packages/backend/src/core/QueryService.ts
@@ -52,14 +52,14 @@ export class QueryService {
q.andWhere(`${q.alias}.id < :untilId`, { untilId: untilId });
q.orderBy(`${q.alias}.id`, 'DESC');
} else if (sinceDate && untilDate) {
- q.andWhere(`${q.alias}.id > :sinceId`, { sinceId: this.idService.genId(new Date(sinceDate)) });
- q.andWhere(`${q.alias}.id < :untilId`, { untilId: this.idService.genId(new Date(untilDate)) });
+ q.andWhere(`${q.alias}.id > :sinceId`, { sinceId: this.idService.gen(sinceDate) });
+ q.andWhere(`${q.alias}.id < :untilId`, { untilId: this.idService.gen(untilDate) });
q.orderBy(`${q.alias}.id`, 'DESC');
} else if (sinceDate) {
- q.andWhere(`${q.alias}.id > :sinceId`, { sinceId: this.idService.genId(new Date(sinceDate)) });
+ q.andWhere(`${q.alias}.id > :sinceId`, { sinceId: this.idService.gen(sinceDate) });
q.orderBy(`${q.alias}.id`, 'ASC');
} else if (untilDate) {
- q.andWhere(`${q.alias}.id < :untilId`, { untilId: this.idService.genId(new Date(untilDate)) });
+ q.andWhere(`${q.alias}.id < :untilId`, { untilId: this.idService.gen(untilDate) });
q.orderBy(`${q.alias}.id`, 'DESC');
} else {
q.orderBy(`${q.alias}.id`, 'DESC');
diff --git a/packages/backend/src/core/ReactionService.ts b/packages/backend/src/core/ReactionService.ts
index e7bbd44926..49b465a0f8 100644
--- a/packages/backend/src/core/ReactionService.ts
+++ b/packages/backend/src/core/ReactionService.ts
@@ -153,8 +153,7 @@ export class ReactionService {
}
const record: MiNoteReaction = {
- id: this.idService.genId(),
- createdAt: new Date(),
+ id: this.idService.gen(),
noteId: note.id,
userId: user.id,
reaction,
diff --git a/packages/backend/src/core/RelayService.ts b/packages/backend/src/core/RelayService.ts
index 7171bf84c5..d40cd080c7 100644
--- a/packages/backend/src/core/RelayService.ts
+++ b/packages/backend/src/core/RelayService.ts
@@ -54,7 +54,7 @@ export class RelayService {
@bindThis
public async addRelay(inbox: string): Promise<MiRelay> {
const relay = await this.relaysRepository.insert({
- id: this.idService.genId(),
+ id: this.idService.gen(),
inbox,
status: 'requesting',
}).then(x => this.relaysRepository.findOneByOrFail(x.identifiers[0]));
diff --git a/packages/backend/src/core/RoleService.ts b/packages/backend/src/core/RoleService.ts
index 2c3547e4ac..d18fb240f7 100644
--- a/packages/backend/src/core/RoleService.ts
+++ b/packages/backend/src/core/RoleService.ts
@@ -125,7 +125,6 @@ export class RoleService implements OnApplicationShutdown {
if (cached) {
cached.push({
...body,
- createdAt: new Date(body.createdAt),
updatedAt: new Date(body.updatedAt),
lastUsedAt: new Date(body.lastUsedAt),
});
@@ -139,7 +138,6 @@ export class RoleService implements OnApplicationShutdown {
if (i > -1) {
cached[i] = {
...body,
- createdAt: new Date(body.createdAt),
updatedAt: new Date(body.updatedAt),
lastUsedAt: new Date(body.lastUsedAt),
};
@@ -159,7 +157,6 @@ export class RoleService implements OnApplicationShutdown {
if (cached) {
cached.push({
...body,
- createdAt: new Date(body.createdAt),
expiresAt: body.expiresAt ? new Date(body.expiresAt) : null,
});
}
@@ -198,10 +195,10 @@ export class RoleService implements OnApplicationShutdown {
return this.userEntityService.isRemoteUser(user);
}
case 'createdLessThan': {
- return user.createdAt.getTime() > (Date.now() - (value.sec * 1000));
+ return this.idService.parse(user.id).date.getTime() > (Date.now() - (value.sec * 1000));
}
case 'createdMoreThan': {
- return user.createdAt.getTime() < (Date.now() - (value.sec * 1000));
+ return this.idService.parse(user.id).date.getTime() < (Date.now() - (value.sec * 1000));
}
case 'followersLessThanOrEq': {
return user.followersCount <= value.value;
@@ -382,7 +379,7 @@ export class RoleService implements OnApplicationShutdown {
@bindThis
public async assign(userId: MiUser['id'], roleId: MiRole['id'], expiresAt: Date | null = null, moderator?: MiUser): Promise<void> {
- const now = new Date();
+ const now = Date.now();
const role = await this.rolesRepository.findOneByOrFail({ id: roleId });
@@ -392,7 +389,7 @@ export class RoleService implements OnApplicationShutdown {
});
if (existing) {
- if (existing.expiresAt && (existing.expiresAt.getTime() < now.getTime())) {
+ if (existing.expiresAt && (existing.expiresAt.getTime() < now)) {
await this.roleAssignmentsRepository.delete({
roleId: roleId,
userId: userId,
@@ -403,8 +400,7 @@ export class RoleService implements OnApplicationShutdown {
}
const created = await this.roleAssignmentsRepository.insert({
- id: this.idService.genId(),
- createdAt: now,
+ id: this.idService.gen(now),
expiresAt: expiresAt,
roleId: roleId,
userId: userId,
@@ -485,8 +481,7 @@ export class RoleService implements OnApplicationShutdown {
public async create(values: Partial<MiRole>, moderator?: MiUser): Promise<MiRole> {
const date = new Date();
const created = await this.rolesRepository.insert({
- id: this.idService.genId(),
- createdAt: date,
+ id: this.idService.gen(date.getTime()),
updatedAt: date,
lastUsedAt: date,
name: values.name,
diff --git a/packages/backend/src/core/SearchService.ts b/packages/backend/src/core/SearchService.ts
index 3ef321dd32..b6d2bcabc8 100644
--- a/packages/backend/src/core/SearchService.ts
+++ b/packages/backend/src/core/SearchService.ts
@@ -131,7 +131,7 @@ export class SearchService {
await this.meilisearchNoteIndex?.addDocuments([{
id: note.id,
- createdAt: note.createdAt.getTime(),
+ createdAt: this.idService.parse(note.id).date.getTime(),
userId: note.userId,
userHost: note.userHost,
channelId: note.channelId,
diff --git a/packages/backend/src/core/SignupService.ts b/packages/backend/src/core/SignupService.ts
index 48a25ed3ca..359957cd52 100644
--- a/packages/backend/src/core/SignupService.ts
+++ b/packages/backend/src/core/SignupService.ts
@@ -121,8 +121,7 @@ export class SignupService {
if (exist) throw new Error(' the username is already used');
account = await transactionalEntityManager.save(new MiUser({
- id: this.idService.genId(),
- createdAt: new Date(),
+ id: this.idService.gen(),
username: username,
usernameLower: username.toLowerCase(),
host: this.utilityService.toPunyNullable(host),
diff --git a/packages/backend/src/core/UserBlockingService.ts b/packages/backend/src/core/UserBlockingService.ts
index 087dfd9214..39b19325c3 100644
--- a/packages/backend/src/core/UserBlockingService.ts
+++ b/packages/backend/src/core/UserBlockingService.ts
@@ -68,8 +68,7 @@ export class UserBlockingService implements OnModuleInit {
]);
const blocking = {
- id: this.idService.genId(),
- createdAt: new Date(),
+ id: this.idService.gen(),
blocker,
blockerId: blocker.id,
blockee,
diff --git a/packages/backend/src/core/UserFollowingService.ts b/packages/backend/src/core/UserFollowingService.ts
index beffcc2e9c..87484f0383 100644
--- a/packages/backend/src/core/UserFollowingService.ts
+++ b/packages/backend/src/core/UserFollowingService.ts
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: AGPL-3.0-only
*/
-import { Inject, Injectable, OnModuleInit, forwardRef } from '@nestjs/common';
+import { Inject, Injectable, OnModuleInit } from '@nestjs/common';
import { ModuleRef } from '@nestjs/core';
import { IsNull } from 'typeorm';
import type { MiLocalUser, MiPartialLocalUser, MiPartialRemoteUser, MiRemoteUser, MiUser } from '@/models/User.js';
@@ -28,6 +28,7 @@ import { MetaService } from '@/core/MetaService.js';
import { CacheService } from '@/core/CacheService.js';
import type { Config } from '@/config.js';
import { AccountMoveService } from '@/core/AccountMoveService.js';
+import { UtilityService } from '@/core/UtilityService.js';
import Logger from '../logger.js';
const logger = new Logger('following/create');
@@ -71,6 +72,7 @@ export class UserFollowingService implements OnModuleInit {
private instancesRepository: InstancesRepository,
private cacheService: CacheService,
+ private utilityService: UtilityService,
private userEntityService: UserEntityService,
private idService: IdService,
private queueService: QueueService,
@@ -118,15 +120,16 @@ export class UserFollowingService implements OnModuleInit {
}
const followeeProfile = await this.userProfilesRepository.findOneByOrFail({ userId: followee.id });
-
// フォロー対象が鍵アカウントである or
// フォロワーがBotであり、フォロー対象がBotからのフォローに慎重である or
- // フォロワーがローカルユーザーであり、フォロー対象がリモートユーザーである
+ // フォロワーがローカルユーザーであり、フォロー対象がリモートユーザーである or
+ // フォロワーがローカルユーザーであり、フォロー対象がサイレンスされているサーバーである
// 上記のいずれかに当てはまる場合はすぐフォローせずにフォローリクエストを発行しておく
if (
followee.isLocked ||
(followeeProfile.carefulBot && follower.isBot) ||
- (this.userEntityService.isLocalUser(follower) && this.userEntityService.isRemoteUser(followee) && process.env.FORCE_FOLLOW_REMOTE_USER_FOR_TESTING !== 'true')
+ (this.userEntityService.isLocalUser(follower) && this.userEntityService.isRemoteUser(followee) && process.env.FORCE_FOLLOW_REMOTE_USER_FOR_TESTING !== 'true') ||
+ (this.userEntityService.isLocalUser(followee) && this.userEntityService.isRemoteUser(follower) && this.utilityService.isSilencedHost((await this.metaService.fetch()).silencedHosts, follower.host))
) {
let autoAccept = false;
@@ -196,8 +199,7 @@ export class UserFollowingService implements OnModuleInit {
let alreadyFollowed = false as boolean;
await this.followingsRepository.insert({
- id: this.idService.genId(),
- createdAt: new Date(),
+ id: this.idService.gen(),
followerId: follower.id,
followeeId: followee.id,
@@ -465,8 +467,7 @@ export class UserFollowingService implements OnModuleInit {
if (blocked) throw new Error('blocked');
const followRequest = await this.followRequestsRepository.insert({
- id: this.idService.genId(),
- createdAt: new Date(),
+ id: this.idService.gen(),
followerId: follower.id,
followeeId: followee.id,
requestId,
diff --git a/packages/backend/src/core/UserListService.ts b/packages/backend/src/core/UserListService.ts
index 5b4e7a711e..702c731fc3 100644
--- a/packages/backend/src/core/UserListService.ts
+++ b/packages/backend/src/core/UserListService.ts
@@ -93,8 +93,7 @@ export class UserListService implements OnApplicationShutdown {
}
await this.userListMembershipsRepository.insert({
- id: this.idService.genId(),
- createdAt: new Date(),
+ id: this.idService.gen(),
userId: target.id,
userListId: list.id,
userListUserId: list.userId,
diff --git a/packages/backend/src/core/UserMutingService.ts b/packages/backend/src/core/UserMutingService.ts
index 2387c9d648..397e6bdd5d 100644
--- a/packages/backend/src/core/UserMutingService.ts
+++ b/packages/backend/src/core/UserMutingService.ts
@@ -26,8 +26,7 @@ export class UserMutingService {
@bindThis
public async mute(user: MiUser, target: MiUser, expiresAt: Date | null = null): Promise<void> {
await this.mutingsRepository.insert({
- id: this.idService.genId(),
- createdAt: new Date(),
+ id: this.idService.gen(),
expiresAt: expiresAt ?? null,
muterId: user.id,
muteeId: target.id,
diff --git a/packages/backend/src/core/UtilityService.ts b/packages/backend/src/core/UtilityService.ts
index d2d2776bd2..b95e41167b 100644
--- a/packages/backend/src/core/UtilityService.ts
+++ b/packages/backend/src/core/UtilityService.ts
@@ -36,6 +36,12 @@ export class UtilityService {
}
@bindThis
+ public isSilencedHost(silencedHosts: string[] | undefined, host: string | null): boolean {
+ if (!silencedHosts || host == null) return false;
+ return silencedHosts.some(x => `.${host.toLowerCase()}`.endsWith(`.${x}`));
+ }
+
+ @bindThis
public extractDbHost(uri: string): string {
const url = new URL(uri);
return this.toPuny(url.hostname);
diff --git a/packages/backend/src/core/WebhookService.ts b/packages/backend/src/core/WebhookService.ts
index ff70f7bc0c..930e6ef64a 100644
--- a/packages/backend/src/core/WebhookService.ts
+++ b/packages/backend/src/core/WebhookService.ts
@@ -51,7 +51,6 @@ export class WebhookService implements OnApplicationShutdown {
if (body.active) {
this.webhooks.push({
...body,
- createdAt: new Date(body.createdAt),
latestSentAt: body.latestSentAt ? new Date(body.latestSentAt) : null,
});
}
@@ -62,13 +61,11 @@ export class WebhookService implements OnApplicationShutdown {
if (i > -1) {
this.webhooks[i] = {
...body,
- createdAt: new Date(body.createdAt),
latestSentAt: body.latestSentAt ? new Date(body.latestSentAt) : null,
};
} else {
this.webhooks.push({
...body,
- createdAt: new Date(body.createdAt),
latestSentAt: body.latestSentAt ? new Date(body.latestSentAt) : null,
});
}
diff --git a/packages/backend/src/core/activitypub/ApInboxService.ts b/packages/backend/src/core/activitypub/ApInboxService.ts
index f1f821b299..048d527762 100644
--- a/packages/backend/src/core/activitypub/ApInboxService.ts
+++ b/packages/backend/src/core/activitypub/ApInboxService.ts
@@ -514,8 +514,7 @@ export class ApInboxService {
if (users.length < 1) return 'skip';
await this.abuseUserReportsRepository.insert({
- id: this.idService.genId(),
- createdAt: new Date(),
+ id: this.idService.gen(),
targetUserId: users[0].id,
targetUserHost: users[0].host,
reporterId: actor.id,
diff --git a/packages/backend/src/core/activitypub/ApRendererService.ts b/packages/backend/src/core/activitypub/ApRendererService.ts
index b47d785663..bfbe62e2a9 100644
--- a/packages/backend/src/core/activitypub/ApRendererService.ts
+++ b/packages/backend/src/core/activitypub/ApRendererService.ts
@@ -27,6 +27,7 @@ import type { UsersRepository, UserProfilesRepository, NotesRepository, DriveFil
import { bindThis } from '@/decorators.js';
import { CustomEmojiService } from '@/core/CustomEmojiService.js';
import { isNotNull } from '@/misc/is-not-null.js';
+import { IdService } from '@/core/IdService.js';
import { LdSignatureService } from './LdSignatureService.js';
import { ApMfmService } from './ApMfmService.js';
import type { IAccept, IActivity, IAdd, IAnnounce, IApDocument, IApEmoji, IApHashtag, IApImage, IApMention, IBlock, ICreate, IDelete, IFlag, IFollow, IKey, ILike, IMove, IObject, IPost, IQuestion, IReject, IRemove, ITombstone, IUndo, IUpdate } from './type.js';
@@ -59,6 +60,7 @@ export class ApRendererService {
private userKeypairService: UserKeypairService,
private apMfmService: ApMfmService,
private mfmService: MfmService,
+ private idService: IdService,
) {
}
@@ -105,7 +107,7 @@ export class ApRendererService {
id: `${this.config.url}/notes/${note.id}/activity`,
actor: this.userEntityService.genLocalUserUri(note.userId),
type: 'Announce',
- published: note.createdAt.toISOString(),
+ published: this.idService.parse(note.id).date.toISOString(),
to,
cc,
object,
@@ -137,7 +139,7 @@ export class ApRendererService {
id: `${this.config.url}/notes/${note.id}/activity`,
actor: this.userEntityService.genLocalUserUri(note.userId),
type: 'Create',
- published: note.createdAt.toISOString(),
+ published: this.idService.parse(note.id).date.toISOString(),
object,
};
@@ -438,7 +440,7 @@ export class ApRendererService {
_misskey_quote: quote,
quoteUrl: quote,
quoteUri: quote,
- published: note.createdAt.toISOString(),
+ published: this.idService.parse(note.id).date.toISOString(),
to,
cc,
inReplyTo,
@@ -731,7 +733,7 @@ export class ApRendererService {
_misskey_quote: quote,
quoteUrl: quote,
quoteUri: quote,
- published: note.createdAt.toISOString(),
+ published: this.idService.parse(note.id).date.toISOString(),
to,
cc,
inReplyTo,
diff --git a/packages/backend/src/core/activitypub/models/ApNoteService.ts b/packages/backend/src/core/activitypub/models/ApNoteService.ts
index 5a8f90405a..72488b1c37 100644
--- a/packages/backend/src/core/activitypub/models/ApNoteService.ts
+++ b/packages/backend/src/core/activitypub/models/ApNoteService.ts
@@ -599,7 +599,7 @@ export class ApNoteService {
this.logger.info(`register emoji host=${host}, name=${name}`);
return await this.emojisRepository.insert({
- id: this.idService.genId(),
+ id: this.idService.gen(),
host,
name,
uri: tag.id,
diff --git a/packages/backend/src/core/activitypub/models/ApPersonService.ts b/packages/backend/src/core/activitypub/models/ApPersonService.ts
index 76b8073087..07dfe7c476 100644
--- a/packages/backend/src/core/activitypub/models/ApPersonService.ts
+++ b/packages/backend/src/core/activitypub/models/ApPersonService.ts
@@ -304,11 +304,10 @@ export class ApPersonService implements OnModuleInit {
// Start transaction
await this.db.transaction(async transactionalEntityManager => {
user = await transactionalEntityManager.save(new MiUser({
- id: this.idService.genId(),
+ id: this.idService.gen(),
avatarId: null,
bannerId: null,
backgroundId: null,
- createdAt: new Date(),
lastFetchedAt: new Date(),
name: truncate(person.name, nameLength),
isLocked: person.manuallyApprovesFollowers,
@@ -624,8 +623,7 @@ export class ApPersonService implements OnModuleInit {
for (const note of featuredNotes.filter((note): note is MiNote => note != null)) {
td -= 1000;
transactionalEntityManager.insert(MiUserNotePining, {
- id: this.idService.genId(new Date(Date.now() + td)),
- createdAt: new Date(),
+ id: this.idService.gen(Date.now() + td),
userId: user.id,
noteId: note.id,
});
diff --git a/packages/backend/src/core/chart/charts/active-users.ts b/packages/backend/src/core/chart/charts/active-users.ts
index 55da1469e5..f0918e059c 100644
--- a/packages/backend/src/core/chart/charts/active-users.ts
+++ b/packages/backend/src/core/chart/charts/active-users.ts
@@ -9,6 +9,7 @@ import { AppLockService } from '@/core/AppLockService.js';
import type { MiUser } from '@/models/User.js';
import { DI } from '@/di-symbols.js';
import { bindThis } from '@/decorators.js';
+import { IdService } from '@/core/IdService.js';
import Chart from '../core.js';
import { ChartLoggerService } from '../ChartLoggerService.js';
import { name, schema } from './entities/active-users.js';
@@ -29,6 +30,7 @@ export default class ActiveUsersChart extends Chart<typeof schema> { // eslint-d
private appLockService: AppLockService,
private chartLoggerService: ChartLoggerService,
+ private idService: IdService,
) {
super(db, (k) => appLockService.getChartInsertLock(k), chartLoggerService.logger, name, schema);
}
@@ -42,20 +44,21 @@ export default class ActiveUsersChart extends Chart<typeof schema> { // eslint-d
}
@bindThis
- public async read(user: { id: MiUser['id'], host: null, createdAt: MiUser['createdAt'] }): Promise<void> {
+ public async read(user: { id: MiUser['id'], host: null }): Promise<void> {
+ const createdAt = this.idService.parse(user.id).date;
await this.commit({
'read': [user.id],
- 'registeredWithinWeek': (Date.now() - user.createdAt.getTime() < week) ? [user.id] : [],
- 'registeredWithinMonth': (Date.now() - user.createdAt.getTime() < month) ? [user.id] : [],
- 'registeredWithinYear': (Date.now() - user.createdAt.getTime() < year) ? [user.id] : [],
- 'registeredOutsideWeek': (Date.now() - user.createdAt.getTime() > week) ? [user.id] : [],
- 'registeredOutsideMonth': (Date.now() - user.createdAt.getTime() > month) ? [user.id] : [],
- 'registeredOutsideYear': (Date.now() - user.createdAt.getTime() > year) ? [user.id] : [],
+ 'registeredWithinWeek': (Date.now() - createdAt.getTime() < week) ? [user.id] : [],
+ 'registeredWithinMonth': (Date.now() - createdAt.getTime() < month) ? [user.id] : [],
+ 'registeredWithinYear': (Date.now() - createdAt.getTime() < year) ? [user.id] : [],
+ 'registeredOutsideWeek': (Date.now() - createdAt.getTime() > week) ? [user.id] : [],
+ 'registeredOutsideMonth': (Date.now() - createdAt.getTime() > month) ? [user.id] : [],
+ 'registeredOutsideYear': (Date.now() - createdAt.getTime() > year) ? [user.id] : [],
});
}
@bindThis
- public async write(user: { id: MiUser['id'], host: null, createdAt: MiUser['createdAt'] }): Promise<void> {
+ public async write(user: { id: MiUser['id'], host: null }): Promise<void> {
await this.commit({
'write': [user.id],
});
diff --git a/packages/backend/src/core/entities/AbuseUserReportEntityService.ts b/packages/backend/src/core/entities/AbuseUserReportEntityService.ts
index 0e65a10d26..97de891ece 100644
--- a/packages/backend/src/core/entities/AbuseUserReportEntityService.ts
+++ b/packages/backend/src/core/entities/AbuseUserReportEntityService.ts
@@ -9,6 +9,7 @@ import type { AbuseUserReportsRepository } from '@/models/_.js';
import { awaitAll } from '@/misc/prelude/await-all.js';
import type { MiAbuseUserReport } from '@/models/AbuseUserReport.js';
import { bindThis } from '@/decorators.js';
+import { IdService } from '@/core/IdService.js';
import { UserEntityService } from './UserEntityService.js';
@Injectable()
@@ -18,6 +19,7 @@ export class AbuseUserReportEntityService {
private abuseUserReportsRepository: AbuseUserReportsRepository,
private userEntityService: UserEntityService,
+ private idService: IdService,
) {
}
@@ -29,7 +31,7 @@ export class AbuseUserReportEntityService {
return await awaitAll({
id: report.id,
- createdAt: report.createdAt.toISOString(),
+ createdAt: this.idService.parse(report.id).date.toISOString(),
comment: report.comment,
resolved: report.resolved,
reporterId: report.reporterId,
diff --git a/packages/backend/src/core/entities/AntennaEntityService.ts b/packages/backend/src/core/entities/AntennaEntityService.ts
index ed108f2ce5..265a61e8ad 100644
--- a/packages/backend/src/core/entities/AntennaEntityService.ts
+++ b/packages/backend/src/core/entities/AntennaEntityService.ts
@@ -9,12 +9,15 @@ import type { AntennasRepository } from '@/models/_.js';
import type { Packed } from '@/misc/json-schema.js';
import type { MiAntenna } from '@/models/Antenna.js';
import { bindThis } from '@/decorators.js';
+import { IdService } from '@/core/IdService.js';
@Injectable()
export class AntennaEntityService {
constructor(
@Inject(DI.antennasRepository)
private antennasRepository: AntennasRepository,
+
+ private idService: IdService,
) {
}
@@ -26,7 +29,7 @@ export class AntennaEntityService {
return {
id: antenna.id,
- createdAt: antenna.createdAt.toISOString(),
+ createdAt: this.idService.parse(antenna.id).date.toISOString(),
name: antenna.name,
keywords: antenna.keywords,
excludeKeywords: antenna.excludeKeywords,
@@ -34,6 +37,7 @@ export class AntennaEntityService {
userListId: antenna.userListId,
users: antenna.users,
caseSensitive: antenna.caseSensitive,
+ localOnly: antenna.localOnly,
notify: antenna.notify,
withReplies: antenna.withReplies,
withFile: antenna.withFile,
diff --git a/packages/backend/src/core/entities/BlockingEntityService.ts b/packages/backend/src/core/entities/BlockingEntityService.ts
index 44466e24e8..b4760346b7 100644
--- a/packages/backend/src/core/entities/BlockingEntityService.ts
+++ b/packages/backend/src/core/entities/BlockingEntityService.ts
@@ -11,6 +11,7 @@ import type { Packed } from '@/misc/json-schema.js';
import type { MiBlocking } from '@/models/Blocking.js';
import type { MiUser } from '@/models/User.js';
import { bindThis } from '@/decorators.js';
+import { IdService } from '@/core/IdService.js';
import { UserEntityService } from './UserEntityService.js';
@Injectable()
@@ -20,6 +21,7 @@ export class BlockingEntityService {
private blockingsRepository: BlockingsRepository,
private userEntityService: UserEntityService,
+ private idService: IdService,
) {
}
@@ -32,7 +34,7 @@ export class BlockingEntityService {
return await awaitAll({
id: blocking.id,
- createdAt: blocking.createdAt.toISOString(),
+ createdAt: this.idService.parse(blocking.id).date.toISOString(),
blockeeId: blocking.blockeeId,
blockee: this.userEntityService.pack(blocking.blockeeId, me, {
detail: true,
diff --git a/packages/backend/src/core/entities/ChannelEntityService.ts b/packages/backend/src/core/entities/ChannelEntityService.ts
index 094de4d2d5..dd72953c7d 100644
--- a/packages/backend/src/core/entities/ChannelEntityService.ts
+++ b/packages/backend/src/core/entities/ChannelEntityService.ts
@@ -11,6 +11,7 @@ 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 { IdService } from '@/core/IdService.js';
import { DriveFileEntityService } from './DriveFileEntityService.js';
import { NoteEntityService } from './NoteEntityService.js';
import { In } from 'typeorm';
@@ -38,6 +39,7 @@ export class ChannelEntityService {
private noteEntityService: NoteEntityService,
private driveFileEntityService: DriveFileEntityService,
+ private idService: IdService,
) {
}
@@ -81,7 +83,7 @@ export class ChannelEntityService {
return {
id: channel.id,
- createdAt: channel.createdAt.toISOString(),
+ createdAt: this.idService.parse(channel.id).date.toISOString(),
lastNotedAt: channel.lastNotedAt ? channel.lastNotedAt.toISOString() : null,
name: channel.name,
description: channel.description,
diff --git a/packages/backend/src/core/entities/ClipEntityService.ts b/packages/backend/src/core/entities/ClipEntityService.ts
index e141db03f1..96422894fd 100644
--- a/packages/backend/src/core/entities/ClipEntityService.ts
+++ b/packages/backend/src/core/entities/ClipEntityService.ts
@@ -11,6 +11,7 @@ import type { Packed } from '@/misc/json-schema.js';
import type { } from '@/models/Blocking.js';
import type { MiClip } from '@/models/Clip.js';
import { bindThis } from '@/decorators.js';
+import { IdService } from '@/core/IdService.js';
import { UserEntityService } from './UserEntityService.js';
@Injectable()
@@ -23,6 +24,7 @@ export class ClipEntityService {
private clipFavoritesRepository: ClipFavoritesRepository,
private userEntityService: UserEntityService,
+ private idService: IdService,
) {
}
@@ -36,7 +38,7 @@ export class ClipEntityService {
return await awaitAll({
id: clip.id,
- createdAt: clip.createdAt.toISOString(),
+ createdAt: this.idService.parse(clip.id).date.toISOString(),
lastClippedAt: clip.lastClippedAt ? clip.lastClippedAt.toISOString() : null,
userId: clip.userId,
user: this.userEntityService.pack(clip.user ?? clip.userId),
diff --git a/packages/backend/src/core/entities/DriveFileEntityService.ts b/packages/backend/src/core/entities/DriveFileEntityService.ts
index 23273b0413..5148b2ca9e 100644
--- a/packages/backend/src/core/entities/DriveFileEntityService.ts
+++ b/packages/backend/src/core/entities/DriveFileEntityService.ts
@@ -17,6 +17,7 @@ import { deepClone } from '@/misc/clone.js';
import { bindThis } from '@/decorators.js';
import { isMimeImage } from '@/misc/is-mime-image.js';
import { isNotNull } from '@/misc/is-not-null.js';
+import { IdService } from '@/core/IdService.js';
import { UtilityService } from '../UtilityService.js';
import { VideoProcessingService } from '../VideoProcessingService.js';
import { UserEntityService } from './UserEntityService.js';
@@ -44,6 +45,7 @@ export class DriveFileEntityService {
private utilityService: UtilityService,
private driveFolderEntityService: DriveFolderEntityService,
private videoProcessingService: VideoProcessingService,
+ private idService: IdService,
) {
}
@@ -196,7 +198,7 @@ export class DriveFileEntityService {
return await awaitAll<Packed<'DriveFile'>>({
id: file.id,
- createdAt: file.createdAt.toISOString(),
+ createdAt: this.idService.parse(file.id).date.toISOString(),
name: file.name,
type: file.type,
md5: file.md5,
@@ -231,7 +233,7 @@ export class DriveFileEntityService {
return await awaitAll<Packed<'DriveFile'>>({
id: file.id,
- createdAt: file.createdAt.toISOString(),
+ createdAt: this.idService.parse(file.id).date.toISOString(),
name: file.name,
type: file.type,
md5: file.md5,
diff --git a/packages/backend/src/core/entities/DriveFolderEntityService.ts b/packages/backend/src/core/entities/DriveFolderEntityService.ts
index 55014284bd..8fa78154b9 100644
--- a/packages/backend/src/core/entities/DriveFolderEntityService.ts
+++ b/packages/backend/src/core/entities/DriveFolderEntityService.ts
@@ -11,6 +11,7 @@ import type { Packed } from '@/misc/json-schema.js';
import type { } from '@/models/Blocking.js';
import type { MiDriveFolder } from '@/models/DriveFolder.js';
import { bindThis } from '@/decorators.js';
+import { IdService } from '@/core/IdService.js';
@Injectable()
export class DriveFolderEntityService {
@@ -20,6 +21,8 @@ export class DriveFolderEntityService {
@Inject(DI.driveFilesRepository)
private driveFilesRepository: DriveFilesRepository,
+
+ private idService: IdService,
) {
}
@@ -38,7 +41,7 @@ export class DriveFolderEntityService {
return await awaitAll({
id: folder.id,
- createdAt: folder.createdAt.toISOString(),
+ createdAt: this.idService.parse(folder.id).date.toISOString(),
name: folder.name,
parentId: folder.parentId,
diff --git a/packages/backend/src/core/entities/FlashEntityService.ts b/packages/backend/src/core/entities/FlashEntityService.ts
index 4701cddcba..dc335d9975 100644
--- a/packages/backend/src/core/entities/FlashEntityService.ts
+++ b/packages/backend/src/core/entities/FlashEntityService.ts
@@ -12,6 +12,7 @@ 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 { IdService } from '@/core/IdService.js';
import { UserEntityService } from './UserEntityService.js';
@Injectable()
@@ -24,6 +25,7 @@ export class FlashEntityService {
private flashLikesRepository: FlashLikesRepository,
private userEntityService: UserEntityService,
+ private idService: IdService,
) {
}
@@ -37,7 +39,7 @@ export class FlashEntityService {
return await awaitAll({
id: flash.id,
- createdAt: flash.createdAt.toISOString(),
+ createdAt: this.idService.parse(flash.id).date.toISOString(),
updatedAt: flash.updatedAt.toISOString(),
userId: flash.userId,
user: this.userEntityService.pack(flash.user ?? flash.userId, me), // { detail: true } すると無限ループするので注意
diff --git a/packages/backend/src/core/entities/FollowingEntityService.ts b/packages/backend/src/core/entities/FollowingEntityService.ts
index 9f6eb51e8c..52aa979677 100644
--- a/packages/backend/src/core/entities/FollowingEntityService.ts
+++ b/packages/backend/src/core/entities/FollowingEntityService.ts
@@ -12,6 +12,7 @@ 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 { IdService } from '@/core/IdService.js';
import { UserEntityService } from './UserEntityService.js';
type LocalFollowerFollowing = MiFollowing & {
@@ -45,6 +46,7 @@ export class FollowingEntityService {
private followingsRepository: FollowingsRepository,
private userEntityService: UserEntityService,
+ private idService: IdService,
) {
}
@@ -83,7 +85,7 @@ export class FollowingEntityService {
return await awaitAll({
id: following.id,
- createdAt: following.createdAt.toISOString(),
+ createdAt: this.idService.parse(following.id).date.toISOString(),
followeeId: following.followeeId,
followerId: following.followerId,
followee: opts.populateFollowee ? this.userEntityService.pack(following.followee ?? following.followeeId, me, {
diff --git a/packages/backend/src/core/entities/GalleryPostEntityService.ts b/packages/backend/src/core/entities/GalleryPostEntityService.ts
index bbaf70f0fd..d7b960e0d9 100644
--- a/packages/backend/src/core/entities/GalleryPostEntityService.ts
+++ b/packages/backend/src/core/entities/GalleryPostEntityService.ts
@@ -12,6 +12,7 @@ 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 { IdService } from '@/core/IdService.js';
import { UserEntityService } from './UserEntityService.js';
import { DriveFileEntityService } from './DriveFileEntityService.js';
@@ -26,6 +27,7 @@ export class GalleryPostEntityService {
private userEntityService: UserEntityService,
private driveFileEntityService: DriveFileEntityService,
+ private idService: IdService,
) {
}
@@ -39,7 +41,7 @@ export class GalleryPostEntityService {
return await awaitAll({
id: post.id,
- createdAt: post.createdAt.toISOString(),
+ createdAt: this.idService.parse(post.id).date.toISOString(),
updatedAt: post.updatedAt.toISOString(),
userId: post.userId,
user: this.userEntityService.pack(post.user ?? post.userId, me),
diff --git a/packages/backend/src/core/entities/InstanceEntityService.ts b/packages/backend/src/core/entities/InstanceEntityService.ts
index 0e27e9df7f..9afe87eab7 100644
--- a/packages/backend/src/core/entities/InstanceEntityService.ts
+++ b/packages/backend/src/core/entities/InstanceEntityService.ts
@@ -3,9 +3,8 @@
* SPDX-License-Identifier: AGPL-3.0-only
*/
-import { Injectable } from '@nestjs/common';
+import { Inject, Injectable } from '@nestjs/common';
import type { Packed } from '@/misc/json-schema.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';
@@ -43,6 +42,7 @@ export class InstanceEntityService {
description: instance.description,
maintainerName: instance.maintainerName,
maintainerEmail: instance.maintainerEmail,
+ isSilenced: this.utilityService.isSilencedHost(meta.silencedHosts, instance.host),
iconUrl: instance.iconUrl,
faviconUrl: instance.faviconUrl,
themeColor: instance.themeColor,
diff --git a/packages/backend/src/core/entities/InviteCodeEntityService.ts b/packages/backend/src/core/entities/InviteCodeEntityService.ts
index 914eaafe68..0f15fb5ab2 100644
--- a/packages/backend/src/core/entities/InviteCodeEntityService.ts
+++ b/packages/backend/src/core/entities/InviteCodeEntityService.ts
@@ -11,6 +11,7 @@ import type { Packed } from '@/misc/json-schema.js';
import type { MiUser } from '@/models/User.js';
import type { MiRegistrationTicket } from '@/models/RegistrationTicket.js';
import { bindThis } from '@/decorators.js';
+import { IdService } from '@/core/IdService.js';
import { UserEntityService } from './UserEntityService.js';
@Injectable()
@@ -20,6 +21,7 @@ export class InviteCodeEntityService {
private registrationTicketsRepository: RegistrationTicketsRepository,
private userEntityService: UserEntityService,
+ private idService: IdService,
) {
}
@@ -39,7 +41,7 @@ export class InviteCodeEntityService {
id: target.id,
code: target.code,
expiresAt: target.expiresAt ? target.expiresAt.toISOString() : null,
- createdAt: target.createdAt.toISOString(),
+ createdAt: this.idService.parse(target.id).date.toISOString(),
createdBy: target.createdBy ? await this.userEntityService.pack(target.createdBy, me) : null,
usedBy: target.usedBy ? await this.userEntityService.pack(target.usedBy, me) : null,
usedAt: target.usedAt ? target.usedAt.toISOString() : null,
diff --git a/packages/backend/src/core/entities/ModerationLogEntityService.ts b/packages/backend/src/core/entities/ModerationLogEntityService.ts
index 83b024d83b..6729ca2671 100644
--- a/packages/backend/src/core/entities/ModerationLogEntityService.ts
+++ b/packages/backend/src/core/entities/ModerationLogEntityService.ts
@@ -10,6 +10,7 @@ import { awaitAll } from '@/misc/prelude/await-all.js';
import type { } from '@/models/Blocking.js';
import type { MiModerationLog } from '@/models/ModerationLog.js';
import { bindThis } from '@/decorators.js';
+import { IdService } from '@/core/IdService.js';
import { UserEntityService } from './UserEntityService.js';
@Injectable()
@@ -19,6 +20,7 @@ export class ModerationLogEntityService {
private moderationLogsRepository: ModerationLogsRepository,
private userEntityService: UserEntityService,
+ private idService: IdService,
) {
}
@@ -30,7 +32,7 @@ export class ModerationLogEntityService {
return await awaitAll({
id: log.id,
- createdAt: log.createdAt.toISOString(),
+ createdAt: this.idService.parse(log.id).date.toISOString(),
type: log.type,
info: log.info,
userId: log.userId,
diff --git a/packages/backend/src/core/entities/MutingEntityService.ts b/packages/backend/src/core/entities/MutingEntityService.ts
index e3d5d2e211..9d672169ba 100644
--- a/packages/backend/src/core/entities/MutingEntityService.ts
+++ b/packages/backend/src/core/entities/MutingEntityService.ts
@@ -12,6 +12,7 @@ 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 { IdService } from '@/core/IdService.js';
import { UserEntityService } from './UserEntityService.js';
@Injectable()
@@ -21,6 +22,7 @@ export class MutingEntityService {
private mutingsRepository: MutingsRepository,
private userEntityService: UserEntityService,
+ private idService: IdService,
) {
}
@@ -33,7 +35,7 @@ export class MutingEntityService {
return await awaitAll({
id: muting.id,
- createdAt: muting.createdAt.toISOString(),
+ createdAt: this.idService.parse(muting.id).date.toISOString(),
expiresAt: muting.expiresAt ? muting.expiresAt.toISOString() : null,
muteeId: muting.muteeId,
mutee: this.userEntityService.pack(muting.muteeId, me, {
diff --git a/packages/backend/src/core/entities/NoteEntityService.ts b/packages/backend/src/core/entities/NoteEntityService.ts
index 498cf4721f..d593f66253 100644
--- a/packages/backend/src/core/entities/NoteEntityService.ts
+++ b/packages/backend/src/core/entities/NoteEntityService.ts
@@ -314,7 +314,7 @@ export class NoteEntityService implements OnModuleInit {
const packed: Packed<'Note'> = await awaitAll({
id: note.id,
- createdAt: note.createdAt.toISOString(),
+ createdAt: this.idService.parse(note.id).date.toISOString(),
updatedAt: note.updatedAt ? note.updatedAt.toISOString() : undefined,
userId: note.userId,
user: this.userEntityService.pack(note.user ?? note.userId, me, {
@@ -389,7 +389,8 @@ export class NoteEntityService implements OnModuleInit {
if (meId) {
const renoteIds = notes.filter(n => n.renoteId != null).map(n => n.renoteId!);
// パフォーマンスのためノートが作成されてから2秒以上経っていない場合はリアクションを取得しない
- const targets = [...notes.filter(n => n.createdAt.getTime() + 2000 < Date.now()).map(n => n.id), ...renoteIds];
+ const oldId = this.idService.gen(Date.now() - 2000);
+ const targets = [...notes.filter(n => n.id < oldId).map(n => n.id), ...renoteIds];
const myReactions = await this.noteReactionsRepository.findBy({
userId: meId,
noteId: In(targets),
diff --git a/packages/backend/src/core/entities/NoteFavoriteEntityService.ts b/packages/backend/src/core/entities/NoteFavoriteEntityService.ts
index 808c8c9f69..1c9aed413f 100644
--- a/packages/backend/src/core/entities/NoteFavoriteEntityService.ts
+++ b/packages/backend/src/core/entities/NoteFavoriteEntityService.ts
@@ -10,6 +10,7 @@ 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 { IdService } from '@/core/IdService.js';
import { NoteEntityService } from './NoteEntityService.js';
@Injectable()
@@ -19,6 +20,7 @@ export class NoteFavoriteEntityService {
private noteFavoritesRepository: NoteFavoritesRepository,
private noteEntityService: NoteEntityService,
+ private idService: IdService,
) {
}
@@ -31,7 +33,7 @@ export class NoteFavoriteEntityService {
return {
id: favorite.id,
- createdAt: favorite.createdAt.toISOString(),
+ createdAt: this.idService.parse(favorite.id).date.toISOString(),
noteId: favorite.noteId,
note: await this.noteEntityService.pack(favorite.note ?? favorite.noteId, me),
};
diff --git a/packages/backend/src/core/entities/NoteReactionEntityService.ts b/packages/backend/src/core/entities/NoteReactionEntityService.ts
index 9701f37fdb..f4aba3e543 100644
--- a/packages/backend/src/core/entities/NoteReactionEntityService.ts
+++ b/packages/backend/src/core/entities/NoteReactionEntityService.ts
@@ -8,6 +8,7 @@ import { DI } from '@/di-symbols.js';
import type { NoteReactionsRepository } from '@/models/_.js';
import type { Packed } from '@/misc/json-schema.js';
import { bindThis } from '@/decorators.js';
+import { IdService } from '@/core/IdService.js';
import type { OnModuleInit } from '@nestjs/common';
import type { } from '@/models/Blocking.js';
import type { MiUser } from '@/models/User.js';
@@ -22,6 +23,7 @@ export class NoteReactionEntityService implements OnModuleInit {
private userEntityService: UserEntityService;
private noteEntityService: NoteEntityService;
private reactionService: ReactionService;
+ private idService: IdService;
constructor(
private moduleRef: ModuleRef,
@@ -32,6 +34,7 @@ export class NoteReactionEntityService implements OnModuleInit {
//private userEntityService: UserEntityService,
//private noteEntityService: NoteEntityService,
//private reactionService: ReactionService,
+ //private idService: IdService,
) {
}
@@ -39,6 +42,7 @@ export class NoteReactionEntityService implements OnModuleInit {
this.userEntityService = this.moduleRef.get('UserEntityService');
this.noteEntityService = this.moduleRef.get('NoteEntityService');
this.reactionService = this.moduleRef.get('ReactionService');
+ this.idService = this.moduleRef.get('IdService');
}
@bindThis
@@ -57,7 +61,7 @@ export class NoteReactionEntityService implements OnModuleInit {
return {
id: reaction.id,
- createdAt: reaction.createdAt.toISOString(),
+ createdAt: this.idService.parse(reaction.id).date.toISOString(),
user: await this.userEntityService.pack(reaction.user ?? reaction.userId, me),
type: this.reactionService.convertLegacyReaction(reaction.reaction),
...(opts.withNote ? {
diff --git a/packages/backend/src/core/entities/PageEntityService.ts b/packages/backend/src/core/entities/PageEntityService.ts
index e3a1e19ddd..f39ef949db 100644
--- a/packages/backend/src/core/entities/PageEntityService.ts
+++ b/packages/backend/src/core/entities/PageEntityService.ts
@@ -13,6 +13,7 @@ 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 { IdService } from '@/core/IdService.js';
import { UserEntityService } from './UserEntityService.js';
import { DriveFileEntityService } from './DriveFileEntityService.js';
@@ -30,6 +31,7 @@ export class PageEntityService {
private userEntityService: UserEntityService,
private driveFileEntityService: DriveFileEntityService,
+ private idService: IdService,
) {
}
@@ -85,7 +87,7 @@ export class PageEntityService {
return await awaitAll({
id: page.id,
- createdAt: page.createdAt.toISOString(),
+ createdAt: this.idService.parse(page.id).date.toISOString(),
updatedAt: page.updatedAt.toISOString(),
userId: page.userId,
user: this.userEntityService.pack(page.user ?? page.userId, me), // { detail: true } すると無限ループするので注意
diff --git a/packages/backend/src/core/entities/RenoteMutingEntityService.ts b/packages/backend/src/core/entities/RenoteMutingEntityService.ts
index 7111fab08a..3f9dc9180a 100644
--- a/packages/backend/src/core/entities/RenoteMutingEntityService.ts
+++ b/packages/backend/src/core/entities/RenoteMutingEntityService.ts
@@ -12,6 +12,7 @@ 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 { IdService } from '@/core/IdService.js';
import { UserEntityService } from './UserEntityService.js';
@Injectable()
@@ -21,6 +22,7 @@ export class RenoteMutingEntityService {
private renoteMutingsRepository: RenoteMutingsRepository,
private userEntityService: UserEntityService,
+ private idService: IdService,
) {
}
@@ -33,7 +35,7 @@ export class RenoteMutingEntityService {
return await awaitAll({
id: muting.id,
- createdAt: muting.createdAt.toISOString(),
+ createdAt: this.idService.parse(muting.id).date.toISOString(),
muteeId: muting.muteeId,
mutee: this.userEntityService.pack(muting.muteeId, me, {
detail: true,
diff --git a/packages/backend/src/core/entities/RoleEntityService.ts b/packages/backend/src/core/entities/RoleEntityService.ts
index 79375a7008..5563f9a1ac 100644
--- a/packages/backend/src/core/entities/RoleEntityService.ts
+++ b/packages/backend/src/core/entities/RoleEntityService.ts
@@ -12,6 +12,7 @@ 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 { IdService } from '@/core/IdService.js';
@Injectable()
export class RoleEntityService {
@@ -21,6 +22,8 @@ export class RoleEntityService {
@Inject(DI.roleAssignmentsRepository)
private roleAssignmentsRepository: RoleAssignmentsRepository,
+
+ private idService: IdService,
) {
}
@@ -51,7 +54,7 @@ export class RoleEntityService {
return await awaitAll({
id: role.id,
- createdAt: role.createdAt.toISOString(),
+ createdAt: this.idService.parse(role.id).date.toISOString(),
updatedAt: role.updatedAt.toISOString(),
name: role.name,
description: role.description,
diff --git a/packages/backend/src/core/entities/UserEntityService.ts b/packages/backend/src/core/entities/UserEntityService.ts
index 1be63f027c..3de95129fc 100644
--- a/packages/backend/src/core/entities/UserEntityService.ts
+++ b/packages/backend/src/core/entities/UserEntityService.ts
@@ -20,6 +20,7 @@ import { bindThis } from '@/decorators.js';
import { RoleService } from '@/core/RoleService.js';
import { ApPersonService } from '@/core/activitypub/models/ApPersonService.js';
import { FederatedInstanceService } from '@/core/FederatedInstanceService.js';
+import { IdService } from '@/core/IdService.js';
import type { OnModuleInit } from '@nestjs/common';
import type { AnnouncementService } from '../AnnouncementService.js';
import type { CustomEmojiService } from '../CustomEmojiService.js';
@@ -60,6 +61,7 @@ export class UserEntityService implements OnModuleInit {
private announcementService: AnnouncementService;
private roleService: RoleService;
private federatedInstanceService: FederatedInstanceService;
+ private idService: IdService;
constructor(
private moduleRef: ModuleRef,
@@ -111,13 +113,6 @@ export class UserEntityService implements OnModuleInit {
@Inject(DI.userMemosRepository)
private userMemosRepository: UserMemoRepository,
-
- //private noteEntityService: NoteEntityService,
- //private driveFileEntityService: DriveFileEntityService,
- //private pageEntityService: PageEntityService,
- //private customEmojiService: CustomEmojiService,
- //private antennaService: AntennaService,
- //private roleService: RoleService,
) {
}
@@ -130,6 +125,7 @@ export class UserEntityService implements OnModuleInit {
this.announcementService = this.moduleRef.get('AnnouncementService');
this.roleService = this.moduleRef.get('RoleService');
this.federatedInstanceService = this.moduleRef.get('FederatedInstanceService');
+ this.idService = this.moduleRef.get('IdService');
}
//#region Validators
@@ -369,7 +365,7 @@ export class UserEntityService implements OnModuleInit {
avatarUrl: user.avatarUrl ?? this.getIdenticonUrl(user),
avatarBlurhash: user.avatarBlurhash,
description: mastoapi ? mastoapi.description : profile ? profile.description : '',
- createdAt: user.createdAt.toISOString(),
+ createdAt: this.idService.parse(user.id).date.toISOString(),
isBot: user.isBot ?? falsy,
isCat: user.isCat ?? falsy,
speakAsCat: user.speakAsCat ?? falsy,
diff --git a/packages/backend/src/core/entities/UserListEntityService.ts b/packages/backend/src/core/entities/UserListEntityService.ts
index 06b6e852b1..31ab7293da 100644
--- a/packages/backend/src/core/entities/UserListEntityService.ts
+++ b/packages/backend/src/core/entities/UserListEntityService.ts
@@ -10,6 +10,7 @@ import type { Packed } from '@/misc/json-schema.js';
import type { } from '@/models/Blocking.js';
import type { MiUserList } from '@/models/UserList.js';
import { bindThis } from '@/decorators.js';
+import { IdService } from '@/core/IdService.js';
import { UserEntityService } from './UserEntityService.js';
@Injectable()
@@ -22,6 +23,7 @@ export class UserListEntityService {
private userListMembershipsRepository: UserListMembershipsRepository,
private userEntityService: UserEntityService,
+ private idService: IdService,
) {
}
@@ -37,7 +39,7 @@ export class UserListEntityService {
return {
id: userList.id,
- createdAt: userList.createdAt.toISOString(),
+ createdAt: this.idService.parse(userList.id).date.toISOString(),
name: userList.name,
userIds: users.map(x => x.userId),
isPublic: userList.isPublic,
@@ -50,7 +52,7 @@ export class UserListEntityService {
) {
return Promise.all(memberships.map(async x => ({
id: x.id,
- createdAt: x.createdAt.toISOString(),
+ createdAt: this.idService.parse(x.id).date.toISOString(),
userId: x.userId,
user: await this.userEntityService.pack(x.userId),
withReplies: x.withReplies,