Compare commits

...

4 commits

7 changed files with 118 additions and 36 deletions

View file

@ -187,13 +187,15 @@ class FFTCGDB
modDeck: (userID, deckID, deckCards) ->
new Promise (resolve, reject) =>
stmt = @db.prepare 'UPDATE decks SET json = ? WHERE deck = ? AND user = ?'
stmt.run [JSON.stringify deckCards, deckID, userID], (err) ->
stmt.run [(JSON.stringify deckCards), deckID, userID], (err) ->
stmt.finalize()
if err
logger.warn "modDeck: FAIL db '#{err.code}' for '#{deckID}'"
reject messages.db
else if @changes == 0
logger.warn "no changes for input (#{userID}, #{deckID}, #{JSON.stringify deckCards})!"
reject messages.db
else
logger.debug "modDeck: OK '#{deckID}'"
resolve deckID
getDecks: (userID) ->

View file

@ -0,0 +1,34 @@
logger = (require 'logging').default '/decks/modify'
# session storage (volatile data)
session = (require '../../session')
# fftcg.db (persistent data)
fftcgdb = (require '../../db')
module.exports =
url: '/decks/modify'
method: 'POST'
# schema: (require './modify.schema')
handler: (request, reply) ->
session.check request.body.session ? ""
.then (userid) ->
# active session found, get associated user
fftcgdb.modDeck (userid), (request.body.deckID), (request.body.deckCards)
.then (deckID) ->
logger.info "OK user '#{userid}' modified deck '#{deckID}'"
reply.send
success: true
deck: deckID
.catch (err) ->
# couldnt get user details
logger.warn "FAIL '#{err}' for user id '#{userid}'"
reply.send
success: false
.catch ->
# no session found
logger.info "FAIL '#{request.body.session}' session not found"
reply.send
success: false

View file

@ -22,6 +22,8 @@ fastify.route (require "./routes/#{route}") for route in [
'user/register'
# list decks
'decks/list'
# modify deck
'decks/modify'
]
# request logging

View file

@ -30,7 +30,12 @@
</v-btn>
</v-layout>
</v-container>
<DeckEditor v-model="editing" :id="deck.id" :list="deck_list" />
<DeckEditor
:visible="editing"
:id="deck.id"
:value="deck_list"
@close="editing = false"
/>
</v-expansion-panel-content>
</template>

View file

@ -1,10 +1,12 @@
<template>
<v-expansion-panel v-if="value">
<Deck v-for="deck in decks" :deck="deck" :key="deck.id" />
<v-expansion-panel v-if="linked_decks">
<Deck v-for="deck in linked_decks" :deck="deck" :key="deck.id" />
</v-expansion-panel>
</template>
<script>
import * as Cookies from 'js-cookie'
import axios from '@/plugins/axios'
import CardsDB from '@/plugins/ffdecks'
import Deck from './Deck.vue'
@ -12,20 +14,35 @@ import Deck from './Deck.vue'
export default {
name: 'DeckList',
props: {
value: Array
},
components: {
Deck
},
asyncComputed: {
decks: {
get() {
return axios
.post('/decks/list', {
session: this.session
})
.then(response => {
if (response.data.success) {
return response.data.decks
}
})
},
default: []
}
},
computed: {
decks() {
session: () => Cookies.get('session'),
linked_decks() {
let result = []
for (let i = 0; i < this.value.length; i++) {
let elem = this.value[i]
for (let i = 0; i < this.decks.length; i++) {
let elem = this.decks[i]
let cards = []
for (let j = 0; j < elem.content.cards.length; j++) {

View file

@ -1,5 +1,5 @@
<template>
<v-container v-if="value">
<v-container v-if="visible">
<v-card flat>
<v-alert :value="count !== 50" type="warning">
{{ count }} cards detected! (Decks should have exactly 50 cards)
@ -12,15 +12,16 @@
<v-textarea
ref="textarea"
label="Edit Deck"
:value="list"
:value="value"
rows="35"
hint="Change card counts and/or serial numbers. Names will be updated automatically."
hint="Change card counts and/or serial numbers. Names will be updated accordingly!"
style="font-family: monospace"
@input="checked = false"
>
</v-textarea>
<v-card-actions>
<v-btn color="error" @click.native="$emit('input', false)">
<v-btn color="error" @click.native="close">
<v-icon>cancel</v-icon>
cancel
</v-btn>
@ -42,13 +43,16 @@
</template>
<script>
import * as Cookies from 'js-cookie'
import axios from '@/plugins/axios'
export default {
name: 'DeckEditor',
props: {
id: Number,
list: String,
value: Boolean
value: String,
visible: Boolean
},
data: () => ({
@ -57,6 +61,18 @@ export default {
checked: false
}),
computed: {
session: () => Cookies.get('session'),
new_deck() {
try {
return this.parse_deck(this.$refs.textarea)
} catch (e) {
return this.parse_deck(this.value)
}
}
},
methods: {
parse_deck(deck_string) {
let retval = {
@ -150,6 +166,11 @@ export default {
return retval
},
close() {
this.checked = false
this.$emit('close')
},
check() {
let new_deck = this.parse_deck(this.$refs.textarea.lazyValue)
@ -164,11 +185,24 @@ export default {
// deck has now been checked
this.checked = true
}
},
},
activated() {
console.log('Frosch')
save() {
let new_deck = this.parse_deck(this.$refs.textarea.lazyValue)
axios
.post('/decks/modify', {
session: this.session,
deckID: this.id,
deckCards: new_deck
})
.then(response => {
if (response.data.success) {
this.$emit('change', new_deck)
this.close()
}
})
}
}
}
</script>

View file

@ -5,7 +5,7 @@
<template v-if="user">
<p>user logged in: {{ user.login }}</p>
<DeckList v-model="decks" />
<DeckList />
<v-btn @click.native="logout">Logout</v-btn>
</template>
@ -36,7 +36,7 @@ export default {
logout() {
axios
.post('/user/logout', {
session: Cookies.get('session')
session: this.session
})
.then(response => {
if (response.data.success) {
@ -64,18 +64,6 @@ export default {
return null
}
})
},
decks() {
return axios
.post('/decks/list', {
session: this.session
})
.then(response => {
if (response.data.success) {
return response.data.decks
}
})
}
}
}