import { getNodeABIVersion } from '@server/helpers/version.js' import memoizee from 'memoizee' import { AllowNull, Column, Default, DefaultScope, HasOne, IsInt, Table } from 'sequelize-typescript' import { AccountModel } from '../account/account.js' import { ActorImageModel } from '../actor/actor-image.js' import { SequelizeModel } from '../shared/index.js' export const getServerActor = memoizee(async function () { const application = await ApplicationModel.load() if (!application) throw Error('Could not load Application from database.') const actor = application.Account.Actor actor.Account = application.Account const { avatars, banners } = await ActorImageModel.listActorImages(actor) actor.Avatars = avatars actor.Banners = banners return actor }, { promise: true }) @DefaultScope(() => ({ include: [ { model: AccountModel, required: true } ] })) @Table({ tableName: 'application', timestamps: false }) export class ApplicationModel extends SequelizeModel { @AllowNull(false) @Default(0) @IsInt @Column migrationVersion: number @AllowNull(true) @Column latestPeerTubeVersion: string @AllowNull(false) @Column nodeVersion: string @AllowNull(false) @Column nodeABIVersion: number @HasOne(() => AccountModel, { foreignKey: { allowNull: true }, onDelete: 'cascade' }) Account: Awaited static countTotal () { return ApplicationModel.count() } static load () { return ApplicationModel.findOne() } static async nodeABIChanged () { const application = await this.load() return application.nodeABIVersion !== getNodeABIVersion() } static async updateNodeVersions () { const application = await this.load() application.nodeABIVersion = getNodeABIVersion() application.nodeVersion = process.version await application.save() } }