aboutsummaryrefslogtreecommitdiffstats
path: root/start
diff options
context:
space:
mode:
Diffstat (limited to 'start')
-rw-r--r--start/env.ts43
-rw-r--r--start/events.ts14
-rw-r--r--start/kernel.ts75
-rw-r--r--start/routes.ts4
-rw-r--r--start/routes/api.ts115
-rw-r--r--start/routes/web.ts107
6 files changed, 231 insertions, 127 deletions
diff --git a/start/env.ts b/start/env.ts
new file mode 100644
index 0000000..5b40fd8
--- /dev/null
+++ b/start/env.ts
@@ -0,0 +1,43 @@
1/*
2|--------------------------------------------------------------------------
3| Validating Environment Variables
4|--------------------------------------------------------------------------
5|
6| In this file we define the rules for validating environment variables.
7| By performing validation we ensure that your application is running in
8| a stable environment with correct configuration values.
9|
10| This file is read automatically by the framework during the boot lifecycle
11| and hence do not rename or move this file to a different location.
12|
13*/
14import { Env } from '@adonisjs/core/env';
15
16export default await Env.create(new URL('../', import.meta.url), {
17 NODE_ENV: Env.schema.enum(['development', 'production', 'test'] as const),
18 PORT: Env.schema.number(),
19 APP_KEY: Env.schema.string(),
20 HOST: Env.schema.string({ format: 'host' }),
21 LOG_LEVEL: Env.schema.string(),
22
23 /*
24 |----------------------------------------------------------
25 | Variables for configuring session package
26 |----------------------------------------------------------
27 */
28 SESSION_DRIVER: Env.schema.enum(['cookie', 'memory'] as const),
29
30 /*
31 |----------------------------------------------------------
32 | Variables for configuring the mail package
33 |----------------------------------------------------------
34 */
35 // SMTP_HOST: Env.schema.string(),
36 // SMTP_PORT: Env.schema.string(),
37 // SES_ACCESS_KEY: Env.schema.string(),
38 // SES_ACCESS_SECRET: Env.schema.string(),
39 // SES_REGION: Env.schema.string(),
40 // MAILGUN_API_KEY: Env.schema.string(),
41 // MAILGUN_DOMAIN: Env.schema.string(),
42 // SPARKPOST_API_KEY: Env.schema.string(),
43});
diff --git a/start/events.ts b/start/events.ts
index 11e63e5..b3667db 100644
--- a/start/events.ts
+++ b/start/events.ts
@@ -1,6 +1,6 @@
1import Config from '@ioc:Adonis/Core/Config'; 1import emitter from '@adonisjs/core/services/emitter';
2import Event from '@ioc:Adonis/Core/Event'; 2import mail from '@adonisjs/mail/services/main';
3import Mail from '@ioc:Adonis/Addons/Mail'; 3import config from '@adonisjs/core/services/config';
4 4
5/* 5/*
6|-------------------------------------------------------------------------- 6|--------------------------------------------------------------------------
@@ -11,17 +11,17 @@ import Mail from '@ioc:Adonis/Addons/Mail';
11| boot. 11| boot.
12| 12|
13*/ 13*/
14Event.on('forgot::password', async ({ user, token }) => { 14emitter.on('forgot::password', async ({ user, token }) => {
15 try { 15 try {
16 // eslint-disable-next-line no-console 16 // eslint-disable-next-line no-console
17 console.log('Sending message'); 17 console.log('Sending message');
18 await Mail.send(message => { 18 await mail.send(message => {
19 message 19 message
20 .subject('[Ferdium] Forgot Password') 20 .subject('[Ferdium] Forgot Password')
21 .to(user.email) 21 .to(user.email)
22 .from(Config.get('dasshboard.mailFrom')) 22 .from(config.get('dasshboard.mailFrom'))
23 .textView('emails.forgot-password', { 23 .textView('emails.forgot-password', {
24 appUrl: Config.get('app.url'), 24 appUrl: config.get('app.url'),
25 username: user.username, 25 username: user.username,
26 token, 26 token,
27 }); 27 });
diff --git a/start/kernel.ts b/start/kernel.ts
index 1c5c92b..4bd783c 100644
--- a/start/kernel.ts
+++ b/start/kernel.ts
@@ -1,49 +1,48 @@
1/* 1/*
2|-------------------------------------------------------------------------- 2|--------------------------------------------------------------------------
3| Application middleware 3| HTTP kernel file
4|-------------------------------------------------------------------------- 4|--------------------------------------------------------------------------
5| 5|
6| This file is used to define middleware for HTTP requests. You can register 6| The HTTP kernel file is used to register the middleware with the server
7| middleware as a `closure` or an IoC container binding. The bindings are 7| or the router.
8| preferred, since they keep this file clean.
9| 8|
10*/ 9*/
11 10
12import Server from '@ioc:Adonis/Core/Server'; 11import router from '@adonisjs/core/services/router';
12import server from '@adonisjs/core/services/server';
13 13
14/* 14/**
15|-------------------------------------------------------------------------- 15 * The error handler is used to convert an exception
16| Global middleware 16 * to a HTTP response.
17|-------------------------------------------------------------------------- 17 */
18| 18server.errorHandler(() => import('#exceptions/handler'));
19| An array of global middleware, that will be executed in the order they 19
20| are defined for every HTTP requests. 20/**
21| 21 * The server middleware stack runs middleware on all the HTTP
22*/ 22 * requests, even if there is no route registered for
23Server.middleware.register([ 23 * the request URL.
24 () => import('@ioc:Adonis/Core/BodyParser'), 24 */
25 () => import('@ioc:Adonis/Addons/Shield'), 25server.use([
26 () => import('@adonisjs/core/bodyparser_middleware'),
27 () => import('@adonisjs/shield/shield_middleware'),
28 () => import('@adonisjs/cors/cors_middleware'),
29 () => import('#middleware/container_bindings_middleware'),
30 () => import('#middleware/force_json_response_middleware'),
26]); 31]);
27 32
28/* 33/**
29|-------------------------------------------------------------------------- 34 * The router middleware stack runs middleware on all the HTTP
30| Named middleware 35 * requests with a registered route.
31|-------------------------------------------------------------------------- 36 */
32| 37router.use([() => import('@adonisjs/core/bodyparser_middleware')]);
33| Named middleware are defined as key-value pair. The value is the namespace 38
34| or middleware function and key is the alias. Later you can use these 39/**
35| alias on individual routes. For example: 40 * Named middleware collection must be explicitly assigned to
36| 41 * the routes or the routes group.
37| { auth: () => import('App/Middleware/Auth') } 42 */
38| 43export const middleware = router.named({
39| and then use it as follows 44 auth: () => import('#app/Middleware/Auth'),
40| 45 dashboard: () => import('#app/Middleware/Dashboard'),
41| Route.get('dashboard', 'UserController.dashboard').middleware('auth') 46 guest: () => import('#app/Middleware/AllowGuestOnly'),
42| 47 shield: () => import('@adonisjs/shield/shield_middleware'),
43*/
44Server.middleware.registerNamed({
45 auth: () => import('App/Middleware/Auth'),
46 dashboard: () => import('App/Middleware/Dashboard'),
47 guest: () => import('App/Middleware/AllowGuestOnly'),
48 shield: () => import('@ioc:Adonis/Addons/Shield'),
49}); 48});
diff --git a/start/routes.ts b/start/routes.ts
index 75cef72..ea090c9 100644
--- a/start/routes.ts
+++ b/start/routes.ts
@@ -18,5 +18,5 @@
18| 18|
19*/ 19*/
20 20
21import './routes/api'; 21import './routes/api.js';
22import './routes/web'; 22import './routes/web.js';
diff --git a/start/routes/api.ts b/start/routes/api.ts
index 78282f0..37f7859 100644
--- a/start/routes/api.ts
+++ b/start/routes/api.ts
@@ -1,51 +1,80 @@
1// As this is currently a rebuild of the initial API we it is grouped in /v2/ 1// As this is currently a rebuild of the initial API we it is grouped in /v2/
2 2
3import Route from '@ioc:Adonis/Core/Route'; 3import { middleware } from '#start/kernel';
4import router from '@adonisjs/core/services/router';
5const UserController = () => import('#controllers/Http/UserController');
6const ServiceController = () => import('#controllers/Http/ServiceController');
7const RecipeController = () => import('#controllers/Http/RecipeController');
8const WorkspaceController = () =>
9 import('#controllers/Http/WorkspaceController');
10const FeaturesController = () =>
11 import('#controllers/Http/Api/Static/FeaturesController');
12const EmptyController = () =>
13 import('#controllers/Http/Api/Static/EmptyController');
14const AnnouncementsController = () =>
15 import('#controllers/Http/Api/Static/AnnouncementsController');
4 16
5Route.group(() => { 17router
6 // User authentification 18 .group(() => {
7 Route.post('auth/signup', 'UserController.signup').middleware('guest'); 19 // User authentification
8 Route.post('auth/login', 'UserController.login').middleware('guest'); 20 router
21 .post('auth/signup', [UserController, 'signup'])
22 .use(middleware.guest());
23 router
24 .post('auth/login', [UserController, 'login'])
25 .use(middleware.guest());
9 26
10 // User info 27 // User info
11 Route.get('me', 'UserController.me').middleware('auth:jwt'); 28 router.get('me', [UserController, 'me']).use(middleware.auth());
12 Route.put('me', 'UserController.updateMe').middleware('auth:jwt'); 29 router.put('me', [UserController, 'updateMe']).use(middleware.auth());
13 Route.get('me/newtoken', 'UserController.newToken').middleware('auth:jwt'); 30 router
31 .get('me/newtoken', [UserController, 'newToken'])
32 .use(middleware.auth());
14 33
15 // // Service info 34 // // Service info
16 Route.post('service', 'ServiceController.create').middleware('auth:jwt'); 35 router
17 Route.put('service/reorder', 'ServiceController.reorder').middleware( 36 .post('service', [ServiceController, 'create'])
18 'auth:jwt', 37 .use(middleware.auth());
19 ); 38 router
20 Route.put('service/:id', 'ServiceController.edit').middleware('auth:jwt'); 39 .put('service/reorder', [ServiceController, 'reorder'])
21 Route.delete('service/:id', 'ServiceController.delete').middleware( 40 .use(middleware.auth());
22 'auth:jwt', 41 router
23 ); 42 .put('service/:id', [ServiceController, 'edit'])
24 Route.get('me/services', 'ServiceController.list').middleware('auth:jwt'); 43 .use(middleware.auth());
25 Route.get('recipe', 'ServiceController.list').middleware('auth:jwt'); 44 router
26 Route.get('icon/:id', 'ServiceController.icon'); 45 .delete('service/:id', [ServiceController, 'delete'])
46 .use(middleware.auth());
47 router
48 .get('me/services', [ServiceController, 'list'])
49 .use(middleware.auth());
50 router.get('recipe', [ServiceController, 'list']).use(middleware.auth());
51 router.get('icon/:id', [ServiceController, 'icon']);
27 52
28 // Recipe store 53 // Recipe store
29 Route.get('recipes', 'RecipeController.list'); 54 router.get('recipes', [RecipeController, 'list']);
30 Route.get('recipes/search', 'RecipeController.search'); 55 router.get('recipes/search', [RecipeController, 'search']);
31 Route.get('recipes/popular', 'RecipeController.popularRecipes'); 56 router.get('recipes/popular', [RecipeController, 'popularRecipes']);
32 Route.get('recipes/download/:recipe', 'RecipeController.download'); 57 router.get('recipes/download/:recipe', [RecipeController, 'download']);
33 Route.post('recipes/update', 'RecipeController.update'); 58 router.post('recipes/update', [RecipeController, 'update']);
34 59
35 // // Workspaces 60 // // Workspaces
36 Route.put('workspace/:id', 'WorkspaceController.edit').middleware('auth:jwt'); 61 router
37 Route.delete('workspace/:id', 'WorkspaceController.delete').middleware( 62 .put('workspace/:id', [WorkspaceController, 'edit'])
38 'auth:jwt', 63 .use(middleware.auth());
39 ); 64 router
40 Route.post('workspace', 'WorkspaceController.create').middleware('auth:jwt'); 65 .delete('workspace/:id', [WorkspaceController, 'delete'])
41 Route.get('workspace', 'WorkspaceController.list').middleware('auth:jwt'); 66 .use(middleware.auth());
67 router
68 .post('workspace', [WorkspaceController, 'create'])
69 .use(middleware.auth());
70 router
71 .get('workspace', [WorkspaceController, 'list'])
72 .use(middleware.auth());
42 73
43 // Static responses 74 // Static responses
44 Route.get('features/:mode?', 'Api/Static/FeaturesController.show'); 75 router.get('features/:mode?', [FeaturesController, 'show']);
45 Route.get('services', 'Api/Static/EmptyController.show'); 76 router.get('services', [EmptyController, 'show']);
46 Route.get('news', 'Api/Static/EmptyController.show'); 77 router.get('news', [EmptyController, 'show']);
47 Route.get( 78 router.get('announcements/:version', [AnnouncementsController, 'show']);
48 'announcements/:version', 79 })
49 'Api/Static/AnnouncementsController.show', 80 .prefix('/v1');
50 );
51}).prefix('/v1');
diff --git a/start/routes/web.ts b/start/routes/web.ts
index 308abec..f78585c 100644
--- a/start/routes/web.ts
+++ b/start/routes/web.ts
@@ -1,54 +1,87 @@
1import Route from '@ioc:Adonis/Core/Route'; 1import { middleware } from '#start/kernel';
2import router from '@adonisjs/core/services/router';
3const HealthController = () => import('#controllers/Http/HealthController');
4const LoginController = () =>
5 import('#controllers/Http/Dashboard/LoginController');
6const ForgotPasswordController = () =>
7 import('#controllers/Http/Dashboard/ForgotPasswordController');
8const ResetPasswordController = () =>
9 import('#controllers/Http/Dashboard/ResetPasswordController');
10const AccountController = () =>
11 import('#controllers/Http/Dashboard/AccountController');
12const DataController = () =>
13 import('#controllers/Http/Dashboard/DataController');
14const ExportController = () =>
15 import('#controllers/Http/Dashboard/ExportController');
16const TransferController = () =>
17 import('#controllers/Http/Dashboard/TransferController');
18const DeleteController = () =>
19 import('#controllers/Http/Dashboard/DeleteController');
20const LogOutController = () =>
21 import('#controllers/Http/Dashboard/LogOutController');
22const UserController = () => import('#controllers/Http/UserController');
2 23
3// Health check 24// Health check
4Route.get('health', 'HealthController.index'); 25router.get('health', [HealthController, 'index']);
5 26
6// Legal documents 27// Legal documents
7Route.get('terms', ({ response }) => response.redirect('/terms.html')); 28router.get('terms', ({ response }) => response.redirect('/terms.html'));
8Route.get('privacy', ({ response }) => response.redirect('/privacy.html')); 29router.get('privacy', ({ response }) => response.redirect('/privacy.html'));
9 30
10// Index 31// Index
11Route.get('/', ({ view }) => view.render('others/index')); 32router.get('/', ({ view }) => view.render('others/index'));
12 33
13Route.group(() => { 34router
14 Route.group(() => { 35 .group(() => {
15 // Guest troutes 36 router
16 Route.group(() => { 37 .group(() => {
17 Route.get('login', 'Dashboard/LoginController.show'); 38 // Guest troutes
18 Route.post('login', 'Dashboard/LoginController.login').as('login'); 39 router
40 .group(() => {
41 router.get('login', [LoginController, 'show']);
42 router.post('login', [LoginController, 'login']).as('login');
19 43
20 // Reset password 44 // Reset password
21 Route.get('forgot', 'Dashboard/ForgotPasswordController.show'); 45 router.get('forgot', [ForgotPasswordController, 'show']);
22 Route.post('forgot', 'Dashboard/ForgotPasswordController.forgotPassword'); 46 router.post('forgot', [ForgotPasswordController, 'forgotPassword']);
23 47
24 Route.get('reset', 'Dashboard/ResetPasswordController.show'); 48 router.get('reset', [ResetPasswordController, 'show']);
25 Route.post('reset', 'Dashboard/ResetPasswordController.resetPassword'); 49 router.post('reset', [ResetPasswordController, 'resetPassword']);
26 }).middleware(['dashboard', 'guest']); 50 })
51 .use(middleware.dashboard())
52 .use(middleware.guest());
27 53
28 // Authenticated routes 54 // Authenticated routes
29 Route.group(() => { 55 router
30 Route.get('account', 'Dashboard/AccountController.show'); 56 .group(() => {
31 Route.post('account', 'Dashboard/AccountController.store'); 57 router.get('account', [AccountController, 'show']);
58 router.post('account', [AccountController, 'store']);
32 59
33 Route.get('data', 'Dashboard/DataController.show'); 60 router.get('data', [DataController, 'show']);
34 Route.get('export', 'Dashboard/ExportController.show'); 61 router.get('export', [ExportController, 'show']);
35 62
36 Route.get('transfer', 'Dashboard/TransferController.show'); 63 router.get('transfer', [TransferController, 'show']);
37 Route.post('transfer', 'Dashboard/TransferController.import'); 64 router.post('transfer', [TransferController, 'import']);
38 65
39 Route.get('delete', 'Dashboard/DeleteController.show'); 66 router.get('delete', [DeleteController, 'show']);
40 Route.post('delete', 'Dashboard/DeleteController.delete'); 67 router.post('delete', [DeleteController, 'delete']);
41 68
42 Route.get('logout', 'Dashboard/LogOutController.logout'); 69 router.get('logout', [LogOutController, 'logout']);
43 70
44 Route.get('*', ({ response }) => response.redirect('/user/account')); 71 router.get('*', ({ response }) =>
45 }).middleware(['dashboard', 'auth:web']); 72 response.redirect('/user/account'),
46 }).prefix('user'); 73 );
74 })
75 .use(middleware.dashboard())
76 .use(middleware.auth());
77 })
78 .prefix('user');
47 79
48 // Franz/Ferdi account import 80 // Franz/Ferdi account import
49 Route.get('import', ({ view }) => view.render('others/import')); 81 router.get('import', ({ view }) => view.render('others/import'));
50 Route.post('import', 'UserController.import'); 82 router.post('import', [UserController, 'import']);
51 83
52 // 404 handler 84 // 404 handler
53 Route.get('/*', ({ response }) => response.redirect('/')); 85 router.get('/*', ({ response }) => response.redirect('/'));
54}).middleware(['dashboard']); 86 })
87 .use(middleware.dashboard());