fix: database problem

This commit is contained in:
아르페 2024-02-16 15:58:23 +09:00 committed by 무라쿠모
parent 5d0012ceac
commit a87776f41e
No known key found for this signature in database
GPG key ID: 139D6573F92DA9F7
7 changed files with 38 additions and 75 deletions

View file

@ -138,13 +138,6 @@ export class SignupService {
if (exist) throw new Error(' the username is already used'); if (exist) throw new Error(' the username is already used');
const condition = await transactionalEntityManager.save(new MiAutoRemovalCondition({
id: this.idService.gen(),
deleteAfter: 7,
noPiningNotes: false,
noSpecifiedNotes: false,
}));
account = await transactionalEntityManager.save(new MiUser({ account = await transactionalEntityManager.save(new MiUser({
id: this.idService.gen(), id: this.idService.gen(),
username: username, username: username,
@ -152,11 +145,16 @@ export class SignupService {
host: this.utilityService.toPunyNullable(host), host: this.utilityService.toPunyNullable(host),
token: secret, token: secret,
autoRemoval: false, autoRemoval: false,
autoRemovalConditionId: condition.id,
autoRemovalCondition: condition,
isRoot: isTheFirstUser, isRoot: isTheFirstUser,
})); }));
await transactionalEntityManager.save(new MiAutoRemovalCondition({
userId: account.id,
deleteAfter: 7,
noPiningNotes: false,
noSpecifiedNotes: false,
}));
await transactionalEntityManager.save(new MiUserKeypair({ await transactionalEntityManager.save(new MiUserKeypair({
publicKey: keyPair[0], publicKey: keyPair[0],
privateKey: keyPair[1], privateKey: keyPair[1],

View file

@ -1,40 +0,0 @@
/*
* SPDX-FileCopyrightText: syuilo and other misskey, cherrypick contributors
* SPDX-License-Identifier: AGPL-3.0-only
*/
import { Inject, Injectable } from '@nestjs/common';
import { DI } from '@/di-symbols.js';
import type { AutoRemovalConditionRepository, MiAutoRemovalCondition } from '@/models/_.js';
import type { Packed } from '@/misc/json-schema.js';
import { bindThis } from '@/decorators.js';
@Injectable()
export class AutoRemovalConditionEntityService {
constructor(
@Inject(DI.autoRemovalConditionRepository)
private autoRemovalConditionRepository: AutoRemovalConditionRepository,
) {
}
@bindThis
public async pack(
src: MiAutoRemovalCondition['id'] | MiAutoRemovalCondition,
): Promise<Packed<'AutoRemovalCondition'>> {
const condition = typeof src === 'object' ? src : await this.autoRemovalConditionRepository.findOneByOrFail({ id: src });
return {
deleteAfter: condition.deleteAfter,
noPiningNotes: condition.noPiningNotes,
noSpecifiedNotes: condition.noSpecifiedNotes,
};
}
@bindThis
public packMany(
conditions: any[],
) {
return Promise.all(conditions.map(x => this.pack(x)));
}
}

View file

@ -15,6 +15,7 @@ import type { Promiseable } from '@/misc/prelude/await-all.js';
import { awaitAll } 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 { USER_ACTIVE_THRESHOLD, USER_ONLINE_THRESHOLD } from '@/const.js';
import type { MiLocalUser, MiPartialLocalUser, MiPartialRemoteUser, MiRemoteUser, MiUser } from '@/models/User.js'; import type { MiLocalUser, MiPartialLocalUser, MiPartialRemoteUser, MiRemoteUser, MiUser } from '@/models/User.js';
import { MiAutoRemovalCondition } from '@/models/AutoRemovalCondition.js';
import { import {
birthdaySchema, birthdaySchema,
descriptionSchema, descriptionSchema,
@ -429,8 +430,6 @@ export class UserEntityService implements OnModuleInit {
? (opts.userProfile ?? await this.userProfilesRepository.findOneByOrFail({ userId: user.id })) ? (opts.userProfile ?? await this.userProfilesRepository.findOneByOrFail({ userId: user.id }))
: null; : null;
const autoRemovalCondition = await this.autoRemovalConditionRepository.findOneBy({ id: user.autoRemovalConditionId });
let relation: UserRelation | null = null; let relation: UserRelation | null = null;
if (meId && !isMe && isDetailed) { if (meId && !isMe && isDetailed) {
if (opts.userRelations) { if (opts.userRelations) {
@ -440,6 +439,17 @@ export class UserEntityService implements OnModuleInit {
} }
} }
let autoRemovalCondition = await this.autoRemovalConditionRepository.findOneBy({ userId: user.id });
if (autoRemovalCondition === null) {
autoRemovalCondition = new MiAutoRemovalCondition({
userId: user.id,
deleteAfter: 7,
noPiningNotes: false,
noSpecifiedNotes: false,
});
await this.autoRemovalConditionRepository.save(autoRemovalCondition);
}
let memo: string | null = null; let memo: string | null = null;
if (isDetailed && meId) { if (isDetailed && meId) {
if (opts.userMemos) { if (opts.userMemos) {

View file

@ -5,12 +5,16 @@
import { Entity, Column, PrimaryColumn } from 'typeorm'; import { Entity, Column, PrimaryColumn } from 'typeorm';
import { id } from './util/id.js'; import { id } from './util/id.js';
import { MiUser } from './User.js';
@Entity('auto_removal_condition') @Entity('auto_removal_condition')
// @Index(['userId'], { unique: true }) // @Index(['userId'], { unique: true })
export class MiAutoRemovalCondition { export class MiAutoRemovalCondition {
@PrimaryColumn(id()) @PrimaryColumn({
public id: string; ...id(),
nullable: false,
})
public userId: MiUser['id'];
@Column('bigint', { @Column('bigint', {
default: 7, default: 7,

View file

@ -6,7 +6,6 @@
import { Entity, Column, Index, OneToOne, JoinColumn, PrimaryColumn } from 'typeorm'; import { Entity, Column, Index, OneToOne, JoinColumn, PrimaryColumn } from 'typeorm';
import { id } from './util/id.js'; import { id } from './util/id.js';
import { MiDriveFile } from './DriveFile.js'; import { MiDriveFile } from './DriveFile.js';
import { MiAutoRemovalCondition } from './AutoRemovalCondition.js';
@Entity('user') @Entity('user')
@Index(['usernameLower', 'host'], { unique: true }) @Index(['usernameLower', 'host'], { unique: true })
@ -274,18 +273,6 @@ export class MiUser {
}) })
public token: string | null; public token: string | null;
@Column({
...id(),
nullable: false,
})
public autoRemovalConditionId: MiAutoRemovalCondition['id'];
@OneToOne(type => MiAutoRemovalCondition, {
onDelete: 'CASCADE',
})
@JoinColumn()
public autoRemovalCondition: MiAutoRemovalCondition;
constructor(data: Partial<MiUser>) { constructor(data: Partial<MiUser>) {
if (data == null) return; if (data == null) return;

View file

@ -51,7 +51,7 @@ export class AutoNoteRemovalProcessorService {
const now = Date.now(); const now = Date.now();
for (const user of users) { for (const user of users) {
const autoRemovalCondition = await this.autoRemovalConditionRepository.findOneByOrFail({ id: user.autoRemovalConditionId }); const autoRemovalCondition = await this.autoRemovalConditionRepository.findOneByOrFail({ userId: user.id });
const pinings: MiUserNotePining[] = await this.userNotePiningsRepository.findBy({ userId: user.id }); const pinings: MiUserNotePining[] = await this.userNotePiningsRepository.findBy({ userId: user.id });
const piningNoteIds: string[] = pinings.map(pining => pining.noteId); // pining.note always undefined (bug?) const piningNoteIds: string[] = pinings.map(pining => pining.noteId); // pining.note always undefined (bug?)

View file

@ -5,7 +5,8 @@
import { Inject, Injectable } from '@nestjs/common'; import { Inject, Injectable } from '@nestjs/common';
import { Endpoint } from '@/server/api/endpoint-base.js'; import { Endpoint } from '@/server/api/endpoint-base.js';
import type { AutoRemovalConditionRepository, MiAutoRemovalCondition, UsersRepository } from '@/models/_.js'; import { MiAutoRemovalCondition } from '@/models/_.js';
import type { AutoRemovalConditionRepository, UsersRepository } from '@/models/_.js';
import { DI } from '@/di-symbols.js'; import { DI } from '@/di-symbols.js';
import { UserEntityService } from '@/core/entities/UserEntityService.js'; import { UserEntityService } from '@/core/entities/UserEntityService.js';
import { GlobalEventService } from '@/core/GlobalEventService.js'; import { GlobalEventService } from '@/core/GlobalEventService.js';
@ -55,16 +56,19 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
) { ) {
super(meta, paramDef, async (ps, me) => { super(meta, paramDef, async (ps, me) => {
await this.usersRepository.update(me.id, { autoRemoval: ps.active }); await this.usersRepository.update(me.id, { autoRemoval: ps.active });
const updated = { let updates = await this.autoRemovalConditionRepository.findOneBy({ userId: me.id });
deleteAfter: ps.deleteAfter, if (updates === null) {
noPiningNotes: ps.noPiningNotes, updates = new MiAutoRemovalCondition({
noSpecifiedNotes: ps.noSpecifiedNotes, userId: me.id,
}; deleteAfter: 7,
const updates = {} as Partial<MiAutoRemovalCondition>; noPiningNotes: false,
noSpecifiedNotes: false,
});
}
if (ps.deleteAfter !== undefined) updates.deleteAfter = ps.deleteAfter; if (ps.deleteAfter !== undefined) updates.deleteAfter = ps.deleteAfter;
if (ps.noPiningNotes !== undefined) updates.noPiningNotes = ps.noPiningNotes; if (ps.noPiningNotes !== undefined) updates.noPiningNotes = ps.noPiningNotes;
if (ps.noSpecifiedNotes !== undefined) updates.noSpecifiedNotes = ps.noSpecifiedNotes; if (ps.noSpecifiedNotes !== undefined) updates.noSpecifiedNotes = ps.noSpecifiedNotes;
if (Object.keys(updates).length > 0) await this.autoRemovalConditionRepository.update(me.autoRemovalConditionId, updated); await this.autoRemovalConditionRepository.save(updates);
const iObj = await this.userEntityService.pack(me.id, me, { const iObj = await this.userEntityService.pack(me.id, me, {
schema: 'MeDetailed', schema: 'MeDetailed',