From 076e923d48904cfb9d54dfba46242f6d63453ad1 Mon Sep 17 00:00:00 2001 From: NGPixel Date: Sun, 22 Jul 2018 16:25:39 -0400 Subject: [PATCH] feat: save page + create event for storage targets --- client/components/admin/admin-contribute.vue | 7 ++++++- client/components/editor.vue | 2 ++ client/components/editor/editor-code.vue | 1 + client/graph/editor/create.gql | 4 ++-- client/store/editor.js | 13 ++++++------ server/app/data.yml | 7 +++++++ server/core/queue.js | 10 +++++++--- server/db/models/pages.js | 20 +++++++++++++++++++ server/db/models/storage.js | 15 ++++++++++++++ server/db/models/users.js | 1 - server/graph/resolvers/page.js | 11 ++-------- server/graph/schemas/page.graphql | 10 ++++++---- server/jobs/sync-storage.js | 20 +++++++++++++++++++ server/modules/storage/azure/storage.js | 14 ++++++------- .../modules/storage/digitalocean/storage.js | 14 ++++++------- server/modules/storage/disk/storage.js | 14 ++++++------- server/modules/storage/dropbox/storage.js | 14 ++++++------- server/modules/storage/gdrive/storage.js | 14 ++++++------- server/modules/storage/git/storage.js | 14 ++++++------- server/modules/storage/onedrive/storage.js | 14 ++++++------- server/modules/storage/s3/storage.js | 14 ++++++------- server/modules/storage/scp/storage.js | 14 ++++++------- 22 files changed, 158 insertions(+), 89 deletions(-) create mode 100644 server/jobs/sync-storage.js diff --git a/client/components/admin/admin-contribute.vue b/client/components/admin/admin-contribute.vue index c03a4453..c6028649 100644 --- a/client/components/admin/admin-contribute.vue +++ b/client/components/admin/admin-contribute.vue @@ -12,10 +12,15 @@ v-divider.mt-3 v-subheader {{ $t('admin:contribute.fundOurWork') }} .body-1.pl-3 {{ $t('admin:contribute.openCollective') }} - v-card-actions.mt-3.ml-2 + v-card-actions.ml-2 v-btn(depressed, color='primary', href='https://opencollective.com/wikijs') v-icon(left) local_atm span {{ $t('admin:contribute.makeADonation') }} + .body-1.mt-3.pl-3 {{ $t('admin:contribute.tshirts') }} + v-card-actions.ml-2 + v-btn(depressed, color='primary', href='https://wikijs.threadless.com') + v-icon(left) shopping_cart + span {{ $t('admin:contribute.shop') }} v-divider.mt-3 v-subheader {{ $t('admin:contribute.contribute') }} .body-1.pl-3 diff --git a/client/components/editor.vue b/client/components/editor.vue index 508f62da..28f802f0 100644 --- a/client/components/editor.vue +++ b/client/components/editor.vue @@ -94,9 +94,11 @@ export default { const resp = await this.$apollo.mutate({ mutation: createPageMutation, variables: { + content: this.$store.get('editor/content'), description: this.$store.get('editor/description'), editor: 'markdown', locale: this.$store.get('editor/locale'), + isPrivate: false, isPublished: this.$store.get('editor/isPublished'), path: this.$store.get('editor/path'), publishEndDate: this.$store.get('editor/publishEndDate'), diff --git a/client/components/editor/editor-code.vue b/client/components/editor/editor-code.vue index 991a4a74..c0ce43cf 100644 --- a/client/components/editor/editor-code.vue +++ b/client/components/editor/editor-code.vue @@ -220,6 +220,7 @@ export default { }, onCmInput: _.debounce(function (newContent) { linesMap = [] + this.$store.set('editor/content', newContent) this.previewHTML = md.render(newContent) this.$nextTick(() => { Prism.highlightAllUnder(this.$refs.editorPreview) diff --git a/client/graph/editor/create.gql b/client/graph/editor/create.gql index 55b303cf..131082c9 100644 --- a/client/graph/editor/create.gql +++ b/client/graph/editor/create.gql @@ -1,6 +1,6 @@ -mutation ($description: String, $editor: String, $isPublished: Boolean!, $locale: String!, $path: String!, $publishEndDate: Date, $publishStartDate: Date, $tags: [String], $title: String!) { +mutation ($content: String!, $description: String!, $editor: String!, $isPrivate: Boolean!, $isPublished: Boolean!, $locale: String!, $path: String!, $publishEndDate: Date, $publishStartDate: Date, $tags: [String]!, $title: String!) { pages { - create(description: $description, editor: $editor, isPublished: $isPublished, locale: $locale, path: $path, publishEndDate: $publishEndDate, publishStartDate: $publishStartDate, tags: $tags, title: $title) { + create(content: $content, description: $description, editor: $editor, isPrivate: $isPrivate, isPublished: $isPublished, locale: $locale, path: $path, publishEndDate: $publishEndDate, publishStartDate: $publishStartDate, tags: $tags, title: $title) { responseResult { succeeded errorCode diff --git a/client/store/editor.js b/client/store/editor.js index a4d95a41..b66ee8f5 100644 --- a/client/store/editor.js +++ b/client/store/editor.js @@ -1,15 +1,16 @@ import { make } from 'vuex-pathify' const state = { - title: '', + content: '', description: '', - tags: [], - path: '', isPublished: true, - publishStartDate: '', - publishEndDate: '', locale: 'en', - mode: 'create' + mode: 'create', + path: '', + publishEndDate: '', + publishStartDate: '', + tags: [], + title: '' } export default { diff --git a/server/app/data.yml b/server/app/data.yml index 403fd040..ef76ffcc 100644 --- a/server/app/data.yml +++ b/server/app/data.yml @@ -61,12 +61,19 @@ jobs: fetchGraphLocale: onInit: false cron: false + concurrency: 0 purgeUploads: onInit: true cron: '*/15 * * * *' + concurrency: 0 syncGraphLocales: onInit: true cron: '0 0 * * *' + concurrency: 0 + syncStorage: + onInit: false + cron: false + concurrency: 1 telemetry: BUGSNAG_ID: 'bb4b324d0675bcbba10025617fd2cec8' BUGSNAG_REMOTE: 'https://notify.bugsnag.com' diff --git a/server/core/queue.js b/server/core/queue.js index bf6500dd..8f0189b7 100644 --- a/server/core/queue.js +++ b/server/core/queue.js @@ -10,10 +10,14 @@ module.exports = { init() { _.forOwn(WIKI.data.jobs, (queueParams, queueName) => { this.job[queueName] = new Bull(queueName, { - prefix: `q-${WIKI.config.ha.uid}`, + prefix: `queue`, redis: WIKI.config.redis }) - this.job[queueName].process(path.join(WIKI.SERVERPATH, `jobs/${_.kebabCase(queueName)}.js`)) + if (queueParams.concurrency > 0) { + this.job[queueName].process(queueParams.concurrency, path.join(WIKI.SERVERPATH, `jobs/${_.kebabCase(queueName)}.js`)) + } else { + this.job[queueName].process(path.join(WIKI.SERVERPATH, `jobs/${_.kebabCase(queueName)}.js`)) + } }) return this }, @@ -36,7 +40,7 @@ module.exports = { return Promise.each(_.keys(WIKI.data.jobs), queueName => { return new Promise((resolve, reject) => { let keyStream = WIKI.redis.scanStream({ - match: `q-${WIKI.config.ha.uid}:${queueName}:*` + match: `queue:${queueName}:*` }) keyStream.on('data', resultKeys => { if (resultKeys.length > 0) { diff --git a/server/db/models/pages.js b/server/db/models/pages.js index 03784ccb..e8780934 100644 --- a/server/db/models/pages.js +++ b/server/db/models/pages.js @@ -1,5 +1,7 @@ const Model = require('objection').Model +/* global WIKI */ + /** * Pages model */ @@ -75,4 +77,22 @@ module.exports = class Page extends Model { this.createdAt = new Date().toISOString() this.updatedAt = new Date().toISOString() } + + static async createPage(opts) { + const page = await WIKI.db.pages.query().insertAndFetch({ + authorId: opts.authorId, + content: opts.content, + description: opts.description, + editorKey: opts.editor, + isPrivate: opts.isPrivate, + isPublished: opts.isPublished, + localeCode: opts.locale, + path: opts.path, + publishEndDate: opts.publishEndDate, + publishStartDate: opts.publishStartDate, + title: opts.title + }) + await WIKI.db.storage.createPage(page) + return page + } } diff --git a/server/db/models/storage.js b/server/db/models/storage.js index a77bc626..b3eac75b 100644 --- a/server/db/models/storage.js +++ b/server/db/models/storage.js @@ -86,4 +86,19 @@ module.exports = class Storage extends Model { WIKI.logger.error(err) } } + + static async createPage(page) { + const targets = await WIKI.db.storage.query().where('isEnabled', true) + if (targets && targets.length > 0) { + _.forEach(targets, target => { + WIKI.queue.job.syncStorage.add({ + event: 'created', + target, + page + }, { + removeOnComplete: true + }) + }) + } + } } diff --git a/server/db/models/users.js b/server/db/models/users.js index f445d67b..affd9b63 100644 --- a/server/db/models/users.js +++ b/server/db/models/users.js @@ -193,7 +193,6 @@ module.exports = class User extends Model { } static async login (opts, context) { - console.info(context) if (_.has(WIKI.auth.strategies, opts.strategy)) { _.set(context.req, 'body.email', opts.username) _.set(context.req, 'body.password', opts.password) diff --git a/server/graph/resolvers/page.js b/server/graph/resolvers/page.js index f44d4e95..ca3dcb00 100644 --- a/server/graph/resolvers/page.js +++ b/server/graph/resolvers/page.js @@ -22,16 +22,9 @@ module.exports = { }, PageMutation: { async create(obj, args, context) { - const page = await WIKI.db.pages.query().insertAndFetch({ - path: args.path, - title: args.title, - description: args.description, + const page = await WIKI.db.pages.createPage({ + ...args, isPrivate: false, - isPublished: args.isPublished, - publishStartDate: args.publishStartDate, - publishEndDate: args.publishEndDate, - localeCode: args.locale, - editorKey: args.editor, authorId: context.req.user.id }) return { diff --git a/server/graph/schemas/page.graphql b/server/graph/schemas/page.graphql index a8118fd7..7ec3fb0c 100644 --- a/server/graph/schemas/page.graphql +++ b/server/graph/schemas/page.graphql @@ -34,20 +34,22 @@ type PageQuery { type PageMutation { create( - description: String - editor: String + content: String! + description: String! + editor: String! isPublished: Boolean! - isPrivate: Boolean + isPrivate: Boolean! locale: String! path: String! publishEndDate: Date publishStartDate: Date - tags: [String] + tags: [String]! title: String! ): PageResponse update( id: Int! + content: String description: String editor: String isPublished: Boolean diff --git a/server/jobs/sync-storage.js b/server/jobs/sync-storage.js new file mode 100644 index 00000000..cce94681 --- /dev/null +++ b/server/jobs/sync-storage.js @@ -0,0 +1,20 @@ +require('../core/worker') + +/* global WIKI */ + +module.exports = async (job) => { + WIKI.logger.info(`Syncing with storage provider ${job.data.target.title}...`) + + try { + const target = require(`../modules/storage/${job.data.target.key}/storage.js`) + target[job.data.event].call({ + config: job.data.target.config, + mode: job.data.target.mode, + page: job.data.page + }) + WIKI.logger.info(`Syncing with storage provider ${job.data.target.title}: [ COMPLETED ]`) + } catch (err) { + WIKI.logger.error(`Syncing with storage provider ${job.data.target.title}: [ FAILED ]`) + WIKI.logger.error(err.message) + } +} diff --git a/server/modules/storage/azure/storage.js b/server/modules/storage/azure/storage.js index 22d81b84..ab25ce97 100644 --- a/server/modules/storage/azure/storage.js +++ b/server/modules/storage/azure/storage.js @@ -1,23 +1,23 @@ module.exports = { - async activated(opts) { + async activated() { }, - async deactivated(opts) { + async deactivated() { }, - async init(opts) { + async init() { }, - async created(opts) { + async created() { }, - async updated(opts) { + async updated() { }, - async deleted(opts) { + async deleted() { }, - async renamed(opts) { + async renamed() { } } diff --git a/server/modules/storage/digitalocean/storage.js b/server/modules/storage/digitalocean/storage.js index 22d81b84..ab25ce97 100644 --- a/server/modules/storage/digitalocean/storage.js +++ b/server/modules/storage/digitalocean/storage.js @@ -1,23 +1,23 @@ module.exports = { - async activated(opts) { + async activated() { }, - async deactivated(opts) { + async deactivated() { }, - async init(opts) { + async init() { }, - async created(opts) { + async created() { }, - async updated(opts) { + async updated() { }, - async deleted(opts) { + async deleted() { }, - async renamed(opts) { + async renamed() { } } diff --git a/server/modules/storage/disk/storage.js b/server/modules/storage/disk/storage.js index 22d81b84..ab25ce97 100644 --- a/server/modules/storage/disk/storage.js +++ b/server/modules/storage/disk/storage.js @@ -1,23 +1,23 @@ module.exports = { - async activated(opts) { + async activated() { }, - async deactivated(opts) { + async deactivated() { }, - async init(opts) { + async init() { }, - async created(opts) { + async created() { }, - async updated(opts) { + async updated() { }, - async deleted(opts) { + async deleted() { }, - async renamed(opts) { + async renamed() { } } diff --git a/server/modules/storage/dropbox/storage.js b/server/modules/storage/dropbox/storage.js index 22d81b84..ab25ce97 100644 --- a/server/modules/storage/dropbox/storage.js +++ b/server/modules/storage/dropbox/storage.js @@ -1,23 +1,23 @@ module.exports = { - async activated(opts) { + async activated() { }, - async deactivated(opts) { + async deactivated() { }, - async init(opts) { + async init() { }, - async created(opts) { + async created() { }, - async updated(opts) { + async updated() { }, - async deleted(opts) { + async deleted() { }, - async renamed(opts) { + async renamed() { } } diff --git a/server/modules/storage/gdrive/storage.js b/server/modules/storage/gdrive/storage.js index 22d81b84..ab25ce97 100644 --- a/server/modules/storage/gdrive/storage.js +++ b/server/modules/storage/gdrive/storage.js @@ -1,23 +1,23 @@ module.exports = { - async activated(opts) { + async activated() { }, - async deactivated(opts) { + async deactivated() { }, - async init(opts) { + async init() { }, - async created(opts) { + async created() { }, - async updated(opts) { + async updated() { }, - async deleted(opts) { + async deleted() { }, - async renamed(opts) { + async renamed() { } } diff --git a/server/modules/storage/git/storage.js b/server/modules/storage/git/storage.js index 22d81b84..ab25ce97 100644 --- a/server/modules/storage/git/storage.js +++ b/server/modules/storage/git/storage.js @@ -1,23 +1,23 @@ module.exports = { - async activated(opts) { + async activated() { }, - async deactivated(opts) { + async deactivated() { }, - async init(opts) { + async init() { }, - async created(opts) { + async created() { }, - async updated(opts) { + async updated() { }, - async deleted(opts) { + async deleted() { }, - async renamed(opts) { + async renamed() { } } diff --git a/server/modules/storage/onedrive/storage.js b/server/modules/storage/onedrive/storage.js index 22d81b84..ab25ce97 100644 --- a/server/modules/storage/onedrive/storage.js +++ b/server/modules/storage/onedrive/storage.js @@ -1,23 +1,23 @@ module.exports = { - async activated(opts) { + async activated() { }, - async deactivated(opts) { + async deactivated() { }, - async init(opts) { + async init() { }, - async created(opts) { + async created() { }, - async updated(opts) { + async updated() { }, - async deleted(opts) { + async deleted() { }, - async renamed(opts) { + async renamed() { } } diff --git a/server/modules/storage/s3/storage.js b/server/modules/storage/s3/storage.js index 22d81b84..ab25ce97 100644 --- a/server/modules/storage/s3/storage.js +++ b/server/modules/storage/s3/storage.js @@ -1,23 +1,23 @@ module.exports = { - async activated(opts) { + async activated() { }, - async deactivated(opts) { + async deactivated() { }, - async init(opts) { + async init() { }, - async created(opts) { + async created() { }, - async updated(opts) { + async updated() { }, - async deleted(opts) { + async deleted() { }, - async renamed(opts) { + async renamed() { } } diff --git a/server/modules/storage/scp/storage.js b/server/modules/storage/scp/storage.js index 22d81b84..ab25ce97 100644 --- a/server/modules/storage/scp/storage.js +++ b/server/modules/storage/scp/storage.js @@ -1,23 +1,23 @@ module.exports = { - async activated(opts) { + async activated() { }, - async deactivated(opts) { + async deactivated() { }, - async init(opts) { + async init() { }, - async created(opts) { + async created() { }, - async updated(opts) { + async updated() { }, - async deleted(opts) { + async deleted() { }, - async renamed(opts) { + async renamed() { } }