aboutsummaryrefslogtreecommitdiffstats
path: root/src/api
diff options
context:
space:
mode:
Diffstat (limited to 'src/api')
-rw-r--r--src/api/LocalApi.js8
-rw-r--r--src/api/ServicesApi.js7
-rw-r--r--src/api/server/LocalApi.js36
-rw-r--r--src/api/server/ServerApi.js63
4 files changed, 106 insertions, 8 deletions
diff --git a/src/api/LocalApi.js b/src/api/LocalApi.js
index 6f2b049d6..3f84f8a0b 100644
--- a/src/api/LocalApi.js
+++ b/src/api/LocalApi.js
@@ -15,4 +15,12 @@ export default class LocalApi {
15 removeKey(key) { 15 removeKey(key) {
16 return this.local.removeKey(key); 16 return this.local.removeKey(key);
17 } 17 }
18
19 getAppCacheSize() {
20 return this.local.getAppCacheSize();
21 }
22
23 clearAppCache() {
24 return this.local.clearAppCache();
25 }
18} 26}
diff --git a/src/api/ServicesApi.js b/src/api/ServicesApi.js
index 3cb40ba0d..36ed9482f 100644
--- a/src/api/ServicesApi.js
+++ b/src/api/ServicesApi.js
@@ -1,5 +1,6 @@
1export default class ServicesApi { 1export default class ServicesApi {
2 constructor(server) { 2 constructor(server, local) {
3 this.local = local;
3 this.server = server; 4 this.server = server;
4 } 5 }
5 6
@@ -30,4 +31,8 @@ export default class ServicesApi {
30 reorder(data) { 31 reorder(data) {
31 return this.server.reorderService(data); 32 return this.server.reorderService(data);
32 } 33 }
34
35 clearCache(serviceId) {
36 return this.local.clearCache(serviceId);
37 }
33} 38}
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 @@
1import SettingsModel from '../../models/Settings'; 1import { remote } from 'electron';
2import du from 'du';
3
4import { getServicePartitionsDirectory } from '../../helpers/service-helpers.js';
5
6const { session } = remote;
2 7
3export default class LocalApi { 8export 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';
12import UserModel from '../../models/User'; 12import UserModel from '../../models/User';
13import OrderModel from '../../models/Order'; 13import OrderModel from '../../models/Order';
14 14
15import { sleep } from '../../helpers/async-helpers';
16
15import { API } from '../../environment'; 17import { API } from '../../environment';
16 18
17import { 19import {
@@ -20,6 +22,10 @@ import {
20 loadRecipeConfig, 22 loadRecipeConfig,
21} from '../../helpers/recipe-helpers'; 23} from '../../helpers/recipe-helpers';
22 24
25import {
26 removeServicePartitionDirectory,
27} from '../../helpers/service-helpers.js';
28
23module.paths.unshift( 29module.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'));