mirror of https://github.com/Requarks/wiki.git
11 changed files with 312 additions and 41 deletions
Unified View
Diff Options
-
4client/components/admin/admin-auth.vue
-
148client/components/admin/admin-storage.vue
-
6client/graph/admin/auth/auth-mutation-save-strategies.gql
-
12client/graph/admin/storage/storage-mutation-save-targets.gql
-
14client/graph/admin/storage/storage-query-targets.gql
-
1server/db/migrations/2.0.0.js
-
64server/db/models/storage.js
-
48server/graph/resolvers/storage.js
-
51server/graph/schemas/storage.graphql
-
2server/modules/storage/digitalocean.js
-
3server/setup.js
@ -0,0 +1,12 @@ |
|||||
|
mutation($strategies: [AuthenticationStrategyInput]) { |
||||
|
authentication { |
||||
|
updateStrategies(strategies: $strategies) { |
||||
|
responseResult { |
||||
|
succeeded |
||||
|
errorCode |
||||
|
slug |
||||
|
message |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,14 @@ |
|||||
|
query { |
||||
|
storage { |
||||
|
targets(orderBy: "title ASC") { |
||||
|
isEnabled |
||||
|
key |
||||
|
title |
||||
|
mode |
||||
|
config { |
||||
|
key |
||||
|
value |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,64 @@ |
|||||
|
const Model = require('objection').Model |
||||
|
const autoload = require('auto-load') |
||||
|
const path = require('path') |
||||
|
const _ = require('lodash') |
||||
|
|
||||
|
/* global WIKI */ |
||||
|
|
||||
|
/** |
||||
|
* Storage model |
||||
|
*/ |
||||
|
module.exports = class Storage extends Model { |
||||
|
static get tableName() { return 'storage' } |
||||
|
|
||||
|
static get jsonSchema () { |
||||
|
return { |
||||
|
type: 'object', |
||||
|
required: ['key', 'title', 'isEnabled'], |
||||
|
|
||||
|
properties: { |
||||
|
id: {type: 'integer'}, |
||||
|
key: {type: 'string'}, |
||||
|
title: {type: 'string'}, |
||||
|
isEnabled: {type: 'boolean'}, |
||||
|
mode: {type: 'string'}, |
||||
|
config: {type: 'object'} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
static async getTargets() { |
||||
|
return WIKI.db.storage.query() |
||||
|
} |
||||
|
|
||||
|
static async refreshTargetsFromDisk() { |
||||
|
try { |
||||
|
const dbTargets = await WIKI.db.storage.query() |
||||
|
const diskTargets = autoload(path.join(WIKI.SERVERPATH, 'modules/storage')) |
||||
|
let newTargets = [] |
||||
|
_.forOwn(diskTargets, (target, targetKey) => { |
||||
|
if (!_.some(dbTargets, ['key', target.key])) { |
||||
|
newTargets.push({ |
||||
|
key: target.key, |
||||
|
title: target.title, |
||||
|
isEnabled: false, |
||||
|
mode: 'push', |
||||
|
config: _.reduce(target.props, (result, value, key) => { |
||||
|
_.set(result, value, '') |
||||
|
return result |
||||
|
}, {}) |
||||
|
}) |
||||
|
} |
||||
|
}) |
||||
|
if (newTargets.length > 0) { |
||||
|
await WIKI.db.storage.query().insert(newTargets) |
||||
|
WIKI.logger.info(`Loaded ${newTargets.length} new storage targets: [ OK ]`) |
||||
|
} else { |
||||
|
WIKI.logger.info(`No new storage targets found: [ SKIPPED ]`) |
||||
|
} |
||||
|
} catch (err) { |
||||
|
WIKI.logger.error(`Failed to scan or load new storage providers: [ FAILED ]`) |
||||
|
WIKI.logger.error(err) |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,48 @@ |
|||||
|
const _ = require('lodash') |
||||
|
const graphHelper = require('../../helpers/graph') |
||||
|
|
||||
|
/* global WIKI */ |
||||
|
|
||||
|
module.exports = { |
||||
|
Query: { |
||||
|
async storage() { return {} } |
||||
|
}, |
||||
|
Mutation: { |
||||
|
async storage() { return {} } |
||||
|
}, |
||||
|
StorageQuery: { |
||||
|
async targets(obj, args, context, info) { |
||||
|
let targets = await WIKI.db.storage.getTargets() |
||||
|
targets = targets.map(stg => ({ |
||||
|
...stg, |
||||
|
config: _.transform(stg.config, (res, value, key) => { |
||||
|
res.push({ key, value }) |
||||
|
}, []) |
||||
|
})) |
||||
|
if (args.filter) { targets = graphHelper.filter(targets, args.filter) } |
||||
|
if (args.orderBy) { targets = graphHelper.orderBy(targets, args.orderBy) } |
||||
|
return targets |
||||
|
} |
||||
|
}, |
||||
|
StorageMutation: { |
||||
|
async updateTargets(obj, args, context) { |
||||
|
try { |
||||
|
for (let tgt of args.targets) { |
||||
|
await WIKI.db.storage.query().patch({ |
||||
|
isEnabled: tgt.isEnabled, |
||||
|
mode: tgt.mode, |
||||
|
config: _.reduce(tgt.config, (result, value, key) => { |
||||
|
_.set(result, value.key, value.value) |
||||
|
return result |
||||
|
}, {}) |
||||
|
}).where('key', tgt.key) |
||||
|
} |
||||
|
return { |
||||
|
responseResult: graphHelper.generateSuccess('Storage targets updated successfully') |
||||
|
} |
||||
|
} catch (err) { |
||||
|
return graphHelper.generateError(err) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,51 @@ |
|||||
|
# =============================================== |
||||
|
# STORAGE |
||||
|
# =============================================== |
||||
|
|
||||
|
extend type Query { |
||||
|
storage: StorageQuery |
||||
|
} |
||||
|
|
||||
|
extend type Mutation { |
||||
|
storage: StorageMutation |
||||
|
} |
||||
|
|
||||
|
# ----------------------------------------------- |
||||
|
# QUERIES |
||||
|
# ----------------------------------------------- |
||||
|
|
||||
|
type StorageQuery { |
||||
|
targets( |
||||
|
filter: String |
||||
|
orderBy: String |
||||
|
): [StorageTarget] |
||||
|
} |
||||
|
|
||||
|
# ----------------------------------------------- |
||||
|
# MUTATIONS |
||||
|
# ----------------------------------------------- |
||||
|
|
||||
|
type StorageMutation { |
||||
|
updateTargets( |
||||
|
targets: [StorageTargetInput] |
||||
|
): DefaultResponse |
||||
|
} |
||||
|
|
||||
|
# ----------------------------------------------- |
||||
|
# TYPES |
||||
|
# ----------------------------------------------- |
||||
|
|
||||
|
type StorageTarget { |
||||
|
isEnabled: Boolean! |
||||
|
key: String! |
||||
|
title: String! |
||||
|
mode: String |
||||
|
config: [KeyValuePair] |
||||
|
} |
||||
|
|
||||
|
input StorageTargetInput { |
||||
|
isEnabled: Boolean! |
||||
|
key: String! |
||||
|
mode: String! |
||||
|
config: [KeyValuePairInput] |
||||
|
} |
Write
Preview
Loading…
Cancel
Save