Skip to content

Commit 2b8056a

Browse files
authored
fix(backend): use insertOne insteadof insert/findOneOrFail combination (misskey-dev#13908)
* fix(backend): use insertOne insteadof insert/findOneOrFail combination * fix: typo * fix(backend): inherit mainAlias? * refactor(backend): use extend * fix(backend): invalid entityTarget * fix(backend): fake where * chore: debug * chore: debug * test: log * fix(backend): column names * fix(backend): remove dummy from * revert: log * fix(backend): position * fix(backend): automatic aliasing * chore(backend): alias * chore(backend): remove from * fix(backend): type * fix(backend): avoid pure name * test(backend): fix type * chore(backend): use cte * fix(backend): avoid useless alias * fix(backend): fix typo * fix(backend): __disambiguation__ * fix(backend): quote * chore(backend): t * chore(backend): accessible * chore(backend): concrete returning * fix(backend): quote * chore: log more * chore: log metadata * chore(backend): use raw * fix(backend): returning column name * fix(backend): transform * build(backend): wanna logging * build(backend): transform empty * build(backend): build alias * build(backend): restore name * chore: return entity * fix: test case * test(backend): 204 * chore(backend): log sql * chore(backend): assert user joined * fix(backend): typo * chore(backend): log long sql * chore(backend): log join * chore(backend): log join depth null * chore(backend): joinAttributes * chore(backend): override createJoinExpression * chore: join log * fix(backend): escape * test(backend): log log * chore(backend): join gonna success? * chore(backend): relations * chore(backend): undefined * chore(backend): target * chore(backend): remove log * chore(backend): log chart update * chore(backend): log columns * chore(backend): check hasMetadata * chore(backend): unshift id when not included * chore(backend): missing select * chore(backend): remove debug code
1 parent ecf7945 commit 2b8056a

36 files changed

+319
-215
lines changed

packages/backend/src/core/AnnouncementService.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ export class AnnouncementService {
6767

6868
@bindThis
6969
public async create(values: Partial<MiAnnouncement>, moderator?: MiUser): Promise<{ raw: MiAnnouncement; packed: Packed<'Announcement'> }> {
70-
const announcement = await this.announcementsRepository.insert({
70+
const announcement = await this.announcementsRepository.insertOne({
7171
id: this.idService.gen(),
7272
updatedAt: null,
7373
title: values.title,
@@ -79,7 +79,7 @@ export class AnnouncementService {
7979
silence: values.silence,
8080
needConfirmationToRead: values.needConfirmationToRead,
8181
userId: values.userId,
82-
}).then(x => this.announcementsRepository.findOneByOrFail(x.identifiers[0]));
82+
});
8383

8484
const packed = await this.announcementEntityService.pack(announcement);
8585

packages/backend/src/core/AvatarDecorationService.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,10 @@ export class AvatarDecorationService implements OnApplicationShutdown {
5555

5656
@bindThis
5757
public async create(options: Partial<MiAvatarDecoration>, moderator?: MiUser): Promise<MiAvatarDecoration> {
58-
const created = await this.avatarDecorationsRepository.insert({
58+
const created = await this.avatarDecorationsRepository.insertOne({
5959
id: this.idService.gen(),
6060
...options,
61-
}).then(x => this.avatarDecorationsRepository.findOneByOrFail(x.identifiers[0]));
61+
});
6262

6363
this.globalEventService.publishInternalEvent('avatarDecorationCreated', created);
6464

packages/backend/src/core/ClipService.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,13 @@ export class ClipService {
4545
throw new ClipService.TooManyClipsError();
4646
}
4747

48-
const clip = await this.clipsRepository.insert({
48+
const clip = await this.clipsRepository.insertOne({
4949
id: this.idService.gen(),
5050
userId: me.id,
5151
name: name,
5252
isPublic: isPublic,
5353
description: description,
54-
}).then(x => this.clipsRepository.findOneByOrFail(x.identifiers[0]));
54+
});
5555

5656
return clip;
5757
}

packages/backend/src/core/CustomEmojiService.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ export class CustomEmojiService implements OnApplicationShutdown {
6868
localOnly: boolean;
6969
roleIdsThatCanBeUsedThisEmojiAsReaction: MiRole['id'][];
7070
}, moderator?: MiUser): Promise<MiEmoji> {
71-
const emoji = await this.emojisRepository.insert({
71+
const emoji = await this.emojisRepository.insertOne({
7272
id: this.idService.gen(),
7373
updatedAt: new Date(),
7474
name: data.name,
@@ -82,7 +82,7 @@ export class CustomEmojiService implements OnApplicationShutdown {
8282
isSensitive: data.isSensitive,
8383
localOnly: data.localOnly,
8484
roleIdsThatCanBeUsedThisEmojiAsReaction: data.roleIdsThatCanBeUsedThisEmojiAsReaction,
85-
}).then(x => this.emojisRepository.findOneByOrFail(x.identifiers[0]));
85+
});
8686

8787
if (data.host == null) {
8888
this.localEmojisCache.refresh();

packages/backend/src/core/DriveService.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ export class DriveService {
220220
file.size = size;
221221
file.storedInternal = false;
222222

223-
return await this.driveFilesRepository.insert(file).then(x => this.driveFilesRepository.findOneByOrFail(x.identifiers[0]));
223+
return await this.driveFilesRepository.insertOne(file);
224224
} else { // use internal storage
225225
const accessKey = randomUUID();
226226
const thumbnailAccessKey = 'thumbnail-' + randomUUID();
@@ -254,7 +254,7 @@ export class DriveService {
254254
file.md5 = hash;
255255
file.size = size;
256256

257-
return await this.driveFilesRepository.insert(file).then(x => this.driveFilesRepository.findOneByOrFail(x.identifiers[0]));
257+
return await this.driveFilesRepository.insertOne(file);
258258
}
259259
}
260260

@@ -615,7 +615,7 @@ export class DriveService {
615615
file.type = info.type.mime;
616616
file.storedInternal = false;
617617

618-
file = await this.driveFilesRepository.insert(file).then(x => this.driveFilesRepository.findOneByOrFail(x.identifiers[0]));
618+
file = await this.driveFilesRepository.insertOne(file);
619619
} catch (err) {
620620
// duplicate key error (when already registered)
621621
if (isDuplicateKeyValueError(err)) {

packages/backend/src/core/FederatedInstanceService.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,11 @@ export class FederatedInstanceService implements OnApplicationShutdown {
5555
const index = await this.instancesRepository.findOneBy({ host });
5656

5757
if (index == null) {
58-
const i = await this.instancesRepository.insert({
58+
const i = await this.instancesRepository.insertOne({
5959
id: this.idService.gen(),
6060
host,
6161
firstRetrievedAt: new Date(),
62-
}).then(x => this.instancesRepository.findOneByOrFail(x.identifiers[0]));
62+
});
6363

6464
this.federatedInstanceCache.set(host, i);
6565
return i;

packages/backend/src/core/RelayService.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,11 @@ export class RelayService {
5353

5454
@bindThis
5555
public async addRelay(inbox: string): Promise<MiRelay> {
56-
const relay = await this.relaysRepository.insert({
56+
const relay = await this.relaysRepository.insertOne({
5757
id: this.idService.gen(),
5858
inbox,
5959
status: 'requesting',
60-
}).then(x => this.relaysRepository.findOneByOrFail(x.identifiers[0]));
60+
});
6161

6262
const relayActor = await this.getRelayActor();
6363
const follow = await this.apRendererService.renderFollowRelay(relay, relayActor);

packages/backend/src/core/ReversiService.ts

+2-5
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ export class ReversiService implements OnApplicationShutdown, OnModuleInit {
281281

282282
@bindThis
283283
private async matched(parentId: MiUser['id'], childId: MiUser['id'], options: { noIrregularRules: boolean; }): Promise<MiReversiGame> {
284-
const game = await this.reversiGamesRepository.insert({
284+
const game = await this.reversiGamesRepository.insertOne({
285285
id: this.idService.gen(),
286286
user1Id: parentId,
287287
user2Id: childId,
@@ -294,10 +294,7 @@ export class ReversiService implements OnApplicationShutdown, OnModuleInit {
294294
bw: 'random',
295295
isLlotheo: false,
296296
noIrregularRules: options.noIrregularRules,
297-
}).then(x => this.reversiGamesRepository.findOneOrFail({
298-
where: { id: x.identifiers[0].id },
299-
relations: ['user1', 'user2'],
300-
}));
297+
}, { relations: ['user1', 'user2'] });
301298
this.cacheGame(game);
302299

303300
const packed = await this.reversiGameEntityService.packDetail(game);

packages/backend/src/core/RoleService.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -471,12 +471,12 @@ export class RoleService implements OnApplicationShutdown, OnModuleInit {
471471
}
472472
}
473473

474-
const created = await this.roleAssignmentsRepository.insert({
474+
const created = await this.roleAssignmentsRepository.insertOne({
475475
id: this.idService.gen(now),
476476
expiresAt: expiresAt,
477477
roleId: roleId,
478478
userId: userId,
479-
}).then(x => this.roleAssignmentsRepository.findOneByOrFail(x.identifiers[0]));
479+
});
480480

481481
this.rolesRepository.update(roleId, {
482482
lastUsedAt: new Date(),
@@ -558,7 +558,7 @@ export class RoleService implements OnApplicationShutdown, OnModuleInit {
558558
@bindThis
559559
public async create(values: Partial<MiRole>, moderator?: MiUser): Promise<MiRole> {
560560
const date = new Date();
561-
const created = await this.rolesRepository.insert({
561+
const created = await this.rolesRepository.insertOne({
562562
id: this.idService.gen(date.getTime()),
563563
updatedAt: date,
564564
lastUsedAt: date,
@@ -576,7 +576,7 @@ export class RoleService implements OnApplicationShutdown, OnModuleInit {
576576
canEditMembersByModerator: values.canEditMembersByModerator,
577577
displayOrder: values.displayOrder,
578578
policies: values.policies,
579-
}).then(x => this.rolesRepository.findOneByOrFail(x.identifiers[0]));
579+
});
580580

581581
this.globalEventService.publishInternalEvent('roleCreated', created);
582582

packages/backend/src/core/UserFollowingService.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -517,7 +517,7 @@ export class UserFollowingService implements OnModuleInit {
517517
followerId: follower.id,
518518
});
519519

520-
const followRequest = await this.followRequestsRepository.insert({
520+
const followRequest = await this.followRequestsRepository.insertOne({
521521
id: this.idService.gen(),
522522
followerId: follower.id,
523523
followeeId: followee.id,
@@ -531,7 +531,7 @@ export class UserFollowingService implements OnModuleInit {
531531
followeeHost: followee.host,
532532
followeeInbox: this.userEntityService.isRemoteUser(followee) ? followee.inbox : undefined,
533533
followeeSharedInbox: this.userEntityService.isRemoteUser(followee) ? followee.sharedInbox : undefined,
534-
}).then(x => this.followRequestsRepository.findOneByOrFail(x.identifiers[0]));
534+
});
535535

536536
// Publish receiveRequest event
537537
if (this.userEntityService.isLocalUser(followee)) {

packages/backend/src/core/activitypub/models/ApNoteService.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -407,7 +407,7 @@ export class ApNoteService {
407407

408408
this.logger.info(`register emoji host=${host}, name=${name}`);
409409

410-
return await this.emojisRepository.insert({
410+
return await this.emojisRepository.insertOne({
411411
id: this.idService.gen(),
412412
host,
413413
name,
@@ -416,7 +416,7 @@ export class ApNoteService {
416416
publicUrl: tag.icon.url,
417417
updatedAt: new Date(),
418418
aliases: [],
419-
}).then(x => this.emojisRepository.findOneByOrFail(x.identifiers[0]));
419+
});
420420
}));
421421
}
422422
}

packages/backend/src/core/chart/core.ts

+14-9
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ import { EntitySchema, LessThan, Between } from 'typeorm';
1414
import { dateUTC, isTimeSame, isTimeBefore, subtractTime, addTime } from '@/misc/prelude/time.js';
1515
import type Logger from '@/logger.js';
1616
import { bindThis } from '@/decorators.js';
17-
import type { Repository, DataSource } from 'typeorm';
17+
import { MiRepository, miRepository } from '@/models/_.js';
18+
import type { DataSource, Repository } from 'typeorm';
1819

1920
const COLUMN_PREFIX = '___' as const;
2021
const UNIQUE_TEMP_COLUMN_PREFIX = 'unique_temp___' as const;
@@ -145,10 +146,10 @@ export default abstract class Chart<T extends Schema> {
145146
group: string | null;
146147
}[] = [];
147148
// ↓にしたいけどfindOneとかで型エラーになる
148-
//private repositoryForHour: Repository<RawRecord<T>>;
149-
//private repositoryForDay: Repository<RawRecord<T>>;
150-
private repositoryForHour: Repository<{ id: number; group?: string | null; date: number; }>;
151-
private repositoryForDay: Repository<{ id: number; group?: string | null; date: number; }>;
149+
//private repositoryForHour: Repository<RawRecord<T>> & MiRepository<RawRecord<T>>;
150+
//private repositoryForDay: Repository<RawRecord<T>> & MiRepository<RawRecord<T>>;
151+
private repositoryForHour: Repository<{ id: number; group?: string | null; date: number; }> & MiRepository<{ id: number; group?: string | null; date: number; }>;
152+
private repositoryForDay: Repository<{ id: number; group?: string | null; date: number; }> & MiRepository<{ id: number; group?: string | null; date: number; }>;
152153

153154
/**
154155
* 1日に一回程度実行されれば良いような計算処理を入れる(主にCASCADE削除などアプリケーション側で感知できない変動によるズレの修正用)
@@ -211,6 +212,10 @@ export default abstract class Chart<T extends Schema> {
211212
} {
212213
const createEntity = (span: 'hour' | 'day'): EntitySchema => new EntitySchema({
213214
name:
215+
span === 'hour' ? `ChartX${name}` :
216+
span === 'day' ? `ChartDayX${name}` :
217+
new Error('not happen') as never,
218+
tableName:
214219
span === 'hour' ? `__chart__${camelToSnake(name)}` :
215220
span === 'day' ? `__chart_day__${camelToSnake(name)}` :
216221
new Error('not happen') as never,
@@ -271,8 +276,8 @@ export default abstract class Chart<T extends Schema> {
271276
this.logger = logger;
272277

273278
const { hour, day } = Chart.schemaToEntity(name, schema, grouped);
274-
this.repositoryForHour = db.getRepository<{ id: number; group?: string | null; date: number; }>(hour);
275-
this.repositoryForDay = db.getRepository<{ id: number; group?: string | null; date: number; }>(day);
279+
this.repositoryForHour = db.getRepository<{ id: number; group?: string | null; date: number; }>(hour).extend(miRepository as MiRepository<{ id: number; group?: string | null; date: number; }>);
280+
this.repositoryForDay = db.getRepository<{ id: number; group?: string | null; date: number; }>(day).extend(miRepository as MiRepository<{ id: number; group?: string | null; date: number; }>);
276281
}
277282

278283
@bindThis
@@ -387,11 +392,11 @@ export default abstract class Chart<T extends Schema> {
387392
}
388393

389394
// 新規ログ挿入
390-
log = await repository.insert({
395+
log = await repository.insertOne({
391396
date: date,
392397
...(group ? { group: group } : {}),
393398
...columns,
394-
}).then(x => repository.findOneByOrFail(x.identifiers[0])) as RawRecord<T>;
399+
}) as RawRecord<T>;
395400

396401
this.logger.info(`${this.name + (group ? `:${group}` : '')}(${span}): New commit created`);
397402

0 commit comments

Comments
 (0)