فهرست منبع

Merge pull request #3359 from weseek/feat/4572-get-contributors-with-gc-api

Feat/get contributors with gc api #4572
ryo-h 5 سال پیش
والد
کامیت
a867e1e77f

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


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

@@ -4,7 +4,9 @@ import loggerFactory from '@alias/logger';
 import {
   Modal, ModalBody,
 } from 'reactstrap';
-import contributors from './Contributor';
+import contributors from '../../../../../resource/Contributor';
+import AppContainer from '../../services/AppContainer';
+import { withUnstatedContainers } from '../UnstatedUtils';
 
 /**
  * Page staff credit component
@@ -17,13 +19,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,6 +60,10 @@ export default class StaffCredit extends React.Component {
 
   renderContributors() {
     if (this.state.isShown) {
+      if (this.state.contributors != null) {
+        // TODO: merge gcContributors to Contributors
+        // refs: https://youtrack.weseek.co.jp/issue/GW-4573
+      }
       const credit = contributors.map((contributor) => {
         // construct members elements
         const memberGroups = contributor.memberGroups.map((memberGroup, idx) => {
@@ -98,6 +105,11 @@ export default class StaffCredit extends React.Component {
         color: '#FFFFFF',
       });
     }, 10);
+
+    this.props.appContainer.apiv3Get('/staffs').then((res) => {
+      this.setState({ contributors: res.data });
+    });
+
   }
 
   render() {
@@ -123,6 +135,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;
 };

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

@@ -0,0 +1,45 @@
+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;
+let contributorsCache = contributors;
+
+
+module.exports = (crowi) => {
+
+  router.get('/', async(req, res) => {
+    const now = new Date();
+    const growiCloudUri = await crowi.configManager.getConfig('crowi', 'app:growiCloudUri');
+
+    if (expiredAt == null || isAfter(now, expiredAt) || growiCloudUri != null) {
+      const url = new URL('_api/staffCredit', growiCloudUri);
+      const growiContributors = contributors.slice(0, 1);
+      const otherContributors = contributors.slice(1);
+      try {
+        const gcContributorsRes = await axios.get(url.toString());
+        const gcContributors = gcContributorsRes.data;
+        // caching 'expiredAt' for 1 hour
+        expiredAt = addHours(now, 1);
+        // caching merged contributors
+        contributorsCache = growiContributors.concat(gcContributors, otherContributors);
+      }
+      catch (err) {
+        logger.warn('Getting GROWI.cloud staffcredit is failed');
+      }
+    }
+    return res.apiv3({ contributorsCache });
+  });
+
+  return router;
+
+};