Exercise store, mark exercise 0.2 as solved on ticket buy

This commit is contained in:
2024-10-23 13:57:37 +02:00
parent 093eba9af6
commit c5c5a2da8b
5 changed files with 49 additions and 20 deletions

View File

@@ -1,14 +1,11 @@
<script setup lang="ts"> <script setup lang="ts">
import { updateExercise } from '@/data/api/exerciseApi'; import { useExerciseStore } from '@/stores/exercise.store';
import { ref, watch } from 'vue'; import { ref, watch } from 'vue';
import { useRoute } from 'vue-router'; import { useRoute } from 'vue-router';
const route = useRoute() const route = useRoute()
const routeItems = ref(route.path.split('/')) const routeItems = ref(route.path.split('/'))
const exerciseStore = useExerciseStore()
function solveExerciseXssInUrl() {
updateExercise(3, 1, true)
}
watch(() => route.path, () => { watch(() => route.path, () => {
routeItems.value = route.path.split("/") routeItems.value = route.path.split("/")
@@ -41,9 +38,10 @@ watch(() => route.path, () => {
Filter: Filter:
<div v-for="query in route.query" v-html="query" /> <div v-for="query in route.query" v-html="query" />
<!-- Logic to check, if exercise 3.1 is solved -->
<div v-for="query in route.query"> <div v-for="query in route.query">
<span v-if="String(query).startsWith('<iframe')"> <span v-if="String(query).startsWith('<iframe')">
{{ solveExerciseXssInUrl() }} {{ exerciseStore.solveExercise(3, 1) }}
</span> </span>
</div> </div>
</v-col> </v-col>

View File

@@ -2,7 +2,7 @@ import axios from "axios"
const BASE_URL = "http://localhost:3000/exercises" const BASE_URL = "http://localhost:3000/exercises"
export async function getAllExerciseGroups() { export async function fetchAllExerciseGroups() {
return await axios.get(BASE_URL) return await axios.get(BASE_URL)
} }

View File

@@ -1,29 +1,22 @@
<script setup lang="ts"> <script setup lang="ts">
import { getAllExerciseGroups } from '@/data/api/exerciseApi';
import scoreCard from './scoreCard.vue'; import scoreCard from './scoreCard.vue';
import { ref } from 'vue'; import { useExerciseStore } from '@/stores/exercise.store';
import { ExerciseGroupApiModel } from '@/data/models/exercises/exerciseGroupApiModel';
import { usePreferencesStore } from '@/stores/preferences.store';
const exerciseGroups = ref<Array<ExerciseGroupApiModel>>([]) const exerciseStore = useExerciseStore()
const preferencesStore = usePreferencesStore()
getAllExerciseGroups() exerciseStore.getAllExercises()
.then(result => {
exerciseGroups.value = result.data
})
</script> </script>
<template> <template>
<v-container max-width="1000"> <v-container max-width="1000">
<v-row v-if="preferencesStore.fetchInProgress" v-for="i in 3"> <v-row v-if="exerciseStore.fetchInProgress" v-for="i in 3">
<v-col> <v-col>
<score-card :loading="true" <score-card :loading="true"
/> />
</v-col> </v-col>
</v-row> </v-row>
<v-row v-for="exerciseGroup in exerciseGroups"> <v-row v-for="exerciseGroup in exerciseStore.exerciseGroups">
<v-col> <v-col>
<score-card <score-card
:exercise-group="exerciseGroup" :exercise-group="exerciseGroup"

View File

@@ -9,9 +9,9 @@ import { ref } from "vue";
import { SelectedSeatModel } from "../data/models/ordering/selectedSeatModel"; import { SelectedSeatModel } from "../data/models/ordering/selectedSeatModel";
import { calcPrice } from "@/scripts/concertScripts"; import { calcPrice } from "@/scripts/concertScripts";
import { BandModel } from "../data/models/acts/bandModel"; import { BandModel } from "../data/models/acts/bandModel";
import { ConcertModel } from "../data/models/acts/concertModel";
import { useAccountStore } from "./account.store"; import { useAccountStore } from "./account.store";
import { createOrder } from "@/data/api/orderApi"; import { createOrder } from "@/data/api/orderApi";
import { useExerciseStore } from "./exercise.store";
export const useBasketStore = defineStore('basketStore', { export const useBasketStore = defineStore('basketStore', {
state: () => ({ state: () => ({
@@ -97,6 +97,7 @@ export const useBasketStore = defineStore('basketStore', {
async takeOrder() { async takeOrder() {
const accountStore = useAccountStore() const accountStore = useAccountStore()
const feedbackStore = useFeedbackStore() const feedbackStore = useFeedbackStore()
const exerciseStore = useExerciseStore()
await createOrder( await createOrder(
accountStore.userAccount.id, accountStore.userAccount.id,
@@ -110,6 +111,9 @@ export const useBasketStore = defineStore('basketStore', {
this.itemsInBasket = [] this.itemsInBasket = []
feedbackStore.changeBanner(BannerStateEnum.ORDERPLACESUCCESSFUL) feedbackStore.changeBanner(BannerStateEnum.ORDERPLACESUCCESSFUL)
// Exercise 0.2 is solved
exerciseStore.solveExercise(0, 2)
} else { } else {
feedbackStore.changeBanner(BannerStateEnum.ERROR) feedbackStore.changeBanner(BannerStateEnum.ERROR)
} }

View File

@@ -0,0 +1,34 @@
import { fetchAllExerciseGroups, updateExercise } from "@/data/api/exerciseApi";
import { ExerciseGroupApiModel } from "@/data/models/exercises/exerciseGroupApiModel";
import { defineStore } from "pinia";
import { ref } from "vue";
export const useExerciseStore = defineStore("exerciseStore", {
state: () => ({
exerciseGroups: ref<Array<ExerciseGroupApiModel>>([]),
/** Request to server sent, waiting for data response */
fetchInProgress: ref(false)
}),
actions: {
getAllExercises() {
this.fetchInProgress = true
fetchAllExerciseGroups()
.then(result => {
this.exerciseGroups = result.data
this.fetchInProgress = false
})
},
solveExercise(exerciseGroupNr: number, exerciseNr: number) {
this.fetchInProgress = true
updateExercise(exerciseGroupNr, exerciseNr, true)
.then(result => {
this.getAllExercises()
})
}
}
})