Compare commits

...

5 commits

9 changed files with 100 additions and 8 deletions

View file

@ -35,7 +35,7 @@ module.exports =
message: err
.then (session_id) ->
#
# login or resume successful
reply.send
success: true
message: session_id

View file

@ -0,0 +1,36 @@
logger = (require 'logging').default 'logout'
# session storage (volatile data)
session = (require '../../session')
# fftcg.db (persistent data)
fftcgdb = (require '../../db')
module.exports =
url: '/user/logout'
method: 'POST'
schema:
body:
session: type: 'string'
response:
200:
type: 'object'
required: ['success']
properties:
success:
type: 'boolean'
const: true
handler: (request, reply) ->
new Promise (resolve) ->
session.destroy request.body.session ? ""
.then ->
# active session found
logger.debug "OK removed session '#{request.body.session}'"
resolve null
.catch ->
resolve null
.then ->
reply.send
success: true

View file

@ -14,6 +14,8 @@ fastify.route (require "./routes/#{route}") for route in [
'test'
# log in user
'user/login'
# log out user
'user/logout'
# register user
'user/register'
]

View file

@ -33,6 +33,16 @@ class FFTCGSESSION
logger.info "OK '#{digest}' created"
resolve digest
destroy: (digest) ->
new Promise (resolve, reject) =>
# delete hash immediately
@db.del digest, (err, res) ->
if res == 0
reject null
else
logger.info "OK '#{digest}' deleted"
resolve null
check: (digest) ->
new Promise (resolve, reject) =>
# refresh expiry timer on digest

View file

@ -22,7 +22,7 @@
{{ buttonText }}
</v-btn>
<v-btn color="error" @click="dialog = false">
<v-btn color="error" @click.native="dialog = false">
Cancel
</v-btn>
</v-card-actions>
@ -46,7 +46,7 @@ export default {
methods: {
validate() {
if (this.$refs.form.validate()) {
this.$parent.confirm()
this.$emit('confirm')
}
}
},

View file

@ -1,5 +1,5 @@
<template>
<FormDialog buttonText="Login">
<FormDialog buttonText="Login" @confirm="doLogin">
<v-card-title class="headline">
Log In
</v-card-title>
@ -43,7 +43,7 @@ export default {
}),
methods: {
confirm() {
doLogin() {
axios
.post('/user/login', {
session: Cookies.get('session'),
@ -56,6 +56,7 @@ export default {
if (response.data.success) {
Cookies.set('session', response.data.message, { expires: 30 })
console.log('cookie', Cookies.get())
this.$router.push('about')
}
})
}

View file

@ -1,5 +1,5 @@
<template>
<FormDialog buttonText="Register">
<FormDialog buttonText="Register" @confirm="doRegister">
<v-card-title class="headline">
Register
</v-card-title>
@ -67,7 +67,7 @@ export default {
},
methods: {
confirm() {
doRegister() {
axios
.post('/user/register', {
session: null,

View file

@ -7,6 +7,7 @@
</p>
</v-flex>
<p>user session: {{ sessionID }}</p>
<v-btn @click.native="logout">Logout</v-btn>
</v-container>
</template>
@ -21,13 +22,36 @@ export default {
sessionID: ''
}),
methods: {
goHome() {
Cookies.remove('session')
this.$router.push({ name: 'home' })
},
logout() {
axios
.post('/user/logout', {
session: Cookies.get('session')
})
.then(response => {
if (response.data.success) {
this.goHome()
}
})
}
},
mounted() {
axios
.post('/user/login', {
session: Cookies.get('session')
})
.then(response => {
this.sessionID = response.data.message
if (response.data.success) {
this.sessionID = response.data.message
} else {
this.goHome()
}
})
}
}

View file

@ -15,19 +15,38 @@
</template>
<script>
import * as Cookies from 'js-cookie'
import axios from '@/plugins/axios'
import LoginForm from '@/components/forms/Login.vue'
import RegisterForm from '@/components/forms/Register.vue'
export default {
name: 'Home',
data() {
return {
dialog: false
}
},
components: {
LoginForm,
RegisterForm
},
mounted() {
if (Cookies.get('session')) {
axios
.post('/user/login', {
session: Cookies.get('session')
})
.then(response => {
if (response.data.success) {
this.$router.push({ name: 'about' })
}
})
}
}
}
</script>