diff options
author | vantezzen <properly@protonmail.com> | 2019-08-25 12:02:57 +0200 |
---|---|---|
committer | vantezzen <properly@protonmail.com> | 2019-08-25 12:02:57 +0200 |
commit | 74de67c7d83ee9d8c632f6dde775ac7e0bdbbd04 (patch) | |
tree | 04c00351a372afc2d1d8d5525cb13fb8cf62f397 /app/Controllers | |
parent | Add recipe store (diff) | |
download | ferdium-server-74de67c7d83ee9d8c632f6dde775ac7e0bdbbd04.tar.gz ferdium-server-74de67c7d83ee9d8c632f6dde775ac7e0bdbbd04.tar.zst ferdium-server-74de67c7d83ee9d8c632f6dde775ac7e0bdbbd04.zip |
Add custom recipe creator
Diffstat (limited to 'app/Controllers')
-rw-r--r-- | app/Controllers/Http/RecipeController.js | 64 | ||||
-rw-r--r-- | app/Controllers/Http/UserController.js | 19 |
2 files changed, 61 insertions, 22 deletions
diff --git a/app/Controllers/Http/RecipeController.js b/app/Controllers/Http/RecipeController.js index 641f4ef..407379e 100644 --- a/app/Controllers/Http/RecipeController.js +++ b/app/Controllers/Http/RecipeController.js | |||
@@ -4,9 +4,27 @@ const Recipe = use('App/Models/Recipe'); | |||
4 | const Helpers = use('Helpers') | 4 | const Helpers = use('Helpers') |
5 | const Drive = use('Drive') | 5 | const Drive = use('Drive') |
6 | const fetch = require('node-fetch'); | 6 | const fetch = require('node-fetch'); |
7 | const targz = require('targz'); | ||
7 | const path = require('path'); | 8 | const path = require('path'); |
9 | const fs = require('fs'); | ||
10 | |||
11 | const compress = (src, dest) => { | ||
12 | return new Promise((resolve, reject) => { | ||
13 | targz.compress({ | ||
14 | src, | ||
15 | dest | ||
16 | }, function (err) { | ||
17 | if (err) { | ||
18 | reject(err); | ||
19 | } else { | ||
20 | resolve(dest); | ||
21 | } | ||
22 | }); | ||
23 | }) | ||
24 | } | ||
8 | 25 | ||
9 | class RecipeController { | 26 | class RecipeController { |
27 | // List official and custom recipes | ||
10 | async list({ | 28 | async list({ |
11 | response | 29 | response |
12 | }) { | 30 | }) { |
@@ -26,19 +44,29 @@ class RecipeController { | |||
26 | return response.send(recipes) | 44 | return response.send(recipes) |
27 | } | 45 | } |
28 | 46 | ||
47 | // Create a new recipe using the new.html page | ||
29 | async create({ | 48 | async create({ |
30 | request, | 49 | request, |
31 | response | 50 | response |
32 | }) { | 51 | }) { |
33 | const data = request.all(); | 52 | const data = request.all(); |
34 | 53 | ||
35 | const pkg = request.file('package') | 54 | // Check for invalid characters |
55 | if (/\.{1,}/.test(data.id) || /\/{1,}/.test(data.id)) { | ||
56 | return response.send('Invalid recipe name. Your recipe name may not contain "." or "/"'); | ||
57 | } | ||
36 | 58 | ||
37 | await pkg.move(path.join(Helpers.appRoot(), '/recipes/'), { | 59 | // Move uploaded files to temporary path |
38 | name: data.id + '.tar.gz', | 60 | const files = request.file('files') |
39 | overwrite: false | 61 | await files.moveAll(Helpers.tmpPath('recipe')) |
40 | }) | ||
41 | 62 | ||
63 | // Compress files to .tar.gz file | ||
64 | compress( | ||
65 | Helpers.tmpPath('recipe'), | ||
66 | path.join(Helpers.appRoot(), '/recipes/' + data.id + '.tar.gz') | ||
67 | ); | ||
68 | |||
69 | // Create recipe in db | ||
42 | await Recipe.create({ | 70 | await Recipe.create({ |
43 | name: data.name, | 71 | name: data.name, |
44 | recipeId: data.id, | 72 | recipeId: data.id, |
@@ -56,23 +84,25 @@ class RecipeController { | |||
56 | return response.send('Created new recipe') | 84 | return response.send('Created new recipe') |
57 | } | 85 | } |
58 | 86 | ||
87 | // Search official and custom recipes | ||
59 | async search({ | 88 | async search({ |
60 | request, | 89 | request, |
61 | response | 90 | response |
62 | }) { | 91 | }) { |
63 | const needle = request.input('needle') | 92 | const needle = request.input('needle') |
64 | 93 | ||
94 | // Get results | ||
65 | const remoteResults = JSON.parse(await (await fetch('https://api.franzinfra.com/v1/recipes/search?needle=' + needle)).text()); | 95 | const remoteResults = JSON.parse(await (await fetch('https://api.franzinfra.com/v1/recipes/search?needle=' + needle)).text()); |
66 | const localResultsArray = (await Recipe.query().where('name', 'LIKE', '%' + needle + '%').fetch()).toJSON(); | 96 | const localResultsArray = (await Recipe.query().where('name', 'LIKE', '%' + needle + '%').fetch()).toJSON(); |
67 | const localResults = localResultsArray.map(recipe => ({ | 97 | const localResults = localResultsArray.map(recipe => ({ |
68 | "id": recipe.recipeId, | 98 | "id": recipe.recipeId, |
69 | "name": recipe.name, | 99 | "name": recipe.name, |
70 | ...JSON.parse(recipe.data) | 100 | ...JSON.parse(recipe.data) |
71 | })) | 101 | })) |
72 | 102 | ||
73 | const results = [ | 103 | const results = [ |
74 | ...localResults, | 104 | ...localResults, |
75 | ...remoteResults, | 105 | ...remoteResults, |
76 | ] | 106 | ] |
77 | 107 | ||
78 | return response.send(results); | 108 | return response.send(results); |
@@ -86,16 +116,16 @@ class RecipeController { | |||
86 | }) { | 116 | }) { |
87 | const service = params.recipe; | 117 | const service = params.recipe; |
88 | 118 | ||
89 | // Chack for invalid characters | 119 | // Check for invalid characters |
90 | if (/\.{1,}/.test(service) || /\/{1,}/.test(service)) { | 120 | if (/\.{1,}/.test(service) || /\/{1,}/.test(service)) { |
91 | return response.send('Invalid recipe name'); | 121 | return response.send('Invalid recipe name'); |
92 | } | 122 | } |
93 | 123 | ||
94 | // Check if recipe exists in recipes folder | 124 | // Check if recipe exists in recipes folder |
95 | if (await Drive.exists(service + '.tar.gz')) { | 125 | if (await Drive.exists(service + '.tar.gz')) { |
96 | response.send(await Drive.get(service + '.tar.gz')) | 126 | response.send(await Drive.get(service + '.tar.gz')) |
97 | } else { | 127 | } else { |
98 | response.redirect('https://api.franzinfra.com/v1/recipes/download/' + service) | 128 | response.redirect('https://api.franzinfra.com/v1/recipes/download/' + service) |
99 | } | 129 | } |
100 | } | 130 | } |
101 | } | 131 | } |
diff --git a/app/Controllers/Http/UserController.js b/app/Controllers/Http/UserController.js index 062e16f..f78f28d 100644 --- a/app/Controllers/Http/UserController.js +++ b/app/Controllers/Http/UserController.js | |||
@@ -13,11 +13,20 @@ class UserController { | |||
13 | session | 13 | session |
14 | }) { | 14 | }) { |
15 | const data = request.only(['firstname', 'email', 'password']); | 15 | const data = request.only(['firstname', 'email', 'password']); |
16 | const user = await User.create({ | 16 | |
17 | email: data.email, | 17 | try { |
18 | password: data.password, | 18 | const user = await User.create({ |
19 | username: data.firstname | 19 | email: data.email, |
20 | }); | 20 | password: data.password, |
21 | username: data.firstname | ||
22 | }); | ||
23 | } catch(e) { | ||
24 | return response.status(401).send({ | ||
25 | "message": "E-Mail Address already in use", | ||
26 | "status": 401 | ||
27 | }) | ||
28 | } | ||
29 | |||
21 | const token = await auth.generate(user) | 30 | const token = await auth.generate(user) |
22 | 31 | ||
23 | return response.send({ | 32 | return response.send({ |