2
0
Эх сурвалжийг харах

feat: admin utilities - rerender all pages

NGPixel 5 жил өмнө
parent
commit
0d6562cca4

+ 2 - 2
client/components/admin.vue

@@ -86,8 +86,8 @@
             v-list-item(to='/mail', color='primary', v-if='hasPermission(`manage:system`)')
               v-list-item-avatar(size='24'): v-icon mdi-email-multiple-outline
               v-list-item-title {{ $t('admin:mail.title') }}
-            v-list-item(to='/ssl', color='primary', v-if='hasPermission(`manage:system`)')
-              v-list-item-avatar(size='24'): v-icon mdi-cloud-lock-outline
+            v-list-item(to='/ssl', v-if='hasPermission(`manage:system`)', disabled)
+              v-list-item-avatar(size='24'): v-icon(color='grey lighten-2') mdi-cloud-lock-outline
               v-list-item-title {{ $t('admin:ssl.title') }}
             v-list-item(to='/system', color='primary', v-if='hasPermission(`manage:system`)')
               v-list-item-avatar(size='24'): v-icon mdi-tune

+ 116 - 0
client/components/admin/admin-utilities-content.vue

@@ -9,6 +9,35 @@
         v-icon(left) mdi-gesture-double-tap
         span Proceed
       v-divider.my-5
+      .subtitle-1.pb-3.primary--text Rerender All Pages
+      .body-2 All pages will be rendered again. Useful if internal links are broken or the rendering pipeline has changed.
+      v-btn(outlined, color='primary', @click='rerenderPages', :disabled='loading', :loading='isRerendering').ml-0.mt-3
+        v-icon(left) mdi-gesture-double-tap
+        span Proceed
+      v-dialog(
+        v-model='isRerendering'
+        persistent
+        max-width='450'
+        )
+        v-card(color='blue darken-2', dark)
+          v-card-text.pa-10.text-center
+            semipolar-spinner.animated.fadeIn(
+              :animation-duration='1500'
+              :size='65'
+              color='#FFF'
+              style='margin: 0 auto;'
+            )
+            .mt-5.body-1.white--text Rendering all pages...
+            .caption(v-if='renderIndex > 0') Rendering {{renderCurrentPath}}... ({{renderIndex}}/{{renderTotal}}, {{renderProgress}}%)
+            .caption.mt-4 Do not leave this page.
+            v-progress-linear.mt-5(
+              color='white'
+              :value='renderProgress'
+              stream
+              rounded
+              :buffer-value='0'
+            )
+      v-divider.my-5
       .subtitle-1.pb-3.pl-0.primary--text Migrate all pages to target locale
       .body-2 If you created content before selecting a different locale and activating the namespacing capabilities, you may want to transfer all content to the base locale.
       .body-2.red--text: strong This operation is destructive and cannot be reversed! Make sure you have proper backups!
@@ -40,15 +69,26 @@
 
 <script>
 import _ from 'lodash'
+import gql from 'graphql-tag'
 import utilityContentMigrateLocaleMutation from 'gql/admin/utilities/utilities-mutation-content-migratelocale.gql'
 import utilityContentRebuildTreeMutation from 'gql/admin/utilities/utilities-mutation-content-rebuildtree.gql'
 
+import { SemipolarSpinner } from 'epic-spinners'
+
 /* global siteLangs, siteConfig */
 
 export default {
+  components: {
+    SemipolarSpinner
+  },
   data: () => {
     return {
+      isRerendering: false,
       loading: false,
+      renderProgress: 0,
+      renderIndex: 0,
+      renderTotal: 0,
+      renderCurrentPath: '',
       sourceLocale: '',
       targetLocale: ''
     }
@@ -87,6 +127,82 @@ export default {
       this.$store.commit(`loadingStop`, 'admin-utilities-content-rebuildtree')
       this.loading = false
     },
+    async rerenderPages () {
+      this.loading = true
+      this.isRerendering = true
+      this.$store.commit(`loadingStart`, 'admin-utilities-content-rerender')
+
+      try {
+        const pagesRaw = await this.$apollo.query({
+          query: gql`
+            {
+              pages {
+                list {
+                  id
+                  path
+                  locale
+                }
+              }
+            }
+          `,
+          fetchPolicy: 'network-only'
+        })
+        if (_.get(pagesRaw, 'data.pages.list', []).length < 1) {
+          throw new Error('Could not find any page to render!')
+        }
+
+        this.renderIndex = 0
+        this.renderTotal = pagesRaw.data.pages.list.length
+        let failed = 0
+        for (const page of pagesRaw.data.pages.list) {
+          this.renderCurrentPath = `${page.locale}/${page.path}`
+          this.renderIndex++
+          this.renderProgress = Math.round(this.renderIndex / this.renderTotal * 100)
+          const respRaw = await this.$apollo.mutate({
+            mutation: gql`
+              mutation($id: Int!) {
+                pages {
+                  render(id: $id) {
+                    responseResult {
+                      succeeded
+                      errorCode
+                      slug
+                      message
+                    }
+                  }
+                }
+              }
+            `,
+            variables: {
+              id: page.id
+            }
+          })
+          const resp = _.get(respRaw, 'data.pages.render.responseResult', {})
+          if (!resp.succeeded) {
+            failed++
+          }
+        }
+        if (failed > 0) {
+          this.$store.commit('showNotification', {
+            message: `Completed with ${failed} pages that failed to render. Check server logs for details.`,
+            style: 'error',
+            icon: 'alert'
+          })
+        } else {
+          this.$store.commit('showNotification', {
+            message: 'All pages have been rendered successfully.',
+            style: 'success',
+            icon: 'check'
+          })
+        }
+      } catch (err) {
+        this.$store.commit('pushGraphError', err)
+      }
+
+      this.$store.commit(`loadingStop`, 'admin-utilities-content-rerender')
+      this.isRerendering = false
+      this.loading = false
+    },
     async migrateToLocale () {
       this.loading = true
       this.$store.commit(`loadingStart`, 'admin-utilities-content-migratelocale')

+ 17 - 0
server/graph/resolvers/page.js

@@ -312,6 +312,23 @@ module.exports = {
       } catch (err) {
         return graphHelper.generateError(err)
       }
+    },
+    /**
+     * RENDER PAGE
+     */
+    async render (obj, args, context) {
+      try {
+        const page = await WIKI.models.pages.query().findById(args.id)
+        if (!page) {
+          throw new Error('Invalid Page Id')
+        }
+        await WIKI.models.pages.renderPage(page)
+        return {
+          responseResult: graphHelper.generateSuccess('Page rendered successfully.')
+        }
+      } catch (err) {
+        return graphHelper.generateError(err)
+      }
     }
   },
   Page: {

+ 4 - 0
server/graph/schemas/page.graphql

@@ -106,6 +106,10 @@ type PageMutation {
   ): PageMigrationResponse @auth(requires: ["manage:system"])
 
   rebuildTree: DefaultResponse @auth(requires: ["manage:system"])
+
+  render(
+    id: Int!
+  ): DefaultResponse @auth(requires: ["manage:system"])
 }
 
 # -----------------------------------------------