Преглед изворни кода

persist theme summary data

Yuki Takei пре 3 година
родитељ
комит
bc93443045

+ 8 - 2
packages/app/src/interfaces/plugin.ts

@@ -1,3 +1,5 @@
+import { GrowiCustomThemeSummary } from '@growi/core';
+
 export const GrowiPluginResourceType = {
 export const GrowiPluginResourceType = {
   Template: 'template',
   Template: 'template',
   Style: 'style',
   Style: 'style',
@@ -12,11 +14,11 @@ export type GrowiPluginOrigin = {
   ghTag?: string,
   ghTag?: string,
 }
 }
 
 
-export type GrowiPlugin = {
+export type GrowiPlugin<M extends GrowiPluginMeta = GrowiPluginMeta> = {
   isEnabled: boolean,
   isEnabled: boolean,
   installedPath: string,
   installedPath: string,
   origin: GrowiPluginOrigin,
   origin: GrowiPluginOrigin,
-  meta: GrowiPluginMeta,
+  meta: M,
 }
 }
 
 
 export type GrowiPluginMeta = {
 export type GrowiPluginMeta = {
@@ -25,3 +27,7 @@ export type GrowiPluginMeta = {
   desc?: string,
   desc?: string,
   author?: string,
   author?: string,
 }
 }
+
+export type GrowiThemePluginMeta = GrowiPluginMeta & {
+  themes: GrowiCustomThemeSummary[]
+}

+ 30 - 3
packages/app/src/server/models/growi-plugin.ts

@@ -1,18 +1,35 @@
+import { GrowiCustomThemeSummary, GrowiThemeSchemeType } from '@growi/core';
 import {
 import {
   Schema, Model, Document,
   Schema, Model, Document,
 } from 'mongoose';
 } from 'mongoose';
 
 
 import {
 import {
-  GrowiPlugin, GrowiPluginMeta, GrowiPluginOrigin, GrowiPluginResourceType,
+  GrowiPlugin, GrowiPluginMeta, GrowiPluginOrigin, GrowiPluginResourceType, GrowiThemePluginMeta,
 } from '~/interfaces/plugin';
 } from '~/interfaces/plugin';
 
 
 import { getOrCreateModel } from '../util/mongoose-utils';
 import { getOrCreateModel } from '../util/mongoose-utils';
 
 
 export interface GrowiPluginDocument extends GrowiPlugin, Document {
 export interface GrowiPluginDocument extends GrowiPlugin, Document {
 }
 }
-export type GrowiPluginModel = Model<GrowiPluginDocument>
+export interface GrowiPluginModel extends Model<GrowiPluginDocument> {
+  findEnabledPlugins(): Promise<GrowiPlugin[]>
+  findEnabledPluginsIncludingTypes(includingTypes: GrowiPluginResourceType[]): Promise<GrowiPlugin[]>
+}
+
+const growiPluginMetaThemesSchema = new Schema<GrowiCustomThemeSummary>({
+  name: { 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 },
+  theme: { type: String, required: true },
+});
 
 
-const growiPluginMetaSchema = new Schema<GrowiPluginMeta>({
+const growiPluginMetaSchema = new Schema<GrowiPluginMeta|GrowiThemePluginMeta>({
   name: { type: String, required: true },
   name: { type: String, required: true },
   types: {
   types: {
     type: [String],
     type: [String],
@@ -21,6 +38,7 @@ const growiPluginMetaSchema = new Schema<GrowiPluginMeta>({
   },
   },
   desc: { type: String },
   desc: { type: String },
   author: { type: String },
   author: { type: String },
+  themes: [growiPluginMetaThemesSchema],
 });
 });
 
 
 const growiPluginOriginSchema = new Schema<GrowiPluginOrigin>({
 const growiPluginOriginSchema = new Schema<GrowiPluginOrigin>({
@@ -36,5 +54,14 @@ const growiPluginSchema = new Schema<GrowiPluginDocument, GrowiPluginModel>({
   meta: growiPluginMetaSchema,
   meta: growiPluginMetaSchema,
 });
 });
 
 
+growiPluginSchema.statics.findEnabledPlugins = async function(): Promise<GrowiPlugin[]> {
+  return this.find({ isEnabled: true });
+};
+growiPluginSchema.statics.findEnabledPluginsIncludingAnyTypes = async function(types: GrowiPluginResourceType[]): Promise<GrowiPlugin[]> {
+  return this.find({
+    isEnabled: true,
+    'meta.types': { $in: types },
+  });
+};
 
 
 export default getOrCreateModel<GrowiPluginDocument, GrowiPluginModel>('GrowiPlugin', growiPluginSchema);
 export default getOrCreateModel<GrowiPluginDocument, GrowiPluginModel>('GrowiPlugin', growiPluginSchema);

+ 11 - 1
packages/app/src/server/service/plugin.ts

@@ -7,7 +7,9 @@ import mongoose from 'mongoose';
 import streamToPromise from 'stream-to-promise';
 import streamToPromise from 'stream-to-promise';
 import unzipper from 'unzipper';
 import unzipper from 'unzipper';
 
 
-import type { GrowiPlugin, GrowiPluginOrigin } from '~/interfaces/plugin';
+import {
+  GrowiPlugin, GrowiPluginOrigin, GrowiPluginResourceType, GrowiThemePluginMeta,
+} from '~/interfaces/plugin';
 import loggerFactory from '~/utils/logger';
 import loggerFactory from '~/utils/logger';
 import { resolveFromRoot } from '~/utils/project-dir-utils';
 import { resolveFromRoot } from '~/utils/project-dir-utils';
 
 
@@ -155,6 +157,14 @@ export class PluginService {
       },
       },
     };
     };
 
 
+    // add theme metadata
+    if (growiPlugin.types.includes(GrowiPluginResourceType.Theme)) {
+      (plugin as GrowiPlugin<GrowiThemePluginMeta>).meta = {
+        ...plugin.meta,
+        themes: growiPlugin.themes,
+      };
+    }
+
     logger.info('Plugin detected => ', plugin);
     logger.info('Plugin detected => ', plugin);
 
 
     return [plugin];
     return [plugin];