diff --git a/server/boot/db.js b/server/boot/db.js index 02cf70d..9d33f02 100644 --- a/server/boot/db.js +++ b/server/boot/db.js @@ -7,7 +7,8 @@ module.exports = function () { username TEXT UNIQUE, hashed_password BLOB, salt BLOB, - name TEXT)` + name TEXT, + is_admin INTEGER)` ) db.run(`CREATE TABLE IF NOT EXISTS profiles ( diff --git a/server/routes/profiles.js b/server/routes/profiles.js index 4fc0a27..a3ed864 100644 --- a/server/routes/profiles.js +++ b/server/routes/profiles.js @@ -84,6 +84,7 @@ router.get('/profiles/:profileId', function (req, res, next) { return res.sendStatus(401) } + // TODO: I'm guessing there's a better way to marshal this data const profile = { name: null, isTimerEnabled: null, diff --git a/server/routes/users.js b/server/routes/users.js index 37a7218..6bbbd91 100644 --- a/server/routes/users.js +++ b/server/routes/users.js @@ -3,6 +3,39 @@ const crypto = require('crypto') const db = require('../db') const router = express.Router() +router.get('/users', function (req, res, next) { + if (!req.user) { + return res.sendStatus(401) + } + + // TODO: I'm guessing there's a better way to marshal this data + const users = [] + + db.all('SELECT username, name, is_admin as isAdmin FROM users', (err, rows) => { + if (err) { + console.log('Error getting profiles') + console.log(err) + return res.sendStatus(500) + } + + rows.forEach((row) => { + const user = { + username: null, + name: null, + isAdmin: null + } + + user.username = row.username + user.name = row.name + user.isAdmin = row.isAdmin === 1 + + users.push(user) + }) + + res.json({ users: users }) + }) +}) + router.post('/users', function (req, res, next) { const salt = crypto.randomBytes(16) crypto.pbkdf2(req.body.password, salt, 10000, 32, 'sha256', function (err, hashedPassword) { @@ -11,11 +44,12 @@ router.post('/users', function (req, res, next) { res.sendStatus(500) } - db.run('INSERT INTO users (username, hashed_password, salt, name) VALUES (?, ?, ?, ?)', [ + db.run('INSERT INTO users (username, hashed_password, salt, name, is_admin) VALUES (?, ?, ?, ?, ?)', [ req.body.username, hashedPassword, salt, - req.body.name + req.body.name, + req.body.isAdmin ], function (err) { if (err) { console.log(err) @@ -38,4 +72,22 @@ router.post('/users', function (req, res, next) { res.sendStatus(200) }) +router.put('/users', function (req, res, next) { + if (!req.user) { + return res.sendStatus(401) + } + + db.run('UPDATE users SET is_admin = ? WHERE username = ?', [req.body.isAdmin, req.body.username], (err) => { + if (err) { + console.log('Error getting profiles') + console.log(err) + return res.sendStatus(500) + } + + console.log(`Row(s) updated: ${this.changes}`) + }) + + res.sendStatus(200) +}) + module.exports = router diff --git a/src/components/Admin.vue b/src/components/Admin.vue new file mode 100644 index 0000000..1a83c54 --- /dev/null +++ b/src/components/Admin.vue @@ -0,0 +1,109 @@ + + + diff --git a/src/components/AppBar.vue b/src/components/AppBar.vue index e680c1a..3d31218 100644 --- a/src/components/AppBar.vue +++ b/src/components/AppBar.vue @@ -21,7 +21,9 @@ - + mdi-home @@ -42,7 +44,6 @@ @@ -61,6 +62,12 @@ export default { group: null }), methods: { + home () { + this.$router.push('/') + }, + admin () { + this.$router.push('/admin') + }, logout () { this.$http.get('https://localhost:3000/logout') .then(response => { diff --git a/src/components/Register.vue b/src/components/Register.vue index 80a783c..de0b024 100644 --- a/src/components/Register.vue +++ b/src/components/Register.vue @@ -73,7 +73,8 @@ export default { this.$http.post('https://localhost:3000/users', { name: this.name, username: this.username, - password: this.password + password: this.password, + isAdmin: 1 }) .then(response => { if (response.status === 200) { diff --git a/src/router/index.js b/src/router/index.js index f0e1a31..30a47e7 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -31,6 +31,11 @@ const routes = [ // this generates a separate chunk (about.[hash].js) for this route // which is lazy-loaded when the route is visited. component: () => import(/* webpackChunkName: "about" */ '../views/Signup.vue') + }, + { + path: '/admin', + name: 'Admin', + component: () => import(/* webpackChunkName: "about" */ '../views/AdminPage.vue') } ] diff --git a/src/views/AdminPage.vue b/src/views/AdminPage.vue new file mode 100644 index 0000000..1bb314c --- /dev/null +++ b/src/views/AdminPage.vue @@ -0,0 +1,15 @@ + + +