/
index.ts
185 lines (157 loc) · 4.42 KB
/
index.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
/** @module Lib.Plugin */
import { merge } from 'lodash'
import { v4 as uuid } from 'uuid'
import { LIMIT50 } from '@/config/string'
import { HPCClientPlugin, HPCServerPlugin } from '@/plugins/index.d'
import User from '../user'
import Plugins from '../plugins'
import Tools from '../tools'
/**
* Add
* @param user User
* @param plugin Plugin
*/
const add = async (
user: { id: string },
plugin: HPCClientPlugin
): Promise<void> => {
// Set uuid
plugin.uuid = uuid()
// Check name
if (plugin.configuration?.name?.value) {
const name = plugin.configuration.name.value as string
plugin.configuration.name.value = name.substring(0, LIMIT50)
}
// Plugin initialization
if (plugin.haveInit) {
const plugins = await Plugins.serverList()
const HPCPlugins = plugins.filter(
(p) => p.category === 'HPC'
) as HPCServerPlugin[]
const lib = HPCPlugins.find((l) => l.key === plugin.key)?.lib
if (lib) {
const init = await lib.init!(plugin.configuration)
merge(plugin, init)
}
}
// Encrypt
for (const key in plugin.configuration) {
const config = plugin.configuration[key]
if (config.secret && config.value)
plugin.configuration[key].value = JSON.stringify(
await Tools.encrypt(config.value.toString())
)
}
// Get
const userData = await User.get(user.id, ['plugins'])
if (!userData) return
// Update user
userData.plugins = [...(userData.plugins ?? []), plugin]
// Update
await User.update(user, [{ key: 'plugins', value: userData.plugins }])
}
/**
* Extra
* @param simulation Simulation
* @param plugin Plugin
* @param extra Extra action
*/
const extra = async (
simulation: { id: string },
plugin: HPCClientPlugin,
extra: string
): Promise<void> => {
const plugins = await Plugins.serverList()
const HPCPlugins = plugins.filter(
(p) => p.category === 'HPC'
) as HPCServerPlugin[]
const lib = HPCPlugins.find((l) => l.key === plugin.key)?.lib
if (lib) {
await lib.extra?.(simulation, plugin.configuration, extra)
}
}
/**
* Get by user
* @param user User
* @returns Plugins
*/
const getByUser = async (user: { id: string }): Promise<HPCClientPlugin[]> => {
// Get plugins
const userData = await User.get(user.id, ['plugins'])
return userData?.plugins ?? []
}
/**
* Update
* @param user User
* @param plugin Plugin
*/
const update = async (
user: { id: string },
plugin: HPCClientPlugin
): Promise<void> => {
// Check name
if (plugin.configuration?.name?.value) {
const name = plugin.configuration.name.value as string
plugin.configuration.name.value = name.substring(0, LIMIT50)
}
// Get
const userData = await User.get(user.id, ['plugins'])
if (!userData) return
if (!userData.plugins) return
const index = userData.plugins.findIndex((p) => p.uuid === plugin.uuid)
if (index === -1) return
// Re-init
if (plugin.haveInit && plugin.needReInit) {
const plugins = await Plugins.serverList()
const HPCPlugins = plugins.filter(
(p) => p.category === 'HPC'
) as HPCServerPlugin[]
const lib = HPCPlugins.find((l) => l.key === plugin.key)?.lib
if (lib) {
const init = await lib.init!(plugin.configuration)
merge(plugin, init)
}
plugin.needReInit = false
}
// Encrypt
for (const userPlugin of userData.plugins) {
for (const key in userPlugin.configuration) {
const config = userPlugin.configuration[key]
if (config.secret && config.value)
userPlugin.configuration[key].value = JSON.stringify(
await Tools.encrypt(config.value)
)
}
}
userData.plugins = [
...userData.plugins.slice(0, index),
{ ...userData.plugins[index], ...plugin },
...userData.plugins.slice(index + 1)
]
// Update
await User.update(user, [{ key: 'plugins', value: userData.plugins }])
}
/**
* Delete
* @param user User
* @param plugin Plugin
*/
const del = async (
user: { id: string },
plugin: HPCClientPlugin
): Promise<void> => {
// Get
const userData = await User.get(user.id, ['plugins'])
if (!userData) return
if (!userData.plugins) return
const index = userData.plugins.findIndex((p) => p.uuid === plugin.uuid)
if (index === -1) return
userData.plugins = [
...userData.plugins.slice(0, index),
...userData.plugins.slice(index + 1)
]
// Update
await User.update(user, [{ key: 'plugins', value: userData.plugins }])
}
const Plugin = { add, extra, getByUser, update, del }
export default Plugin