123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229 |
- import _ from 'lodash-es'
- import { generateError, generateSuccess } from '../../helpers/graph.mjs'
- import { v4 as uuid } from 'uuid'
- export default {
- Query: {
- async storageTargets (obj, args, context, info) {
- const dbTargets = await WIKI.db.storage.getTargets({ siteId: args.siteId })
- // targets = _.sortBy(targets.map(tgt => {
- // const targetInfo = _.find(WIKI.data.storage, ['module', tgt.key]) || {}
- // return {
- // ...targetInfo,
- // ...tgt,
- // hasSchedule: (targetInfo.schedule !== false),
- // syncInterval: targetInfo.syncInterval || targetInfo.schedule || 'P0D',
- // syncIntervalDefault: targetInfo.schedule,
- // config: _.sortBy(_.transform(tgt.config, (res, value, key) => {
- // const configData = _.get(targetInfo.props, key, false)
- // if (configData) {
- // res.push({
- // key,
- // value: JSON.stringify({
- // ...configData,
- // value: (configData.sensitive && value.length > 0) ? '********' : value
- // })
- // })
- // }
- // }, []), 'key')
- // }
- // }), ['title', 'key'])
- return _.sortBy(WIKI.storage.defs.map(md => {
- const dbTarget = dbTargets.find(tg => tg.module === md.key)
- return {
- id: dbTarget?.id ?? uuid(),
- isEnabled: dbTarget?.isEnabled ?? false,
- module: md.key,
- title: md.title,
- description: md.description,
- icon: md.icon,
- banner: md.banner,
- vendor: md.vendor,
- website: md.website,
- contentTypes: {
- activeTypes: dbTarget?.contentTypes?.activeTypes ?? md.contentTypes.defaultTypesEnabled,
- largeThreshold: dbTarget?.contentTypes?.largeThreshold ?? md.contentTypes.defaultLargeThreshold
- },
- assetDelivery: {
- isStreamingSupported: md?.assetDelivery?.isStreamingSupported ?? false,
- isDirectAccessSupported: md?.assetDelivery?.isDirectAccessSupported ?? false,
- streaming: dbTarget?.assetDelivery?.streaming ?? md?.assetDelivery?.defaultStreamingEnabled ?? false,
- directAccess: dbTarget?.assetDelivery?.directAccess ?? md?.assetDelivery?.defaultDirectAccessEnabled ?? false
- },
- versioning: {
- isSupported: md?.versioning?.isSupported ?? false,
- isForceEnabled: md?.versioning?.isForceEnabled ?? false,
- enabled: dbTarget?.versioning?.enabled ?? md?.versioning?.defaultEnabled ?? false
- },
- sync: {},
- status: {},
- setup: {
- handler: md?.setup?.handler,
- state: dbTarget?.state?.setup ?? 'notconfigured',
- values: md.setup?.handler ?
- _.transform(md.setup.defaultValues,
- (r, v, k) => {
- r[k] = dbTarget?.config?.[k] ?? v
- }, {}) :
- {}
- },
- config: _.transform(md.props, (r, v, k) => {
- const cfValue = dbTarget?.config?.[k] ?? v.default
- r[k] = {
- ...v,
- value: v.sensitive && cfValue ? '********' : cfValue,
- ...v.enum && {
- enum: v.enum.map(o => {
- if (o.indexOf('|') > 0) {
- const oParsed = o.split('|')
- return {
- value: oParsed[0],
- label: oParsed[1]
- }
- } else {
- return {
- value: o,
- label: o
- }
- }
- })
- }
- }
- }, {}),
- actions: md.actions
- }
- }), ['title'])
- }
- },
- Mutation: {
- async updateStorageTargets (obj, args, context) {
- WIKI.logger.debug(`Updating storage targets for site ${args.siteId}...`)
- try {
- const dbTargets = await WIKI.db.storage.getTargets({ siteId: args.siteId })
- for (const tgt of args.targets) {
- const md = _.find(WIKI.storage.defs, ['key', tgt.module])
- if (!md) {
- throw new Error('Invalid module key for non-existent storage target.')
- }
- const dbTarget = _.find(dbTargets, ['id', tgt.id])
- // -> Build update config object
- const updatedConfig = dbTarget?.config ?? {}
- if (tgt.config) {
- for (const [key, prop] of Object.entries(md.props)) {
- if (prop.readOnly) { continue }
- if (!Object.prototype.hasOwnProperty.call(tgt.config, key)) { continue }
- if (prop.sensitive && tgt.config[key] === '********') { continue }
- updatedConfig[key] = tgt.config[key]
- }
- }
- // -> Target doesn't exist yet in the DB, let's create it
- if (!dbTarget) {
- WIKI.logger.debug(`No existing DB configuration for module ${tgt.module}. Creating a new one...`)
- await WIKI.db.storage.query().insert({
- id: tgt.id,
- module: tgt.module,
- siteId: args.siteId,
- isEnabled: tgt.isEnabled ?? false,
- contentTypes: {
- activeTypes: tgt.contentTypes ?? md.contentTypes.defaultTypesEnabled ?? [],
- largeThreshold: tgt.largeThreshold ?? md.contentTypes.defaultLargeThreshold ?? '5MB'
- },
- assetDelivery: {
- streaming: tgt.assetDeliveryFileStreaming ?? md?.assetDelivery?.defaultStreamingEnabled ?? false,
- directAccess: tgt.assetDeliveryDirectAccess ?? md?.assetDelivery?.defaultDirectAccessEnabled ?? false
- },
- versioning: {
- enabled: tgt.useVersioning ?? md?.versioning?.defaultEnabled ?? false
- },
- state: {
- current: 'ok'
- },
- config: updatedConfig
- })
- } else {
- WIKI.logger.debug(`Updating DB configuration for module ${tgt.module}...`)
- await WIKI.db.storage.query().patch({
- isEnabled: tgt.isEnabled ?? dbTarget.isEnabled ?? false,
- contentTypes: {
- activeTypes: tgt.contentTypes ?? dbTarget?.contentTypes?.activeTypes ?? [],
- largeThreshold: tgt.largeThreshold ?? dbTarget?.contentTypes?.largeThreshold ?? '5MB'
- },
- assetDelivery: {
- streaming: tgt.assetDeliveryFileStreaming ?? dbTarget?.assetDelivery?.streaming ?? false,
- directAccess: tgt.assetDeliveryDirectAccess ?? dbTarget?.assetDelivery?.directAccess ?? false
- },
- versioning: {
- enabled: tgt.useVersioning ?? dbTarget?.versioning?.enabled ?? false
- },
- config: updatedConfig
- }).where('id', tgt.id)
- }
- }
- // await WIKI.db.storage.initTargets()
- return {
- operation: generateSuccess('Storage targets updated successfully')
- }
- } catch (err) {
- return generateError(err)
- }
- },
- async setupStorageTarget (obj, args, context) {
- try {
- const tgt = await WIKI.db.storage.query().findById(args.targetId)
- if (!tgt) {
- throw new Error('Not storage target matching this ID')
- }
- const md = _.find(WIKI.storage.defs, ['key', tgt.module])
- if (!md) {
- throw new Error('No matching storage module installed.')
- }
- if (!await WIKI.db.storage.ensureModule(md.key)) {
- throw new Error('Failed to load storage module. Check logs for details.')
- }
- const result = await WIKI.storage.modules[md.key].setup(args.targetId, args.state)
- return {
- operation: generateSuccess('Storage target setup step succeeded'),
- state: result
- }
- } catch (err) {
- return generateError(err)
- }
- },
- async destroyStorageTargetSetup (obj, args, context) {
- try {
- const tgt = await WIKI.db.storage.query().findById(args.targetId)
- if (!tgt) {
- throw new Error('Not storage target matching this ID')
- }
- const md = _.find(WIKI.storage.defs, ['key', tgt.module])
- if (!md) {
- throw new Error('No matching storage module installed.')
- }
- if (!await WIKI.db.storage.ensureModule(md.key)) {
- throw new Error('Failed to load storage module. Check logs for details.')
- }
- await WIKI.storage.modules[md.key].setupDestroy(args.targetId)
- return {
- operation: generateSuccess('Storage target setup configuration destroyed succesfully.')
- }
- } catch (err) {
- return generateError(err)
- }
- },
- async executeStorageAction (obj, args, context) {
- try {
- await WIKI.db.storage.executeAction(args.targetKey, args.handler)
- return {
- operation: generateSuccess('Action completed.')
- }
- } catch (err) {
- return generateError(err)
- }
- }
- }
- }
|