diff options
Diffstat (limited to 'start')
-rw-r--r-- | start/env.ts | 43 | ||||
-rw-r--r-- | start/events.ts | 14 | ||||
-rw-r--r-- | start/kernel.ts | 75 | ||||
-rw-r--r-- | start/routes.ts | 4 | ||||
-rw-r--r-- | start/routes/api.ts | 115 | ||||
-rw-r--r-- | start/routes/web.ts | 107 |
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 | */ | ||
14 | import { Env } from '@adonisjs/core/env'; | ||
15 | |||
16 | export 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 @@ | |||
1 | import Config from '@ioc:Adonis/Core/Config'; | 1 | import emitter from '@adonisjs/core/services/emitter'; |
2 | import Event from '@ioc:Adonis/Core/Event'; | 2 | import mail from '@adonisjs/mail/services/main'; |
3 | import Mail from '@ioc:Adonis/Addons/Mail'; | 3 | import 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 | */ |
14 | Event.on('forgot::password', async ({ user, token }) => { | 14 | emitter.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 | ||
12 | import Server from '@ioc:Adonis/Core/Server'; | 11 | import router from '@adonisjs/core/services/router'; |
12 | import 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 | | | 18 | server.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 |
23 | Server.middleware.register([ | 23 | * the request URL. |
24 | () => import('@ioc:Adonis/Core/BodyParser'), | 24 | */ |
25 | () => import('@ioc:Adonis/Addons/Shield'), | 25 | server.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 | | | 37 | router.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 | | | 43 | export 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 | */ | ||
44 | Server.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 | ||
21 | import './routes/api'; | 21 | import './routes/api.js'; |
22 | import './routes/web'; | 22 | import './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 | ||
3 | import Route from '@ioc:Adonis/Core/Route'; | 3 | import { middleware } from '#start/kernel'; |
4 | import router from '@adonisjs/core/services/router'; | ||
5 | const UserController = () => import('#controllers/Http/UserController'); | ||
6 | const ServiceController = () => import('#controllers/Http/ServiceController'); | ||
7 | const RecipeController = () => import('#controllers/Http/RecipeController'); | ||
8 | const WorkspaceController = () => | ||
9 | import('#controllers/Http/WorkspaceController'); | ||
10 | const FeaturesController = () => | ||
11 | import('#controllers/Http/Api/Static/FeaturesController'); | ||
12 | const EmptyController = () => | ||
13 | import('#controllers/Http/Api/Static/EmptyController'); | ||
14 | const AnnouncementsController = () => | ||
15 | import('#controllers/Http/Api/Static/AnnouncementsController'); | ||
4 | 16 | ||
5 | Route.group(() => { | 17 | router |
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 @@ | |||
1 | import Route from '@ioc:Adonis/Core/Route'; | 1 | import { middleware } from '#start/kernel'; |
2 | import router from '@adonisjs/core/services/router'; | ||
3 | const HealthController = () => import('#controllers/Http/HealthController'); | ||
4 | const LoginController = () => | ||
5 | import('#controllers/Http/Dashboard/LoginController'); | ||
6 | const ForgotPasswordController = () => | ||
7 | import('#controllers/Http/Dashboard/ForgotPasswordController'); | ||
8 | const ResetPasswordController = () => | ||
9 | import('#controllers/Http/Dashboard/ResetPasswordController'); | ||
10 | const AccountController = () => | ||
11 | import('#controllers/Http/Dashboard/AccountController'); | ||
12 | const DataController = () => | ||
13 | import('#controllers/Http/Dashboard/DataController'); | ||
14 | const ExportController = () => | ||
15 | import('#controllers/Http/Dashboard/ExportController'); | ||
16 | const TransferController = () => | ||
17 | import('#controllers/Http/Dashboard/TransferController'); | ||
18 | const DeleteController = () => | ||
19 | import('#controllers/Http/Dashboard/DeleteController'); | ||
20 | const LogOutController = () => | ||
21 | import('#controllers/Http/Dashboard/LogOutController'); | ||
22 | const UserController = () => import('#controllers/Http/UserController'); | ||
2 | 23 | ||
3 | // Health check | 24 | // Health check |
4 | Route.get('health', 'HealthController.index'); | 25 | router.get('health', [HealthController, 'index']); |
5 | 26 | ||
6 | // Legal documents | 27 | // Legal documents |
7 | Route.get('terms', ({ response }) => response.redirect('/terms.html')); | 28 | router.get('terms', ({ response }) => response.redirect('/terms.html')); |
8 | Route.get('privacy', ({ response }) => response.redirect('/privacy.html')); | 29 | router.get('privacy', ({ response }) => response.redirect('/privacy.html')); |
9 | 30 | ||
10 | // Index | 31 | // Index |
11 | Route.get('/', ({ view }) => view.render('others/index')); | 32 | router.get('/', ({ view }) => view.render('others/index')); |
12 | 33 | ||
13 | Route.group(() => { | 34 | router |
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()); | ||