aboutsummaryrefslogtreecommitdiffstats
path: root/start/routes.js
blob: 64a76051d9219c2d1d759bc53309f8791b03a0ab (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/*
|--------------------------------------------------------------------------
| Routes
|--------------------------------------------------------------------------
|
*/

/** @type {typeof import('@adonisjs/framework/src/Route/Manager')} */
const Route = use('Route');
const Env = use('Env');

// Health: Returning if all systems function correctly
Route.get('health', ({
  response,
}) => response.send({
  api: 'success',
  db: 'success',
}));

// API is grouped under '/v1/' route
Route.group(() => {
  // User authentification
  Route.post('auth/signup', 'UserController.signup').middleware('guest');
  Route.post('auth/login', 'UserController.login').middleware('guest');

  // User info
  Route.get('me', 'UserController.me').middleware('auth');
  Route.put('me', 'UserController.updateMe').middleware('auth');

  // Service info
  Route.post('service', 'ServiceController.create').middleware('auth');
  Route.put('service/reorder', 'ServiceController.reorder').middleware('auth');
  Route.put('service/:id', 'ServiceController.edit').middleware('auth');
  Route.delete('service/:id', 'ServiceController.delete').middleware('auth');
  Route.get('me/services', 'ServiceController.list').middleware('auth');
  Route.get('recipe', 'ServiceController.list').middleware('auth');
  Route.get('icon/:id', 'ServiceController.icon');

  // Recipe store
  Route.get('recipes', 'RecipeController.list');
  Route.get('recipes/search', 'RecipeController.search');
  Route.get('recipes/popular', 'RecipeController.popularRecipes');
  Route.get('recipes/download/:recipe', 'RecipeController.download');
  Route.post('recipes/update', 'RecipeController.update');

  // Workspaces
  Route.put('workspace/:id', 'WorkspaceController.edit').middleware('auth');
  Route.delete('workspace/:id', 'WorkspaceController.delete').middleware('auth');
  Route.post('workspace', 'WorkspaceController.create').middleware('auth');
  Route.get('workspace', 'WorkspaceController.list').middleware('auth');

  // Static responses
  Route.get('features/:mode?', 'StaticController.features');
  Route.get('services', 'StaticController.emptyArray');
  Route.get('news', 'StaticController.emptyArray');
  Route.get('payment/plans', 'StaticController.plans');
  Route.get('announcements/:version', 'StaticController.announcement');
}).prefix('v1');

// User dashboard
if (Env.get('IS_DASHBOARD_ENABLED') !== 'false') {
  Route.group(() => {
    // Auth
    Route.get('login', ({ view }) => view.render('dashboard.login')).middleware('guest');
    Route.post('login', 'DashboardController.login').middleware('guest').as('login');

    // Reset password
    Route.get('forgot', ({ view }) => view.render('dashboard.forgotPassword')).middleware('guest');
    Route.post('forgot', 'DashboardController.forgotPassword').middleware('guest');

    Route.get('reset', ({ view, request }) => {
      const { token } = request.get();
      if (token) {
        return view.render('dashboard.resetPassword', { token });
      }
      return view.render('others.message', {
        heading: 'Invalid token',
        text: 'Please make sure you are using a valid and recent link to reset your password.',
      });
    }).middleware('guest');
    Route.post('reset', 'DashboardController.resetPassword').middleware('guest');

    // Dashboard
    Route.get('account', 'DashboardController.account').middleware('auth:session');
    Route.post('account', 'DashboardController.edit').middleware('auth:session');

    Route.get('data', 'DashboardController.data').middleware('auth:session');

    Route.get('export', 'DashboardController.export').middleware('auth:session');
    Route.post('transfer', 'DashboardController.import').middleware('auth:session');
    Route.get('transfer', ({ view }) => view.render('dashboard.transfer')).middleware('auth:session');

    Route.get('delete', ({ view }) => view.render('dashboard.delete')).middleware('auth:session');
    Route.post('delete', 'DashboardController.delete').middleware('auth:session');

    Route.get('logout', 'DashboardController.logout').middleware('auth:session');

    Route.get('*', ({ response }) => response.redirect('/user/account'));
  }).prefix('user').middleware('shield');
} else {
  Route.group(() => {
    Route.get('*', ({
      response,
    }) => response.send('The user dashboard is disabled on this server\n\nIf you are the server owner, please set IS_DASHBOARD_ENABLED to true to enable the dashboard.'));
  }).prefix('user');
}

// Recipe creation
Route.post('new', 'RecipeController.create');
Route.get('new', ({ response, view }) => {
  if (Env.get('IS_CREATION_ENABLED') == 'false') { // eslint-disable-line eqeqeq
    return response.send('This server doesn\'t allow the creation of new recipes.\n\nIf you are the server owner, please set IS_CREATION_ENABLED to true to enable recipe creation.');
  }
  return view.render('others.new');
});

// Franz/Ferdi account import
Route.post('import', 'UserController.import');
Route.get('import', ({ view }) => view.render('others.import'));

// Legal documents
Route.get('terms', ({ response }) => response.redirect('/terms.html'));
Route.get('privacy', ({ response }) => response.redirect('/privacy.html'));

// Index
Route.get('/', ({ view }) => view.render('others.index'));

// 404 handler
Route.get('/*', ({ response }) => response.redirect('/'));