server/database/entities/Status.ts

146 lines
3.1 KiB
TypeScript
Raw Normal View History

2023-09-12 22:48:10 +02:00
import { getConfig } from "@config";
import {
BaseEntity,
Column,
CreateDateColumn,
Entity,
2023-09-22 03:09:14 +02:00
JoinTable,
2023-09-12 22:48:10 +02:00
ManyToMany,
ManyToOne,
PrimaryGeneratedColumn,
UpdateDateColumn,
} from "typeorm";
import { APIStatus } from "~types/entities/status";
import { User } from "./User";
import { Application } from "./Application";
import { Emoji } from "./Emoji";
2023-09-13 07:30:45 +02:00
import { RawActivity } from "./RawActivity";
2023-09-12 22:48:10 +02:00
const config = getConfig();
/**
* Stores ActivityPub notes
*/
@Entity({
name: "statuses",
})
export class Status extends BaseEntity {
@PrimaryGeneratedColumn("uuid")
id!: string;
2023-09-13 02:29:13 +02:00
@ManyToOne(() => User, user => user.id)
2023-09-12 22:48:10 +02:00
account!: User;
@CreateDateColumn()
created_at!: Date;
@UpdateDateColumn()
updated_at!: Date;
2023-09-13 02:29:13 +02:00
@ManyToOne(() => Status, status => status.id, {
2023-09-12 22:48:10 +02:00
nullable: true,
})
reblog?: Status;
@Column("boolean")
isReblog!: boolean;
@Column("varchar", {
default: "",
})
content!: string;
@Column("varchar")
visibility!: APIStatus["visibility"];
@Column("boolean")
sensitive!: boolean;
@Column("varchar", {
default: "",
})
spoiler_text!: string;
2023-09-13 02:29:13 +02:00
@ManyToOne(() => Application, app => app.id, {
nullable: true,
2023-09-12 22:48:10 +02:00
})
application!: Application | null;
2023-09-13 02:29:13 +02:00
@ManyToMany(() => Emoji, emoji => emoji.id)
2023-09-22 03:09:14 +02:00
@JoinTable()
2023-09-12 22:48:10 +02:00
emojis!: Emoji[];
2023-09-22 03:09:14 +02:00
@ManyToMany(() => RawActivity, activity => activity.id)
@JoinTable()
2023-09-14 04:25:45 +02:00
likes!: RawActivity[];
2023-09-13 07:30:45 +02:00
2023-09-22 03:09:14 +02:00
@ManyToMany(() => RawActivity, activity => activity.id)
@JoinTable()
2023-09-14 04:25:45 +02:00
announces!: RawActivity[];
2023-09-13 02:29:13 +02:00
2023-09-22 03:09:14 +02:00
static async createNew(data: {
account: User;
application: Application | null;
content: string;
visibility: APIStatus["visibility"];
sensitive: boolean;
spoiler_text: string;
emojis: Emoji[];
}) {
const newStatus = new Status();
newStatus.account = data.account;
newStatus.application = data.application ?? null;
newStatus.content = data.content;
newStatus.visibility = data.visibility;
newStatus.sensitive = data.sensitive;
newStatus.spoiler_text = data.spoiler_text;
newStatus.emojis = data.emojis;
newStatus.likes = [];
newStatus.announces = [];
newStatus.isReblog = false;
newStatus.announces = [];
2023-09-22 23:41:05 +02:00
// TODO: Add default language
2023-09-22 03:09:14 +02:00
await newStatus.save();
return newStatus;
}
2023-09-12 22:48:10 +02:00
async toAPI(): Promise<APIStatus> {
return {
account: await this.account.toAPI(),
2023-09-13 02:29:13 +02:00
application: (await this.application?.toAPI()) ?? null,
2023-09-12 22:48:10 +02:00
bookmarked: false,
created_at: this.created_at.toISOString(),
2023-09-13 02:29:13 +02:00
emojis: await Promise.all(
this.emojis.map(async emoji => await emoji.toAPI())
),
2023-09-12 22:48:10 +02:00
favourited: false,
2023-09-22 03:09:14 +02:00
favourites_count: this.likes.length,
2023-09-12 22:48:10 +02:00
id: this.id,
in_reply_to_account_id: null,
in_reply_to_id: null,
language: null,
media_attachments: [],
mentions: [],
muted: false,
pinned: false,
poll: null,
2023-09-13 02:29:13 +02:00
reblog: this.isReblog ? (await this.reblog?.toAPI()) ?? null : null,
2023-09-12 22:48:10 +02:00
reblogged: false,
2023-09-22 03:09:14 +02:00
reblogs_count: this.announces.length,
2023-09-12 22:48:10 +02:00
replies_count: 0,
sensitive: false,
spoiler_text: "",
tags: [],
card: null,
2023-09-22 03:09:14 +02:00
content: this.content,
2023-09-12 22:48:10 +02:00
uri: `${config.http.base_url}/@${this.account.username}/${this.id}`,
url: `${config.http.base_url}/@${this.account.username}/${this.id}`,
visibility: "public",
quote: null,
};
}
}