denormalize Events/Notes relation
This commit is contained in:
parent
a56561f8aa
commit
173a901eee
|
@ -0,0 +1,29 @@
|
||||||
|
export class Event1681675881633 {
|
||||||
|
name = 'Event1681675881633'
|
||||||
|
|
||||||
|
async up(queryRunner) {
|
||||||
|
await queryRunner.query(`ALTER TABLE "note" RENAME COLUMN "isEvent" TO "hasEvent"`);
|
||||||
|
await queryRunner.query(`CREATE TYPE "public"."event_notevisibility_enum" AS ENUM('public', 'home', 'followers', 'specified')`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "event" ADD "noteVisibility" "public"."event_notevisibility_enum" NOT NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "event"."noteVisibility" IS '[Denormalized]'`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "event" ADD "userId" character varying(32) NOT NULL`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "event"."userId" IS '[Denormalized]'`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "event" ADD "userHost" character varying(128)`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "event"."userHost" IS '[Denormalized]'`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_01cd2b829e0263917bf570cb67" ON "event" ("userId") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_f6ba57dff679ccbcfe004698ec" ON "event" ("userHost") `);
|
||||||
|
}
|
||||||
|
|
||||||
|
async down(queryRunner) {
|
||||||
|
await queryRunner.query(`DROP INDEX "public"."IDX_f6ba57dff679ccbcfe004698ec"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "public"."IDX_01cd2b829e0263917bf570cb67"`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "event"."userHost" IS '[Denormalized]'`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "event" DROP COLUMN "userHost"`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "event"."userId" IS '[Denormalized]'`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "event" DROP COLUMN "userId"`);
|
||||||
|
await queryRunner.query(`COMMENT ON COLUMN "event"."noteVisibility" IS '[Denormalized]'`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "event" DROP COLUMN "noteVisibility"`);
|
||||||
|
await queryRunner.query(`DROP TYPE "public"."event_notevisibility_enum"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "note" RENAME COLUMN "hasEvent" TO "isEvent"`);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,6 +1,8 @@
|
||||||
import { Entity, Index, Column, PrimaryColumn, OneToOne, JoinColumn } from 'typeorm';
|
import { Entity, Index, Column, PrimaryColumn, OneToOne, JoinColumn } from 'typeorm';
|
||||||
import { id } from '../id.js';
|
import { id } from '../id.js';
|
||||||
|
import { noteVisibilities } from '../../types.js';
|
||||||
import { Note } from './Note.js';
|
import { Note } from './Note.js';
|
||||||
|
import type { User } from './User.js';
|
||||||
|
|
||||||
@Entity()
|
@Entity()
|
||||||
export class Event {
|
export class Event {
|
||||||
|
@ -37,4 +39,41 @@ export class Event {
|
||||||
comment: 'metadata mapping for event with more user configurable optional information',
|
comment: 'metadata mapping for event with more user configurable optional information',
|
||||||
})
|
})
|
||||||
public metadata: Record<string, string>;
|
public metadata: Record<string, string>;
|
||||||
|
|
||||||
|
//#region Denormalized fields
|
||||||
|
@Column('enum', {
|
||||||
|
enum: noteVisibilities,
|
||||||
|
comment: '[Denormalized]',
|
||||||
|
})
|
||||||
|
public noteVisibility: typeof noteVisibilities[number];
|
||||||
|
|
||||||
|
@Index()
|
||||||
|
@Column({
|
||||||
|
...id(),
|
||||||
|
comment: '[Denormalized]',
|
||||||
|
})
|
||||||
|
public userId: User['id'];
|
||||||
|
|
||||||
|
@Index()
|
||||||
|
@Column('varchar', {
|
||||||
|
length: 128, nullable: true,
|
||||||
|
comment: '[Denormalized]',
|
||||||
|
})
|
||||||
|
public userHost: string | null;
|
||||||
|
//#endregion
|
||||||
|
|
||||||
|
constructor(data: Partial<Event>) {
|
||||||
|
if (data == null) return;
|
||||||
|
|
||||||
|
for (const [k, v] of Object.entries(data)) {
|
||||||
|
(this as any)[k] = v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export type IEvent = {
|
||||||
|
start: Date;
|
||||||
|
end: Date | null
|
||||||
|
title: string;
|
||||||
|
metadata: Record<string, string>;
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,7 +56,7 @@ export class Note {
|
||||||
@Column('boolean', {
|
@Column('boolean', {
|
||||||
default: false,
|
default: false,
|
||||||
})
|
})
|
||||||
public isEvent: boolean;
|
public hasEvent: boolean;
|
||||||
|
|
||||||
// TODO: varcharにしたい
|
// TODO: varcharにしたい
|
||||||
@Column('text', {
|
@Column('text', {
|
||||||
|
|
|
@ -150,6 +150,12 @@ export type Note = {
|
||||||
replyId: Note['id'];
|
replyId: Note['id'];
|
||||||
renote?: Note;
|
renote?: Note;
|
||||||
renoteId: Note['id'];
|
renoteId: Note['id'];
|
||||||
|
event?: {
|
||||||
|
title: string,
|
||||||
|
start: DateString,
|
||||||
|
end: DateString | null,
|
||||||
|
metadata: Record<string, string>,
|
||||||
|
};
|
||||||
files: DriveFile[];
|
files: DriveFile[];
|
||||||
fileIds: DriveFile['id'][];
|
fileIds: DriveFile['id'][];
|
||||||
visibility: 'public' | 'home' | 'followers' | 'specified';
|
visibility: 'public' | 'home' | 'followers' | 'specified';
|
||||||
|
|
Loading…
Reference in New Issue