aboutsummaryrefslogtreecommitdiffstats
path: root/src/internal-server
diff options
context:
space:
mode:
authorLibravatar mhatvan <markus_hatvan@aon.at>2021-08-05 08:58:28 +0200
committerLibravatar Vijay Raghavan Aravamudhan <vraravam@users.noreply.github.com>2021-08-05 08:05:49 +0000
commit305c2c5ecb49a1349be2efb1ef557d61da9a64dc (patch)
tree19a05ed4ddfc1e5b5bb7fc3ecc071ad562da820f /src/internal-server
parentrefactor: minor refactoring: solve name-clash of env vars vs vars in the program (diff)
downloadferdium-app-305c2c5ecb49a1349be2efb1ef557d61da9a64dc.tar.gz
ferdium-app-305c2c5ecb49a1349be2efb1ef557d61da9a64dc.tar.zst
ferdium-app-305c2c5ecb49a1349be2efb1ef557d61da9a64dc.zip
refactor: general code improvements
- replace deprecated fs.exists with fs.existsSync - replace console.log with debug - replace hardcoded FERDI_VERSION in start.js with dynamic one from package.json - correct JSDoc annotations in Handler.js - simplify macOSPermissions.js - updates to various eslint rules - add FileReader to known globals
Diffstat (limited to 'src/internal-server')
-rw-r--r--src/internal-server/app/Controllers/Http/ServiceController.js150
-rw-r--r--src/internal-server/app/Exceptions/Handler.js10
-rw-r--r--src/internal-server/public/js/transfer.js3
-rw-r--r--src/internal-server/start.js17
4 files changed, 85 insertions, 95 deletions
diff --git a/src/internal-server/app/Controllers/Http/ServiceController.js b/src/internal-server/app/Controllers/Http/ServiceController.js
index 36d20c70c..c30e9e040 100644
--- a/src/internal-server/app/Controllers/Http/ServiceController.js
+++ b/src/internal-server/app/Controllers/Http/ServiceController.js
@@ -1,7 +1,5 @@
1const Service = use('App/Models/Service'); 1const Service = use('App/Models/Service');
2const { 2const { validateAll } = use('Validator');
3 validateAll,
4} = use('Validator');
5const Env = use('Env'); 3const Env = use('Env');
6 4
7const uuid = require('uuid/v4'); 5const uuid = require('uuid/v4');
@@ -10,10 +8,7 @@ const fs = require('fs-extra');
10 8
11class ServiceController { 9class ServiceController {
12 // Create a new service for user 10 // Create a new service for user
13 async create({ 11 async create({ request, response }) {
14 request,
15 response,
16 }) {
17 // Validate user input 12 // Validate user input
18 const validation = await validateAll(request.all(), { 13 const validation = await validateAll(request.all(), {
19 name: 'required|string', 14 name: 'required|string',
@@ -33,7 +28,10 @@ class ServiceController {
33 let serviceId; 28 let serviceId;
34 do { 29 do {
35 serviceId = uuid(); 30 serviceId = uuid();
36 } while ((await Service.query().where('serviceId', serviceId).fetch()).rows.length > 0); // eslint-disable-line no-await-in-loop 31 } while (
32 (await Service.query().where('serviceId', serviceId).fetch()).rows
33 .length > 0
34 ); // eslint-disable-line no-await-in-loop
37 35
38 await Service.create({ 36 await Service.create({
39 serviceId, 37 serviceId,
@@ -64,13 +62,14 @@ class ServiceController {
64 } 62 }
65 63
66 // List all services a user has created 64 // List all services a user has created
67 async list({ 65 async list({ response }) {
68 response,
69 }) {
70 const services = (await Service.all()).rows; 66 const services = (await Service.all()).rows;
71 // Convert to array with all data Franz wants 67 // Convert to array with all data Franz wants
72 const servicesArray = services.map((service) => { 68 const servicesArray = services.map(service => {
73 const settings = typeof service.settings === 'string' ? JSON.parse(service.settings) : service.settings; 69 const settings =
70 typeof service.settings === 'string'
71 ? JSON.parse(service.settings)
72 : service.settings;
74 73
75 return { 74 return {
76 customRecipe: false, 75 customRecipe: false,
@@ -84,7 +83,9 @@ class ServiceController {
84 spellcheckerLanguage: '', 83 spellcheckerLanguage: '',
85 workspaces: [], 84 workspaces: [],
86 ...JSON.parse(service.settings), 85 ...JSON.parse(service.settings),
87 iconUrl: settings.iconId ? `http://127.0.0.1:${Env.get('PORT')}/v1/icon/${settings.iconId}` : null, 86 iconUrl: settings.iconId
87 ? `http://127.0.0.1:${Env.get('PORT')}/v1/icon/${settings.iconId}`
88 : null,
88 id: service.serviceId, 89 id: service.serviceId,
89 name: service.name, 90 name: service.name,
90 recipeId: service.recipeId, 91 recipeId: service.recipeId,
@@ -95,11 +96,7 @@ class ServiceController {
95 return response.send(servicesArray); 96 return response.send(servicesArray);
96 } 97 }
97 98
98 async edit({ 99 async edit({ request, response, params }) {
99 request,
100 response,
101 params,
102 }) {
103 if (request.file('icon')) { 100 if (request.file('icon')) {
104 // Upload custom service icon 101 // Upload custom service icon
105 await fs.ensureDir(path.join(Env.get('USER_PATH'), 'icons')); 102 await fs.ensureDir(path.join(Env.get('USER_PATH'), 'icons'));
@@ -108,19 +105,19 @@ class ServiceController {
108 types: ['image'], 105 types: ['image'],
109 size: '2mb', 106 size: '2mb',
110 }); 107 });
111 const { 108 const { id } = params;
112 id, 109 const service = (await Service.query().where('serviceId', id).fetch())
113 } = params; 110 .rows[0];
114 const service = (await Service.query() 111 const settings =
115 .where('serviceId', id).fetch()).rows[0]; 112 typeof service.settings === 'string'
116 const settings = typeof service.settings === 'string' ? JSON.parse(service.settings) : service.settings; 113 ? JSON.parse(service.settings)
114 : service.settings;
117 115
118 // Generate new icon ID 116 // Generate new icon ID
119 let iconId; 117 let iconId;
120 do { 118 do {
121 iconId = uuid() + uuid(); 119 iconId = uuid() + uuid();
122 // eslint-disable-next-line no-await-in-loop 120 } while (fs.existsSync(path.join(Env.get('USER_PATH'), 'icons', iconId)));
123 } while (await fs.exists(path.join(Env.get('USER_PATH'), 'icons', iconId)));
124 121
125 await icon.move(path.join(Env.get('USER_PATH'), 'icons'), { 122 await icon.move(path.join(Env.get('USER_PATH'), 'icons'), {
126 name: iconId, 123 name: iconId,
@@ -135,23 +132,29 @@ class ServiceController {
135 ...settings, 132 ...settings,
136 ...{ 133 ...{
137 iconId, 134 iconId,
138 customIconVersion: settings && settings.customIconVersion ? settings.customIconVersion + 1 : 1, 135 customIconVersion:
136 settings && settings.customIconVersion
137 ? settings.customIconVersion + 1
138 : 1,
139 }, 139 },
140 }; 140 };
141 141
142 // Update data in database 142 // Update data in database
143 await (Service.query() 143 await Service.query()
144 .where('serviceId', id)).update({ 144 .where('serviceId', id)
145 name: service.name, 145 .update({
146 settings: JSON.stringify(newSettings), 146 name: service.name,
147 }); 147 settings: JSON.stringify(newSettings),
148 });
148 149
149 return response.send({ 150 return response.send({
150 data: { 151 data: {
151 id, 152 id,
152 name: service.name, 153 name: service.name,
153 ...newSettings, 154 ...newSettings,
154 iconUrl: `http://127.0.0.1:${Env.get('PORT')}/v1/icon/${newSettings.iconId}`, 155 iconUrl: `http://127.0.0.1:${Env.get('PORT')}/v1/icon/${
156 newSettings.iconId
157 }`,
155 userId: 1, 158 userId: 1,
156 }, 159 },
157 status: ['updated'], 160 status: ['updated'],
@@ -159,29 +162,30 @@ class ServiceController {
159 } 162 }
160 // Update service info 163 // Update service info
161 const data = request.all(); 164 const data = request.all();
162 const { 165 const { id } = params;
163 id,
164 } = params;
165 166
166 // Get current settings from db 167 // Get current settings from db
167 const serviceData = (await Service.query() 168 const serviceData = (await Service.query().where('serviceId', id).fetch())
168 .where('serviceId', id).fetch()).rows[0]; 169 .rows[0];
169 170
170 const settings = { 171 const settings = {
171 ...typeof serviceData.settings === 'string' ? JSON.parse(serviceData.settings) : serviceData.settings, 172 ...(typeof serviceData.settings === 'string'
173 ? JSON.parse(serviceData.settings)
174 : serviceData.settings),
172 ...data, 175 ...data,
173 }; 176 };
174 177
175 // Update data in database 178 // Update data in database
176 await (Service.query() 179 await Service.query()
177 .where('serviceId', id)).update({ 180 .where('serviceId', id)
178 name: data.name, 181 .update({
179 settings: JSON.stringify(settings), 182 name: data.name,
180 }); 183 settings: JSON.stringify(settings),
184 });
181 185
182 // Get updated row 186 // Get updated row
183 const service = (await Service.query() 187 const service = (await Service.query().where('serviceId', id).fetch())
184 .where('serviceId', id).fetch()).rows[0]; 188 .rows[0];
185 189
186 return response.send({ 190 return response.send({
187 data: { 191 data: {
@@ -195,34 +199,29 @@ class ServiceController {
195 }); 199 });
196 } 200 }
197 201
198 async icon({ 202 async icon({ params, response }) {
199 params, 203 const { id } = params;
200 response,
201 }) {
202 const {
203 id,
204 } = params;
205 204
206 const iconPath = path.join(Env.get('USER_PATH'), 'icons', id); 205 const iconPath = path.join(Env.get('USER_PATH'), 'icons', id);
207 if (!await fs.exists(iconPath)) { 206 if (!fs.existsSync(iconPath)) {
208 return response.status(404).send({ 207 return response.status(404).send({
209 status: 'Icon doesn\'t exist', 208 status: "Icon doesn't exist",
210 }); 209 });
211 } 210 }
212 211
213 return response.download(iconPath); 212 return response.download(iconPath);
214 } 213 }
215 214
216 async reorder({ 215 async reorder({ request, response }) {
217 request,
218 response,
219 }) {
220 const data = request.all(); 216 const data = request.all();
221 217
222 for (const service of Object.keys(data)) { 218 for (const service of Object.keys(data)) {
223 // Get current settings from db 219 // Get current settings from db
224 const serviceData = (await Service.query() // eslint-disable-line no-await-in-loop 220 const serviceData = (
225 .where('serviceId', service).fetch()).rows[0]; 221 await Service.query() // eslint-disable-line no-await-in-loop
222 .where('serviceId', service)
223 .fetch()
224 ).rows[0];
226 225
227 const settings = { 226 const settings = {
228 ...JSON.parse(serviceData.settings), 227 ...JSON.parse(serviceData.settings),
@@ -230,8 +229,8 @@ class ServiceController {
230 }; 229 };
231 230
232 // Update data in database 231 // Update data in database
233 await (Service.query() // eslint-disable-line no-await-in-loop 232 await Service.query() // eslint-disable-line no-await-in-loop
234 .where('serviceId', service)) 233 .where('serviceId', service)
235 .update({ 234 .update({
236 settings: JSON.stringify(settings), 235 settings: JSON.stringify(settings),
237 }); 236 });
@@ -240,8 +239,11 @@ class ServiceController {
240 // Get new services 239 // Get new services
241 const services = (await Service.all()).rows; 240 const services = (await Service.all()).rows;
242 // Convert to array with all data Franz wants 241 // Convert to array with all data Franz wants
243 const servicesArray = services.map((service) => { 242 const servicesArray = services.map(service => {
244 const settings = typeof service.settings === 'string' ? JSON.parse(service.settings) : service.settings; 243 const settings =
244 typeof service.settings === 'string'
245 ? JSON.parse(service.settings)
246 : service.settings;
245 247
246 return { 248 return {
247 customRecipe: false, 249 customRecipe: false,
@@ -255,7 +257,9 @@ class ServiceController {
255 spellcheckerLanguage: '', 257 spellcheckerLanguage: '',
256 workspaces: [], 258 workspaces: [],
257 ...JSON.parse(service.settings), 259 ...JSON.parse(service.settings),
258 iconUrl: settings.iconId ? `http://127.0.0.1:${Env.get('PORT')}/v1/icon/${settings.iconId}` : null, 260 iconUrl: settings.iconId
261 ? `http://127.0.0.1:${Env.get('PORT')}/v1/icon/${settings.iconId}`
262 : null,
259 id: service.serviceId, 263 id: service.serviceId,
260 name: service.name, 264 name: service.name,
261 recipeId: service.recipeId, 265 recipeId: service.recipeId,
@@ -266,19 +270,13 @@ class ServiceController {
266 return response.send(servicesArray); 270 return response.send(servicesArray);
267 } 271 }
268 272
269 update({ 273 update({ response }) {
270 response,
271 }) {
272 return response.send([]); 274 return response.send([]);
273 } 275 }
274 276
275 async delete({ 277 async delete({ params, response }) {
276 params,
277 response,
278 }) {
279 // Update data in database 278 // Update data in database
280 await (Service.query() 279 await Service.query().where('serviceId', params.id).delete();
281 .where('serviceId', params.id)).delete();
282 280
283 return response.send({ 281 return response.send({
284 message: 'Sucessfully deleted service', 282 message: 'Sucessfully deleted service',
diff --git a/src/internal-server/app/Exceptions/Handler.js b/src/internal-server/app/Exceptions/Handler.js
index 111ef4e0e..ab323fd38 100644
--- a/src/internal-server/app/Exceptions/Handler.js
+++ b/src/internal-server/app/Exceptions/Handler.js
@@ -13,10 +13,9 @@ class ExceptionHandler extends BaseExceptionHandler {
13 * @method handle 13 * @method handle
14 * 14 *
15 * @param {Object} error 15 * @param {Object} error
16 * @param {Object} options.request 16 * @param {object} options.response
17 * @param {Object} options.response
18 * 17 *
19 * @return {void} 18 * @return {Promise<void>}
20 */ 19 */
21 async handle(error, { response }) { 20 async handle(error, { response }) {
22 if (error.name === 'ValidationException') { 21 if (error.name === 'ValidationException') {
@@ -31,10 +30,7 @@ class ExceptionHandler extends BaseExceptionHandler {
31 * 30 *
32 * @method report 31 * @method report
33 * 32 *
34 * @param {Object} error 33 * @return {Promise<boolean>}
35 * @param {Object} options.request
36 *
37 * @return {void}
38 */ 34 */
39 async report() { 35 async report() {
40 return true; 36 return true;
diff --git a/src/internal-server/public/js/transfer.js b/src/internal-server/public/js/transfer.js
index c04a6d3b1..8382bba02 100644
--- a/src/internal-server/public/js/transfer.js
+++ b/src/internal-server/public/js/transfer.js
@@ -1,11 +1,10 @@
1/* eslint-env browser */
2const submitBtn = document.getElementById('submit'); 1const submitBtn = document.getElementById('submit');
3const fileInput = document.getElementById('file'); 2const fileInput = document.getElementById('file');
4const fileOutput = document.getElementById('fileoutput'); 3const fileOutput = document.getElementById('fileoutput');
5 4
6fileInput.addEventListener('change', () => { 5fileInput.addEventListener('change', () => {
7 const reader = new FileReader(); 6 const reader = new FileReader();
8 reader.onload = function () { 7 reader.onload = () => {
9 const text = reader.result; 8 const text = reader.result;
10 fileOutput.value = text; 9 fileOutput.value = text;
11 submitBtn.disabled = false; 10 submitBtn.disabled = false;
diff --git a/src/internal-server/start.js b/src/internal-server/start.js
index adcac0bec..683f24651 100644
--- a/src/internal-server/start.js
+++ b/src/internal-server/start.js
@@ -14,22 +14,22 @@
14| Also you can preload files by calling `preLoad('path/to/file')` method. 14| Also you can preload files by calling `preLoad('path/to/file')` method.
15| Make sure to pass a relative path from the project root. 15| Make sure to pass a relative path from the project root.
16*/ 16*/
17process.env.FERDI_VERSION = '5.4.0-beta.5';
18 17
19const path = require('path'); 18const fold = require('@adonisjs/fold');
19const { Ignitor } = require('@adonisjs/ignitor');
20const fs = require('fs-extra'); 20const fs = require('fs-extra');
21const os = require('os'); 21const os = require('os');
22const path = require('path');
23const packageJSON = require('../../package.json');
22 24
25process.env.FERDI_VERSION = packageJSON.version;
23process.env.ENV_PATH = path.join(__dirname, 'env.ini'); 26process.env.ENV_PATH = path.join(__dirname, 'env.ini');
24 27
25const { Ignitor } = require('@adonisjs/ignitor');
26const fold = require('@adonisjs/fold');
27
28module.exports = async (userPath, port) => { 28module.exports = async (userPath, port) => {
29 const dbPath = path.join(userPath, 'server.sqlite'); 29 const dbPath = path.join(userPath, 'server.sqlite');
30 const dbTemplatePath = path.join(__dirname, 'database', 'template.sqlite'); 30 const dbTemplatePath = path.join(__dirname, 'database', 'template.sqlite');
31 31
32 if (!await fs.exists(dbPath)) { 32 if (!fs.existsSync(dbPath)) {
33 // Manually copy file 33 // Manually copy file
34 // We can't use copyFile here as it will cause the file to be readonly on Windows 34 // We can't use copyFile here as it will cause the file to be readonly on Windows
35 const dbTemplate = await fs.readFile(dbTemplatePath); 35 const dbTemplate = await fs.readFile(dbTemplatePath);
@@ -46,8 +46,5 @@ module.exports = async (userPath, port) => {
46 process.env.USER_PATH = userPath; 46 process.env.USER_PATH = userPath;
47 process.env.PORT = port; 47 process.env.PORT = port;
48 48
49 new Ignitor(fold) 49 new Ignitor(fold).appRoot(__dirname).fireHttpServer().catch(console.error); // eslint-disable-line no-console
50 .appRoot(__dirname)
51 .fireHttpServer()
52 .catch(console.error); // eslint-disable-line no-console
53}; 50};