Просмотр исходного кода

Merge pull request #3443 from weseek/feat/4328-display-growi-cloud-member-staffcredit

Feat/4328 display growi cloud member staffcredit [integration branch]
Yuki Takei 5 лет назад
Родитель
Сommit
c3e4077845

+ 4 - 0
src/client/js/components/StaffCredit/Contributor.js → resource/Contributor.js

@@ -1,5 +1,6 @@
 const contributors = [
   {
+    order: 1,
     sectionName: 'GROWI VILLAGE',
     additionalClass: '',
     memberGroups: [
@@ -47,6 +48,7 @@ const contributors = [
     ],
   },
   {
+    order: 10,
     sectionName: 'CONTRIBUTER',
     additionalClass: '',
     memberGroups: [
@@ -92,6 +94,7 @@ const contributors = [
     ],
   },
   {
+    order: 100,
     sectionName: 'VULNERABILITY HUNTER',
     additionalClass: '',
     memberGroups: [
@@ -111,6 +114,7 @@ const contributors = [
     ],
   },
   {
+    order: 200,
     sectionName: 'SPECIAL THANKS',
     additionalClass: '',
     memberGroups: [

+ 20 - 4
src/client/js/components/StaffCredit/StaffCredit.jsx

@@ -4,7 +4,8 @@ import loggerFactory from '@alias/logger';
 import {
   Modal, ModalBody,
 } from 'reactstrap';
-import contributors from './Contributor';
+import AppContainer from '../../services/AppContainer';
+import { withUnstatedContainers } from '../UnstatedUtils';
 
 /**
  * Page staff credit component
@@ -17,13 +18,14 @@ import contributors from './Contributor';
 // eslint-disable-next-line no-unused-vars
 const logger = loggerFactory('growi:cli:StaffCredit');
 
-export default class StaffCredit extends React.Component {
+class StaffCredit extends React.Component {
 
   constructor(props) {
 
     super(props);
     this.state = {
       isShown: true,
+      contributors: null,
     };
     this.deleteCredit = this.deleteCredit.bind(this);
   }
@@ -57,7 +59,7 @@ export default class StaffCredit extends React.Component {
 
   renderContributors() {
     if (this.state.isShown) {
-      const credit = contributors.map((contributor) => {
+      const credit = this.state.contributors.map((contributor) => {
         // construct members elements
         const memberGroups = contributor.memberGroups.map((memberGroup, idx) => {
           return this.renderMembers(memberGroup, `${contributor.sectionName}-group${idx}`);
@@ -83,7 +85,11 @@ export default class StaffCredit extends React.Component {
     return null;
   }
 
-  componentDidMount() {
+  async componentDidMount() {
+    const res = await this.props.appContainer.apiv3Get('/staffs');
+    const contributors = res.data.contributors;
+    this.setState({ contributors });
+
     setTimeout(() => {
       // px / sec
       const scrollSpeed = 200;
@@ -103,6 +109,10 @@ export default class StaffCredit extends React.Component {
   render() {
     const { onClosed } = this.props;
 
+    if (this.state.contributors === null) {
+      return <></>;
+    }
+
     return (
       <Modal
         isOpen={this.state.isShown}
@@ -123,6 +133,12 @@ export default class StaffCredit extends React.Component {
   }
 
 }
+
+const StaffCreditWrapper = withUnstatedContainers(StaffCredit, [AppContainer]);
+
 StaffCredit.propTypes = {
   onClosed: PropTypes.func,
+  appContainer: PropTypes.instanceOf(AppContainer).isRequired,
 };
+
+export default StaffCreditWrapper;

+ 2 - 0
src/server/routes/apiv3/index.js

@@ -46,5 +46,7 @@ module.exports = (crowi) => {
   router.use('/bookmarks', require('./bookmarks')(crowi));
   router.use('/attachment', require('./attachment')(crowi));
 
+  router.use('/staffs', require('./staffs')(crowi));
+
   return router;
 };

+ 52 - 0
src/server/routes/apiv3/staffs.js

@@ -0,0 +1,52 @@
+const loggerFactory = require('@alias/logger');
+
+const logger = loggerFactory('growi:routes:apiv3:staffs'); // eslint-disable-line no-unused-vars
+
+const express = require('express');
+
+const axios = require('axios');
+
+const router = express.Router();
+const { isAfter, addHours } = require('date-fns');
+
+const contributors = require('../../../../resource/Contributor');
+
+let expiredAt;
+const contributorsCache = contributors;
+let gcContributors;
+
+// Sorting contributors by this method
+const compareFunction = function(a, b) {
+  return a.order - b.order;
+};
+
+module.exports = (crowi) => {
+
+  router.get('/', async(req, res) => {
+    const now = new Date();
+    const growiCloudUri = await crowi.configManager.getConfig('crowi', 'app:growiCloudUri');
+
+    if (growiCloudUri != null && (expiredAt == null || isAfter(now, expiredAt))) {
+      const url = new URL('_api/staffCredit', growiCloudUri);
+      try {
+        const gcContributorsRes = await axios.get(url.toString());
+        if (gcContributors == null) {
+          gcContributors = gcContributorsRes.data;
+          // merging contributors
+          contributorsCache.push(gcContributors);
+        }
+        // Change the order of section
+        contributorsCache.sort(compareFunction);
+        // caching 'expiredAt' for 1 hour
+        expiredAt = addHours(now, 1);
+      }
+      catch (err) {
+        logger.warn('Getting GROWI.cloud staffcredit is failed');
+      }
+    }
+    return res.apiv3({ contributors: contributorsCache });
+  });
+
+  return router;
+
+};