-import * as Sequelize from 'sequelize'
+import memoizee from 'memoizee'
+import { AllowNull, Column, Default, DefaultScope, HasOne, IsInt, Model, Table } from 'sequelize-typescript'
+import { AttributesOnly } from '@shared/typescript-utils'
+import { AccountModel } from '../account/account'
-import { addMethodsToModel } from '../utils'
-import {
- ApplicationAttributes,
- ApplicationInstance,
+export const getServerActor = memoizee(async function () {
+ const application = await ApplicationModel.load()
+ if (!application) throw Error('Could not load Application from database.')
- ApplicationMethods
-} from './application-interface'
+ const actor = application.Account.Actor
+ actor.Account = application.Account
-let Application: Sequelize.Model<ApplicationInstance, ApplicationAttributes>
-let loadMigrationVersion: ApplicationMethods.LoadMigrationVersion
-let updateMigrationVersion: ApplicationMethods.UpdateMigrationVersion
-let countTotal: ApplicationMethods.CountTotal
+ return actor
+}, { promise: true })
-export default function defineApplication (sequelize: Sequelize.Sequelize, DataTypes: Sequelize.DataTypes) {
- Application = sequelize.define<ApplicationInstance, ApplicationAttributes>('Application',
+@DefaultScope(() => ({
+ include: [
{
- migrationVersion: {
- type: DataTypes.INTEGER,
- defaultValue: 0,
- allowNull: false,
- validate: {
- isInt: true
- }
- }
+ model: AccountModel,
+ required: true
}
- )
-
- const classMethods = [
- countTotal,
- loadMigrationVersion,
- updateMigrationVersion
]
- addMethodsToModel(Application, classMethods)
-
- return Application
-}
-
-// ---------------------------------------------------------------------------
-
-countTotal = function () {
- return this.count()
-}
-
-loadMigrationVersion = function () {
- const query = {
- attributes: [ 'migrationVersion' ]
+}))
+@Table({
+ tableName: 'application',
+ timestamps: false
+})
+export class ApplicationModel extends Model<Partial<AttributesOnly<ApplicationModel>>> {
+
+ @AllowNull(false)
+ @Default(0)
+ @IsInt
+ @Column
+ migrationVersion: number
+
+ @AllowNull(true)
+ @Column
+ latestPeerTubeVersion: string
+
+ @HasOne(() => AccountModel, {
+ foreignKey: {
+ allowNull: true
+ },
+ onDelete: 'cascade'
+ })
+ Account: AccountModel
+
+ static countTotal () {
+ return ApplicationModel.count()
}
- return Application.findOne(query).then(data => data ? data.migrationVersion : null)
-}
-
-updateMigrationVersion = function (newVersion: number, transaction: Sequelize.Transaction) {
- const options: Sequelize.UpdateOptions = {
- where: {},
- transaction: transaction
+ static load () {
+ return ApplicationModel.findOne()
}
-
- return Application.update({ migrationVersion: newVersion }, options)
}