| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280 | const _ = require('lodash')const graphHelper = require('../../helpers/graph')/* global WIKI */module.exports = {  Query: {    async pages() { return {} }  },  Mutation: {    async pages() { return {} }  },  PageQuery: {    /**     * PAGE HISTORY     */    async history(obj, args, context, info) {      return WIKI.models.pageHistory.getHistory({        pageId: args.id,        offsetPage: args.offsetPage || 0,        offsetSize: args.offsetSize || 100      })    },    /**     * SEARCH PAGES     */    async search (obj, args, context) {      if (WIKI.data.searchEngine) {        const resp = await WIKI.data.searchEngine.query(args.query, args)        return {          ...resp,          results: _.filter(resp.results, r => {            return WIKI.auth.checkAccess(context.req.user, ['read:pages'], {              path: r.path,              locale: r.locale            })          })        }      } else {        return {          results: [],          suggestions: [],          totalHits: 0        }      }    },    /**     * LIST PAGES     */    async list (obj, args, context, info) {      let results = await WIKI.models.pages.query().column([        'pages.id',        'path',        { locale: 'localeCode' },        'title',        'description',        'isPublished',        'isPrivate',        'privateNS',        'contentType',        'createdAt',        'updatedAt'      ])        .eagerAlgorithm(WIKI.models.Objection.Model.JoinEagerAlgorithm)        .eager('tags(selectTags)', {          selectTags: builder => {            builder.select('tag')          }        })        .modify(queryBuilder => {          if (args.limit) {            queryBuilder.limit(args.limit)          }          if (args.locale) {            queryBuilder.where('localeCode', args.locale)          }          if (args.tags && args.tags.length > 0) {            queryBuilder.whereIn('tags.tag', args.tags)          }          const orderDir = args.orderByDirection === 'DESC' ? 'desc' : 'asc'          switch (args.orderBy) {            case 'CREATED':              queryBuilder.orderBy('createdAt', orderDir)              break            case 'PATH':              queryBuilder.orderBy('path', orderDir)              break            case 'TITLE':              queryBuilder.orderBy('title', orderDir)              break            case 'UPDATED':              queryBuilder.orderBy('updatedAt', orderDir)              break            default:              queryBuilder.orderBy('pages.id', orderDir)              break          }        })      results = _.filter(results, r => {        return WIKI.auth.checkAccess(context.req.user, ['read:pages'], {          path: r.path,          locale: r.locale        })      }).map(r => ({        ...r,        tags: _.map(r.tags, 'tag')      }))      if (args.tags && args.tags.length > 0) {        results = _.filter(results, r => _.every(args.tags, t => _.includes(r.tags, t)))      }      return results    },    /**     * FETCH SINGLE PAGE     */    async single (obj, args, context, info) {      let page = await WIKI.models.pages.getPageFromDb(args.id)      if (page) {        return {          ...page,          locale: page.localeCode,          editor: page.editorKey        }      } else {        throw new WIKI.Error.PageNotFound()      }    },    /**     * FETCH TAGS     */    async tags (obj, args, context, info) {      return WIKI.models.tags.query().orderBy('tag', 'asc')    },    /**     * FETCH PAGE TREE     */    async tree (obj, args, context, info) {      let results = []      let conds = {        localeCode: args.locale,        parent: (args.parent < 1) ? null : args.parent      }      switch (args.mode) {        case 'FOLDERS':          conds.isFolder = true          results = await WIKI.models.knex('pageTree').where(conds)          break        case 'PAGES':          await WIKI.models.knex('pageTree').where(conds).andWhereNotNull('pageId')          break        default:          results = await WIKI.models.knex('pageTree').where(conds)          break      }      return results.filter(r => {        return WIKI.auth.checkAccess(context.req.user, ['read:pages'], {          path: r.path,          locale: r.localeCode        })      }).map(r => ({        ...r,        parent: r.parent || 0,        locale: r.localeCode      }))    }  },  PageMutation: {    /**     * CREATE PAGE     */    async create(obj, args, context) {      try {        const page = await WIKI.models.pages.createPage({          ...args,          user: context.req.user        })        return {          responseResult: graphHelper.generateSuccess('Page created successfully.'),          page        }      } catch (err) {        return graphHelper.generateError(err)      }    },    /**     * UPDATE PAGE     */    async update(obj, args, context) {      try {        const page = await WIKI.models.pages.updatePage({          ...args,          user: context.req.user        })        return {          responseResult: graphHelper.generateSuccess('Page has been updated.'),          page        }      } catch (err) {        return graphHelper.generateError(err)      }    },    /**     * MOVE PAGE     */    async move(obj, args, context) {      try {        await WIKI.models.pages.movePage({          ...args,          user: context.req.user        })        return {          responseResult: graphHelper.generateSuccess('Page has been moved.')        }      } catch (err) {        return graphHelper.generateError(err)      }    },    /**     * DELETE PAGE     */    async delete(obj, args, context) {      try {        await WIKI.models.pages.deletePage({          ...args,          user: context.req.user        })        return {          responseResult: graphHelper.generateSuccess('Page has been deleted.')        }      } catch (err) {        return graphHelper.generateError(err)      }    },    /**     * FLUSH PAGE CACHE     */    async flushCache(obj, args, context) {      try {        await WIKI.models.pages.flushCache()        return {          responseResult: graphHelper.generateSuccess('Pages Cache has been flushed successfully.')        }      } catch (err) {        return graphHelper.generateError(err)      }    },    /**     * MIGRATE ALL PAGES FROM SOURCE LOCALE TO TARGET LOCALE     */    async migrateToLocale(obj, args, context) {      try {        const count = await WIKI.models.pages.migrateToLocale(args)        return {          responseResult: graphHelper.generateSuccess('Migrated content to target locale successfully.'),          count        }      } catch (err) {        return graphHelper.generateError(err)      }    },    /**     * REBUILD TREE     */    async rebuildTree(obj, args, context) {      try {        await WIKI.models.pages.rebuildTree()        return {          responseResult: graphHelper.generateSuccess('Page tree rebuilt successfully.')        }      } catch (err) {        return graphHelper.generateError(err)      }    }  },  Page: {    // comments(pg) {    //   return pg.$relatedQuery('comments')    // }  }}
 |