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 @@
+
+
+
+
+
+ Admin Dashboard
+
+
+
+
+
+
+ |
+ Username
+ |
+
+ Is Admin
+ |
+
+ Delete User
+ |
+
+
+
+
+ | {{ user.username }} |
+
+
+ |
+
+
+ Delete
+
+ |
+
+
+
+
+ {{ updateText }}
+
+
+
+ Close
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+