import { GrowiThemeMetadata, GrowiThemeSchemeType } from '@growi/core'; import { Schema, Model, Document, } from 'mongoose'; import { GrowiPlugin, GrowiPluginMeta, GrowiPluginOrigin, GrowiPluginResourceType, GrowiThemePluginMeta, } from '~/interfaces/plugin'; import { getOrCreateModel } from '../util/mongoose-utils'; export interface GrowiPluginDocument extends GrowiPlugin, Document { } export interface GrowiPluginModel extends Model { findEnabledPlugins(): Promise findEnabledPluginsIncludingAnyTypes(includingTypes: GrowiPluginResourceType[]): Promise } const growiThemeMetadataSchema = new Schema({ name: { type: String, required: true }, manifestKey: { type: String, required: true }, schemeType: { type: String, enum: GrowiThemeSchemeType, require: true, }, bg: { type: String, required: true }, topbar: { type: String, required: true }, sidebar: { type: String, required: true }, accent: { type: String, required: true }, }); const growiPluginMetaSchema = new Schema({ name: { type: String, required: true }, types: { type: [String], enum: GrowiPluginResourceType, require: true, }, desc: { type: String }, author: { type: String }, themes: [growiThemeMetadataSchema], }); const growiPluginOriginSchema = new Schema({ url: { type: String }, ghBranch: { type: String }, ghTag: { type: String }, }); const growiPluginSchema = new Schema({ isEnabled: { type: Boolean }, installedPath: { type: String }, origin: growiPluginOriginSchema, meta: growiPluginMetaSchema, }); growiPluginSchema.statics.findEnabledPlugins = async function(): Promise { return this.find({ isEnabled: true }); }; growiPluginSchema.statics.findEnabledPluginsIncludingAnyTypes = async function(types: GrowiPluginResourceType[]): Promise { return this.find({ isEnabled: true, 'meta.types': { $in: types }, }); }; export default getOrCreateModel('GrowiPlugin', growiPluginSchema);