Compare commits
4 commits
417c8cdd75
...
8aec2a0b6c
| Author | SHA1 | Date | |
|---|---|---|---|
| 8aec2a0b6c | |||
| 3bbb949400 | |||
| da69fb8e9d | |||
| 1354b59cb0 |
7 changed files with 118 additions and 36 deletions
|
|
@ -187,13 +187,15 @@ class FFTCGDB
|
||||||
modDeck: (userID, deckID, deckCards) ->
|
modDeck: (userID, deckID, deckCards) ->
|
||||||
new Promise (resolve, reject) =>
|
new Promise (resolve, reject) =>
|
||||||
stmt = @db.prepare 'UPDATE decks SET json = ? WHERE deck = ? AND user = ?'
|
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()
|
stmt.finalize()
|
||||||
if err
|
if err
|
||||||
logger.warn "modDeck: FAIL db '#{err.code}' for '#{deckID}'"
|
logger.warn "modDeck: FAIL db '#{err.code}' for '#{deckID}'"
|
||||||
reject messages.db
|
reject messages.db
|
||||||
|
else if @changes == 0
|
||||||
|
logger.warn "no changes for input (#{userID}, #{deckID}, #{JSON.stringify deckCards})!"
|
||||||
|
reject messages.db
|
||||||
else
|
else
|
||||||
logger.debug "modDeck: OK '#{deckID}'"
|
|
||||||
resolve deckID
|
resolve deckID
|
||||||
|
|
||||||
getDecks: (userID) ->
|
getDecks: (userID) ->
|
||||||
|
|
|
||||||
34
backend/routes/decks/modify.coffee
Normal file
34
backend/routes/decks/modify.coffee
Normal 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
|
||||||
|
|
@ -22,6 +22,8 @@ fastify.route (require "./routes/#{route}") for route in [
|
||||||
'user/register'
|
'user/register'
|
||||||
# list decks
|
# list decks
|
||||||
'decks/list'
|
'decks/list'
|
||||||
|
# modify deck
|
||||||
|
'decks/modify'
|
||||||
]
|
]
|
||||||
|
|
||||||
# request logging
|
# request logging
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,12 @@
|
||||||
</v-btn>
|
</v-btn>
|
||||||
</v-layout>
|
</v-layout>
|
||||||
</v-container>
|
</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>
|
</v-expansion-panel-content>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,12 @@
|
||||||
<template>
|
<template>
|
||||||
<v-expansion-panel v-if="value">
|
<v-expansion-panel v-if="linked_decks">
|
||||||
<Deck v-for="deck in decks" :deck="deck" :key="deck.id" />
|
<Deck v-for="deck in linked_decks" :deck="deck" :key="deck.id" />
|
||||||
</v-expansion-panel>
|
</v-expansion-panel>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
import * as Cookies from 'js-cookie'
|
||||||
|
import axios from '@/plugins/axios'
|
||||||
import CardsDB from '@/plugins/ffdecks'
|
import CardsDB from '@/plugins/ffdecks'
|
||||||
|
|
||||||
import Deck from './Deck.vue'
|
import Deck from './Deck.vue'
|
||||||
|
|
@ -12,20 +14,35 @@ import Deck from './Deck.vue'
|
||||||
export default {
|
export default {
|
||||||
name: 'DeckList',
|
name: 'DeckList',
|
||||||
|
|
||||||
props: {
|
|
||||||
value: Array
|
|
||||||
},
|
|
||||||
|
|
||||||
components: {
|
components: {
|
||||||
Deck
|
Deck
|
||||||
},
|
},
|
||||||
|
|
||||||
|
asyncComputed: {
|
||||||
|
decks: {
|
||||||
|
get() {
|
||||||
|
return axios
|
||||||
|
.post('/decks/list', {
|
||||||
|
session: this.session
|
||||||
|
})
|
||||||
|
.then(response => {
|
||||||
|
if (response.data.success) {
|
||||||
|
return response.data.decks
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
default: []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
computed: {
|
computed: {
|
||||||
decks() {
|
session: () => Cookies.get('session'),
|
||||||
|
|
||||||
|
linked_decks() {
|
||||||
let result = []
|
let result = []
|
||||||
|
|
||||||
for (let i = 0; i < this.value.length; i++) {
|
for (let i = 0; i < this.decks.length; i++) {
|
||||||
let elem = this.value[i]
|
let elem = this.decks[i]
|
||||||
let cards = []
|
let cards = []
|
||||||
|
|
||||||
for (let j = 0; j < elem.content.cards.length; j++) {
|
for (let j = 0; j < elem.content.cards.length; j++) {
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
<template>
|
<template>
|
||||||
<v-container v-if="value">
|
<v-container v-if="visible">
|
||||||
<v-card flat>
|
<v-card flat>
|
||||||
<v-alert :value="count !== 50" type="warning">
|
<v-alert :value="count !== 50" type="warning">
|
||||||
{{ count }} cards detected! (Decks should have exactly 50 cards)
|
{{ count }} cards detected! (Decks should have exactly 50 cards)
|
||||||
|
|
@ -12,15 +12,16 @@
|
||||||
<v-textarea
|
<v-textarea
|
||||||
ref="textarea"
|
ref="textarea"
|
||||||
label="Edit Deck"
|
label="Edit Deck"
|
||||||
:value="list"
|
:value="value"
|
||||||
rows="35"
|
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"
|
style="font-family: monospace"
|
||||||
|
@input="checked = false"
|
||||||
>
|
>
|
||||||
</v-textarea>
|
</v-textarea>
|
||||||
|
|
||||||
<v-card-actions>
|
<v-card-actions>
|
||||||
<v-btn color="error" @click.native="$emit('input', false)">
|
<v-btn color="error" @click.native="close">
|
||||||
<v-icon>cancel</v-icon>
|
<v-icon>cancel</v-icon>
|
||||||
cancel
|
cancel
|
||||||
</v-btn>
|
</v-btn>
|
||||||
|
|
@ -42,13 +43,16 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
import * as Cookies from 'js-cookie'
|
||||||
|
import axios from '@/plugins/axios'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'DeckEditor',
|
name: 'DeckEditor',
|
||||||
|
|
||||||
props: {
|
props: {
|
||||||
id: Number,
|
id: Number,
|
||||||
list: String,
|
value: String,
|
||||||
value: Boolean
|
visible: Boolean
|
||||||
},
|
},
|
||||||
|
|
||||||
data: () => ({
|
data: () => ({
|
||||||
|
|
@ -57,6 +61,18 @@ export default {
|
||||||
checked: false
|
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: {
|
methods: {
|
||||||
parse_deck(deck_string) {
|
parse_deck(deck_string) {
|
||||||
let retval = {
|
let retval = {
|
||||||
|
|
@ -150,6 +166,11 @@ export default {
|
||||||
return retval
|
return retval
|
||||||
},
|
},
|
||||||
|
|
||||||
|
close() {
|
||||||
|
this.checked = false
|
||||||
|
this.$emit('close')
|
||||||
|
},
|
||||||
|
|
||||||
check() {
|
check() {
|
||||||
let new_deck = this.parse_deck(this.$refs.textarea.lazyValue)
|
let new_deck = this.parse_deck(this.$refs.textarea.lazyValue)
|
||||||
|
|
||||||
|
|
@ -164,11 +185,24 @@ export default {
|
||||||
|
|
||||||
// deck has now been checked
|
// deck has now been checked
|
||||||
this.checked = true
|
this.checked = true
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
activated() {
|
save() {
|
||||||
console.log('Frosch')
|
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>
|
</script>
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@
|
||||||
<template v-if="user">
|
<template v-if="user">
|
||||||
<p>user logged in: {{ user.login }}</p>
|
<p>user logged in: {{ user.login }}</p>
|
||||||
|
|
||||||
<DeckList v-model="decks" />
|
<DeckList />
|
||||||
|
|
||||||
<v-btn @click.native="logout">Logout</v-btn>
|
<v-btn @click.native="logout">Logout</v-btn>
|
||||||
</template>
|
</template>
|
||||||
|
|
@ -36,7 +36,7 @@ export default {
|
||||||
logout() {
|
logout() {
|
||||||
axios
|
axios
|
||||||
.post('/user/logout', {
|
.post('/user/logout', {
|
||||||
session: Cookies.get('session')
|
session: this.session
|
||||||
})
|
})
|
||||||
.then(response => {
|
.then(response => {
|
||||||
if (response.data.success) {
|
if (response.data.success) {
|
||||||
|
|
@ -64,18 +64,6 @@ export default {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
},
|
|
||||||
|
|
||||||
decks() {
|
|
||||||
return axios
|
|
||||||
.post('/decks/list', {
|
|
||||||
session: this.session
|
|
||||||
})
|
|
||||||
.then(response => {
|
|
||||||
if (response.data.success) {
|
|
||||||
return response.data.decks
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Reference in a new issue