diff --git a/webapp/src/routes/setup.js b/webapp/src/routes/setup.js new file mode 100644 index 0000000..5c111d7 --- /dev/null +++ b/webapp/src/routes/setup.js @@ -0,0 +1,33 @@ +const express = require('express'); +const router = express.Router(); +const bcrypt = require('bcryptjs'); +const supabase = require('../services/supabase'); + +// GET /setup – show wizard if no admin exists +router.get('/', async (req, res) => { + const { count } = await supabase.from('portal_users').select('*', { count: 'exact', head: true }).eq('role', 'admin'); + if (count > 0) return res.redirect('/login'); // admin already exists + res.render('pages/setup', { error: null }); +}); + +// POST /setup – create first admin securely +router.post('/', async (req, res) => { + const { username, password } = req.body; + if (!username || !password) return res.render('pages/setup', { error: 'All fields are required' }); + + // ensure admin does not already exist (race‑condition safety) + const { data: existing } = await supabase.from('portal_users').select('id').eq('role', 'admin').single(); + if (existing) return res.render('pages/setup', { error: 'Admin already configured' }); + + const hash = await bcrypt.hash(password, 12); + await supabase.from('portal_users').insert({ + username, + password_hash: hash, + role: 'admin', + is_active: true, + }); + // redirect to login after creation + res.redirect('/login'); +}); + +module.exports = router; diff --git a/webapp/src/views/pages/setup.ejs b/webapp/src/views/pages/setup.ejs index f72cea7..1a8220c 100644 --- a/webapp/src/views/pages/setup.ejs +++ b/webapp/src/views/pages/setup.ejs @@ -1,46 +1,42 @@ - + - - - Setup — <%= appName %> - - + + + FreightDesk | Admin Setup + + - -
-
- + +
+
+

Welcome to FreightDesk

+

No administrator account found. Please create your first admin account to get started.

+ + <% if (typeof error !== 'undefined' && error) { %> + + <% } %> - <% if (typeof error !== 'undefined' && error) { %> -
<%= error %>
- <% } %> - - -
- - -

Minimum 6 characters

-
- - - -
-
- - + \ No newline at end of file