diff options
Diffstat (limited to 'src/internal-server')
-rw-r--r-- | src/internal-server/app/Controllers/Http/RecipeController.js | 51 | ||||
-rw-r--r-- | src/internal-server/app/Controllers/Http/ServiceController.js | 16 | ||||
-rw-r--r-- | src/internal-server/app/Controllers/Http/UserController.js | 176 | ||||
-rw-r--r-- | src/internal-server/app/Middleware/ConvertEmptyStringsToNull.js | 2 | ||||
-rw-r--r-- | src/internal-server/app/Models/Recipe.js | 3 | ||||
-rw-r--r-- | src/internal-server/app/Models/Service.js | 3 | ||||
-rw-r--r-- | src/internal-server/app/Models/Token.js | 3 | ||||
-rw-r--r-- | src/internal-server/app/Models/User.js | 3 | ||||
-rw-r--r-- | src/internal-server/app/Models/Workspace.js | 3 | ||||
-rw-r--r-- | src/internal-server/config/shield.js | 3 | ||||
-rw-r--r-- | src/internal-server/public/js/transfer.js | 20 | ||||
-rw-r--r-- | src/internal-server/start/kernel.js | 10 | ||||
-rw-r--r-- | src/internal-server/start/migrate.js | 24 | ||||
-rw-r--r-- | src/internal-server/test.js | 2 |
14 files changed, 165 insertions, 154 deletions
diff --git a/src/internal-server/app/Controllers/Http/RecipeController.js b/src/internal-server/app/Controllers/Http/RecipeController.js index 1a7595a9d..2c7baf2a4 100644 --- a/src/internal-server/app/Controllers/Http/RecipeController.js +++ b/src/internal-server/app/Controllers/Http/RecipeController.js | |||
@@ -1,8 +1,6 @@ | |||
1 | const Recipe = use('App/Models/Recipe'); | 1 | const Recipe = use('App/Models/Recipe'); |
2 | const Drive = use('Drive'); | 2 | const Drive = use('Drive'); |
3 | const { | 3 | const { validateAll } = use('Validator'); |
4 | validateAll, | ||
5 | } = use('Validator'); | ||
6 | const Env = use('Env'); | 4 | const Env = use('Env'); |
7 | 5 | ||
8 | const fetch = require('node-fetch'); | 6 | const fetch = require('node-fetch'); |
@@ -14,9 +12,7 @@ const RECIPES_URL = `${LIVE_FERDI_API}/${API_VERSION}/recipes`; | |||
14 | 12 | ||
15 | class RecipeController { | 13 | class RecipeController { |
16 | // List official and custom recipes | 14 | // List official and custom recipes |
17 | async list({ | 15 | async list({ response }) { |
18 | response, | ||
19 | }) { | ||
20 | const officialRecipes = JSON.parse(await (await fetch(RECIPES_URL)).text()); | 16 | const officialRecipes = JSON.parse(await (await fetch(RECIPES_URL)).text()); |
21 | const customRecipesArray = (await Recipe.all()).rows; | 17 | const customRecipesArray = (await Recipe.all()).rows; |
22 | const customRecipes = customRecipesArray.map(recipe => ({ | 18 | const customRecipes = customRecipesArray.map(recipe => ({ |
@@ -25,19 +21,13 @@ class RecipeController { | |||
25 | ...JSON.parse(recipe.data), | 21 | ...JSON.parse(recipe.data), |
26 | })); | 22 | })); |
27 | 23 | ||
28 | const recipes = [ | 24 | const recipes = [...officialRecipes, ...customRecipes]; |
29 | ...officialRecipes, | ||
30 | ...customRecipes, | ||
31 | ]; | ||
32 | 25 | ||
33 | return response.send(recipes); | 26 | return response.send(recipes); |
34 | } | 27 | } |
35 | 28 | ||
36 | // Search official and custom recipes | 29 | // Search official and custom recipes |
37 | async search({ | 30 | async search({ request, response }) { |
38 | request, | ||
39 | response, | ||
40 | }) { | ||
41 | // Validate user input | 31 | // Validate user input |
42 | const validation = await validateAll(request.all(), { | 32 | const validation = await validateAll(request.all(), { |
43 | needle: 'required', | 33 | needle: 'required', |
@@ -64,13 +54,23 @@ class RecipeController { | |||
64 | })); | 54 | })); |
65 | } else { | 55 | } else { |
66 | let remoteResults = []; | 56 | let remoteResults = []; |
67 | if (Env.get('CONNECT_WITH_FRANZ') == 'true') { // eslint-disable-line eqeqeq | 57 | // eslint-disable-next-line eqeqeq |
68 | remoteResults = JSON.parse(await (await fetch(`${RECIPES_URL}/search?needle=${encodeURIComponent(needle)}`)).text()); | 58 | if (Env.get('CONNECT_WITH_FRANZ') == 'true') { |
59 | // eslint-disable-line eqeqeq | ||
60 | remoteResults = JSON.parse( | ||
61 | await ( | ||
62 | await fetch( | ||
63 | `${RECIPES_URL}/search?needle=${encodeURIComponent(needle)}`, | ||
64 | ) | ||
65 | ).text(), | ||
66 | ); | ||
69 | } | 67 | } |
70 | 68 | ||
71 | debug('remoteResults:', remoteResults); | 69 | debug('remoteResults:', remoteResults); |
72 | 70 | ||
73 | const localResultsArray = (await Recipe.query().where('name', 'LIKE', `%${needle}%`).fetch()).toJSON(); | 71 | const localResultsArray = ( |
72 | await Recipe.query().where('name', 'LIKE', `%${needle}%`).fetch() | ||
73 | ).toJSON(); | ||
74 | const localResults = localResultsArray.map(recipe => ({ | 74 | const localResults = localResultsArray.map(recipe => ({ |
75 | id: recipe.recipeId, | 75 | id: recipe.recipeId, |
76 | name: recipe.name, | 76 | name: recipe.name, |
@@ -79,20 +79,14 @@ class RecipeController { | |||
79 | 79 | ||
80 | debug('localResults:', localResults); | 80 | debug('localResults:', localResults); |
81 | 81 | ||
82 | results = [ | 82 | results = [...localResults, ...(remoteResults || [])]; |
83 | ...localResults, | ||
84 | ...remoteResults || [], | ||
85 | ]; | ||
86 | } | 83 | } |
87 | 84 | ||
88 | return response.send(results); | 85 | return response.send(results); |
89 | } | 86 | } |
90 | 87 | ||
91 | // Download a recipe | 88 | // Download a recipe |
92 | async download({ | 89 | async download({ response, params }) { |
93 | response, | ||
94 | params, | ||
95 | }) { | ||
96 | // Validate user input | 90 | // Validate user input |
97 | const validation = await validateAll(params, { | 91 | const validation = await validateAll(params, { |
98 | recipe: 'required|accepted', | 92 | recipe: 'required|accepted', |
@@ -108,14 +102,17 @@ class RecipeController { | |||
108 | const service = params.recipe; | 102 | const service = params.recipe; |
109 | 103 | ||
110 | // Check for invalid characters | 104 | // Check for invalid characters |
111 | if (/\.{1,}/.test(service) || /\/{1,}/.test(service)) { | 105 | if (/\.+/.test(service) || /\/+/.test(service)) { |
112 | return response.send('Invalid recipe name'); | 106 | return response.send('Invalid recipe name'); |
113 | } | 107 | } |
114 | 108 | ||
115 | // Check if recipe exists in recipes folder | 109 | // Check if recipe exists in recipes folder |
116 | if (await Drive.exists(`${service}.tar.gz`)) { | 110 | if (await Drive.exists(`${service}.tar.gz`)) { |
117 | return response.send(await Drive.get(`${service}.tar.gz`)); | 111 | return response.send(await Drive.get(`${service}.tar.gz`)); |
118 | } if (Env.get('CONNECT_WITH_FRANZ') == 'true') { // eslint-disable-line eqeqeq | 112 | } |
113 | // eslint-disable-next-line eqeqeq | ||
114 | if (Env.get('CONNECT_WITH_FRANZ') == 'true') { | ||
115 | // eslint-disable-line eqeqeq | ||
119 | return response.redirect(`${RECIPES_URL}/download/${service}`); | 116 | return response.redirect(`${RECIPES_URL}/download/${service}`); |
120 | } | 117 | } |
121 | return response.status(400).send({ | 118 | return response.status(400).send({ |
diff --git a/src/internal-server/app/Controllers/Http/ServiceController.js b/src/internal-server/app/Controllers/Http/ServiceController.js index f2af9d411..ae463617d 100644 --- a/src/internal-server/app/Controllers/Http/ServiceController.js +++ b/src/internal-server/app/Controllers/Http/ServiceController.js | |||
@@ -135,13 +135,11 @@ class ServiceController { | |||
135 | 135 | ||
136 | const newSettings = { | 136 | const newSettings = { |
137 | ...settings, | 137 | ...settings, |
138 | ...{ | 138 | iconId, |
139 | iconId, | 139 | customIconVersion: |
140 | customIconVersion: | 140 | settings && settings.customIconVersion |
141 | settings && settings.customIconVersion | 141 | ? settings.customIconVersion + 1 |
142 | ? settings.customIconVersion + 1 | 142 | : 1, |
143 | : 1, | ||
144 | }, | ||
145 | }; | 143 | }; |
146 | 144 | ||
147 | // Update data in database | 145 | // Update data in database |
@@ -157,9 +155,7 @@ class ServiceController { | |||
157 | id, | 155 | id, |
158 | name: service.name, | 156 | name: service.name, |
159 | ...newSettings, | 157 | ...newSettings, |
160 | iconUrl: `http://${hostname}:${port}/${API_VERSION}/icon/${ | 158 | iconUrl: `http://${hostname}:${port}/${API_VERSION}/icon/${newSettings.iconId}`, |
161 | newSettings.iconId | ||
162 | }`, | ||
163 | userId: 1, | 159 | userId: 1, |
164 | }, | 160 | }, |
165 | status: ['updated'], | 161 | status: ['updated'], |
diff --git a/src/internal-server/app/Controllers/Http/UserController.js b/src/internal-server/app/Controllers/Http/UserController.js index 994dcc0dc..7b71aac14 100644 --- a/src/internal-server/app/Controllers/Http/UserController.js +++ b/src/internal-server/app/Controllers/Http/UserController.js | |||
@@ -1,34 +1,37 @@ | |||
1 | const User = use('App/Models/User'); | 1 | const User = use('App/Models/User'); |
2 | const Service = use('App/Models/Service'); | 2 | const Service = use('App/Models/Service'); |
3 | const Workspace = use('App/Models/Workspace'); | 3 | const Workspace = use('App/Models/Workspace'); |
4 | const { | 4 | const { validateAll } = use('Validator'); |
5 | validateAll, | ||
6 | } = use('Validator'); | ||
7 | 5 | ||
8 | const btoa = require('btoa'); | 6 | const btoa = require('btoa'); |
9 | const fetch = require('node-fetch'); | 7 | const fetch = require('node-fetch'); |
10 | const uuid = require('uuid/v4'); | 8 | const uuid = require('uuid/v4'); |
11 | const crypto = require('crypto'); | 9 | const crypto = require('crypto'); |
12 | const { DEFAULT_APP_SETTINGS, API_VERSION } = require('../../../../environment'); | 10 | const { |
11 | DEFAULT_APP_SETTINGS, | ||
12 | API_VERSION, | ||
13 | } = require('../../../../environment'); | ||
13 | const { default: userAgent } = require('../../../../helpers/userAgent-helpers'); | 14 | const { default: userAgent } = require('../../../../helpers/userAgent-helpers'); |
14 | 15 | ||
15 | const apiRequest = (url, route, method, auth) => new Promise((resolve, reject) => { | 16 | const apiRequest = (url, route, method, auth) => |
16 | try { | 17 | new Promise((resolve, reject) => { |
17 | fetch(`${url}/${API_VERSION}/${route}`, { | 18 | try { |
18 | method, | 19 | fetch(`${url}/${API_VERSION}/${route}`, { |
19 | headers: { | 20 | method, |
20 | Authorization: `Bearer ${auth}`, | 21 | headers: { |
21 | 'User-Agent': userAgent(), | 22 | Authorization: `Bearer ${auth}`, |
22 | }, | 23 | 'User-Agent': userAgent(), |
23 | }) | 24 | }, |
24 | .then(data => data.json()) | 25 | }) |
25 | .then(json => resolve(json)); | 26 | .then(data => data.json()) |
26 | } catch (e) { | 27 | .then(json => resolve(json)); |
27 | reject(); | 28 | } catch { |
28 | } | 29 | reject(); |
29 | }); | 30 | } |
31 | }); | ||
30 | 32 | ||
31 | const LOGIN_SUCCESS_TOKEN = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJGZXJkaSBJbnRlcm5hbCBTZXJ2ZXIiLCJpYXQiOjE1NzEwNDAyMTUsImV4cCI6MjUzMzk1NDE3ODQ0LCJhdWQiOiJnZXRmZXJkaS5jb20iLCJzdWIiOiJmZXJkaUBsb2NhbGhvc3QiLCJ1c2VySWQiOiIxIn0.9_TWFGp6HROv8Yg82Rt6i1-95jqWym40a-HmgrdMC6M'; | 33 | const LOGIN_SUCCESS_TOKEN = |
34 | 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJGZXJkaSBJbnRlcm5hbCBTZXJ2ZXIiLCJpYXQiOjE1NzEwNDAyMTUsImV4cCI6MjUzMzk1NDE3ODQ0LCJhdWQiOiJnZXRmZXJkaS5jb20iLCJzdWIiOiJmZXJkaUBsb2NhbGhvc3QiLCJ1c2VySWQiOiIxIn0.9_TWFGp6HROv8Yg82Rt6i1-95jqWym40a-HmgrdMC6M'; | ||
32 | 35 | ||
33 | const DEFAULT_USER_DATA = { | 36 | const DEFAULT_USER_DATA = { |
34 | accountType: 'individual', | 37 | accountType: 'individual', |
@@ -45,10 +48,7 @@ const DEFAULT_USER_DATA = { | |||
45 | 48 | ||
46 | class UserController { | 49 | class UserController { |
47 | // Register a new user | 50 | // Register a new user |
48 | async signup({ | 51 | async signup({ request, response }) { |
49 | request, | ||
50 | response, | ||
51 | }) { | ||
52 | // Validate user input | 52 | // Validate user input |
53 | const validation = await validateAll(request.all(), { | 53 | const validation = await validateAll(request.all(), { |
54 | firstname: 'required', | 54 | firstname: 'required', |
@@ -70,10 +70,7 @@ class UserController { | |||
70 | } | 70 | } |
71 | 71 | ||
72 | // Login using an existing user | 72 | // Login using an existing user |
73 | async login({ | 73 | async login({ request, response }) { |
74 | request, | ||
75 | response, | ||
76 | }) { | ||
77 | if (!request.header('Authorization')) { | 74 | if (!request.header('Authorization')) { |
78 | return response.status(401).send({ | 75 | return response.status(401).send({ |
79 | message: 'Please provide authorization', | 76 | message: 'Please provide authorization', |
@@ -88,23 +85,21 @@ class UserController { | |||
88 | } | 85 | } |
89 | 86 | ||
90 | // Return information about the current user | 87 | // Return information about the current user |
91 | async me({ | 88 | async me({ response }) { |
92 | response, | ||
93 | }) { | ||
94 | const user = await User.find(1); | 89 | const user = await User.find(1); |
95 | 90 | ||
96 | const settings = typeof user.settings === 'string' ? JSON.parse(user.settings) : user.settings; | 91 | const settings = |
92 | typeof user.settings === 'string' | ||
93 | ? JSON.parse(user.settings) | ||
94 | : user.settings; | ||
97 | 95 | ||
98 | return response.send({ | 96 | return response.send({ |
99 | ...DEFAULT_USER_DATA, | 97 | ...DEFAULT_USER_DATA, |
100 | ...settings || {}, | 98 | ...settings, |
101 | }); | 99 | }); |
102 | } | 100 | } |
103 | 101 | ||
104 | async updateMe({ | 102 | async updateMe({ request, response }) { |
105 | request, | ||
106 | response, | ||
107 | }) { | ||
108 | const user = await User.find(1); | 103 | const user = await User.find(1); |
109 | 104 | ||
110 | let settings = user.settings || {}; | 105 | let settings = user.settings || {}; |
@@ -125,16 +120,11 @@ class UserController { | |||
125 | ...DEFAULT_USER_DATA, | 120 | ...DEFAULT_USER_DATA, |
126 | ...newSettings, | 121 | ...newSettings, |
127 | }, | 122 | }, |
128 | status: [ | 123 | status: ['data-updated'], |
129 | 'data-updated', | ||
130 | ], | ||
131 | }); | 124 | }); |
132 | } | 125 | } |
133 | 126 | ||
134 | async import({ | 127 | async import({ request, response }) { |
135 | request, | ||
136 | response, | ||
137 | }) { | ||
138 | // Validate user input | 128 | // Validate user input |
139 | const validation = await validateAll(request.all(), { | 129 | const validation = await validateAll(request.all(), { |
140 | email: 'required|email', | 130 | email: 'required|email', |
@@ -142,7 +132,8 @@ class UserController { | |||
142 | server: 'required', | 132 | server: 'required', |
143 | }); | 133 | }); |
144 | if (validation.fails()) { | 134 | if (validation.fails()) { |
145 | let errorMessage = 'There was an error while trying to import your account:\n'; | 135 | let errorMessage = |
136 | 'There was an error while trying to import your account:\n'; | ||
146 | for (const message of validation.messages()) { | 137 | for (const message of validation.messages()) { |
147 | if (message.validation === 'required') { | 138 | if (message.validation === 'required') { |
148 | errorMessage += `- Please make sure to supply your ${message.field}\n`; | 139 | errorMessage += `- Please make sure to supply your ${message.field}\n`; |
@@ -155,13 +146,12 @@ class UserController { | |||
155 | return response.status(401).send(errorMessage); | 146 | return response.status(401).send(errorMessage); |
156 | } | 147 | } |
157 | 148 | ||
158 | const { | 149 | const { email, password, server } = request.all(); |
159 | email, | ||
160 | password, | ||
161 | server, | ||
162 | } = request.all(); | ||
163 | 150 | ||
164 | const hashedPassword = crypto.createHash('sha256').update(password).digest('base64'); | 151 | const hashedPassword = crypto |
152 | .createHash('sha256') | ||
153 | .update(password) | ||
154 | .digest('base64'); | ||
165 | 155 | ||
166 | // Try to get an authentication token | 156 | // Try to get an authentication token |
167 | let token; | 157 | let token; |
@@ -178,16 +168,17 @@ class UserController { | |||
178 | const content = await rawResponse.json(); | 168 | const content = await rawResponse.json(); |
179 | 169 | ||
180 | if (!content.message || content.message !== 'Successfully logged in') { | 170 | if (!content.message || content.message !== 'Successfully logged in') { |
181 | const errorMessage = 'Could not login into Franz with your supplied credentials. Please check and try again'; | 171 | const errorMessage = |
172 | 'Could not login into Franz with your supplied credentials. Please check and try again'; | ||
182 | return response.status(401).send(errorMessage); | 173 | return response.status(401).send(errorMessage); |
183 | } | 174 | } |
184 | 175 | ||
185 | // eslint-disable-next-line prefer-destructuring | 176 | // eslint-disable-next-line prefer-destructuring |
186 | token = content.token; | 177 | token = content.token; |
187 | } catch (e) { | 178 | } catch (error) { |
188 | return response.status(401).send({ | 179 | return response.status(401).send({ |
189 | message: 'Cannot login to Franz', | 180 | message: 'Cannot login to Franz', |
190 | error: e, | 181 | error, |
191 | }); | 182 | }); |
192 | } | 183 | } |
193 | 184 | ||
@@ -195,12 +186,13 @@ class UserController { | |||
195 | let userInf = false; | 186 | let userInf = false; |
196 | try { | 187 | try { |
197 | userInf = await apiRequest(server, 'me', 'GET', token); | 188 | userInf = await apiRequest(server, 'me', 'GET', token); |
198 | } catch (e) { | 189 | } catch (error) { |
199 | const errorMessage = `Could not get your user info from Franz. Please check your credentials or try again later.\nError: ${e}`; | 190 | const errorMessage = `Could not get your user info from Franz. Please check your credentials or try again later.\nError: ${error}`; |
200 | return response.status(401).send(errorMessage); | 191 | return response.status(401).send(errorMessage); |
201 | } | 192 | } |
202 | if (!userInf) { | 193 | if (!userInf) { |
203 | const errorMessage = 'Could not get your user info from Franz. Please check your credentials or try again later'; | 194 | const errorMessage = |
195 | 'Could not get your user info from Franz. Please check your credentials or try again later'; | ||
204 | return response.status(401).send(errorMessage); | 196 | return response.status(401).send(errorMessage); |
205 | } | 197 | } |
206 | 198 | ||
@@ -213,8 +205,8 @@ class UserController { | |||
213 | for (const service of services) { | 205 | for (const service of services) { |
214 | await this._createAndCacheService(service, serviceIdTranslation); // eslint-disable-line no-await-in-loop | 206 | await this._createAndCacheService(service, serviceIdTranslation); // eslint-disable-line no-await-in-loop |
215 | } | 207 | } |
216 | } catch (e) { | 208 | } catch (error) { |
217 | const errorMessage = `Could not import your services into our system.\nError: ${e}`; | 209 | const errorMessage = `Could not import your services into our system.\nError: ${error}`; |
218 | return response.status(401).send(errorMessage); | 210 | return response.status(401).send(errorMessage); |
219 | } | 211 | } |
220 | 212 | ||
@@ -225,12 +217,14 @@ class UserController { | |||
225 | for (const workspace of workspaces) { | 217 | for (const workspace of workspaces) { |
226 | await this._createWorkspace(workspace, serviceIdTranslation); // eslint-disable-line no-await-in-loop | 218 | await this._createWorkspace(workspace, serviceIdTranslation); // eslint-disable-line no-await-in-loop |
227 | } | 219 | } |
228 | } catch (e) { | 220 | } catch (error) { |
229 | const errorMessage = `Could not import your workspaces into our system.\nError: ${e}`; | 221 | const errorMessage = `Could not import your workspaces into our system.\nError: ${error}`; |
230 | return response.status(401).send(errorMessage); | 222 | return response.status(401).send(errorMessage); |
231 | } | 223 | } |
232 | 224 | ||
233 | return response.send('Your account has been imported. You can now use your Franz account in Ferdi.'); | 225 | return response.send( |
226 | 'Your account has been imported. You can now use your Franz account in Ferdi.', | ||
227 | ); | ||
234 | } | 228 | } |
235 | 229 | ||
236 | // Account import/export | 230 | // Account import/export |
@@ -255,10 +249,7 @@ class UserController { | |||
255 | .send(exportData); | 249 | .send(exportData); |
256 | } | 250 | } |
257 | 251 | ||
258 | async importFerdi({ | 252 | async importFerdi({ request, response }) { |
259 | request, | ||
260 | response, | ||
261 | }) { | ||
262 | const validation = await validateAll(request.all(), { | 253 | const validation = await validateAll(request.all(), { |
263 | file: 'required', | 254 | file: 'required', |
264 | }); | 255 | }); |
@@ -269,8 +260,10 @@ class UserController { | |||
269 | let file; | 260 | let file; |
270 | try { | 261 | try { |
271 | file = JSON.parse(request.input('file')); | 262 | file = JSON.parse(request.input('file')); |
272 | } catch (e) { | 263 | } catch { |
273 | return response.send('Could not import: Invalid file, could not read file'); | 264 | return response.send( |
265 | 'Could not import: Invalid file, could not read file', | ||
266 | ); | ||
274 | } | 267 | } |
275 | 268 | ||
276 | if (!file || !file.services || !file.workspaces) { | 269 | if (!file || !file.services || !file.workspaces) { |
@@ -284,8 +277,8 @@ class UserController { | |||
284 | for (const service of file.services) { | 277 | for (const service of file.services) { |
285 | await this._createAndCacheService(service, serviceIdTranslation); // eslint-disable-line no-await-in-loop | 278 | await this._createAndCacheService(service, serviceIdTranslation); // eslint-disable-line no-await-in-loop |
286 | } | 279 | } |
287 | } catch (e) { | 280 | } catch (error) { |
288 | const errorMessage = `Could not import your services into our system.\nError: ${e}`; | 281 | const errorMessage = `Could not import your services into our system.\nError: ${error}`; |
289 | return response.send(errorMessage); | 282 | return response.send(errorMessage); |
290 | } | 283 | } |
291 | 284 | ||
@@ -294,8 +287,8 @@ class UserController { | |||
294 | for (const workspace of file.workspaces) { | 287 | for (const workspace of file.workspaces) { |
295 | await this._createWorkspace(workspace, serviceIdTranslation); // eslint-disable-line no-await-in-loop | 288 | await this._createWorkspace(workspace, serviceIdTranslation); // eslint-disable-line no-await-in-loop |
296 | } | 289 | } |
297 | } catch (e) { | 290 | } catch (error) { |
298 | const errorMessage = `Could not import your workspaces into our system.\nError: ${e}`; | 291 | const errorMessage = `Could not import your workspaces into our system.\nError: ${error}`; |
299 | return response.status(401).send(errorMessage); | 292 | return response.status(401).send(errorMessage); |
300 | } | 293 | } |
301 | 294 | ||
@@ -306,15 +299,29 @@ class UserController { | |||
306 | let newWorkspaceId; | 299 | let newWorkspaceId; |
307 | do { | 300 | do { |
308 | newWorkspaceId = uuid(); | 301 | newWorkspaceId = uuid(); |
309 | } while ((await Workspace.query().where('workspaceId', newWorkspaceId).fetch()).rows.length > 0); // eslint-disable-line no-await-in-loop | 302 | } while ( |
310 | 303 | (await Workspace.query().where('workspaceId', newWorkspaceId).fetch()) | |
311 | if (workspace.services && typeof (workspace.services) === 'string' && workspace.services.length > 0) { | 304 | .rows.length > 0 |
305 | ); // eslint-disable-line no-await-in-loop | ||
306 | |||
307 | if ( | ||
308 | workspace.services && | ||
309 | typeof workspace.services === 'string' && | ||
310 | workspace.services.length > 0 | ||
311 | ) { | ||
312 | workspace.services = JSON.parse(workspace.services); | 312 | workspace.services = JSON.parse(workspace.services); |
313 | } | 313 | } |
314 | const services = (workspace.services && typeof (workspace.services) === 'object') ? | 314 | const services = |
315 | workspace.services.map(oldServiceId => serviceIdTranslation[oldServiceId]) : | 315 | workspace.services && typeof workspace.services === 'object' |
316 | []; | 316 | ? workspace.services.map( |
317 | if (workspace.data && typeof (workspace.data) === 'string' && workspace.data.length > 0) { | 317 | oldServiceId => serviceIdTranslation[oldServiceId], |
318 | ) | ||
319 | : []; | ||
320 | if ( | ||
321 | workspace.data && | ||
322 | typeof workspace.data === 'string' && | ||
323 | workspace.data.length > 0 | ||
324 | ) { | ||
318 | workspace.data = JSON.parse(workspace.data); | 325 | workspace.data = JSON.parse(workspace.data); |
319 | } | 326 | } |
320 | 327 | ||
@@ -332,12 +339,19 @@ class UserController { | |||
332 | let newServiceId; | 339 | let newServiceId; |
333 | do { | 340 | do { |
334 | newServiceId = uuid(); | 341 | newServiceId = uuid(); |
335 | } while ((await Service.query().where('serviceId', newServiceId).fetch()).rows.length > 0); // eslint-disable-line no-await-in-loop | 342 | } while ( |
343 | (await Service.query().where('serviceId', newServiceId).fetch()).rows | ||
344 | .length > 0 | ||
345 | ); // eslint-disable-line no-await-in-loop | ||
336 | 346 | ||
337 | // store the old serviceId as the key for future lookup | 347 | // store the old serviceId as the key for future lookup |
338 | serviceIdTranslation[service.serviceId] = newServiceId; | 348 | serviceIdTranslation[service.serviceId] = newServiceId; |
339 | 349 | ||
340 | if (service.settings && typeof (service.settings) === 'string' && service.settings.length > 0) { | 350 | if ( |
351 | service.settings && | ||
352 | typeof service.settings === 'string' && | ||
353 | service.settings.length > 0 | ||
354 | ) { | ||
341 | service.settings = JSON.parse(service.settings); | 355 | service.settings = JSON.parse(service.settings); |
342 | } | 356 | } |
343 | 357 | ||
diff --git a/src/internal-server/app/Middleware/ConvertEmptyStringsToNull.js b/src/internal-server/app/Middleware/ConvertEmptyStringsToNull.js index 87f1f6c25..9591cdc41 100644 --- a/src/internal-server/app/Middleware/ConvertEmptyStringsToNull.js +++ b/src/internal-server/app/Middleware/ConvertEmptyStringsToNull.js | |||
@@ -1,6 +1,6 @@ | |||
1 | class ConvertEmptyStringsToNull { | 1 | class ConvertEmptyStringsToNull { |
2 | async handle({ request }, next) { | 2 | async handle({ request }, next) { |
3 | if (Object.keys(request.body).length) { | 3 | if (Object.keys(request.body).length > 0) { |
4 | request.body = Object.assign( | 4 | request.body = Object.assign( |
5 | ...Object.keys(request.body).map(key => ({ | 5 | ...Object.keys(request.body).map(key => ({ |
6 | [key]: request.body[key] !== '' ? request.body[key] : null, | 6 | [key]: request.body[key] !== '' ? request.body[key] : null, |
diff --git a/src/internal-server/app/Models/Recipe.js b/src/internal-server/app/Models/Recipe.js index bd9741114..f9370e206 100644 --- a/src/internal-server/app/Models/Recipe.js +++ b/src/internal-server/app/Models/Recipe.js | |||
@@ -1,7 +1,6 @@ | |||
1 | /** @type {typeof import('@adonisjs/lucid/src/Lucid/Model')} */ | 1 | /** @type {typeof import('@adonisjs/lucid/src/Lucid/Model')} */ |
2 | const Model = use('Model'); | 2 | const Model = use('Model'); |
3 | 3 | ||
4 | class Recipe extends Model { | 4 | class Recipe extends Model {} |
5 | } | ||
6 | 5 | ||
7 | module.exports = Recipe; | 6 | module.exports = Recipe; |
diff --git a/src/internal-server/app/Models/Service.js b/src/internal-server/app/Models/Service.js index a2e5c981e..95321686c 100644 --- a/src/internal-server/app/Models/Service.js +++ b/src/internal-server/app/Models/Service.js | |||
@@ -1,7 +1,6 @@ | |||
1 | /** @type {typeof import('@adonisjs/lucid/src/Lucid/Model')} */ | 1 | /** @type {typeof import('@adonisjs/lucid/src/Lucid/Model')} */ |
2 | const Model = use('Model'); | 2 | const Model = use('Model'); |
3 | 3 | ||
4 | class Service extends Model { | 4 | class Service extends Model {} |
5 | } | ||
6 | 5 | ||
7 | module.exports = Service; | 6 | module.exports = Service; |
diff --git a/src/internal-server/app/Models/Token.js b/src/internal-server/app/Models/Token.js index 83e989117..1388b94ad 100644 --- a/src/internal-server/app/Models/Token.js +++ b/src/internal-server/app/Models/Token.js | |||
@@ -1,7 +1,6 @@ | |||
1 | /** @type {typeof import('@adonisjs/lucid/src/Lucid/Model')} */ | 1 | /** @type {typeof import('@adonisjs/lucid/src/Lucid/Model')} */ |
2 | const Model = use('Model'); | 2 | const Model = use('Model'); |
3 | 3 | ||
4 | class Token extends Model { | 4 | class Token extends Model {} |
5 | } | ||
6 | 5 | ||
7 | module.exports = Token; | 6 | module.exports = Token; |
diff --git a/src/internal-server/app/Models/User.js b/src/internal-server/app/Models/User.js index 907710d8d..f17f04c3e 100644 --- a/src/internal-server/app/Models/User.js +++ b/src/internal-server/app/Models/User.js | |||
@@ -2,7 +2,6 @@ | |||
2 | /** @type {typeof import('@adonisjs/lucid/src/Lucid/Model')} */ | 2 | /** @type {typeof import('@adonisjs/lucid/src/Lucid/Model')} */ |
3 | const Model = use('Model'); | 3 | const Model = use('Model'); |
4 | 4 | ||
5 | class User extends Model { | 5 | class User extends Model {} |
6 | } | ||
7 | 6 | ||
8 | module.exports = User; | 7 | module.exports = User; |
diff --git a/src/internal-server/app/Models/Workspace.js b/src/internal-server/app/Models/Workspace.js index dcf39ac75..c47c02e37 100644 --- a/src/internal-server/app/Models/Workspace.js +++ b/src/internal-server/app/Models/Workspace.js | |||
@@ -1,7 +1,6 @@ | |||
1 | /** @type {typeof import('@adonisjs/lucid/src/Lucid/Model')} */ | 1 | /** @type {typeof import('@adonisjs/lucid/src/Lucid/Model')} */ |
2 | const Model = use('Model'); | 2 | const Model = use('Model'); |
3 | 3 | ||
4 | class Workspace extends Model { | 4 | class Workspace extends Model {} |
5 | } | ||
6 | 5 | ||
7 | module.exports = Workspace; | 6 | module.exports = Workspace; |
diff --git a/src/internal-server/config/shield.js b/src/internal-server/config/shield.js index 76f430e91..4ff22c3f9 100644 --- a/src/internal-server/config/shield.js +++ b/src/internal-server/config/shield.js | |||
@@ -25,8 +25,7 @@ module.exports = { | |||
25 | | } | 25 | | } |
26 | | | 26 | | |
27 | */ | 27 | */ |
28 | directives: { | 28 | directives: {}, |
29 | }, | ||
30 | /* | 29 | /* |
31 | |-------------------------------------------------------------------------- | 30 | |-------------------------------------------------------------------------- |
32 | | Report only | 31 | | Report only |
diff --git a/src/internal-server/public/js/transfer.js b/src/internal-server/public/js/transfer.js index 8382bba02..36fdbd61a 100644 --- a/src/internal-server/public/js/transfer.js +++ b/src/internal-server/public/js/transfer.js | |||
@@ -1,13 +1,17 @@ | |||
1 | const submitBtn = document.getElementById('submit'); | 1 | const submitBtn = document.querySelector('#submit'); |
2 | const fileInput = document.getElementById('file'); | 2 | const fileInput = document.querySelector('#file'); |
3 | const fileOutput = document.getElementById('fileoutput'); | 3 | const fileOutput = document.querySelector('#fileoutput'); |
4 | 4 | ||
5 | fileInput.addEventListener('change', () => { | 5 | fileInput?.addEventListener('change', () => { |
6 | const reader = new FileReader(); | 6 | const reader = new FileReader(); |
7 | reader.onload = () => { | 7 | reader.addEventListener('load', () => { |
8 | const text = reader.result; | 8 | const text = reader.result; |
9 | fileOutput.value = text; | 9 | if (fileOutput) { |
10 | submitBtn.disabled = false; | 10 | fileOutput.value = text; |
11 | }; | 11 | } |
12 | if (submitBtn) { | ||
13 | submitBtn.disabled = false; | ||
14 | } | ||
15 | }); | ||
12 | reader.readAsText(fileInput.files[0]); | 16 | reader.readAsText(fileInput.files[0]); |
13 | }); | 17 | }); |
diff --git a/src/internal-server/start/kernel.js b/src/internal-server/start/kernel.js index 7b540f829..f72e445f2 100644 --- a/src/internal-server/start/kernel.js +++ b/src/internal-server/start/kernel.js | |||
@@ -32,8 +32,7 @@ const globalMiddleware = [ | |||
32 | | Route.get().middleware('auth') | 32 | | Route.get().middleware('auth') |
33 | | | 33 | | |
34 | */ | 34 | */ |
35 | const namedMiddleware = { | 35 | const namedMiddleware = {}; |
36 | }; | ||
37 | 36 | ||
38 | /* | 37 | /* |
39 | |-------------------------------------------------------------------------- | 38 | |-------------------------------------------------------------------------- |
@@ -45,11 +44,8 @@ const namedMiddleware = { | |||
45 | | control over request lifecycle. | 44 | | control over request lifecycle. |
46 | | | 45 | | |
47 | */ | 46 | */ |
48 | const serverMiddleware = [ | 47 | const serverMiddleware = ['Adonis/Middleware/Static']; |
49 | 'Adonis/Middleware/Static', | ||
50 | ]; | ||
51 | 48 | ||
52 | Server | 49 | Server.registerGlobal(globalMiddleware) |
53 | .registerGlobal(globalMiddleware) | ||
54 | .registerNamed(namedMiddleware) | 50 | .registerNamed(namedMiddleware) |
55 | .use(serverMiddleware); | 51 | .use(serverMiddleware); |
diff --git a/src/internal-server/start/migrate.js b/src/internal-server/start/migrate.js index c27e07bc5..0f25240cc 100644 --- a/src/internal-server/start/migrate.js +++ b/src/internal-server/start/migrate.js | |||
@@ -6,29 +6,39 @@ const { ferdiVersion } = require('../../environment'); | |||
6 | const Database = use('Database'); | 6 | const Database = use('Database'); |
7 | const User = use('App/Models/User'); | 7 | const User = use('App/Models/User'); |
8 | 8 | ||
9 | const migrateLog = (text) => { | 9 | const migrateLog = text => { |
10 | console.log('\x1b[36m%s\x1b[0m', 'Ferdi Migration:', '\x1b[0m', text); | 10 | console.log('\u001B[36m%s\u001B[0m', 'Ferdi Migration:', '\u001B[0m', text); |
11 | }; | 11 | }; |
12 | 12 | ||
13 | module.exports = async () => { | 13 | module.exports = async () => { |
14 | migrateLog('🧙 Running database migration wizard'); | 14 | migrateLog('🧙 Running database migration wizard'); |
15 | 15 | ||
16 | // Make sure user table exists | 16 | // Make sure user table exists |
17 | await Database.raw('CREATE TABLE IF NOT EXISTS `users` (`id` integer not null primary key autoincrement, `settings` text, `created_at` datetime, `updated_at` datetime);'); | 17 | await Database.raw( |
18 | 'CREATE TABLE IF NOT EXISTS `users` (`id` integer not null primary key autoincrement, `settings` text, `created_at` datetime, `updated_at` datetime);', | ||
19 | ); | ||
18 | 20 | ||
19 | const user = await User.find(1); | 21 | const user = await User.find(1); |
20 | let settings; | 22 | let settings; |
21 | if (!user) { | 23 | if (!user) { |
22 | migrateLog('🎩 Migrating from old Ferdi version as user doesn\'t exist'); | 24 | migrateLog("🎩 Migrating from old Ferdi version as user doesn't exist"); |
23 | 25 | ||
24 | // Create new user | 26 | // Create new user |
25 | await Database.raw('INSERT INTO "users" ("id") VALUES (\'1\');'); | 27 | await Database.raw('INSERT INTO "users" ("id") VALUES (\'1\');'); |
26 | } else { | 28 | } else { |
27 | settings = typeof user.settings === 'string' ? JSON.parse(user.settings) : user.settings; | 29 | settings = |
30 | typeof user.settings === 'string' | ||
31 | ? JSON.parse(user.settings) | ||
32 | : user.settings; | ||
28 | } | 33 | } |
29 | 34 | ||
30 | if (!settings || !settings.db_version || settings.db_version !== ferdiVersion) { | 35 | if ( |
31 | const srcVersion = settings && settings.db_version ? settings.db_version : '5.4.0-beta.2'; | 36 | !settings || |
37 | !settings.db_version || | ||
38 | settings.db_version !== ferdiVersion | ||
39 | ) { | ||
40 | const srcVersion = | ||
41 | settings && settings.db_version ? settings.db_version : '5.4.0-beta.2'; | ||
32 | migrateLog(`🔮 Migrating table from ${srcVersion} to ${ferdiVersion}`); | 42 | migrateLog(`🔮 Migrating table from ${srcVersion} to ${ferdiVersion}`); |
33 | 43 | ||
34 | // Migrate database to current Ferdi version | 44 | // Migrate database to current Ferdi version |
diff --git a/src/internal-server/test.js b/src/internal-server/test.js index 8d4807d06..ef85743f3 100644 --- a/src/internal-server/test.js +++ b/src/internal-server/test.js | |||
@@ -6,4 +6,4 @@ const dummyUserFolder = path.join(__dirname, 'user_data'); | |||
6 | 6 | ||
7 | fs.ensureDirSync(dummyUserFolder); | 7 | fs.ensureDirSync(dummyUserFolder); |
8 | 8 | ||
9 | server(dummyUserFolder, 45568); | 9 | server(dummyUserFolder, 45_568); |