diff --git a/package-lock.json b/package-lock.json index 428098d..795a343 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5403,6 +5403,15 @@ } } }, + "eslint-plugin-html": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-html/-/eslint-plugin-html-6.1.2.tgz", + "integrity": "sha512-bhBIRyZFqI4EoF12lGDHAmgfff8eLXx6R52/K3ESQhsxzCzIE6hdebS7Py651f7U3RBotqroUnC3L29bR7qJWQ==", + "dev": true, + "requires": { + "htmlparser2": "^6.0.1" + } + }, "eslint-plugin-import": { "version": "2.23.4", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.23.4.tgz", diff --git a/package.json b/package.json index 03092f9..8d48195 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "@vue/eslint-config-standard": "^5.1.2", "babel-eslint": "^10.1.0", "eslint": "^6.7.2", + "eslint-plugin-html": "^6.1.2", "eslint-plugin-import": "^2.20.2", "eslint-plugin-node": "^11.1.0", "eslint-plugin-promise": "^4.2.1", diff --git a/server/boot/db.js b/server/boot/db.js index d16c5ad..6e9e29e 100644 --- a/server/boot/db.js +++ b/server/boot/db.js @@ -8,7 +8,9 @@ module.exports = function () { hashed_password BLOB, salt BLOB, name TEXT, - is_admin INTEGER)` + is_admin INTEGER, + dark_mode INTEGER, + can_upload INTEGER)` ) db.run(`CREATE TABLE IF NOT EXISTS profiles ( @@ -35,7 +37,6 @@ module.exports = function () { db.run(`CREATE TABLE IF NOT EXISTS samples ( id INTEGER PRIMARY KEY, name TEXT UNIQUE, - volume INTEGER, user INTEGER, FOREIGN KEY(user) REFERENCES users(id))` ) @@ -44,6 +45,7 @@ module.exports = function () { id INTEGER PRIMARY KEY, profile INTEGER, sample INTEGER, + volume INTEGER, FOREIGN KEY(profile) REFERENCES profiles(id), FOREIGN KEY(sample) REFERENCES samples(id))` ) diff --git a/server/routes/profiles.js b/server/routes/profiles.js index 0fc76e8..de87869 100644 --- a/server/routes/profiles.js +++ b/server/routes/profiles.js @@ -47,27 +47,26 @@ router.post('/profiles', (req, res) => { ], function (err) { if (err) { - return res.sendStatus(500) + if (err.code === 'SQLITE_CONSTRAINT') { + return res.sendStatus(409) + } else { + return res.sendStatus(500) + } } profileID = this.lastID req.body.samples.forEach(s => { - db.run('INSERT INTO profiles_samples (profile, sample) VALUES (?, ?)', [ + db.run('INSERT INTO profiles_samples (profile, sample, volume) VALUES (?, ?, ?)', [ profileID, - s.id + s.id, + s.volume ], (err) => { if (err) { return res.sendStatus(500) } }) - - db.run('UPDATE samples SET volume = ? WHERE id = ?', [s.volume, s.id], (err) => { - if (err) { - return res.sendStatus(500) - } - }) }) return res.json({ id: profileID }) @@ -75,6 +74,88 @@ router.post('/profiles', (req, res) => { }) }) +router.put('/profiles/:profileId', (req, res) => { + if (!req.user) { + return res.sendStatus(401) + } + + db.serialize(() => { + db.get('SELECT user FROM profiles WHERE id = ?', [req.params.profileId], (err, row) => { + if (err) { + return res.sendStatus(500) + } + + if (row.user.toString() !== req.user.id) { + return res.sendStatus(401) + } + }) + + db.run(`UPDATE profiles SET + timer_enabled = ?, + duration = ?, + volume = ?, + noise_color = ?, + filter_enabled = ?, + filter_type = ?, + filter_cutoff = ?, + lfo_filter_cutoff_enabled = ?, + lfo_filter_cutoff_frequency = ?, + lfo_filter_cutoff_low = ?, + lfo_filter_cutoff_high = ?, + tremolo_enabled = ?, + tremolo_frequency = ?, + tremolo_depth = ? + WHERE id = ?`, [ + req.body.isTimerEnabled ? 1 : 0, + req.body.duration, + req.body.volume, + req.body.noiseColor, + req.body.isFilterEnabled ? 1 : 0, + req.body.filterType, + req.body.filterCutoff, + req.body.isLFOFilterCutoffEnabled ? 1 : 0, + req.body.lfoFilterCutoffFrequency, + req.body.lfoFilterCutoffLow, + req.body.lfoFilterCutoffHigh, + req.body.isTremoloEnabled ? 1 : 0, + req.body.tremoloFrequency, + req.body.tremoloDepth, + req.params.profileId + ], + (err) => { + if (err) { + console.log(err) + return res.sendStatus(500) + } + + db.serialize(() => { + db.run('DELETE FROM profiles_samples WHERE profile = ?', [ + req.params.profileId + ], + (err) => { + if (err) { + return res.sendStatus(500) + } + }) + + req.body.samples.forEach(s => { + db.run('INSERT INTO profiles_samples (profile, sample, volume) VALUES (?, ?, ?)', [ + req.params.profileId, + s.id, + s.volume + ], + (err) => { + if (err) { + return res.sendStatus(500) + } + }) + }) + }) + return res.sendStatus(200) + }) + }) +}) + router.post('/profiles/default', (req, res) => { if (!req.user) { return res.sendStatus(401) @@ -117,13 +198,13 @@ router.get('/profiles', (req, res) => { return res.sendStatus(401) } - const profiles = [] - db.all('SELECT id, name FROM profiles WHERE user = ?', [req.user.id], (err, rows) => { if (err) { return res.sendStatus(500) } + const profiles = [] + rows.forEach(row => { const profile = {} @@ -142,8 +223,6 @@ router.get('/profiles/:profileId', (req, res) => { return res.sendStatus(401) } - const profile = {} - db.serialize(() => { db.get(`SELECT name, @@ -164,6 +243,7 @@ router.get('/profiles/:profileId', (req, res) => { tremolo_depth as tremoloDepth FROM profiles WHERE id = ?`, [req.params.profileId], (err, row) => { if (err) { + console.log(err) return res.sendStatus(500) } @@ -171,6 +251,8 @@ router.get('/profiles/:profileId', (req, res) => { return res.sendStatus(401) } + const profile = {} + profile.name = row.name profile.isTimerEnabled = row.isTimerEnabled === 1 profile.duration = row.duration @@ -187,24 +269,34 @@ router.get('/profiles/:profileId', (req, res) => { profile.tremoloFrequency = row.tremoloFrequency profile.tremoloDepth = row.tremoloDepth - const sampleIds = [] - db.all('SELECT sample FROM profiles_samples WHERE profile = ?', [req.params.profileId], (err, rows) => { if (err) { + console.log(err) return res.sendStatus(500) } - const samples = [] + const sampleQueryArgs = [] + + sampleQueryArgs.push(req.params.profileId) rows.forEach(row => { - sampleIds.push(row.sample) + sampleQueryArgs.push(row.sample) }) - db.all('SELECT id, name, volume FROM samples WHERE id IN ( ' + sampleIds.map(() => { return '?' }).join(',') + ' )', sampleIds, (err, rows) => { + db.all(`SELECT samples.id, name, profiles_samples.volume + FROM samples + INNER JOIN profiles_samples + ON profiles_samples.sample = samples.id + AND profiles_samples.profile = ? + WHERE samples.id IN ( ` + + sampleQueryArgs.map(() => { return '?' }).join(',') + ' )', sampleQueryArgs, (err, rows) => { if (err) { + console.log(err) return res.sendStatus(500) } + const samples = [] + rows.forEach(row => { const sample = {} diff --git a/server/routes/samples.js b/server/routes/samples.js index 8f75990..d090675 100644 --- a/server/routes/samples.js +++ b/server/routes/samples.js @@ -3,8 +3,8 @@ const config = require('config') const multer = require('multer') const storage = multer.diskStorage({ destination: config.get('Server.sampleUploadPath'), - filename: function (req, file, cb) { - cb(null, req.body.name) + filename: (req, file, cb) => { + cb(null, req.user.id + '_' + req.body.name) } }) const upload = multer({ storage: storage }) @@ -16,17 +16,33 @@ router.post('/samples', upload.single('sample'), (req, res, next) => { return res.sendStatus(401) } - db.run('INSERT INTO samples (name, volume, user) VALUES (?, ?, ?)', [ - req.body.name, - 0, - req.user.id - ], - (err) => { - if (err) { - return res.sendStatus(500) - } else { - return res.sendStatus(200) - } + db.serialize(() => { + db.get('SELECT can_upload FROM users WHERE id = ?', [req.user.id], (err, row) => { + if (err) { + return res.sendStatus(500) + } + + if (row.can_upload === 0) { + return res.sendStatus(401) + } + }) + + db.run('INSERT INTO samples (name, user) VALUES (?, ?)', [ + req.body.name, + req.user.id + ], + (err) => { + if (err) { + console.log(err) + if (err.code === 'SQLITE_CONSTRAINT') { + return res.sendStatus(409) + } else { + return res.sendStatus(500) + } + } else { + return res.sendStatus(200) + } + }) }) }) @@ -37,8 +53,9 @@ router.get('/samples', (req, res) => { const samples = [] - db.all('SELECT id, name, volume FROM samples WHERE user = ?', [req.user.id], (err, rows) => { + db.all('SELECT id, name FROM samples WHERE user = ?', [req.user.id], (err, rows) => { if (err) { + console.log(err) return res.sendStatus(500) } @@ -47,7 +64,7 @@ router.get('/samples', (req, res) => { sample.id = row.id sample.name = row.name - sample.volume = row.volume + sample.user = req.user.id samples.push(sample) }) diff --git a/server/routes/users.js b/server/routes/users.js index 7aa8210..b986a02 100644 --- a/server/routes/users.js +++ b/server/routes/users.js @@ -8,17 +8,21 @@ router.get('/users/current', (req, res) => { return res.sendStatus(401) } - db.get('SELECT is_admin as isAdmin, * FROM users WHERE id = ?', [req.user.id], (err, row) => { + db.get('SELECT is_admin as isAdmin, dark_mode as darkMode, can_upload as canUpload, * FROM users WHERE id = ?', [req.user.id], (err, row) => { if (err) { return res.sendStatus(500) } const user = {} - user.id = row.id - user.username = row.username - user.name = row.name - user.isAdmin = row.isAdmin === 1 + if (row) { + user.id = row.id + user.username = row.username + user.name = row.name + user.isAdmin = row.isAdmin === 1 + user.darkMode = row.darkMode === 1 + user.canUpload = row.canUpload === 1 + } res.json({ user: user }) }) @@ -31,7 +35,7 @@ router.get('/users', (req, res) => { const users = [] - db.all('SELECT id, username, name, is_admin as isAdmin FROM users', (err, rows) => { + db.all('SELECT id, username, name, is_admin as isAdmin, can_upload as canUpload FROM users', (err, rows) => { if (err) { return res.sendStatus(500) } @@ -43,6 +47,7 @@ router.get('/users', (req, res) => { user.username = row.username user.name = row.name user.isAdmin = row.isAdmin === 1 + user.canUpload = row.canUpload === 1 users.push(user) }) @@ -58,12 +63,15 @@ router.post('/users', (req, res) => { return res.sendStatus(500) } - db.run('INSERT INTO users (username, hashed_password, salt, name, is_admin) VALUES (?, ?, ?, ?, ?)', [ + db.run(`INSERT INTO users (username, hashed_password, salt, name, is_admin, dark_mode, can_upload) + VALUES (?, ?, ?, ?, ?, ?, ?)`, [ req.body.username, hashedPassword, salt, req.body.name, - req.body.isAdmin + req.body.isAdmin, + req.body.darkMode, + req.body.canUpload ], function (err) { if (err) { if (err.code === 'SQLITE_CONSTRAINT') { @@ -89,7 +97,7 @@ router.post('/users', (req, res) => { }) }) -router.patch('/users/:userId', (req, res) => { +router.patch('/users/admin/:userId', (req, res) => { if (!req.user) { return res.sendStatus(401) } @@ -115,6 +123,48 @@ router.patch('/users/:userId', (req, res) => { }) }) +router.patch('/users/upload/:userId', (req, res) => { + if (!req.user) { + return res.sendStatus(401) + } + + db.serialize(() => { + db.get('SELECT is_admin FROM users WHERE id = ?', [req.user.id], (err, row) => { + if (err) { + return res.sendStatus(500) + } + + if (row.is_admin === 0) { + return res.sendStatus(401) + } + }) + + db.run('UPDATE users SET can_upload = ? WHERE id = ?', [req.body.canUpload ? 1 : 0, req.params.userId], (err) => { + if (err) { + return res.sendStatus(500) + } else { + return res.sendStatus(200) + } + }) + }) +}) + +router.patch('/users/dark-mode', (req, res) => { + if (!req.user) { + return res.sendStatus(401) + } + + db.serialize(() => { + db.run('UPDATE users SET dark_mode = ? WHERE id = ?', [req.body.darkMode ? 1 : 0, req.user.id], (err) => { + if (err) { + return res.sendStatus(500) + } else { + return res.sendStatus(200) + } + }) + }) +}) + router.delete('/users/:userId', (req, res) => { if (!req.user) { return res.sendStatus(401) diff --git a/src/components/Admin.vue b/src/components/Admin.vue index 23d2a02..566db1f 100644 --- a/src/components/Admin.vue +++ b/src/components/Admin.vue @@ -1,124 +1,96 @@ - + diff --git a/src/components/AppBar.vue b/src/components/AppBar.vue index 13ef062..9efdb39 100644 --- a/src/components/AppBar.vue +++ b/src/components/AppBar.vue @@ -7,7 +7,7 @@ dense > @@ -62,47 +63,4 @@ - + diff --git a/src/components/HelloWorld.vue b/src/components/HelloWorld.vue deleted file mode 100644 index 9964cb0..0000000 --- a/src/components/HelloWorld.vue +++ /dev/null @@ -1,151 +0,0 @@ - - - diff --git a/src/components/Login.vue b/src/components/Login.vue index 8f533f9..7987e75 100644 --- a/src/components/Login.vue +++ b/src/components/Login.vue @@ -46,34 +46,4 @@ - + diff --git a/src/components/Noise.vue b/src/components/Noise.vue index b83bf12..e2ec223 100644 --- a/src/components/Noise.vue +++ b/src/components/Noise.vue @@ -8,6 +8,10 @@ +

+ Playback +

+
+ +

+ Profiles +

+ + + + + + + Delete Profile + + + + Save Profile + + + + {{ updateProfileText }} + + + + + + + + + + Profile Name + + + + + + + + + + + + + + Close + + + Save + + + + + +
+

Timer @@ -273,7 +380,10 @@ - +

Samples

@@ -290,6 +400,14 @@ + + mdi-delete + +
- -

- Profiles -

+ + {{ errorSnackbarText }} - - - - - - Delete Profile - - - - - + - - - Profile Name - - - - - - - - - - - - - - Close - - - Save - - - - - -
+ Close + + + diff --git a/src/components/Register.vue b/src/components/Register.vue index 350748b..6f59a96 100644 --- a/src/components/Register.vue +++ b/src/components/Register.vue @@ -57,34 +57,4 @@ - + diff --git a/src/components/admin.js b/src/components/admin.js new file mode 100644 index 0000000..ce36eb4 --- /dev/null +++ b/src/components/admin.js @@ -0,0 +1,77 @@ +export default { + name: 'Admin', + + data: () => ({ + currentUser: {}, + users: [], + snackbar: false, + updateText: '' + }), + created () { + this.getCurrentUser() + this.getUsers() + }, + methods: { + getUsers () { + this.$http.get('/users') + .then(response => { + if (response.status === 200) { + this.users = response.data.users + } + }) + .catch((error) => { + console.error(error.response) + }) + }, + getCurrentUser () { + this.$http.get('/users/current') + .then(response => { + if (response.status === 200) { + this.currentUser = response.data.user + } + }) + .catch((error) => { + console.error(error.response) + }) + }, + updateUserAdmin (id, isAdmin) { + this.$http.patch('/users/admin/'.concat(id), { + isAdmin: isAdmin + }) + .then(response => { + if (response.status === 200) { + this.updateText = 'User updated' + } + }) + .catch(function (error) { + console.error(error.response) + this.updateText = 'Error updating user' + }) + }, + updateUserUpload (id, canUpload) { + this.$http.patch('/users/upload/'.concat(id), { + canUpload: canUpload + }) + .then(response => { + if (response.status === 200) { + this.updateText = 'User updated' + } + }) + .catch(function (error) { + console.error(error.response) + this.updateText = 'Error updating user' + }) + }, + deleteUser (id) { + this.$http.delete('/users/'.concat(id)) + .then(response => { + if (response.status === 200) { + this.getUsers() + } + }) + .catch((error) => { + console.error(error.response) + }) + } + } +} diff --git a/src/components/appbar.js b/src/components/appbar.js new file mode 100644 index 0000000..1de15bb --- /dev/null +++ b/src/components/appbar.js @@ -0,0 +1,51 @@ +export default { + name: 'AppBar', + + data: () => ({ + drawyer: false, + isAdmin: false + }), + created () { + this.getCurrentUser() + }, + methods: { + home () { + this.$router.push('/') + }, + admin () { + this.$router.push('/admin') + }, + logout () { + this.$http.get('/logout') + .then(response => { + if (response.status === 200) { + this.$router.push('/login') + } + }) + .catch((error) => { + console.error(error.response) + }) + }, + getCurrentUser () { + this.$http.get('/users/current') + .then(response => { + if (response.status === 200) { + this.isAdmin = response.data.user.isAdmin + this.$vuetify.theme.dark = response.data.user.darkMode + } + }) + .catch((error) => { + console.error(error.response) + this.isAdmin = false + }) + }, + toggleDarkMode () { + this.$http.patch('/users/dark-mode', { + darkMode: this.$vuetify.theme.dark + }) + .catch((error) => { + console.error(error.response) + }) + } + } +} diff --git a/src/components/login.js b/src/components/login.js new file mode 100644 index 0000000..d5e29bf --- /dev/null +++ b/src/components/login.js @@ -0,0 +1,29 @@ +export default { + data: () => ({ + valid: false, + username: '', + password: '', + usernameRules: [ + v => !!v || 'Username is required' + ], + passwordRules: [ + v => !!v || 'Password is required' + ] + }), + methods: { + login () { + this.$http.post('/login/password', { + username: this.username, + password: this.password + }) + .then(response => { + if (response.status === 200) { + this.$router.push('/') + } + }) + .catch((error) => { + console.error(error.response) + }) + } + } +} diff --git a/src/components/noise.js b/src/components/noise.js index 8aea7bc..1d323ac 100644 --- a/src/components/noise.js +++ b/src/components/noise.js @@ -10,6 +10,8 @@ export default { profileDialog: false, profileName: '', isProfileValid: false, + updateProfileSnackbar: false, + updateProfileText: '', playDisabled: false, isTimerEnabled: false, hours: 0, @@ -32,6 +34,7 @@ export default { isTremoloEnabled: false, tremoloFrequency: 0.5, tremoloDepth: 0.5, + isReverbEnabled: false, allSamples: [], loadedSamples: [], selectedSample: null, @@ -39,8 +42,10 @@ export default { addSampleDialog: false, checkedSamples: [], sampleName: '', - file: null, isSampleUploadValid: false, + canUpload: false, + errorSnackbar: false, + errorSnackbarText: '', rules: { lt (n) { return value => (!isNaN(parseInt(value, 10)) && value < n) || 'Must be less than ' + n @@ -71,8 +76,9 @@ export default { this.tremolo = new Tremolo() this.lfo = new LFO() this.players = new Players() - this.populateProfileItems() + this.populateProfileItems(0) this.getSamples() + this.getCurrentUser() }, methods: { play () { @@ -108,12 +114,14 @@ export default { this.timeRemainingInterval = setInterval(() => this.startTimer(), 1000) this.loadedSamples.forEach(s => { + this.players.player(s.id).loop = true this.players.player(s.id).unsync().sync().start(0).stop(this.duration) }) } else { this.noise.sync().start(0) this.loadedSamples.forEach(s => { + this.players.player(s.id).loop = true this.players.player(s.id).unsync().sync().start(0) }) } @@ -181,7 +189,7 @@ export default { this.noise.connect(this.filter) } }, - populateProfileItems () { + populateProfileItems (profileId) { this.$http.get('/profiles') .then(response => { if (response.status === 200) { @@ -189,7 +197,7 @@ export default { this.addDefaultProfile() } else { this.profileItems = response.data.profiles - this.selectedProfile = this.profileItems[0] + this.selectedProfile = this.profileItems[profileId] } } }) @@ -201,7 +209,9 @@ export default { this.$http.post('/profiles/default') .then(response => { if (response.status === 200) { - this.selectedProfile = { id: response.data.id, text: 'Default' } + const defaultProfile = { id: response.data.id, text: 'Default' } + this.profileItems = [defaultProfile] + this.selectedProfile = defaultProfile } }) .catch((error) => { @@ -227,27 +237,45 @@ export default { tremoloDepth: this.tremoloDepth, samples: this.loadedSamples }).then(response => { - const id = response.data.id if (response.status === 200) { this.profileDialog = false - this.populateProfileItems() - - this.$http.get('/profiles') - .then(response => { - if (response.status === 200) { - this.profileItems = response.data.profiles - this.selectedProfile = { id: id, text: this.profileName } - } - }) - .catch((error) => { - console.error(error.response) - }) + console.log('repsonse.data.id: ', response.data.id) + this.populateProfileItems(response.data.id - 1) } }) .catch((error) => { console.error(error.response) }) }, + updateProfile () { + this.$http.put('/profiles/'.concat(this.selectedProfile.id), { + isTimerEnabled: this.isTimerEnabled, + duration: this.duration, + volume: this.volume, + noiseColor: this.noiseColor, + isFilterEnabled: this.isFilterEnabled, + filterType: this.filterType, + filterCutoff: this.filterCutoff, + isLFOFilterCutoffEnabled: this.isLFOFilterCutoffEnabled, + lfoFilterCutoffFrequency: this.lfoFilterCutoffFrequency, + lfoFilterCutoffLow: this.lfoFilterCutoffRange[0], + lfoFilterCutoffHigh: this.lfoFilterCutoffRange[1], + isTremoloEnabled: this.isTremoloEnabled, + tremoloFrequency: this.tremoloFrequency, + tremoloDepth: this.tremoloDepth, + samples: this.loadedSamples + }).then(response => { + if (response.status === 200) { + this.updateProfileText = 'Profile saved' + } + }) + .catch((error) => { + console.error(error.response) + this.updateProfileText = 'Error saving profile' + }) + + this.updateProfileSnackbar = true + }, loadProfile () { this.$http.get('/profiles/'.concat(this.selectedProfile.id)) .then(response => { @@ -280,7 +308,7 @@ export default { this.$http.delete('/profiles/'.concat(this.selectedProfile.id)) .then(response => { if (response.status === 200) { - this.populateProfileItems() + this.populateProfileItems(0) } }) .catch((error) => { @@ -294,7 +322,7 @@ export default { this.allSamples = response.data.samples this.allSamples.forEach(s => { if (!this.players.has(s.id)) { - this.players.add(s.id, '/samples/' + s.name).toDestination() + this.players.add(s.id, '/samples/' + s.user + '_' + s.name).toDestination() } }) } @@ -320,6 +348,10 @@ export default { } }) .catch((error) => { + if (error.response.status === 409) { + this.errorSnackbarText = 'Upload Failed: Duplicate Sample Name' + this.errorSnackbar = true + } console.error(error.response) }) @@ -328,13 +360,29 @@ export default { addSample () { this.checkedSamples.forEach(i => { const load = this.allSamples.find(e => e.id === i) + load.volume = -10 this.loadedSamples.push(load) }) this.addSampleDialog = false + this.checkedSamples = [] }, updateSampleVolume (id, index) { this.players.player(id).volume.value = this.loadedSamples[index].volume + }, + removeSample (index) { + this.loadedSamples.splice(index, 1) + }, + getCurrentUser () { + this.$http.get('/users/current') + .then(response => { + if (response.status === 200) { + this.canUpload = response.data.user.canUpload + } + }) + .catch((error) => { + console.error(error.response) + }) } } } diff --git a/src/components/register.js b/src/components/register.js new file mode 100644 index 0000000..14c3094 --- /dev/null +++ b/src/components/register.js @@ -0,0 +1,31 @@ +export default { + data: () => ({ + valid: false, + name: '', + username: '', + password: '', + rules: { + required: v => !!v || 'Required' + } + }), + methods: { + register () { + this.$http.post('/users', { + name: this.name, + username: this.username, + password: this.password, + isAdmin: 1, + darkMode: 0, + canUpload: 1 + }) + .then(response => { + if (response.status === 200) { + this.$router.push('/login') + } + }) + .catch((error) => { + console.error(error.response) + }) + } + } +} diff --git a/src/router/index.js b/src/router/index.js index d9e3a55..7163120 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -1,6 +1,6 @@ import Vue from 'vue' import VueRouter from 'vue-router' -import Home from '../views/Home.vue' +import Home from '../views/HomeView.vue' import instance from '../axios' Vue.use(VueRouter) @@ -13,24 +13,24 @@ const routes = [ }, { path: '/login', - name: 'Signin', + name: 'Login', // route level code-splitting // 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/Signin.vue') + component: () => import(/* webpackChunkName: "about" */ '../views/LoginView.vue') }, { path: '/register', - name: 'Signup', + name: 'Register', // route level code-splitting // 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') + component: () => import(/* webpackChunkName: "about" */ '../views/RegisterView.vue') }, { path: '/admin', name: 'Admin', - component: () => import(/* webpackChunkName: "about" */ '../views/AdminPage.vue') + component: () => import(/* webpackChunkName: "about" */ '../views/AdminView.vue') } ] diff --git a/src/views/About.vue b/src/views/About.vue deleted file mode 100644 index 3fa2807..0000000 --- a/src/views/About.vue +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/src/views/AdminPage.vue b/src/views/AdminView.vue similarity index 87% rename from src/views/AdminPage.vue rename to src/views/AdminView.vue index 1bb314c..91d98f6 100644 --- a/src/views/AdminPage.vue +++ b/src/views/AdminView.vue @@ -6,7 +6,7 @@ import Admin from '../components/Admin' export default { - name: 'AdminPage', + name: 'AdminView', components: { Admin diff --git a/src/views/Home.vue b/src/views/HomeView.vue similarity index 87% rename from src/views/Home.vue rename to src/views/HomeView.vue index e223d54..1028ba0 100644 --- a/src/views/Home.vue +++ b/src/views/HomeView.vue @@ -6,7 +6,7 @@ import Noise from '../components/Noise' export default { - name: 'Home', + name: 'HomeView', components: { Noise diff --git a/src/views/Signin.vue b/src/views/LoginView.vue similarity index 87% rename from src/views/Signin.vue rename to src/views/LoginView.vue index cc4aed1..9810711 100644 --- a/src/views/Signin.vue +++ b/src/views/LoginView.vue @@ -6,7 +6,7 @@ import Login from '../components/Login' export default { - name: 'Signin', + name: 'LoginView', components: { Login diff --git a/src/views/Signup.vue b/src/views/RegisterView.vue similarity index 86% rename from src/views/Signup.vue rename to src/views/RegisterView.vue index ecb062d..aaf8903 100644 --- a/src/views/Signup.vue +++ b/src/views/RegisterView.vue @@ -6,7 +6,7 @@ import Register from '../components/Register' export default { - name: 'Signup', + name: 'RegisterView', components: { Register