| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211 | 
							- const _ = require('lodash')
 
- const sanitize = require('sanitize-filename')
 
- const graphHelper = require('../../helpers/graph')
 
- const assetHelper = require('../../helpers/asset')
 
- /* global WIKI */
 
- module.exports = {
 
-   Query: {
 
-     async assets() { return {} }
 
-   },
 
-   Mutation: {
 
-     async assets() { return {} }
 
-   },
 
-   AssetQuery: {
 
-     async list(obj, args, context) {
 
-       let cond = {
 
-         folderId: args.folderId === 0 ? null : args.folderId
 
-       }
 
-       if (args.kind !== 'ALL') {
 
-         cond.kind = args.kind.toLowerCase()
 
-       }
 
-       const folderHierarchy = await WIKI.models.assetFolders.getHierarchy(args.folderId)
 
-       const folderPath = folderHierarchy.map(h => h.slug).join('/')
 
-       const results = await WIKI.models.assets.query().where(cond)
 
-       return _.filter(results, r => {
 
-         const path = folderPath ? `${folderPath}/${r.filename}` : r.filename
 
-         return WIKI.auth.checkAccess(context.req.user, ['read:assets'], { path })
 
-       }).map(a => ({
 
-         ...a,
 
-         kind: a.kind.toUpperCase()
 
-       }))
 
-     },
 
-     async folders(obj, args, context) {
 
-       const results = await WIKI.models.assetFolders.query().where({
 
-         parentId: args.parentFolderId === 0 ? null : args.parentFolderId
 
-       })
 
-       const parentHierarchy = await WIKI.models.assetFolders.getHierarchy(args.parentFolderId)
 
-       const parentPath = parentHierarchy.map(h => h.slug).join('/')
 
-       return _.filter(results, r => {
 
-         const path = parentPath ? `${parentPath}/${r.slug}` : r.slug
 
-         return WIKI.auth.checkAccess(context.req.user, ['read:assets'], { path });
 
-       })
 
-     }
 
-   },
 
-   AssetMutation: {
 
-     /**
 
-      * Create New Asset Folder
 
-      */
 
-     async createFolder(obj, args, context) {
 
-       try {
 
-         const folderSlug = sanitize(args.slug).toLowerCase()
 
-         const parentFolderId = args.parentFolderId === 0 ? null : args.parentFolderId
 
-         const result = await WIKI.models.assetFolders.query().where({
 
-           parentId: parentFolderId,
 
-           slug: folderSlug
 
-         }).first()
 
-         if (!result) {
 
-           await WIKI.models.assetFolders.query().insert({
 
-             slug: folderSlug,
 
-             name: folderSlug,
 
-             parentId: parentFolderId
 
-           })
 
-           return {
 
-             responseResult: graphHelper.generateSuccess('Asset Folder has been created successfully.')
 
-           }
 
-         } else {
 
-           throw new WIKI.Error.AssetFolderExists()
 
-         }
 
-       } catch (err) {
 
-         return graphHelper.generateError(err)
 
-       }
 
-     },
 
-     /**
 
-      * Rename an Asset
 
-      */
 
-     async renameAsset(obj, args, context) {
 
-       try {
 
-         const filename = sanitize(args.filename).toLowerCase()
 
-         const asset = await WIKI.models.assets.query().findById(args.id)
 
-         if (asset) {
 
-           // Check for extension mismatch
 
-           if (!_.endsWith(filename, asset.ext)) {
 
-             throw new WIKI.Error.AssetRenameInvalidExt()
 
-           }
 
-           // Check for non-dot files changing to dotfile
 
-           if (asset.ext.length > 0 && filename.length - asset.ext.length < 1) {
 
-             throw new WIKI.Error.AssetRenameInvalid()
 
-           }
 
-           // Check for collision
 
-           const assetCollision = await WIKI.models.assets.query().where({
 
-             filename,
 
-             folderId: asset.folderId
 
-           }).first()
 
-           if (assetCollision) {
 
-             throw new WIKI.Error.AssetRenameCollision()
 
-           }
 
-           // Get asset folder path
 
-           let hierarchy = []
 
-           if (asset.folderId) {
 
-             hierarchy = await WIKI.models.assetFolders.getHierarchy(asset.folderId)
 
-           }
 
-           // Check source asset permissions
 
-           const assetSourcePath = (asset.folderId) ? hierarchy.map(h => h.slug).join('/') + `/${asset.filename}` : asset.filename
 
-           if (!WIKI.auth.checkAccess(context.req.user, ['manage:assets'], { path: assetSourcePath })) {
 
-             throw new WIKI.Error.AssetRenameForbidden()
 
-           }
 
-           // Check target asset permissions
 
-           const assetTargetPath = (asset.folderId) ? hierarchy.map(h => h.slug).join('/') + `/${filename}` : filename
 
-           if (!WIKI.auth.checkAccess(context.req.user, ['write:assets'], { path: assetTargetPath })) {
 
-             throw new WIKI.Error.AssetRenameTargetForbidden()
 
-           }
 
-           // Update filename + hash
 
-           const fileHash = assetHelper.generateHash(assetTargetPath)
 
-           await WIKI.models.assets.query().patch({
 
-             filename: filename,
 
-             hash: fileHash
 
-           }).findById(args.id)
 
-           // Delete old asset cache
 
-           await asset.deleteAssetCache()
 
-           // Rename in Storage
 
-           await WIKI.models.storage.assetEvent({
 
-             event: 'renamed',
 
-             asset: {
 
-               ...asset,
 
-               path: assetSourcePath,
 
-               destinationPath: assetTargetPath,
 
-               moveAuthorId: context.req.user.id,
 
-               moveAuthorName: context.req.user.name,
 
-               moveAuthorEmail: context.req.user.email
 
-             }
 
-           })
 
-           return {
 
-             responseResult: graphHelper.generateSuccess('Asset has been renamed successfully.')
 
-           }
 
-         } else {
 
-           throw new WIKI.Error.AssetInvalid()
 
-         }
 
-       } catch (err) {
 
-         return graphHelper.generateError(err)
 
-       }
 
-     },
 
-     /**
 
-      * Delete an Asset
 
-      */
 
-     async deleteAsset(obj, args, context) {
 
-       try {
 
-         const asset = await WIKI.models.assets.query().findById(args.id)
 
-         if (asset) {
 
-           // Check permissions
 
-           const assetPath = await asset.getAssetPath()
 
-           if (!WIKI.auth.checkAccess(context.req.user, ['manage:assets'], { path: assetPath })) {
 
-             throw new WIKI.Error.AssetDeleteForbidden()
 
-           }
 
-           await WIKI.models.knex('assetData').where('id', args.id).del()
 
-           await WIKI.models.assets.query().deleteById(args.id)
 
-           await asset.deleteAssetCache()
 
-           // Delete from Storage
 
-           await WIKI.models.storage.assetEvent({
 
-             event: 'deleted',
 
-             asset: {
 
-               ...asset,
 
-               path: assetPath,
 
-               authorId: context.req.user.id,
 
-               authorName: context.req.user.name,
 
-               authorEmail: context.req.user.email
 
-             }
 
-           })
 
-           return {
 
-             responseResult: graphHelper.generateSuccess('Asset has been deleted successfully.')
 
-           }
 
-         } else {
 
-           throw new WIKI.Error.AssetInvalid()
 
-         }
 
-       } catch (err) {
 
-         return graphHelper.generateError(err)
 
-       }
 
-     },
 
-     /**
 
-      * Flush Temporary Uploads
 
-      */
 
-     async flushTempUploads(obj, args, context) {
 
-       try {
 
-         await WIKI.models.assets.flushTempUploads()
 
-         return {
 
-           responseResult: graphHelper.generateSuccess('Temporary Uploads have been flushed successfully.')
 
-         }
 
-       } catch (err) {
 
-         return graphHelper.generateError(err)
 
-       }
 
-     }
 
-   }
 
-   // File: {
 
-   //   folder(fl) {
 
-   //     return fl.getFolder()
 
-   //   }
 
-   // }
 
- }
 
 
  |