diff --git a/server/Database.js b/server/Database.js index afb09dae..0f701706 100644 --- a/server/Database.js +++ b/server/Database.js @@ -305,6 +305,7 @@ class Database { require('./models/Setting').init(this.sequelize) require('./models/CustomMetadataProvider').init(this.sequelize) require('./models/MediaItemShare').init(this.sequelize) + require('./models/Plugin').init(this.sequelize) return this.sequelize.sync({ force, alter: false }) } diff --git a/server/migrations/v2.18.0-add-plugins-table.js b/server/migrations/v2.18.0-add-plugins-table.js new file mode 100644 index 00000000..8c63cbdf --- /dev/null +++ b/server/migrations/v2.18.0-add-plugins-table.js @@ -0,0 +1,67 @@ +/** + * @typedef MigrationContext + * @property {import('sequelize').QueryInterface} queryInterface - a suquelize QueryInterface object. + * @property {import('../Logger')} logger - a Logger object. + * + * @typedef MigrationOptions + * @property {MigrationContext} context - an object containing the migration context. + */ + +const migrationVersion = '2.18.0' +const migrationName = `${migrationVersion}-add-plugins-table` +const loggerPrefix = `[${migrationVersion} migration]` + +/** + * This upward migration creates the plugins table if it does not exist. + * + * @param {MigrationOptions} options - an object containing the migration context. + * @returns {Promise} - A promise that resolves when the migration is complete. + */ +async function up({ context: { queryInterface, logger } }) { + // Upwards migration script + logger.info(`${loggerPrefix} UPGRADE BEGIN: ${migrationName}`) + + if (!(await queryInterface.tableExists('plugins'))) { + const DataTypes = queryInterface.sequelize.Sequelize.DataTypes + await queryInterface.createTable('plugins', { + id: { + type: DataTypes.UUID, + defaultValue: DataTypes.UUIDV4, + primaryKey: true + }, + name: DataTypes.STRING, + version: DataTypes.STRING, + config: DataTypes.JSON, + extraData: DataTypes.JSON, + createdAt: DataTypes.DATE, + updatedAt: DataTypes.DATE + }) + logger.info(`${loggerPrefix} Table 'plugins' created`) + } else { + logger.info(`${loggerPrefix} Table 'plugins' already exists`) + } + + logger.info(`${loggerPrefix} UPGRADE END: ${migrationName}`) +} + +/** + * This downward migration script drops the plugins table if it exists. + * + * @param {MigrationOptions} options - an object containing the migration context. + * @returns {Promise} - A promise that resolves when the migration is complete. + */ +async function down({ context: { queryInterface, logger } }) { + // Downward migration script + logger.info(`${loggerPrefix} DOWNGRADE BEGIN: ${migrationName}`) + + if (await queryInterface.tableExists('plugins')) { + await queryInterface.dropTable('plugins') + logger.info(`${loggerPrefix} Table 'plugins' dropped`) + } else { + logger.info(`${loggerPrefix} Table 'plugins' does not exist`) + } + + logger.info(`${loggerPrefix} DOWNGRADE END: ${migrationName}`) +} + +module.exports = { up, down } diff --git a/server/models/Plugin.js b/server/models/Plugin.js new file mode 100644 index 00000000..cae34ccb --- /dev/null +++ b/server/models/Plugin.js @@ -0,0 +1,48 @@ +const { DataTypes, Model } = require('sequelize') + +class Plugin extends Model { + constructor(values, options) { + super(values, options) + + /** @type {UUIDV4} */ + this.id + /** @type {string} */ + this.name + /** @type {string} */ + this.version + /** @type {Object} */ + this.config + /** @type {Object} */ + this.extraData + /** @type {Date} */ + this.createdAt + /** @type {Date} */ + this.updatedAt + } + + /** + * Initialize model + * @param {import('../Database').sequelize} sequelize + */ + static init(sequelize) { + super.init( + { + id: { + type: DataTypes.UUID, + defaultValue: DataTypes.UUIDV4, + primaryKey: true + }, + name: DataTypes.STRING, + version: DataTypes.STRING, + config: DataTypes.JSON, + extraData: DataTypes.JSON + }, + { + sequelize, + modelName: 'plugin' + } + ) + } +} + +module.exports = Plugin