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()
- // }
- // }
- }
|