aboutsummaryrefslogtreecommitdiffstats
path: root/app
diff options
context:
space:
mode:
authorLibravatar vantezzen <properly@protonmail.com>2019-08-25 12:02:57 +0200
committerLibravatar vantezzen <properly@protonmail.com>2019-08-25 12:02:57 +0200
commit74de67c7d83ee9d8c632f6dde775ac7e0bdbbd04 (patch)
tree04c00351a372afc2d1d8d5525cb13fb8cf62f397 /app
parentAdd recipe store (diff)
downloadferdium-server-74de67c7d83ee9d8c632f6dde775ac7e0bdbbd04.tar.gz
ferdium-server-74de67c7d83ee9d8c632f6dde775ac7e0bdbbd04.tar.zst
ferdium-server-74de67c7d83ee9d8c632f6dde775ac7e0bdbbd04.zip
Add custom recipe creator
Diffstat (limited to 'app')
-rw-r--r--app/Controllers/Http/RecipeController.js64
-rw-r--r--app/Controllers/Http/UserController.js19
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');
4const Helpers = use('Helpers') 4const Helpers = use('Helpers')
5const Drive = use('Drive') 5const Drive = use('Drive')
6const fetch = require('node-fetch'); 6const fetch = require('node-fetch');
7const targz = require('targz');
7const path = require('path'); 8const path = require('path');
9const fs = require('fs');
10
11const 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
9class RecipeController { 26class 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({