diff options
Diffstat (limited to 'src/api/server')
-rw-r--r-- | src/api/server/LocalApi.js | 36 | ||||
-rw-r--r-- | src/api/server/ServerApi.js | 63 |
2 files changed, 92 insertions, 7 deletions
diff --git a/src/api/server/LocalApi.js b/src/api/server/LocalApi.js index eba236f16..e95d750ac 100644 --- a/src/api/server/LocalApi.js +++ b/src/api/server/LocalApi.js | |||
@@ -1,4 +1,9 @@ | |||
1 | import SettingsModel from '../../models/Settings'; | 1 | import { remote } from 'electron'; |
2 | import du from 'du'; | ||
3 | |||
4 | import { getServicePartitionsDirectory } from '../../helpers/service-helpers.js'; | ||
5 | |||
6 | const { session } = remote; | ||
2 | 7 | ||
3 | export default class LocalApi { | 8 | export default class LocalApi { |
4 | // App | 9 | // App |
@@ -15,7 +20,7 @@ export default class LocalApi { | |||
15 | async getAppSettings() { | 20 | async getAppSettings() { |
16 | const settingsString = localStorage.getItem('app'); | 21 | const settingsString = localStorage.getItem('app'); |
17 | try { | 22 | try { |
18 | const settings = new SettingsModel(JSON.parse(settingsString) || {}); | 23 | const settings = JSON.parse(settingsString) || {}; |
19 | console.debug('LocalApi::getAppSettings resolves', settings); | 24 | console.debug('LocalApi::getAppSettings resolves', settings); |
20 | 25 | ||
21 | return settings; | 26 | return settings; |
@@ -32,4 +37,31 @@ export default class LocalApi { | |||
32 | localStorage.setItem('app', JSON.stringify(settings)); | 37 | localStorage.setItem('app', JSON.stringify(settings)); |
33 | } | 38 | } |
34 | } | 39 | } |
40 | |||
41 | // Services | ||
42 | async getAppCacheSize() { | ||
43 | const partitionsDir = getServicePartitionsDirectory(); | ||
44 | return new Promise((resolve, reject) => { | ||
45 | du(partitionsDir, (err, size) => { | ||
46 | if (err) reject(err); | ||
47 | |||
48 | console.debug('LocalApi::getAppCacheSize resolves', size); | ||
49 | resolve(size); | ||
50 | }); | ||
51 | }); | ||
52 | } | ||
53 | |||
54 | async clearCache(serviceId) { | ||
55 | const s = session.fromPartition(`persist:service-${serviceId}`); | ||
56 | |||
57 | console.debug('LocalApi::clearCache resolves', serviceId); | ||
58 | return new Promise(resolve => s.clearCache(resolve)); | ||
59 | } | ||
60 | |||
61 | async clearAppCache() { | ||
62 | const s = session.defaultSession; | ||
63 | |||
64 | console.debug('LocalApi::clearCache clearAppCache'); | ||
65 | return new Promise(resolve => s.clearCache(resolve)); | ||
66 | } | ||
35 | } | 67 | } |
diff --git a/src/api/server/ServerApi.js b/src/api/server/ServerApi.js index 644bf20cd..a684ff98b 100644 --- a/src/api/server/ServerApi.js +++ b/src/api/server/ServerApi.js | |||
@@ -12,6 +12,8 @@ import NewsModel from '../../models/News'; | |||
12 | import UserModel from '../../models/User'; | 12 | import UserModel from '../../models/User'; |
13 | import OrderModel from '../../models/Order'; | 13 | import OrderModel from '../../models/Order'; |
14 | 14 | ||
15 | import { sleep } from '../../helpers/async-helpers'; | ||
16 | |||
15 | import { API } from '../../environment'; | 17 | import { API } from '../../environment'; |
16 | 18 | ||
17 | import { | 19 | import { |
@@ -20,6 +22,10 @@ import { | |||
20 | loadRecipeConfig, | 22 | loadRecipeConfig, |
21 | } from '../../helpers/recipe-helpers'; | 23 | } from '../../helpers/recipe-helpers'; |
22 | 24 | ||
25 | import { | ||
26 | removeServicePartitionDirectory, | ||
27 | } from '../../helpers/service-helpers.js'; | ||
28 | |||
23 | module.paths.unshift( | 29 | module.paths.unshift( |
24 | getDevRecipeDirectory(), | 30 | getDevRecipeDirectory(), |
25 | getRecipeDirectory(), | 31 | getRecipeDirectory(), |
@@ -165,27 +171,65 @@ export default class ServerApi { | |||
165 | throw request; | 171 | throw request; |
166 | } | 172 | } |
167 | const serviceData = await request.json(); | 173 | const serviceData = await request.json(); |
174 | |||
175 | if (data.iconFile) { | ||
176 | const iconUrl = await this.uploadServiceIcon(serviceData.data.id, data.iconFile); | ||
177 | |||
178 | serviceData.data.iconUrl = iconUrl; | ||
179 | } | ||
180 | |||
168 | const service = Object.assign(serviceData, { data: await this._prepareServiceModel(serviceData.data) }); | 181 | const service = Object.assign(serviceData, { data: await this._prepareServiceModel(serviceData.data) }); |
169 | 182 | ||
170 | console.debug('ServerApi::createService resolves', service); | 183 | console.debug('ServerApi::createService resolves', service); |
171 | return service; | 184 | return service; |
172 | } | 185 | } |
173 | 186 | ||
174 | async updateService(recipeId, data) { | 187 | async updateService(serviceId, rawData) { |
175 | const request = await window.fetch(`${SERVER_URL}/${API_VERSION}/service/${recipeId}`, this._prepareAuthRequest({ | 188 | const data = rawData; |
189 | |||
190 | if (data.iconFile) { | ||
191 | await this.uploadServiceIcon(serviceId, data.iconFile); | ||
192 | } | ||
193 | |||
194 | const request = await window.fetch(`${SERVER_URL}/${API_VERSION}/service/${serviceId}`, this._prepareAuthRequest({ | ||
176 | method: 'PUT', | 195 | method: 'PUT', |
177 | body: JSON.stringify(data), | 196 | body: JSON.stringify(data), |
178 | })); | 197 | })); |
198 | |||
179 | if (!request.ok) { | 199 | if (!request.ok) { |
180 | throw request; | 200 | throw request; |
181 | } | 201 | } |
202 | |||
182 | const serviceData = await request.json(); | 203 | const serviceData = await request.json(); |
204 | |||
183 | const service = Object.assign(serviceData, { data: await this._prepareServiceModel(serviceData.data) }); | 205 | const service = Object.assign(serviceData, { data: await this._prepareServiceModel(serviceData.data) }); |
184 | 206 | ||
185 | console.debug('ServerApi::updateService resolves', service); | 207 | console.debug('ServerApi::updateService resolves', service); |
186 | return service; | 208 | return service; |
187 | } | 209 | } |
188 | 210 | ||
211 | async uploadServiceIcon(serviceId, icon) { | ||
212 | const formData = new FormData(); | ||
213 | formData.append('icon', icon); | ||
214 | |||
215 | const requestData = this._prepareAuthRequest({ | ||
216 | method: 'PUT', | ||
217 | body: formData, | ||
218 | }); | ||
219 | |||
220 | delete requestData.headers['Content-Type']; | ||
221 | |||
222 | const request = await window.fetch(`${SERVER_URL}/${API_VERSION}/service/${serviceId}`, requestData); | ||
223 | |||
224 | if (!request.ok) { | ||
225 | throw request; | ||
226 | } | ||
227 | |||
228 | const serviceData = await request.json(); | ||
229 | |||
230 | return serviceData.data.iconUrl; | ||
231 | } | ||
232 | |||
189 | async reorderService(data) { | 233 | async reorderService(data) { |
190 | const request = await window.fetch(`${SERVER_URL}/${API_VERSION}/service/reorder`, this._prepareAuthRequest({ | 234 | const request = await window.fetch(`${SERVER_URL}/${API_VERSION}/service/reorder`, this._prepareAuthRequest({ |
191 | method: 'PUT', | 235 | method: 'PUT', |
@@ -208,6 +252,8 @@ export default class ServerApi { | |||
208 | } | 252 | } |
209 | const data = await request.json(); | 253 | const data = await request.json(); |
210 | 254 | ||
255 | removeServicePartitionDirectory(id, true); | ||
256 | |||
211 | console.debug('ServerApi::deleteService resolves', data); | 257 | console.debug('ServerApi::deleteService resolves', data); |
212 | return data; | 258 | return data; |
213 | } | 259 | } |
@@ -303,18 +349,25 @@ export default class ServerApi { | |||
303 | 349 | ||
304 | fs.ensureDirSync(recipeTempDirectory); | 350 | fs.ensureDirSync(recipeTempDirectory); |
305 | const res = await fetch(packageUrl); | 351 | const res = await fetch(packageUrl); |
352 | console.debug('Recipe downloaded', recipeId); | ||
306 | const buffer = await res.buffer(); | 353 | const buffer = await res.buffer(); |
307 | fs.writeFileSync(archivePath, buffer); | 354 | fs.writeFileSync(archivePath, buffer); |
308 | 355 | ||
309 | tar.x({ | 356 | await sleep(10); |
357 | |||
358 | await tar.x({ | ||
310 | file: archivePath, | 359 | file: archivePath, |
311 | cwd: recipeTempDirectory, | 360 | cwd: recipeTempDirectory, |
312 | sync: true, | 361 | preservePaths: true, |
362 | unlink: true, | ||
363 | preserveOwner: false, | ||
364 | onwarn: x => console.log('warn', recipeId, x), | ||
313 | }); | 365 | }); |
314 | 366 | ||
367 | await sleep(10); | ||
368 | |||
315 | const { id } = fs.readJsonSync(path.join(recipeTempDirectory, 'package.json')); | 369 | const { id } = fs.readJsonSync(path.join(recipeTempDirectory, 'package.json')); |
316 | const recipeDirectory = path.join(recipesDirectory, id); | 370 | const recipeDirectory = path.join(recipesDirectory, id); |
317 | |||
318 | fs.copySync(recipeTempDirectory, recipeDirectory); | 371 | fs.copySync(recipeTempDirectory, recipeDirectory); |
319 | fs.remove(recipeTempDirectory); | 372 | fs.remove(recipeTempDirectory); |
320 | fs.remove(path.join(recipesDirectory, recipeId, 'recipe.tar.gz')); | 373 | fs.remove(path.join(recipesDirectory, recipeId, 'recipe.tar.gz')); |