jam411 3 лет назад
Родитель
Сommit
9ad5d86101

+ 1 - 1
packages/app/src/components/Admin/PluginsExtension/PluginCard.tsx

@@ -23,7 +23,7 @@ export const PluginCard = (props: Props): JSX.Element => {
 
   const { data, mutate } = useSWRxPlugin(id);
 
-  if (data == null) {
+  if (data == null || data.plugin == null) {
     return <></>;
   }
 

+ 20 - 1
packages/app/src/server/models/growi-plugin.ts

@@ -1,6 +1,6 @@
 import { GrowiThemeMetadata, GrowiThemeSchemeType } from '@growi/core';
 import {
-  Schema, Model, Document,
+  Schema, Model, Document, Types,
 } from 'mongoose';
 
 import {
@@ -14,6 +14,9 @@ export interface GrowiPluginDocument extends GrowiPlugin, Document {
 export interface GrowiPluginModel extends Model<GrowiPluginDocument> {
   findEnabledPlugins(): Promise<GrowiPlugin[]>
   findEnabledPluginsIncludingAnyTypes(includingTypes: GrowiPluginResourceType[]): Promise<GrowiPlugin[]>
+  getPlugin(id: Types.ObjectId): Promise<GrowiPlugin | null>
+  activateStatus(id: Types.ObjectId): Promise<GrowiPlugin | null>
+  deactivateStatus(id: Types.ObjectId): Promise<GrowiPlugin | null>
 }
 
 const growiThemeMetadataSchema = new Schema<GrowiThemeMetadata>({
@@ -58,6 +61,7 @@ const growiPluginSchema = new Schema<GrowiPluginDocument, GrowiPluginModel>({
 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,
@@ -65,4 +69,19 @@ growiPluginSchema.statics.findEnabledPluginsIncludingAnyTypes = async function(t
   });
 };
 
+growiPluginSchema.statics.getPlugin = async function(id: Types.ObjectId): Promise<GrowiPlugin | null> {
+  const growiPlugin = await this.findOne({ _id: id });
+  return growiPlugin;
+};
+
+growiPluginSchema.statics.activateStatus = async function(id: Types.ObjectId): Promise<GrowiPlugin | null> {
+  const growiPlugin = await this.findOneAndUpdate({ _id: id }, { isEnabled: true });
+  return growiPlugin;
+};
+
+growiPluginSchema.statics.deactivateStatus = async function(id: Types.ObjectId): Promise<GrowiPlugin | null> {
+  const growiPlugin = await this.findOneAndUpdate({ _id: id }, { isEnabled: false });
+  return growiPlugin;
+};
+
 export default getOrCreateModel<GrowiPluginDocument, GrowiPluginModel>('GrowiPlugin', growiPluginSchema);

+ 10 - 6
packages/app/src/server/routes/apiv3/plugins.ts

@@ -3,6 +3,7 @@ import { body, query } from 'express-validator';
 import mongoose from 'mongoose';
 
 import Crowi from '../../crowi';
+import type { GrowiPluginModel } from '../../models/growi-plugin';
 
 import { ApiV3Response } from './interfaces/apiv3-response';
 
@@ -50,7 +51,8 @@ module.exports = (crowi: Crowi): Router => {
     const pluginId = new ObjectID(id);
 
     try {
-      const data = await pluginService.getPlugin(pluginId);
+      const GrowiPluginModel = mongoose.model('GrowiPlugin') as GrowiPluginModel;
+      const data = await GrowiPluginModel.getPlugin(pluginId);
       return res.apiv3({ plugin: data });
     }
     catch (err) {
@@ -67,7 +69,7 @@ module.exports = (crowi: Crowi): Router => {
 
     try {
       await pluginService.install(formValue);
-      return res.apiv3({});
+      return res.apiv3();
     }
     catch (err) {
       return res.apiv3Err(err);
@@ -83,8 +85,9 @@ module.exports = (crowi: Crowi): Router => {
     const pluginId = new ObjectID(id);
 
     try {
-      const pluginIsEnabled = await pluginService.switchPluginIsEnabled(pluginId);
-      return res.apiv3({ isEnabled: pluginIsEnabled });
+      const GrowiPluginModel = mongoose.model('GrowiPlugin') as GrowiPluginModel;
+      const data = await GrowiPluginModel.activateStatus(pluginId);
+      return res.apiv3({ isEnabled: data?.isEnabled });
     }
     catch (err) {
       return res.apiv3Err(err);
@@ -100,8 +103,9 @@ module.exports = (crowi: Crowi): Router => {
     const pluginId = new ObjectID(id);
 
     try {
-      const pluginIsEnabled = await pluginService.switchPluginIsEnabled(pluginId);
-      return res.apiv3({ isEnabled: pluginIsEnabled });
+      const GrowiPluginModel = mongoose.model('GrowiPlugin') as GrowiPluginModel;
+      const data = await GrowiPluginModel.deactivateStatus(pluginId);
+      return res.apiv3({ isEnabled: data?.isEnabled });
     }
     catch (err) {
       return res.apiv3Err(err);

+ 0 - 35
packages/app/src/server/service/plugin.ts

@@ -209,41 +209,6 @@ export class PluginService implements IPluginService {
     return entries;
   }
 
-  /**
-   * Get plugin data
-   */
-  async getPlugin(pluginId: mongoose.Types.ObjectId): Promise<GrowiPlugin> {
-    const GrowiPlugin = mongoose.model<GrowiPlugin>('GrowiPlugin');
-    const growiPlugin = await GrowiPlugin.findById(pluginId);
-
-    if (growiPlugin == null) {
-      throw new Error('No plugin found for this ID.');
-    }
-
-    return growiPlugin;
-  }
-
-  /**
-   * Switch plugin enabled
-   */
-  async switchPluginIsEnabled(pluginId: mongoose.Types.ObjectId): Promise<boolean> {
-    const GrowiPlugin = mongoose.model<GrowiPlugin>('GrowiPlugin');
-    const growiPlugins = await GrowiPlugin.findById(pluginId);
-
-    if (growiPlugins == null) {
-      throw new Error('No plugin found for this ID.');
-    }
-
-    try {
-      await growiPlugins.update({ isEnabled: !growiPlugins.isEnabled });
-    }
-    catch (err) {
-      throw new Error('Plugin status switching failed.');
-    }
-
-    return growiPlugins.isEnabled;
-  }
-
   /**
    * Delete plugin
    */

+ 3 - 2
packages/app/src/stores/plugin.tsx

@@ -4,6 +4,7 @@ import useSWR, { SWRResponse } from 'swr';
 import { apiv3Get } from '~/client/util/apiv3-client';
 import { GrowiPluginHasId } from '~/interfaces/plugin';
 
+// TODO: Check types
 type Plugins = {
   plugins: GrowiPluginHasId[]
 }
@@ -26,7 +27,7 @@ const pluginsFetcher = () => {
   };
 };
 
-export const useSWRxPlugins = (): SWRResponse<Plugins | null, Error> => {
+export const useSWRxPlugins = (): SWRResponse<Plugins, Error> => {
   return useSWR('/plugins', pluginsFetcher());
 };
 
@@ -44,6 +45,6 @@ const pluginFetcher = (id: string) => {
   };
 };
 
-export const useSWRxPlugin = (_id: string): SWRResponse<Plugin | null, Error> => {
+export const useSWRxPlugin = (_id: string): SWRResponse<Plugin, Error> => {
   return useSWR(`/plugin-${_id}`, pluginFetcher(_id));
 };