Sfoglia il codice sorgente

Merge pull request #16 from weseek/support/save-growi-plugin-documents

growi plugin install 時に document save
ffujisawa 3 anni fa
parent
commit
c701d72f42

+ 4 - 2
packages/app/src/pages/_document.page.tsx

@@ -1,5 +1,6 @@
 import React from 'react';
 import React from 'react';
 
 
+import mongoose from 'mongoose';
 import Document, {
 import Document, {
   DocumentContext, DocumentInitialProps,
   DocumentContext, DocumentInitialProps,
   Html, Head, Main, NextScript,
   Html, Head, Main, NextScript,
@@ -87,8 +88,9 @@ class GrowiDocument extends Document<GrowiDocumentProps> {
     const initialProps: DocumentInitialProps = await Document.getInitialProps(ctx);
     const initialProps: DocumentInitialProps = await Document.getInitialProps(ctx);
 
 
     // TODO: load GrowiPlugin documents from DB
     // TODO: load GrowiPlugin documents from DB
-    // const pluginManifestEntries: GrowiPluginManifestEntries = await ActivatePluginService.retrievePluginManifests(growiPluginsExample);
-    const pluginManifestEntries: GrowiPluginManifestEntries = await ActivatePluginService.retrievePluginManifests([]);
+    const GrowiPlugin = mongoose.model<GrowiPlugin>('GrowiPlugin');
+    const growiPlugins = await GrowiPlugin.find({ isEnabled: true });
+    const pluginManifestEntries: GrowiPluginManifestEntries = await ActivatePluginService.retrievePluginManifests(growiPlugins);
 
 
     return { ...initialProps, pluginManifestEntries };
     return { ...initialProps, pluginManifestEntries };
   }
   }

+ 2 - 1
packages/app/src/server/crowi/index.js

@@ -15,6 +15,7 @@ import loggerFactory from '~/utils/logger';
 import { projectRoot } from '~/utils/project-dir-utils';
 import { projectRoot } from '~/utils/project-dir-utils';
 
 
 import Activity from '../models/activity';
 import Activity from '../models/activity';
+import GrowiPlugin from '../models/growi-plugin';
 import PageRedirect from '../models/page-redirect';
 import PageRedirect from '../models/page-redirect';
 import Tag from '../models/tag';
 import Tag from '../models/tag';
 import UserGroup from '../models/user-group';
 import UserGroup from '../models/user-group';
@@ -68,7 +69,6 @@ function Crowi() {
   this.importService = null;
   this.importService = null;
   this.pluginService = null;
   this.pluginService = null;
   this.searchService = null;
   this.searchService = null;
-  this.pluginService = null;
   this.socketIoService = null;
   this.socketIoService = null;
   this.pageService = null;
   this.pageService = null;
   this.syncPageStatusService = null;
   this.syncPageStatusService = null;
@@ -296,6 +296,7 @@ Crowi.prototype.setupModels = async function() {
   allModels.Tag = Tag;
   allModels.Tag = Tag;
   allModels.UserGroup = UserGroup;
   allModels.UserGroup = UserGroup;
   allModels.PageRedirect = PageRedirect;
   allModels.PageRedirect = PageRedirect;
+  allModels.growiPlugin = GrowiPlugin;
 
 
   Object.keys(allModels).forEach((key) => {
   Object.keys(allModels).forEach((key) => {
     return this.model(key, models[key](this));
     return this.model(key, models[key](this));

+ 40 - 0
packages/app/src/server/models/growi-plugin.ts

@@ -0,0 +1,40 @@
+import {
+  Schema, Model, Document,
+} from 'mongoose';
+
+import {
+  GrowiPlugin, GrowiPluginMeta, GrowiPluginOrigin, GrowiPluginResourceType,
+} from '~/interfaces/plugin';
+
+import { getOrCreateModel } from '../util/mongoose-utils';
+
+export interface GrowiPluginDocument extends GrowiPlugin, Document {
+}
+export type GrowiPluginModel = Model<GrowiPluginDocument>
+
+const growiPluginMetaSchema = new Schema<GrowiPluginMeta>({
+  name: { type: String, required: true },
+  types: {
+    type: [String],
+    enum: GrowiPluginResourceType,
+    require: true,
+  },
+  desc: { type: String },
+  author: { type: String },
+});
+
+const growiPluginOriginSchema = new Schema<GrowiPluginOrigin>({
+  url: { type: String },
+  ghBranch: { type: String },
+  ghTag: { type: String },
+});
+
+const growiPluginSchema = new Schema<GrowiPluginDocument, GrowiPluginModel>({
+  isEnabled: { type: Boolean },
+  installedPath: { type: String },
+  origin: growiPluginOriginSchema,
+  meta: growiPluginMetaSchema,
+});
+
+
+export default getOrCreateModel<GrowiPluginDocument, GrowiPluginModel>('GrowiPlugin', growiPluginSchema);

+ 29 - 3
packages/app/src/server/service/plugin.ts

@@ -1,8 +1,10 @@
-
 import { execSync } from 'child_process';
 import { execSync } from 'child_process';
+import fs from 'fs';
 import path from 'path';
 import path from 'path';
 
 
-import { GrowiPlugin, GrowiPluginOrigin } from '~/interfaces/plugin';
+import mongoose from 'mongoose';
+
+import { GrowiPlugin, GrowiPluginMeta, GrowiPluginOrigin } 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';
 
 
@@ -42,10 +44,34 @@ export class PluginService {
     }
     }
 
 
     // TODO: detect plugins
     // TODO: detect plugins
-    // TODO: save documents
+    // save plugin metadata
+    const ghRepositoryName = ghUrl.split('/').slice(-1)[0];
+    const installedPath = path.join(downloadDir, `${ghRepositoryName}-master`, 'meta.json');
+    await this.savePluginMetaData(installedPath);
+
     return;
     return;
   }
   }
 
 
+  async savePluginMetaData(installedPath: string): Promise<void> {
+    const metaData = this.getPluginMetaData(installedPath);
+    const GrowiPlugin = mongoose.model('GrowiPlugin');
+
+    await GrowiPlugin.insertMany({
+      isEnabled: true,
+      installedPath,
+      meta: {
+        name: metaData.name,
+        types: metaData.types,
+        author: metaData.author,
+      },
+    });
+  }
+
+  private getPluginMetaData(installedPath: string): GrowiPluginMeta {
+    const metaDataJSON = JSON.parse(fs.readFileSync(installedPath, 'utf-8'));
+    return metaDataJSON;
+  }
+
   // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
   // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
   static async detectPlugins(origin: GrowiPluginOrigin, installedPath: string, parentPackageJson?: any): Promise<GrowiPlugin[]> {
   static async detectPlugins(origin: GrowiPluginOrigin, installedPath: string, parentPackageJson?: any): Promise<GrowiPlugin[]> {
     const packageJsonPath = path.resolve(pluginStoringPath, installedPath, 'package.json');
     const packageJsonPath = path.resolve(pluginStoringPath, installedPath, 'package.json');