From aedf873248f06bbf1f6f18aad1cfdeb670bb37ae Mon Sep 17 00:00:00 2001 From: naskya Date: Thu, 11 Apr 2024 21:56:40 +0900 Subject: [PATCH] refactor (backend): distinguish between database columns and relations, set correct nullability --- .../src/models/entities/abuse-user-report.ts | 40 +++---- .../src/models/entities/access-token.ts | 27 ++--- .../src/models/entities/announcement-read.ts | 19 ++-- .../backend/src/models/entities/antenna.ts | 42 ++++---- packages/backend/src/models/entities/app.ts | 23 ++-- .../models/entities/attestation-challenge.ts | 15 +-- .../src/models/entities/auth-session.ts | 20 ++-- .../backend/src/models/entities/blocking.ts | 19 ++-- .../src/models/entities/channel-following.ts | 19 ++-- .../models/entities/channel-note-pining.ts | 19 ++-- .../backend/src/models/entities/channel.ts | 27 ++--- .../backend/src/models/entities/clip-note.ts | 19 ++-- packages/backend/src/models/entities/clip.ts | 15 +-- .../backend/src/models/entities/drive-file.ts | 2 + .../src/models/entities/drive-folder.ts | 23 ++-- .../src/models/entities/follow-request.ts | 27 ++--- .../backend/src/models/entities/following.ts | 27 ++--- .../src/models/entities/gallery-like.ts | 19 ++-- .../src/models/entities/gallery-post.ts | 15 +-- .../src/models/entities/messaging-message.ts | 45 ++++---- packages/backend/src/models/entities/meta.ts | 24 +++-- .../src/models/entities/moderation-log.ts | 15 +-- .../backend/src/models/entities/muted-note.ts | 27 ++--- .../backend/src/models/entities/muting.ts | 19 ++-- .../backend/src/models/entities/note-edit.ts | 16 +-- .../src/models/entities/note-favorite.ts | 19 ++-- .../src/models/entities/note-reaction.ts | 27 ++--- .../src/models/entities/note-thread-muting.ts | 15 +-- .../src/models/entities/note-unread.ts | 27 ++--- .../src/models/entities/note-watching.ts | 27 ++--- packages/backend/src/models/entities/note.ts | 102 +++++++++--------- .../src/models/entities/notification.ts | 72 +++++++------ .../backend/src/models/entities/page-like.ts | 19 ++-- packages/backend/src/models/entities/page.ts | 27 ++--- .../models/entities/password-reset-request.ts | 7 +- .../backend/src/models/entities/poll-vote.ts | 23 ++-- packages/backend/src/models/entities/poll.ts | 17 +-- .../backend/src/models/entities/promo-note.ts | 15 +-- .../backend/src/models/entities/promo-read.ts | 19 ++-- .../src/models/entities/registry-item.ts | 15 +-- .../src/models/entities/renote-muting.ts | 33 +++--- .../src/models/entities/reply-muting.ts | 33 +++--- .../backend/src/models/entities/signin.ts | 15 +-- .../src/models/entities/sw-subscription.ts | 15 +-- .../models/entities/user-group-invitation.ts | 19 ++-- .../src/models/entities/user-group-joining.ts | 19 ++-- .../backend/src/models/entities/user-group.ts | 15 +-- .../src/models/entities/user-keypair.ts | 23 ++-- .../src/models/entities/user-list-joining.ts | 19 ++-- .../backend/src/models/entities/user-list.ts | 15 +-- .../src/models/entities/user-note-pining.ts | 19 ++-- .../src/models/entities/user-profile.ts | 15 +-- .../src/models/entities/user-publickey.ts | 15 +-- .../src/models/entities/user-security-key.ts | 15 +-- packages/backend/src/models/entities/user.ts | 29 ++--- .../backend/src/models/entities/webhook.ts | 15 +-- 56 files changed, 756 insertions(+), 552 deletions(-) diff --git a/packages/backend/src/models/entities/abuse-user-report.ts b/packages/backend/src/models/entities/abuse-user-report.ts index 015b74fc6f..88f24d130d 100644 --- a/packages/backend/src/models/entities/abuse-user-report.ts +++ b/packages/backend/src/models/entities/abuse-user-report.ts @@ -5,6 +5,7 @@ import { JoinColumn, Column, ManyToOne, + type Relation, } from "typeorm"; import { User } from "./user.js"; import { id } from "../id.js"; @@ -24,34 +25,16 @@ export class AbuseUserReport { @Column(id()) public targetUserId: User["id"]; - @ManyToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public targetUser: User | null; - @Index() @Column(id()) public reporterId: User["id"]; - @ManyToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public reporter: User | null; - @Column({ ...id(), nullable: true, }) public assigneeId: User["id"] | null; - @ManyToOne((type) => User, { - onDelete: "SET NULL", - }) - @JoinColumn() - public assignee: User | null; - @Index() @Column("boolean", { default: false, @@ -85,4 +68,25 @@ export class AbuseUserReport { }) public reporterHost: string | null; //#endregion + + //#region Relations + @ManyToOne(() => User, { + onDelete: "CASCADE", + }) + @JoinColumn() + public targetUser: Relation; + + @ManyToOne(() => User, { + onDelete: "CASCADE", + }) + @JoinColumn() + public reporter: Relation; + + @ManyToOne(() => User, { + onDelete: "SET NULL", + nullable: true, + }) + @JoinColumn() + public assignee: Relation; + //#endregion } diff --git a/packages/backend/src/models/entities/access-token.ts b/packages/backend/src/models/entities/access-token.ts index 82eb6516b5..a10cf7a907 100644 --- a/packages/backend/src/models/entities/access-token.ts +++ b/packages/backend/src/models/entities/access-token.ts @@ -5,6 +5,7 @@ import { Column, ManyToOne, JoinColumn, + type Relation, } from "typeorm"; import { User } from "./user.js"; import { App } from "./app.js"; @@ -48,24 +49,12 @@ export class AccessToken { @Column(id()) public userId: User["id"]; - @ManyToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public user: User | null; - @Column({ ...id(), nullable: true, }) public appId: App["id"] | null; - @ManyToOne((type) => App, { - onDelete: "CASCADE", - }) - @JoinColumn() - public app: App | null; - @Column("varchar", { length: 128, nullable: true, @@ -95,4 +84,18 @@ export class AccessToken { default: false, }) public fetched: boolean; + + //#region Relations + @ManyToOne(() => User, { + onDelete: "CASCADE", + }) + @JoinColumn() + public user: Relation; + + @ManyToOne(() => App, { + onDelete: "CASCADE", + }) + @JoinColumn() + public app: Relation; + //#endregion } diff --git a/packages/backend/src/models/entities/announcement-read.ts b/packages/backend/src/models/entities/announcement-read.ts index c636834bc0..3adff38dab 100644 --- a/packages/backend/src/models/entities/announcement-read.ts +++ b/packages/backend/src/models/entities/announcement-read.ts @@ -5,6 +5,7 @@ import { JoinColumn, Column, ManyToOne, + type Relation, } from "typeorm"; import { User } from "./user.js"; import { Announcement } from "./announcement.js"; @@ -25,19 +26,21 @@ export class AnnouncementRead { @Column(id()) public userId: User["id"]; - @ManyToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public user: User | null; - @Index() @Column(id()) public announcementId: Announcement["id"]; - @ManyToOne((type) => Announcement, { + //#region Relations + @ManyToOne(() => User, { onDelete: "CASCADE", }) @JoinColumn() - public announcement: Announcement | null; + public user: Relation; + + @ManyToOne(() => Announcement, { + onDelete: "CASCADE", + }) + @JoinColumn() + public announcement: Relation; + //#endregion } diff --git a/packages/backend/src/models/entities/antenna.ts b/packages/backend/src/models/entities/antenna.ts index 33d5668b80..7f3bea0be8 100644 --- a/packages/backend/src/models/entities/antenna.ts +++ b/packages/backend/src/models/entities/antenna.ts @@ -5,6 +5,7 @@ import { JoinColumn, Column, ManyToOne, + type Relation, } from "typeorm"; import { User } from "./user.js"; import { id } from "../id.js"; @@ -28,12 +29,6 @@ export class Antenna { }) public userId: User["id"]; - @ManyToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public user: User | null; - @Column("varchar", { length: 128, comment: "The name of the Antenna.", @@ -51,24 +46,12 @@ export class Antenna { }) public userListId: UserList["id"] | null; - @ManyToOne((type) => UserList, { - onDelete: "CASCADE", - }) - @JoinColumn() - public userList: UserList | null; - @Column({ ...id(), nullable: true, }) public userGroupJoiningId: UserGroupJoining["id"] | null; - @ManyToOne((type) => UserGroupJoining, { - onDelete: "CASCADE", - }) - @JoinColumn() - public userGroupJoining: UserGroupJoining | null; - @Column("varchar", { length: 1024, array: true, @@ -112,4 +95,27 @@ export class Antenna { @Column("boolean") public notify: boolean; + + //#region Relations + @ManyToOne(() => User, { + onDelete: "CASCADE", + nullable: true, + }) + @JoinColumn() + public user: Relation; + + @ManyToOne(() => UserList, { + onDelete: "CASCADE", + nullable: true, + }) + @JoinColumn() + public userList: Relation; + + @ManyToOne(() => UserGroupJoining, { + onDelete: "CASCADE", + nullable: true, + }) + @JoinColumn() + public userGroupJoining: Relation; + //#endregion } diff --git a/packages/backend/src/models/entities/app.ts b/packages/backend/src/models/entities/app.ts index 48e145343b..cddfb18ee3 100644 --- a/packages/backend/src/models/entities/app.ts +++ b/packages/backend/src/models/entities/app.ts @@ -1,4 +1,11 @@ -import { Entity, PrimaryColumn, Column, Index, ManyToOne } from "typeorm"; +import { + Entity, + PrimaryColumn, + Column, + Index, + ManyToOne, + type Relation, +} from "typeorm"; import { User } from "./user.js"; import { id } from "../id.js"; @@ -21,12 +28,6 @@ export class App { }) public userId: User["id"] | null; - @ManyToOne((type) => User, { - onDelete: "SET NULL", - nullable: true, - }) - public user: User | null; - @Index() @Column("varchar", { length: 64, @@ -59,4 +60,12 @@ export class App { comment: "The callbackUrl of the App.", }) public callbackUrl: string | null; + + //#region Relations + @ManyToOne(() => User, { + onDelete: "SET NULL", + nullable: true, + }) + public user: Relation; + //#endregion } diff --git a/packages/backend/src/models/entities/attestation-challenge.ts b/packages/backend/src/models/entities/attestation-challenge.ts index c46dfcf227..9121ef5368 100644 --- a/packages/backend/src/models/entities/attestation-challenge.ts +++ b/packages/backend/src/models/entities/attestation-challenge.ts @@ -5,6 +5,7 @@ import { Column, ManyToOne, Index, + type Relation, } from "typeorm"; import { User } from "./user.js"; import { id } from "../id.js"; @@ -18,12 +19,6 @@ export class AttestationChallenge { @PrimaryColumn(id()) public userId: User["id"]; - @ManyToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public user: User | null; - @Index() @Column("varchar", { length: 64, @@ -43,6 +38,14 @@ export class AttestationChallenge { }) public registrationChallenge: boolean; + //#region Relations + @ManyToOne(() => User, { + onDelete: "CASCADE", + }) + @JoinColumn() + public user: Relation; + //#endregion + constructor(data: Partial) { if (data == null) return; diff --git a/packages/backend/src/models/entities/auth-session.ts b/packages/backend/src/models/entities/auth-session.ts index f10e7133dc..cceba82553 100644 --- a/packages/backend/src/models/entities/auth-session.ts +++ b/packages/backend/src/models/entities/auth-session.ts @@ -5,6 +5,7 @@ import { Column, ManyToOne, JoinColumn, + type Relation, } from "typeorm"; import { User } from "./user.js"; import { App } from "./app.js"; @@ -32,19 +33,20 @@ export class AuthSession { }) public userId: User["id"] | null; - @ManyToOne((type) => User, { - onDelete: "CASCADE", - nullable: true, - }) - @JoinColumn() - public user: User | null; - @Column(id()) public appId: App["id"]; - @ManyToOne((type) => App, { + //#region Relations + @ManyToOne(() => User, { onDelete: "CASCADE", }) @JoinColumn() - public app: App | null; + public user: Relation; + + @ManyToOne(() => App, { + onDelete: "CASCADE", + }) + @JoinColumn() + public app: App; + //#endregion } diff --git a/packages/backend/src/models/entities/blocking.ts b/packages/backend/src/models/entities/blocking.ts index 414db10831..b530834075 100644 --- a/packages/backend/src/models/entities/blocking.ts +++ b/packages/backend/src/models/entities/blocking.ts @@ -5,6 +5,7 @@ import { JoinColumn, Column, ManyToOne, + type Relation, } from "typeorm"; import { User } from "./user.js"; import { id } from "../id.js"; @@ -28,12 +29,6 @@ export class Blocking { }) public blockeeId: User["id"]; - @ManyToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public blockee: User | null; - @Index() @Column({ ...id(), @@ -41,9 +36,17 @@ export class Blocking { }) public blockerId: User["id"]; - @ManyToOne((type) => User, { + //#region Relations + @ManyToOne(() => User, { onDelete: "CASCADE", }) @JoinColumn() - public blocker: User | null; + public blockee: Relation; + + @ManyToOne(() => User, { + onDelete: "CASCADE", + }) + @JoinColumn() + public blocker: Relation; + //#endregion } diff --git a/packages/backend/src/models/entities/channel-following.ts b/packages/backend/src/models/entities/channel-following.ts index 22a268d133..7314366636 100644 --- a/packages/backend/src/models/entities/channel-following.ts +++ b/packages/backend/src/models/entities/channel-following.ts @@ -5,6 +5,7 @@ import { JoinColumn, Column, ManyToOne, + type Relation, } from "typeorm"; import { User } from "./user.js"; import { id } from "../id.js"; @@ -29,12 +30,6 @@ export class ChannelFollowing { }) public followeeId: Channel["id"]; - @ManyToOne((type) => Channel, { - onDelete: "CASCADE", - }) - @JoinColumn() - public followee: Channel | null; - @Index() @Column({ ...id(), @@ -42,9 +37,17 @@ export class ChannelFollowing { }) public followerId: User["id"]; - @ManyToOne((type) => User, { + //#region Relations + @ManyToOne(() => Channel, { onDelete: "CASCADE", }) @JoinColumn() - public follower: User | null; + public followee: Relation; + + @ManyToOne(() => User, { + onDelete: "CASCADE", + }) + @JoinColumn() + public follower: Relation; + //#endregion } diff --git a/packages/backend/src/models/entities/channel-note-pining.ts b/packages/backend/src/models/entities/channel-note-pining.ts index 22c8f02419..7061b83504 100644 --- a/packages/backend/src/models/entities/channel-note-pining.ts +++ b/packages/backend/src/models/entities/channel-note-pining.ts @@ -5,6 +5,7 @@ import { JoinColumn, Column, ManyToOne, + type Relation, } from "typeorm"; import { Note } from "./note.js"; import { Channel } from "./channel.js"; @@ -25,18 +26,20 @@ export class ChannelNotePining { @Column(id()) public channelId: Channel["id"]; - @ManyToOne((type) => Channel, { - onDelete: "CASCADE", - }) - @JoinColumn() - public channel: Channel | null; - @Column(id()) public noteId: Note["id"]; - @ManyToOne((type) => Note, { + //#region Relations + @ManyToOne(() => Channel, { onDelete: "CASCADE", }) @JoinColumn() - public note: Note | null; + public channel: Relation; + + @ManyToOne(() => Note, { + onDelete: "CASCADE", + }) + @JoinColumn() + public note: Relation; + //#endregion } diff --git a/packages/backend/src/models/entities/channel.ts b/packages/backend/src/models/entities/channel.ts index cc4ba2177f..99cd3d283f 100644 --- a/packages/backend/src/models/entities/channel.ts +++ b/packages/backend/src/models/entities/channel.ts @@ -5,6 +5,7 @@ import { JoinColumn, Column, ManyToOne, + type Relation, } from "typeorm"; import { User } from "./user.js"; import { id } from "../id.js"; @@ -35,12 +36,6 @@ export class Channel { }) public userId: User["id"] | null; - @ManyToOne((type) => User, { - onDelete: "SET NULL", - }) - @JoinColumn() - public user: User | null; - @Column("varchar", { length: 128, comment: "The name of the Channel.", @@ -61,12 +56,6 @@ export class Channel { }) public bannerId: DriveFile["id"] | null; - @ManyToOne((type) => DriveFile, { - onDelete: "SET NULL", - }) - @JoinColumn() - public banner: DriveFile | null; - @Index() @Column("integer", { default: 0, @@ -80,4 +69,18 @@ export class Channel { comment: "The count of users.", }) public usersCount: number; + + //#region Relations + @ManyToOne(() => User, { + onDelete: "SET NULL", + }) + @JoinColumn() + public user: Relation; + + @ManyToOne(() => DriveFile, { + onDelete: "SET NULL", + }) + @JoinColumn() + public banner: Relation; + //#endregion } diff --git a/packages/backend/src/models/entities/clip-note.ts b/packages/backend/src/models/entities/clip-note.ts index 1697474a84..b54820a442 100644 --- a/packages/backend/src/models/entities/clip-note.ts +++ b/packages/backend/src/models/entities/clip-note.ts @@ -5,6 +5,7 @@ import { Column, ManyToOne, PrimaryColumn, + type Relation, } from "typeorm"; import { Note } from "./note.js"; import { Clip } from "./clip.js"; @@ -23,12 +24,6 @@ export class ClipNote { }) public noteId: Note["id"]; - @ManyToOne((type) => Note, { - onDelete: "CASCADE", - }) - @JoinColumn() - public note: Note | null; - @Index() @Column({ ...id(), @@ -36,9 +31,17 @@ export class ClipNote { }) public clipId: Clip["id"]; - @ManyToOne((type) => Clip, { + //#region Relations + @ManyToOne(() => Note, { onDelete: "CASCADE", }) @JoinColumn() - public clip: Clip | null; + public note: Relation; + + @ManyToOne(() => Clip, { + onDelete: "CASCADE", + }) + @JoinColumn() + public clip: Relation; + //#endregion } diff --git a/packages/backend/src/models/entities/clip.ts b/packages/backend/src/models/entities/clip.ts index f14d297f0f..389d008f74 100644 --- a/packages/backend/src/models/entities/clip.ts +++ b/packages/backend/src/models/entities/clip.ts @@ -5,6 +5,7 @@ import { JoinColumn, Column, ManyToOne, + type Relation, } from "typeorm"; import { User } from "./user.js"; import { id } from "../id.js"; @@ -26,12 +27,6 @@ export class Clip { }) public userId: User["id"]; - @ManyToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public user: User | null; - @Column("varchar", { length: 128, comment: "The name of the Clip.", @@ -49,4 +44,12 @@ export class Clip { comment: "The description of the Clip.", }) public description: string | null; + + //#region Relations + @ManyToOne(() => User, { + onDelete: "CASCADE", + }) + @JoinColumn() + public user: Relation; + //#endregion } diff --git a/packages/backend/src/models/entities/drive-file.ts b/packages/backend/src/models/entities/drive-file.ts index 2832de1ce7..3c49e89fd5 100644 --- a/packages/backend/src/models/entities/drive-file.ts +++ b/packages/backend/src/models/entities/drive-file.ts @@ -214,12 +214,14 @@ export class DriveFile { @ManyToOne(() => User, { onDelete: "SET NULL", + nullable: true, }) @JoinColumn() public user: User | null; @ManyToOne(() => DriveFolder, { onDelete: "SET NULL", + nullable: true, }) @JoinColumn() public folder: DriveFolder | null; diff --git a/packages/backend/src/models/entities/drive-folder.ts b/packages/backend/src/models/entities/drive-folder.ts index 6b624f6220..17580f3c8d 100644 --- a/packages/backend/src/models/entities/drive-folder.ts +++ b/packages/backend/src/models/entities/drive-folder.ts @@ -5,6 +5,7 @@ import { PrimaryColumn, Index, Column, + type Relation, } from "typeorm"; import { User } from "./user.js"; import { id } from "../id.js"; @@ -34,12 +35,6 @@ export class DriveFolder { }) public userId: User["id"] | null; - @ManyToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public user: User | null; - @Index() @Column({ ...id(), @@ -49,9 +44,19 @@ export class DriveFolder { }) public parentId: DriveFolder["id"] | null; - @ManyToOne((type) => DriveFolder, { - onDelete: "SET NULL", + //#region Relations + @ManyToOne(() => User, { + onDelete: "CASCADE", + nullable: true, }) @JoinColumn() - public parent: DriveFolder | null; + public user: Relation; + + @ManyToOne(() => DriveFolder, { + onDelete: "SET NULL", + nullable: true, + }) + @JoinColumn() + public parent: Relation; + //#endregion } diff --git a/packages/backend/src/models/entities/follow-request.ts b/packages/backend/src/models/entities/follow-request.ts index 0a79bc2a53..1631d8c965 100644 --- a/packages/backend/src/models/entities/follow-request.ts +++ b/packages/backend/src/models/entities/follow-request.ts @@ -5,6 +5,7 @@ import { JoinColumn, Column, ManyToOne, + type Relation, } from "typeorm"; import { User } from "./user.js"; import { id } from "../id.js"; @@ -27,12 +28,6 @@ export class FollowRequest { }) public followeeId: User["id"]; - @ManyToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public followee: User | null; - @Index() @Column({ ...id(), @@ -40,12 +35,6 @@ export class FollowRequest { }) public followerId: User["id"]; - @ManyToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public follower: User | null; - @Column("varchar", { length: 128, nullable: true, @@ -96,4 +85,18 @@ export class FollowRequest { }) public followeeSharedInbox: string | null; //#endregion + + //#region Relations + @ManyToOne(() => User, { + onDelete: "CASCADE", + }) + @JoinColumn() + public followee: Relation; + + @ManyToOne(() => User, { + onDelete: "CASCADE", + }) + @JoinColumn() + public follower: Relation; + //#endregion } diff --git a/packages/backend/src/models/entities/following.ts b/packages/backend/src/models/entities/following.ts index 339fe5d5f6..855b9f1745 100644 --- a/packages/backend/src/models/entities/following.ts +++ b/packages/backend/src/models/entities/following.ts @@ -5,6 +5,7 @@ import { JoinColumn, Column, ManyToOne, + type Relation, } from "typeorm"; import { User } from "./user.js"; import { id } from "../id.js"; @@ -28,12 +29,6 @@ export class Following { }) public followeeId: User["id"]; - @ManyToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public followee: User | null; - @Index() @Column({ ...id(), @@ -41,12 +36,6 @@ export class Following { }) public followerId: User["id"]; - @ManyToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public follower: User | null; - //#region Denormalized fields @Index() @Column("varchar", { @@ -92,4 +81,18 @@ export class Following { }) public followeeSharedInbox: string | null; //#endregion + + //#region Relations + @ManyToOne(() => User, { + onDelete: "CASCADE", + }) + @JoinColumn() + public followee: Relation; + + @ManyToOne(() => User, { + onDelete: "CASCADE", + }) + @JoinColumn() + public follower: Relation; + //#endregion } diff --git a/packages/backend/src/models/entities/gallery-like.ts b/packages/backend/src/models/entities/gallery-like.ts index 975246ae9f..f8ec098f68 100644 --- a/packages/backend/src/models/entities/gallery-like.ts +++ b/packages/backend/src/models/entities/gallery-like.ts @@ -5,6 +5,7 @@ import { JoinColumn, Column, ManyToOne, + type Relation, } from "typeorm"; import { User } from "./user.js"; import { id } from "../id.js"; @@ -23,18 +24,20 @@ export class GalleryLike { @Column(id()) public userId: User["id"]; - @ManyToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public user: User | null; - @Column(id()) public postId: GalleryPost["id"]; - @ManyToOne((type) => GalleryPost, { + //#region Relations + @ManyToOne(() => User, { onDelete: "CASCADE", }) @JoinColumn() - public post: GalleryPost | null; + public user: Relation; + + @ManyToOne(() => GalleryPost, { + onDelete: "CASCADE", + }) + @JoinColumn() + public post: Relation; + //#endregion } diff --git a/packages/backend/src/models/entities/gallery-post.ts b/packages/backend/src/models/entities/gallery-post.ts index 1e93a01f07..711e7a7860 100644 --- a/packages/backend/src/models/entities/gallery-post.ts +++ b/packages/backend/src/models/entities/gallery-post.ts @@ -5,6 +5,7 @@ import { Column, PrimaryColumn, ManyToOne, + type Relation, } from "typeorm"; import { User } from "./user.js"; import { id } from "../id.js"; @@ -45,12 +46,6 @@ export class GalleryPost { }) public userId: User["id"]; - @ManyToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public user: User | null; - @Index() @Column({ ...id(), @@ -80,6 +75,14 @@ export class GalleryPost { }) public tags: string[]; + //#region Relations + @ManyToOne((type) => User, { + onDelete: "CASCADE", + }) + @JoinColumn() + public user: Relation; + //#endregion + constructor(data: Partial) { if (data == null) return; diff --git a/packages/backend/src/models/entities/messaging-message.ts b/packages/backend/src/models/entities/messaging-message.ts index 0f86d0ba02..1e87a0dc5c 100644 --- a/packages/backend/src/models/entities/messaging-message.ts +++ b/packages/backend/src/models/entities/messaging-message.ts @@ -5,6 +5,7 @@ import { JoinColumn, Column, ManyToOne, + type Relation, } from "typeorm"; import { User } from "./user.js"; import { DriveFile } from "./drive-file.js"; @@ -29,12 +30,6 @@ export class MessagingMessage { }) public userId: User["id"]; - @ManyToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public user: User | null; - @Index() @Column({ ...id(), @@ -43,12 +38,6 @@ export class MessagingMessage { }) public recipientId: User["id"] | null; - @ManyToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public recipient: User | null; - @Index() @Column({ ...id(), @@ -57,12 +46,6 @@ export class MessagingMessage { }) public groupId: UserGroup["id"] | null; - @ManyToOne((type) => UserGroup, { - onDelete: "CASCADE", - }) - @JoinColumn() - public group: UserGroup | null; - @Column("varchar", { length: 4096, nullable: true, @@ -93,9 +76,31 @@ export class MessagingMessage { }) public fileId: DriveFile["id"] | null; - @ManyToOne((type) => DriveFile, { + //#region Relations + @ManyToOne(() => User, { onDelete: "CASCADE", }) @JoinColumn() - public file: DriveFile | null; + public user: Relation; + + @ManyToOne(() => User, { + onDelete: "CASCADE", + }) + @JoinColumn() + public recipient: Relation; + + @ManyToOne(() => UserGroup, { + onDelete: "CASCADE", + nullable: true, + }) + @JoinColumn() + public group: Relation; + + @ManyToOne(() => DriveFile, { + onDelete: "CASCADE", // TODO: change this to SET NULL + nullable: true, + }) + @JoinColumn() + public file: Relation; + //#endregion } diff --git a/packages/backend/src/models/entities/meta.ts b/packages/backend/src/models/entities/meta.ts index 286aa7f68f..cdb8e14c3f 100644 --- a/packages/backend/src/models/entities/meta.ts +++ b/packages/backend/src/models/entities/meta.ts @@ -1,4 +1,11 @@ -import { Entity, Column, PrimaryColumn, ManyToOne, JoinColumn } from "typeorm"; +import { + Entity, + Column, + PrimaryColumn, + ManyToOne, + JoinColumn, + type Relation, +} from "typeorm"; import { id } from "../id.js"; import { User } from "./user.js"; import type { Clip } from "./clip.js"; @@ -218,12 +225,6 @@ export class Meta { }) public proxyAccountId: User["id"] | null; - @ManyToOne((type) => User, { - onDelete: "SET NULL", - }) - @JoinColumn() - public proxyAccount: User | null; - @Column("boolean", { default: false, }) @@ -500,4 +501,13 @@ export class Meta { nullable: true, }) public donationLink: string | null; + + //#region Relations + @ManyToOne(() => User, { + onDelete: "SET NULL", + nullable: true, + }) + @JoinColumn() + public proxyAccount: Relation; + //#endregion } diff --git a/packages/backend/src/models/entities/moderation-log.ts b/packages/backend/src/models/entities/moderation-log.ts index 00b716b890..6eb3ec27ff 100644 --- a/packages/backend/src/models/entities/moderation-log.ts +++ b/packages/backend/src/models/entities/moderation-log.ts @@ -5,6 +5,7 @@ import { JoinColumn, Column, ManyToOne, + type Relation, } from "typeorm"; import { User } from "./user.js"; import { id } from "../id.js"; @@ -23,12 +24,6 @@ export class ModerationLog { @Column(id()) public userId: User["id"]; - @ManyToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public user: User | null; - @Column("varchar", { length: 128, }) @@ -36,4 +31,12 @@ export class ModerationLog { @Column("jsonb") public info: Record; + + //#region Relations + @ManyToOne(() => User, { + onDelete: "CASCADE", + }) + @JoinColumn() + public user: Relation; + //#endregion } diff --git a/packages/backend/src/models/entities/muted-note.ts b/packages/backend/src/models/entities/muted-note.ts index 5c570c5a56..506b9ad81a 100644 --- a/packages/backend/src/models/entities/muted-note.ts +++ b/packages/backend/src/models/entities/muted-note.ts @@ -5,6 +5,7 @@ import { Column, ManyToOne, PrimaryColumn, + type Relation, } from "typeorm"; import { Note } from "./note.js"; import { User } from "./user.js"; @@ -24,12 +25,6 @@ export class MutedNote { }) public noteId: Note["id"]; - @ManyToOne((type) => Note, { - onDelete: "CASCADE", - }) - @JoinColumn() - public note: Note | null; - @Index() @Column({ ...id(), @@ -37,12 +32,6 @@ export class MutedNote { }) public userId: User["id"]; - @ManyToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public user: User | null; - /** * ミュートされた理由。 */ @@ -52,4 +41,18 @@ export class MutedNote { comment: "The reason of the MutedNote.", }) public reason: (typeof mutedNoteReasons)[number]; + + //#region Relations + @ManyToOne(() => Note, { + onDelete: "CASCADE", + }) + @JoinColumn() + public note: Relation; + + @ManyToOne(() => User, { + onDelete: "CASCADE", + }) + @JoinColumn() + public user: Relation; + //#endregion } diff --git a/packages/backend/src/models/entities/muting.ts b/packages/backend/src/models/entities/muting.ts index 1f9ff79992..dd6ee0bf44 100644 --- a/packages/backend/src/models/entities/muting.ts +++ b/packages/backend/src/models/entities/muting.ts @@ -5,6 +5,7 @@ import { JoinColumn, Column, ManyToOne, + type Relation, } from "typeorm"; import { User } from "./user.js"; import { id } from "../id.js"; @@ -34,12 +35,6 @@ export class Muting { }) public muteeId: User["id"]; - @ManyToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public mutee: User | null; - @Index() @Column({ ...id(), @@ -47,9 +42,17 @@ export class Muting { }) public muterId: User["id"]; - @ManyToOne((type) => User, { + //#region Relations + @ManyToOne(() => User, { onDelete: "CASCADE", }) @JoinColumn() - public muter: User | null; + public mutee: Relation; + + @ManyToOne(() => User, { + onDelete: "CASCADE", + }) + @JoinColumn() + public muter: Relation; + //#endregion } diff --git a/packages/backend/src/models/entities/note-edit.ts b/packages/backend/src/models/entities/note-edit.ts index 91e7b7d796..aed85c7614 100644 --- a/packages/backend/src/models/entities/note-edit.ts +++ b/packages/backend/src/models/entities/note-edit.ts @@ -8,7 +8,7 @@ import { } from "typeorm"; import { Note } from "./note.js"; import { id } from "../id.js"; -import { DriveFile } from "./drive-file.js"; +import type { DriveFile } from "./drive-file.js"; @Entity() export class NoteEdit { @@ -22,12 +22,6 @@ export class NoteEdit { }) public noteId: Note["id"]; - @ManyToOne((type) => Note, { - onDelete: "CASCADE", - }) - @JoinColumn() - public note: Note | null; - @Column("text", { nullable: true, }) @@ -57,4 +51,12 @@ export class NoteEdit { default: "{}", }) public emojis: string[]; + + //#region Relations + @ManyToOne(() => Note, { + onDelete: "CASCADE", + }) + @JoinColumn() + public note: Note; + //#endregion } diff --git a/packages/backend/src/models/entities/note-favorite.ts b/packages/backend/src/models/entities/note-favorite.ts index a4caeea4a3..200655e929 100644 --- a/packages/backend/src/models/entities/note-favorite.ts +++ b/packages/backend/src/models/entities/note-favorite.ts @@ -5,6 +5,7 @@ import { JoinColumn, Column, ManyToOne, + type Relation, } from "typeorm"; import { Note } from "./note.js"; import { User } from "./user.js"; @@ -25,18 +26,20 @@ export class NoteFavorite { @Column(id()) public userId: User["id"]; - @ManyToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public user: User | null; - @Column(id()) public noteId: Note["id"]; - @ManyToOne((type) => Note, { + //#region Relations + @ManyToOne(() => User, { onDelete: "CASCADE", }) @JoinColumn() - public note: Note | null; + public user: Relation; + + @ManyToOne(() => Note, { + onDelete: "CASCADE", + }) + @JoinColumn() + public note: Relation; + //#endregion } diff --git a/packages/backend/src/models/entities/note-reaction.ts b/packages/backend/src/models/entities/note-reaction.ts index 019edb19c6..fc57bb6a07 100644 --- a/packages/backend/src/models/entities/note-reaction.ts +++ b/packages/backend/src/models/entities/note-reaction.ts @@ -5,6 +5,7 @@ import { JoinColumn, Column, ManyToOne, + type Relation, } from "typeorm"; import { User } from "./user.js"; import { Note } from "./note.js"; @@ -26,26 +27,28 @@ export class NoteReaction { @Column(id()) public userId: User["id"]; - @ManyToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public user?: User | null; - @Index() @Column(id()) public noteId: Note["id"]; - @ManyToOne((type) => Note, { - onDelete: "CASCADE", - }) - @JoinColumn() - public note?: Note | null; - // TODO: 対象noteのuserIdを非正規化したい(「受け取ったリアクション一覧」のようなものを(JOIN無しで)実装したいため) @Column("varchar", { length: 260, }) public reaction: string; + + //#region Relations + @ManyToOne(() => User, { + onDelete: "CASCADE", + }) + @JoinColumn() + public user: Relation; + + @ManyToOne(() => Note, { + onDelete: "CASCADE", + }) + @JoinColumn() + public note: Relation; + //#endregion } diff --git a/packages/backend/src/models/entities/note-thread-muting.ts b/packages/backend/src/models/entities/note-thread-muting.ts index a4760301b0..9566d6d89f 100644 --- a/packages/backend/src/models/entities/note-thread-muting.ts +++ b/packages/backend/src/models/entities/note-thread-muting.ts @@ -5,6 +5,7 @@ import { JoinColumn, Column, ManyToOne, + type Relation, } from "typeorm"; import { User } from "./user.js"; import { id } from "../id.js"; @@ -24,15 +25,17 @@ export class NoteThreadMuting { }) public userId: User["id"]; - @ManyToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public user: User | null; - @Index() @Column("varchar", { length: 256, }) public threadId: string; + + //#region Relations + @ManyToOne(() => User, { + onDelete: "CASCADE", + }) + @JoinColumn() + public user: Relation; + //#endregion } diff --git a/packages/backend/src/models/entities/note-unread.ts b/packages/backend/src/models/entities/note-unread.ts index 95695cbc8e..4ab24dfd51 100644 --- a/packages/backend/src/models/entities/note-unread.ts +++ b/packages/backend/src/models/entities/note-unread.ts @@ -5,6 +5,7 @@ import { JoinColumn, Column, ManyToOne, + type Relation, } from "typeorm"; import { User } from "./user.js"; import { Note } from "./note.js"; @@ -21,22 +22,10 @@ export class NoteUnread { @Column(id()) public userId: User["id"]; - @ManyToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public user: User | null; - @Index() @Column(id()) public noteId: Note["id"]; - @ManyToOne((type) => Note, { - onDelete: "CASCADE", - }) - @JoinColumn() - public note: Note | null; - /** * メンションか否か */ @@ -67,4 +56,18 @@ export class NoteUnread { }) public noteChannelId: Channel["id"] | null; //#endregion + + //#region Relations + @ManyToOne(() => User, { + onDelete: "CASCADE", + }) + @JoinColumn() + public user: Relation; + + @ManyToOne(() => Note, { + onDelete: "CASCADE", + }) + @JoinColumn() + public note: Relation; + //#endregion } diff --git a/packages/backend/src/models/entities/note-watching.ts b/packages/backend/src/models/entities/note-watching.ts index 5848af9d00..37b48b75b8 100644 --- a/packages/backend/src/models/entities/note-watching.ts +++ b/packages/backend/src/models/entities/note-watching.ts @@ -5,6 +5,7 @@ import { JoinColumn, Column, ManyToOne, + type Relation, } from "typeorm"; import { User } from "./user.js"; import { Note } from "./note.js"; @@ -29,12 +30,6 @@ export class NoteWatching { }) public userId: User["id"]; - @ManyToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public user: User | null; - @Index() @Column({ ...id(), @@ -42,12 +37,6 @@ export class NoteWatching { }) public noteId: Note["id"]; - @ManyToOne((type) => Note, { - onDelete: "CASCADE", - }) - @JoinColumn() - public note: Note | null; - //#region Denormalized fields @Index() @Column({ @@ -56,4 +45,18 @@ export class NoteWatching { }) public noteUserId: Note["userId"]; //#endregion + + //#region Relations + @ManyToOne(() => User, { + onDelete: "CASCADE", + }) + @JoinColumn() + public user: Relation; + + @ManyToOne(() => Note, { + onDelete: "CASCADE", + }) + @JoinColumn() + public note: Relation; + //#endregion } diff --git a/packages/backend/src/models/entities/note.ts b/packages/backend/src/models/entities/note.ts index b71f6c0f2a..738e43d442 100644 --- a/packages/backend/src/models/entities/note.ts +++ b/packages/backend/src/models/entities/note.ts @@ -206,55 +206,6 @@ export class Note { }) public channelId: Channel["id"] | null; - //#region Relations - @OneToMany( - () => NoteFile, - (noteFile: NoteFile) => noteFile.note, - ) - public noteFiles: Relation; - - @ManyToMany( - () => DriveFile, - (file: DriveFile) => file.notes, - ) - @JoinTable({ - name: "note_file", - joinColumn: { - name: "noteId", - referencedColumnName: "id", - }, - inverseJoinColumn: { - name: "fileId", - referencedColumnName: "id", - }, - }) - public files: Relation; - - @ManyToOne(() => Note, { - onDelete: "CASCADE", - }) - @JoinColumn() - public reply: Note | null; - - @ManyToOne(() => Note, { - onDelete: "CASCADE", - }) - @JoinColumn() - public renote: Note | null; - - @ManyToOne(() => Channel, { - onDelete: "CASCADE", - }) - @JoinColumn() - public channel: Channel | null; - - @ManyToOne(() => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public user: User | null; - //#endregion Relations - //#region Denormalized fields @Index() @Column("varchar", { @@ -299,6 +250,59 @@ export class Note { public updatedAt: Date | null; //#endregion + //#region Relations + @OneToMany( + () => NoteFile, + (noteFile: NoteFile) => noteFile.note, + ) + public noteFiles: Relation; + + @ManyToMany( + () => DriveFile, + (file: DriveFile) => file.notes, + ) + @JoinTable({ + name: "note_file", + joinColumn: { + name: "noteId", + referencedColumnName: "id", + }, + inverseJoinColumn: { + name: "fileId", + referencedColumnName: "id", + }, + }) + public files: Relation; + + @ManyToOne(() => Note, { + onDelete: "CASCADE", + nullable: true, + }) + @JoinColumn() + public reply: Relation; + + @ManyToOne(() => Note, { + onDelete: "CASCADE", + nullable: true, + }) + @JoinColumn() + public renote: Relation; + + @ManyToOne(() => Channel, { + onDelete: "CASCADE", + nullable: true, + }) + @JoinColumn() + public channel: Relation; + + @ManyToOne(() => User, { + onDelete: "CASCADE", + nullable: true, + }) + @JoinColumn() + public user: Relation; + //#endregion Relations + constructor(data: Partial) { if (data == null) return; diff --git a/packages/backend/src/models/entities/notification.ts b/packages/backend/src/models/entities/notification.ts index 1e15649fd9..58fc86a72c 100644 --- a/packages/backend/src/models/entities/notification.ts +++ b/packages/backend/src/models/entities/notification.ts @@ -5,6 +5,7 @@ import { ManyToOne, Column, PrimaryColumn, + type Relation, } from "typeorm"; import { User } from "./user.js"; import { id } from "../id.js"; @@ -35,12 +36,6 @@ export class Notification { }) public notifieeId: User["id"]; - @ManyToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public notifiee: User | null; - /** * Notification sender (initiator) */ @@ -52,12 +47,6 @@ export class Notification { }) public notifierId: User["id"] | null; - @ManyToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public notifier: User | null; - /** * Notification types: * follow - Follow request @@ -96,36 +85,18 @@ export class Notification { }) public noteId: Note["id"] | null; - @ManyToOne((type) => Note, { - onDelete: "CASCADE", - }) - @JoinColumn() - public note: Note | null; - @Column({ ...id(), nullable: true, }) public followRequestId: FollowRequest["id"] | null; - @ManyToOne((type) => FollowRequest, { - onDelete: "CASCADE", - }) - @JoinColumn() - public followRequest: FollowRequest | null; - @Column({ ...id(), nullable: true, }) public userGroupInvitationId: UserGroupInvitation["id"] | null; - @ManyToOne((type) => UserGroupInvitation, { - onDelete: "CASCADE", - }) - @JoinColumn() - public userGroupInvitation: UserGroupInvitation | null; - @Column("varchar", { length: 128, nullable: true, @@ -176,9 +147,46 @@ export class Notification { }) public appAccessTokenId: AccessToken["id"] | null; - @ManyToOne((type) => AccessToken, { + //#region Relations + @ManyToOne(() => User, { onDelete: "CASCADE", }) @JoinColumn() - public appAccessToken: AccessToken | null; + public notifiee: Relation; + + @ManyToOne(() => User, { + onDelete: "CASCADE", + nullable: true, + }) + @JoinColumn() + public notifier: Relation; + + @ManyToOne(() => Note, { + onDelete: "CASCADE", + nullable: true, + }) + @JoinColumn() + public note: Relation; + + @ManyToOne(() => FollowRequest, { + onDelete: "CASCADE", + nullable: true, + }) + @JoinColumn() + public followRequest: Relation; + + @ManyToOne(() => UserGroupInvitation, { + onDelete: "CASCADE", + nullable: true, + }) + @JoinColumn() + public userGroupInvitation: Relation; + + @ManyToOne(() => AccessToken, { + onDelete: "CASCADE", + nullable: true, + }) + @JoinColumn() + public appAccessToken: Relation; + //#endregion } diff --git a/packages/backend/src/models/entities/page-like.ts b/packages/backend/src/models/entities/page-like.ts index d4b82c6e13..fba142375d 100644 --- a/packages/backend/src/models/entities/page-like.ts +++ b/packages/backend/src/models/entities/page-like.ts @@ -5,6 +5,7 @@ import { JoinColumn, Column, ManyToOne, + type Relation, } from "typeorm"; import { User } from "./user.js"; import { id } from "../id.js"; @@ -23,18 +24,20 @@ export class PageLike { @Column(id()) public userId: User["id"]; - @ManyToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public user: User | null; - @Column(id()) public pageId: Page["id"]; - @ManyToOne((type) => Page, { + //#region Relations + @ManyToOne(() => User, { onDelete: "CASCADE", }) @JoinColumn() - public page: Page | null; + public user: Relation; + + @ManyToOne(() => Page, { + onDelete: "CASCADE", + }) + @JoinColumn() + public page: Relation; + //#endregion } diff --git a/packages/backend/src/models/entities/page.ts b/packages/backend/src/models/entities/page.ts index 7043932b89..af8e095dd5 100644 --- a/packages/backend/src/models/entities/page.ts +++ b/packages/backend/src/models/entities/page.ts @@ -5,6 +5,7 @@ import { Column, PrimaryColumn, ManyToOne, + type Relation, } from "typeorm"; import { User } from "./user.js"; import { id } from "../id.js"; @@ -68,24 +69,12 @@ export class Page { }) public userId: User["id"]; - @ManyToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public user: User | null; - @Column({ ...id(), nullable: true, }) public eyeCatchingImageId: DriveFile["id"] | null; - @ManyToOne((type) => DriveFile, { - onDelete: "CASCADE", - }) - @JoinColumn() - public eyeCatchingImage: DriveFile | null; - @Column("jsonb", { default: [], }) @@ -123,6 +112,20 @@ export class Page { }) public likedCount: number; + //#region Relations + @ManyToOne(() => User, { + onDelete: "CASCADE", + }) + @JoinColumn() + public user: Relation; + + @ManyToOne(() => DriveFile, { + onDelete: "CASCADE", // TODO: this should be SET NULL + }) + @JoinColumn() + public eyeCatchingImage: Relation; + //#endregion + constructor(data: Partial) { if (data == null) return; diff --git a/packages/backend/src/models/entities/password-reset-request.ts b/packages/backend/src/models/entities/password-reset-request.ts index 9e6a8f02cd..23ec16e38b 100644 --- a/packages/backend/src/models/entities/password-reset-request.ts +++ b/packages/backend/src/models/entities/password-reset-request.ts @@ -5,6 +5,7 @@ import { Column, ManyToOne, JoinColumn, + type Relation, } from "typeorm"; import { id } from "../id.js"; import { User } from "./user.js"; @@ -29,9 +30,11 @@ export class PasswordResetRequest { }) public userId: User["id"]; - @ManyToOne((type) => User, { + //#region Relations + @ManyToOne(() => User, { onDelete: "CASCADE", }) @JoinColumn() - public user: User | null; + public user: Relation; + //#endregion } diff --git a/packages/backend/src/models/entities/poll-vote.ts b/packages/backend/src/models/entities/poll-vote.ts index f45812a007..7b9cc19c3c 100644 --- a/packages/backend/src/models/entities/poll-vote.ts +++ b/packages/backend/src/models/entities/poll-vote.ts @@ -5,6 +5,7 @@ import { JoinColumn, Column, ManyToOne, + type Relation, } from "typeorm"; import { User } from "./user.js"; import { Note } from "./note.js"; @@ -26,22 +27,24 @@ export class PollVote { @Column(id()) public userId: User["id"]; - @ManyToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public user: User | null; - @Index() @Column(id()) public noteId: Note["id"]; - @ManyToOne((type) => Note, { + @Column("integer") + public choice: number; + + //#region Relations + @ManyToOne(() => User, { onDelete: "CASCADE", }) @JoinColumn() - public note: Note | null; + public user: Relation; - @Column("integer") - public choice: number; + @ManyToOne(() => Note, { + onDelete: "CASCADE", + }) + @JoinColumn() + public note: Relation; + //#endregion } diff --git a/packages/backend/src/models/entities/poll.ts b/packages/backend/src/models/entities/poll.ts index 59d669782d..3cc6df17cf 100644 --- a/packages/backend/src/models/entities/poll.ts +++ b/packages/backend/src/models/entities/poll.ts @@ -5,23 +5,18 @@ import { JoinColumn, Column, OneToOne, + type Relation, } from "typeorm"; import { id } from "../id.js"; import { Note } from "./note.js"; import type { User } from "./user.js"; -import { noteVisibilities } from "../../types.js"; +import { noteVisibilities } from "@/types.js"; @Entity() export class Poll { @PrimaryColumn(id()) public noteId: Note["id"]; - @OneToOne((type) => Note, { - onDelete: "CASCADE", - }) - @JoinColumn() - public note: Note | null; - @Column("timestamp without time zone", { nullable: true, }) @@ -65,6 +60,14 @@ export class Poll { public userHost: string | null; //#endregion + //#region Relations + @OneToOne(() => Note, { + onDelete: "CASCADE", + }) + @JoinColumn() + public note: Relation; + //#endregion + constructor(data: Partial) { if (data == null) return; diff --git a/packages/backend/src/models/entities/promo-note.ts b/packages/backend/src/models/entities/promo-note.ts index d4e7ac0b86..18ff3ac63c 100644 --- a/packages/backend/src/models/entities/promo-note.ts +++ b/packages/backend/src/models/entities/promo-note.ts @@ -5,6 +5,7 @@ import { JoinColumn, Column, OneToOne, + type Relation, } from "typeorm"; import { Note } from "./note.js"; import type { User } from "./user.js"; @@ -15,12 +16,6 @@ export class PromoNote { @PrimaryColumn(id()) public noteId: Note["id"]; - @OneToOne((type) => Note, { - onDelete: "CASCADE", - }) - @JoinColumn() - public note: Note | null; - @Column("timestamp without time zone") public expiresAt: Date; @@ -32,4 +27,12 @@ export class PromoNote { }) public userId: User["id"]; //#endregion + + //#region Relations + @OneToOne(() => Note, { + onDelete: "CASCADE", + }) + @JoinColumn() + public note: Relation; + //#endregion } diff --git a/packages/backend/src/models/entities/promo-read.ts b/packages/backend/src/models/entities/promo-read.ts index f7c3bcd73d..efda0757c6 100644 --- a/packages/backend/src/models/entities/promo-read.ts +++ b/packages/backend/src/models/entities/promo-read.ts @@ -5,6 +5,7 @@ import { JoinColumn, Column, ManyToOne, + type Relation, } from "typeorm"; import { Note } from "./note.js"; import { User } from "./user.js"; @@ -25,18 +26,20 @@ export class PromoRead { @Column(id()) public userId: User["id"]; - @ManyToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public user: User | null; - @Column(id()) public noteId: Note["id"]; - @ManyToOne((type) => Note, { + //#region Relations + @ManyToOne(() => User, { onDelete: "CASCADE", }) @JoinColumn() - public note: Note | null; + public user: Relation; + + @ManyToOne(() => Note, { + onDelete: "CASCADE", + }) + @JoinColumn() + public note: Relation; + //#endregion } diff --git a/packages/backend/src/models/entities/registry-item.ts b/packages/backend/src/models/entities/registry-item.ts index 73b1972411..e9e54b7122 100644 --- a/packages/backend/src/models/entities/registry-item.ts +++ b/packages/backend/src/models/entities/registry-item.ts @@ -5,6 +5,7 @@ import { JoinColumn, Column, ManyToOne, + type Relation, } from "typeorm"; import { User } from "./user.js"; import { id } from "../id.js"; @@ -32,12 +33,6 @@ export class RegistryItem { }) public userId: User["id"]; - @ManyToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public user: User | null; - @Column("varchar", { length: 1024, comment: "The key of the RegistryItem.", @@ -66,4 +61,12 @@ export class RegistryItem { nullable: true, }) public domain: string | null; + + //#region Relations + @ManyToOne(() => User, { + onDelete: "CASCADE", + }) + @JoinColumn() + public user: Relation; + //#endregion } diff --git a/packages/backend/src/models/entities/renote-muting.ts b/packages/backend/src/models/entities/renote-muting.ts index 0bb4d7fd10..42cb14127b 100644 --- a/packages/backend/src/models/entities/renote-muting.ts +++ b/packages/backend/src/models/entities/renote-muting.ts @@ -2,12 +2,13 @@ import { PrimaryColumn, Entity, Index, - JoinColumn, + // JoinColumn, Column, - ManyToOne, + // ManyToOne, + // type Relation, } from "typeorm"; import { id } from "../id.js"; -import { User } from "./user.js"; +import type { User } from "./user.js"; @Entity() @Index(["muterId", "muteeId"], { unique: true }) @@ -28,12 +29,6 @@ export class RenoteMuting { }) public muteeId: User["id"]; - @ManyToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public mutee: User | null; - @Index() @Column({ ...id(), @@ -41,9 +36,19 @@ export class RenoteMuting { }) public muterId: User["id"]; - @ManyToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public muter: User | null; + //#region Relations + /* FIXME: There is no such relation */ + // @ManyToOne(() => User, { + // onDelete: "CASCADE", + // }) + // @JoinColumn() + // public mutee: Relation; + + /* FIXME: There is no such relation */ + // @ManyToOne(() => User, { + // onDelete: "CASCADE", + // }) + // @JoinColumn() + // public muter: Relation; + //#endregion } diff --git a/packages/backend/src/models/entities/reply-muting.ts b/packages/backend/src/models/entities/reply-muting.ts index d55a362c2f..e48463e683 100644 --- a/packages/backend/src/models/entities/reply-muting.ts +++ b/packages/backend/src/models/entities/reply-muting.ts @@ -2,12 +2,13 @@ import { PrimaryColumn, Entity, Index, - JoinColumn, + // JoinColumn, Column, - ManyToOne, + // ManyToOne, + // type Relation, } from "typeorm"; import { id } from "../id.js"; -import { User } from "./user.js"; +import type { User } from "./user.js"; @Entity() @Index(["muterId", "muteeId"], { unique: true }) @@ -28,12 +29,6 @@ export class ReplyMuting { }) public muteeId: User["id"]; - @ManyToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public mutee: User | null; - @Index() @Column({ ...id(), @@ -41,9 +36,19 @@ export class ReplyMuting { }) public muterId: User["id"]; - @ManyToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public muter: User | null; + //#region Relations + /* FIXME: There is no such relation */ + // @ManyToOne(() => User, { + // onDelete: "CASCADE", + // }) + // @JoinColumn() + // public mutee: Relation; + + /* FIXME: There is no such relation */ + // @ManyToOne(() => User, { + // onDelete: "CASCADE", + // }) + // @JoinColumn() + // public muter: Relation; + //#endregion } diff --git a/packages/backend/src/models/entities/signin.ts b/packages/backend/src/models/entities/signin.ts index 5db5526e0a..89d50a6b5f 100644 --- a/packages/backend/src/models/entities/signin.ts +++ b/packages/backend/src/models/entities/signin.ts @@ -5,6 +5,7 @@ import { JoinColumn, Column, ManyToOne, + type Relation, } from "typeorm"; import { User } from "./user.js"; import { id } from "../id.js"; @@ -23,12 +24,6 @@ export class Signin { @Column(id()) public userId: User["id"]; - @ManyToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public user: User | null; - @Column("varchar", { length: 128, }) @@ -39,4 +34,12 @@ export class Signin { @Column("boolean") public success: boolean; + + //#region Relations + @ManyToOne(() => User, { + onDelete: "CASCADE", + }) + @JoinColumn() + public user: Relation; + //#endregion } diff --git a/packages/backend/src/models/entities/sw-subscription.ts b/packages/backend/src/models/entities/sw-subscription.ts index 69138f21fe..a4a6ae7711 100644 --- a/packages/backend/src/models/entities/sw-subscription.ts +++ b/packages/backend/src/models/entities/sw-subscription.ts @@ -5,6 +5,7 @@ import { JoinColumn, Column, ManyToOne, + type Relation, } from "typeorm"; import { User } from "./user.js"; import { id } from "../id.js"; @@ -21,12 +22,6 @@ export class SwSubscription { @Column(id()) public userId: User["id"]; - @ManyToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public user: User | null; - @Column("varchar", { length: 512, }) @@ -46,4 +41,12 @@ export class SwSubscription { default: false, }) public sendReadMessage: boolean; + + //#region Relations + @ManyToOne(() => User, { + onDelete: "CASCADE", + }) + @JoinColumn() + public user: Relation; + //#endregion } diff --git a/packages/backend/src/models/entities/user-group-invitation.ts b/packages/backend/src/models/entities/user-group-invitation.ts index 0a38ac4dfa..be34fdc757 100644 --- a/packages/backend/src/models/entities/user-group-invitation.ts +++ b/packages/backend/src/models/entities/user-group-invitation.ts @@ -5,6 +5,7 @@ import { JoinColumn, Column, ManyToOne, + type Relation, } from "typeorm"; import { User } from "./user.js"; import { UserGroup } from "./user-group.js"; @@ -28,12 +29,6 @@ export class UserGroupInvitation { }) public userId: User["id"]; - @ManyToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public user: User | null; - @Index() @Column({ ...id(), @@ -41,9 +36,17 @@ export class UserGroupInvitation { }) public userGroupId: UserGroup["id"]; - @ManyToOne((type) => UserGroup, { + //#region Relation + @ManyToOne(() => User, { onDelete: "CASCADE", }) @JoinColumn() - public userGroup: UserGroup | null; + public user: Relation; + + @ManyToOne(() => UserGroup, { + onDelete: "CASCADE", + }) + @JoinColumn() + public userGroup: Relation; + //#endregion } diff --git a/packages/backend/src/models/entities/user-group-joining.ts b/packages/backend/src/models/entities/user-group-joining.ts index 6bbae5ae39..d7af03bf8f 100644 --- a/packages/backend/src/models/entities/user-group-joining.ts +++ b/packages/backend/src/models/entities/user-group-joining.ts @@ -5,6 +5,7 @@ import { JoinColumn, Column, ManyToOne, + type Relation, } from "typeorm"; import { User } from "./user.js"; import { UserGroup } from "./user-group.js"; @@ -28,12 +29,6 @@ export class UserGroupJoining { }) public userId: User["id"]; - @ManyToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public user: User | null; - @Index() @Column({ ...id(), @@ -41,9 +36,17 @@ export class UserGroupJoining { }) public userGroupId: UserGroup["id"]; - @ManyToOne((type) => UserGroup, { + //#region Relations + @ManyToOne(() => User, { onDelete: "CASCADE", }) @JoinColumn() - public userGroup: UserGroup | null; + public user: Relation; + + @ManyToOne(() => UserGroup, { + onDelete: "CASCADE", + }) + @JoinColumn() + public userGroup: Relation; + //#endregion } diff --git a/packages/backend/src/models/entities/user-group.ts b/packages/backend/src/models/entities/user-group.ts index 7c62ccc593..801b4e619f 100644 --- a/packages/backend/src/models/entities/user-group.ts +++ b/packages/backend/src/models/entities/user-group.ts @@ -5,6 +5,7 @@ import { Column, PrimaryColumn, ManyToOne, + type Relation, } from "typeorm"; import { User } from "./user.js"; import { id } from "../id.js"; @@ -32,17 +33,19 @@ export class UserGroup { }) public userId: User["id"]; - @ManyToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public user: User | null; - @Column("boolean", { default: false, }) public isPrivate: boolean; + //#region Relations + @ManyToOne(() => User, { + onDelete: "CASCADE", + }) + @JoinColumn() + public user: Relation; + //#endregion + constructor(data: Partial) { if (data == null) return; diff --git a/packages/backend/src/models/entities/user-keypair.ts b/packages/backend/src/models/entities/user-keypair.ts index f98384f538..0c1b90c868 100644 --- a/packages/backend/src/models/entities/user-keypair.ts +++ b/packages/backend/src/models/entities/user-keypair.ts @@ -1,4 +1,11 @@ -import { PrimaryColumn, Entity, JoinColumn, Column, OneToOne } from "typeorm"; +import { + PrimaryColumn, + Entity, + JoinColumn, + Column, + OneToOne, + type Relation, +} from "typeorm"; import { User } from "./user.js"; import { id } from "../id.js"; @@ -7,12 +14,6 @@ export class UserKeypair { @PrimaryColumn(id()) public userId: User["id"]; - @OneToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public user: User | null; - @Column("varchar", { length: 4096, }) @@ -23,6 +24,14 @@ export class UserKeypair { }) public privateKey: string; + //#region Relations + @OneToOne(() => User, { + onDelete: "CASCADE", + }) + @JoinColumn() + public user: Relation; + //#endregion + constructor(data: Partial) { if (data == null) return; diff --git a/packages/backend/src/models/entities/user-list-joining.ts b/packages/backend/src/models/entities/user-list-joining.ts index 43c485f6fa..bd3ef8bde1 100644 --- a/packages/backend/src/models/entities/user-list-joining.ts +++ b/packages/backend/src/models/entities/user-list-joining.ts @@ -5,6 +5,7 @@ import { JoinColumn, Column, ManyToOne, + type Relation, } from "typeorm"; import { User } from "./user.js"; import { UserList } from "./user-list.js"; @@ -28,12 +29,6 @@ export class UserListJoining { }) public userId: User["id"]; - @ManyToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public user: User | null; - @Index() @Column({ ...id(), @@ -41,9 +36,17 @@ export class UserListJoining { }) public userListId: UserList["id"]; - @ManyToOne((type) => UserList, { + //#region Relations + @ManyToOne(() => User, { onDelete: "CASCADE", }) @JoinColumn() - public userList: UserList | null; + public user: Relation; + + @ManyToOne(() => UserList, { + onDelete: "CASCADE", + }) + @JoinColumn() + public userList: Relation; + //#endregion } diff --git a/packages/backend/src/models/entities/user-list.ts b/packages/backend/src/models/entities/user-list.ts index bbc40240fc..6f192c6bab 100644 --- a/packages/backend/src/models/entities/user-list.ts +++ b/packages/backend/src/models/entities/user-list.ts @@ -5,6 +5,7 @@ import { JoinColumn, Column, ManyToOne, + type Relation, } from "typeorm"; import { User } from "./user.js"; import { id } from "../id.js"; @@ -26,15 +27,17 @@ export class UserList { }) public userId: User["id"]; - @ManyToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public user: User | null; - @Column("varchar", { length: 128, comment: "The name of the UserList.", }) public name: string; + + //#region Relations + @ManyToOne(() => User, { + onDelete: "CASCADE", + }) + @JoinColumn() + public user: Relation; + //#endregion } diff --git a/packages/backend/src/models/entities/user-note-pining.ts b/packages/backend/src/models/entities/user-note-pining.ts index af91908dfe..d262c3f5b3 100644 --- a/packages/backend/src/models/entities/user-note-pining.ts +++ b/packages/backend/src/models/entities/user-note-pining.ts @@ -5,6 +5,7 @@ import { JoinColumn, Column, ManyToOne, + type Relation, } from "typeorm"; import { Note } from "./note.js"; import { User } from "./user.js"; @@ -25,18 +26,20 @@ export class UserNotePining { @Column(id()) public userId: User["id"]; - @ManyToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public user: User | null; - @Column(id()) public noteId: Note["id"]; - @ManyToOne((type) => Note, { + //#region Relations + @ManyToOne(() => User, { onDelete: "CASCADE", }) @JoinColumn() - public note: Note | null; + public user: Relation; + + @ManyToOne(() => Note, { + onDelete: "CASCADE", + }) + @JoinColumn() + public note: Relation; + //#endregion } diff --git a/packages/backend/src/models/entities/user-profile.ts b/packages/backend/src/models/entities/user-profile.ts index 2a99d58226..2fe2b7a58a 100644 --- a/packages/backend/src/models/entities/user-profile.ts +++ b/packages/backend/src/models/entities/user-profile.ts @@ -5,6 +5,7 @@ import { OneToOne, JoinColumn, PrimaryColumn, + type Relation, } from "typeorm"; import { ffVisibility, notificationTypes } from "@/types.js"; import { id } from "../id.js"; @@ -18,12 +19,6 @@ export class UserProfile { @PrimaryColumn(id()) public userId: User["id"]; - @OneToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public user: User | null; - @Column("varchar", { length: 128, nullable: true, @@ -246,6 +241,14 @@ export class UserProfile { public userHost: string | null; //#endregion + //#region Relations + @OneToOne(() => User, { + onDelete: "CASCADE", + }) + @JoinColumn() + public user: Relation; + //#endregion + constructor(data: Partial) { if (data == null) return; diff --git a/packages/backend/src/models/entities/user-publickey.ts b/packages/backend/src/models/entities/user-publickey.ts index e39b084d32..6ec46b0cca 100644 --- a/packages/backend/src/models/entities/user-publickey.ts +++ b/packages/backend/src/models/entities/user-publickey.ts @@ -5,6 +5,7 @@ import { JoinColumn, Column, OneToOne, + type Relation, } from "typeorm"; import { User } from "./user.js"; import { id } from "../id.js"; @@ -14,12 +15,6 @@ export class UserPublickey { @PrimaryColumn(id()) public userId: User["id"]; - @OneToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public user: User | null; - @Index({ unique: true }) @Column("varchar", { length: 512, @@ -31,6 +26,14 @@ export class UserPublickey { }) public keyPem: string; + //#region Relations + @OneToOne(() => User, { + onDelete: "CASCADE", + }) + @JoinColumn() + public user: Relation; + //#endregion + constructor(data: Partial) { if (data == null) return; diff --git a/packages/backend/src/models/entities/user-security-key.ts b/packages/backend/src/models/entities/user-security-key.ts index 6ac2070ee9..b2853f0aa9 100644 --- a/packages/backend/src/models/entities/user-security-key.ts +++ b/packages/backend/src/models/entities/user-security-key.ts @@ -5,6 +5,7 @@ import { Column, ManyToOne, Index, + type Relation, } from "typeorm"; import { User } from "./user.js"; import { id } from "../id.js"; @@ -20,12 +21,6 @@ export class UserSecurityKey { @Column(id()) public userId: User["id"]; - @ManyToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public user: User | null; - @Index() @Column("varchar", { comment: @@ -45,6 +40,14 @@ export class UserSecurityKey { }) public name: string; + //#region Relations + @ManyToOne(() => User, { + onDelete: "CASCADE", + }) + @JoinColumn() + public user: Relation; + //#endregion + constructor(data: Partial) { if (data == null) return; diff --git a/packages/backend/src/models/entities/user.ts b/packages/backend/src/models/entities/user.ts index cf757d43e5..152acfedb7 100644 --- a/packages/backend/src/models/entities/user.ts +++ b/packages/backend/src/models/entities/user.ts @@ -5,6 +5,7 @@ import { OneToOne, JoinColumn, PrimaryColumn, + type Relation, } from "typeorm"; import { id } from "../id.js"; import { DriveFile } from "./drive-file.js"; @@ -106,12 +107,6 @@ export class User { }) public avatarId: DriveFile["id"] | null; - @OneToOne((type) => DriveFile, { - onDelete: "SET NULL", - }) - @JoinColumn() - public avatar: DriveFile | null; - @Column({ ...id(), nullable: true, @@ -119,12 +114,6 @@ export class User { }) public bannerId: DriveFile["id"] | null; - @OneToOne((type) => DriveFile, { - onDelete: "SET NULL", - }) - @JoinColumn() - public banner: DriveFile | null; - @Index() @Column("varchar", { length: 128, @@ -286,6 +275,22 @@ export class User { }) public isIndexable: boolean; + //#region Relations + @OneToOne(() => DriveFile, { + onDelete: "SET NULL", + nullable: true, + }) + @JoinColumn() + public avatar: Relation; + + @OneToOne(() => DriveFile, { + onDelete: "SET NULL", + nullable: true, + }) + @JoinColumn() + public banner: Relation; + //#endregion + constructor(data: Partial) { if (data == null) return; diff --git a/packages/backend/src/models/entities/webhook.ts b/packages/backend/src/models/entities/webhook.ts index 3d3a242906..bc48e537ae 100644 --- a/packages/backend/src/models/entities/webhook.ts +++ b/packages/backend/src/models/entities/webhook.ts @@ -5,6 +5,7 @@ import { JoinColumn, Column, ManyToOne, + type Relation, } from "typeorm"; import { User } from "./user.js"; import { id } from "../id.js"; @@ -37,12 +38,6 @@ export class Webhook { }) public userId: User["id"]; - @ManyToOne((type) => User, { - onDelete: "CASCADE", - }) - @JoinColumn() - public user: User | null; - @Column("varchar", { length: 128, comment: "The name of the Antenna.", @@ -88,4 +83,12 @@ export class Webhook { nullable: true, }) public latestStatus: number | null; + + //#region Relations + @ManyToOne(() => User, { + onDelete: "CASCADE", + }) + @JoinColumn() + public user: Relation; + //#endregion }