import { GrowiPluginType } from '@growi/core'; import { Schema, type Model, type Document, type Types, } from 'mongoose'; import { getOrCreateModel } from '~/server/util/mongoose-utils'; import type { IGrowiPlugin, IGrowiPluginMeta, IGrowiPluginMetaByType, IGrowiPluginOrigin, IGrowiTemplatePluginMeta, IGrowiThemePluginMeta, } from '../../interfaces'; export interface IGrowiPluginDocument extends IGrowiPlugin, Document { metaJson: IGrowiPluginMeta & IGrowiThemePluginMeta & IGrowiTemplatePluginMeta, } export interface IGrowiPluginModel extends Model { findEnabledPlugins(): Promise findEnabledPluginsByType(type: T): Promise>[]> activatePlugin(id: Types.ObjectId): Promise deactivatePlugin(id: Types.ObjectId): Promise } const growiPluginMetaSchema = new Schema({ name: { type: String, required: true }, types: { type: [String], enum: GrowiPluginType, require: true, }, desc: { type: String }, author: { type: String }, themes: [Map], templateSummaries: [Map], }); const growiPluginOriginSchema = new Schema({ url: { type: String }, ghBranch: { type: String }, ghTag: { type: String }, }); const growiPluginSchema = new Schema({ isEnabled: { type: Boolean }, installedPath: { type: String }, organizationName: { type: String }, origin: growiPluginOriginSchema, meta: growiPluginMetaSchema, }); growiPluginSchema.statics.findEnabledPlugins = async function(): Promise { return this.find({ isEnabled: true }).lean(); }; growiPluginSchema.statics.findEnabledPluginsByType = async function( type: T, ): Promise>[]> { return this.find({ isEnabled: true, 'meta.types': { $in: type }, }).lean(); }; growiPluginSchema.statics.activatePlugin = async function(id: Types.ObjectId): Promise { const growiPlugin = await this.findOneAndUpdate({ _id: id }, { isEnabled: true }); if (growiPlugin == null) { const message = 'No plugin found for this ID.'; throw new Error(message); } const pluginName = growiPlugin.meta.name; return pluginName; }; growiPluginSchema.statics.deactivatePlugin = async function(id: Types.ObjectId): Promise { const growiPlugin = await this.findOneAndUpdate({ _id: id }, { isEnabled: false }); if (growiPlugin == null) { const message = 'No plugin found for this ID.'; throw new Error(message); } const pluginName = growiPlugin.meta.name; return pluginName; }; export const GrowiPlugin = getOrCreateModel('GrowiPlugin', growiPluginSchema);