diff --git a/app/src/router/index.ts b/app/src/router/index.ts index 8fd6fe2..ea1e325 100644 --- a/app/src/router/index.ts +++ b/app/src/router/index.ts @@ -10,7 +10,7 @@ import BullpenStats from "@/views/BullpenStats.vue"; const routes: Array = [ { path: '/', - redirect: '/home' + redirect: '/login' }, { path: '/login', name: 'Login', diff --git a/app/src/services/AuthService.ts b/app/src/services/AuthService.ts index 6a6a036..1a9e2cf 100644 --- a/app/src/services/AuthService.ts +++ b/app/src/services/AuthService.ts @@ -17,8 +17,10 @@ class AuthService { }); } - public logout() { + public logout(): Promise { TokenService.removeUser(); + + return Promise.resolve(); } public register(email: string, password: string) { diff --git a/app/src/services/BullpenSessionService.ts b/app/src/services/BullpenSessionService.ts index d11ec7c..e9732fd 100644 --- a/app/src/services/BullpenSessionService.ts +++ b/app/src/services/BullpenSessionService.ts @@ -1,15 +1,17 @@ -import BullpenPitch from "@/types/BullpenPitch"; +import Pitch from "@/types/Pitch"; import User from "@/types/User"; import PitchType from "@/types/PitchType"; +// import api from './Api'; export class BullpenSessionService { - private static instance: BullpenSessionService; private static nullPitcher: User = { id: 0, firstName: "", lastName: "", - email: "", - password: "", + gender: "male", + handedness: "right", + height: 0.0, + weight: 0.0, dateOfBirth: new Date(0), createdAt: new Date(0), updatedAt: new Date(0), @@ -20,18 +22,11 @@ export class BullpenSessionService { abbreviation: "" } - private constructor() { + public constructor() { this.currentPitch = this.createPitch(); } - // Static method to get the instance of the service - public static getInstance(): BullpenSessionService { - if (!BullpenSessionService.instance) { - BullpenSessionService.instance = new BullpenSessionService(); - } - return BullpenSessionService.instance; - } - + public saveBullpen(): void {} public startSession(pitcher: User): void { this.pitcher = pitcher; this.pitches = []; @@ -51,15 +46,15 @@ export class BullpenSessionService { this.pitcher = BullpenSessionService.nullPitcher; } - public addBullpenPitch( bullpenPitch: BullpenPitch ): void { + public addBullpenPitch( bullpenPitch: Pitch ): void { this.pitches.push( bullpenPitch ); } - public getBullpenPitches(): BullpenPitch[] { + public getBullpenPitches(): Pitch[] { return this.pitches; } - public currentBullpenPitch(): BullpenPitch { + public currentBullpenPitch(): Pitch { return this.currentPitch; } @@ -76,7 +71,7 @@ export class BullpenSessionService { return this.pitcher.id === 0; } - private createPitch(): BullpenPitch { + private createPitch(): Pitch { return { id: 0, date: new Date(), @@ -86,9 +81,9 @@ export class BullpenSessionService { realPitchSubArea: 0 } } - private pitches: BullpenPitch[] = []; + private pitches: Pitch[] = []; private pitcher: User = BullpenSessionService.nullPitcher; - private currentPitch: BullpenPitch; + private currentPitch: Pitch; } -export const bullpenSessionService = BullpenSessionService.getInstance(); \ No newline at end of file +export default new BullpenSessionService(); diff --git a/app/src/store/auth.ts b/app/src/store/auth.ts index d321a9a..28ad8e3 100644 --- a/app/src/store/auth.ts +++ b/app/src/store/auth.ts @@ -26,9 +26,18 @@ const auth: Module = { actions: { login({ commit }: AuthActionContext, user) { return AuthService.login(user.email, user.password).then( - user => { - commit('loginSuccess', user); - return Promise.resolve(user); + auth => { + return UserService.getUser(auth.id).then( + (user: User) => { + commit('loginSuccess', user); + return Promise.resolve(user); + }, + error => { + commit('loginFailure'); + return Promise.reject(error); + } + ); + }, error => { commit('loginFailure'); @@ -37,8 +46,10 @@ const auth: Module = { ); }, logout({ commit }: AuthActionContext) { - AuthService.logout(); - commit('logout'); + return AuthService.logout().then(() => { + commit('logout'); + return Promise.resolve(); + }) }, register({ commit }: AuthActionContext, user) { return AuthService.register(user.email, user.password).then( @@ -56,9 +67,7 @@ const auth: Module = { mutations: { loginSuccess(state, user) { state.isAuthenticated = true; - UserService.getUser(user.id).then((user: User) => { - state.user = user; - }); + state.user = user; }, loginFailure(state) { state.isAuthenticated = false; diff --git a/app/src/types/Bullpen.ts b/app/src/types/Bullpen.ts new file mode 100644 index 0000000..8303ce4 --- /dev/null +++ b/app/src/types/Bullpen.ts @@ -0,0 +1,9 @@ +import Pitch from "@/types/Pitch"; + +export default interface Bullpen { + id: number, + startedAt: Date, + finishedAt: Date, + pitcherId: number, + pitches: Pitch[] +} diff --git a/app/src/types/BullpenPitch.ts b/app/src/types/Pitch.ts similarity index 82% rename from app/src/types/BullpenPitch.ts rename to app/src/types/Pitch.ts index 23f7e33..4834be6 100644 --- a/app/src/types/BullpenPitch.ts +++ b/app/src/types/Pitch.ts @@ -1,6 +1,6 @@ import PitchType from "@/types/PitchType"; -export default interface BullpenPitch { +export default interface Pitch { id: number, date: Date, pitchType: PitchType, diff --git a/app/src/views/BullpenStats.vue b/app/src/views/BullpenStats.vue index 286d088..9695a4b 100644 --- a/app/src/views/BullpenStats.vue +++ b/app/src/views/BullpenStats.vue @@ -16,12 +16,12 @@ import { IonTitle, IonToolbar } from '@ionic/vue'; -import {ref} from 'vue' import {useRouter} from 'vue-router'; -import {BullpenSessionService, bullpenSessionService} from "@/services/BullpenSessionService"; +import BullpenSessionService from "@/services/BullpenSessionService"; +import {ref} from 'vue'; const router = useRouter(); -const bps = ref(bullpenSessionService); +const bps = ref(BullpenSessionService); const gotoHome = () => { router.push('/home'); diff --git a/app/src/views/FinalizePitch.vue b/app/src/views/FinalizePitch.vue index 3dcc6f6..3adeb4c 100644 --- a/app/src/views/FinalizePitch.vue +++ b/app/src/views/FinalizePitch.vue @@ -1,5 +1,4 @@ @@ -62,20 +65,20 @@ const logout = () => {
{{ user.firstName }} {{ user.lastName }}
-
- +
+ Start Bullpen Session - + Show Bullpen Stats - + Show Profile - + Logout @@ -87,10 +90,12 @@ const logout = () => { diff --git a/app/src/views/Login.vue b/app/src/views/Login.vue index 87018a9..d689fb1 100644 --- a/app/src/views/Login.vue +++ b/app/src/views/Login.vue @@ -20,7 +20,6 @@ import { lockClosedOutline, personOutline } from 'ionicons/icons'; import { useForm } from 'vee-validate'; import { useRouter } from 'vue-router'; import { useStore } from 'vuex' -import { AppStore } from '@/store'; import * as yup from 'yup'; const loading = ref(false); @@ -36,7 +35,7 @@ const [email, emailAttrs] = defineField('email'); const [password, passwordAttrs] = defineField('password'); const router = useRouter(); -const store = useStore(); +const store = useStore(); const loggedIn = computed(() => store.state.auth.isAuthenticated); @@ -46,12 +45,13 @@ onMounted(() => { } }); -const submit = handleSubmit(values => { +const submit = handleSubmit((values, { resetForm }) => { store.dispatch('auth/login', { email: values.email, password: values.password, }).then( () => { + resetForm(); onLogin(); }, error => { @@ -64,6 +64,7 @@ const submit = handleSubmit(values => { } ); }, ({errors}) => { + console.log(errors); loading.value = false; }); diff --git a/app/src/views/PitcherList.vue b/app/src/views/PitcherList.vue index 8a0b4db..e28d675 100644 --- a/app/src/views/PitcherList.vue +++ b/app/src/views/PitcherList.vue @@ -4,19 +4,20 @@ import { useRouter } from "vue-router"; import { IonContent, IonHeader, IonPage, IonTitle, IonToolbar, IonList, IonItem, IonLabel } from '@ionic/vue'; import UserService from "@/services/UserService"; import User from "@/types/User"; -import {bullpenSessionService} from "@/services/BullpenSessionService"; +import BullpenSessionService from "@/services/BullpenSessionService"; const pitchers = ref([]); const router = useRouter(); +const bps = ref(BullpenSessionService); -bullpenSessionService.clear(); +bps.value.clear(); onMounted(async () => { pitchers.value = await UserService.getAllUsers(); }); const goToPreparePitch = (pitcher: User) => { - bullpenSessionService.startSession( pitcher ); + bps.value.startSession( pitcher ); router.push({ name: 'PreparePitch' }); }; diff --git a/app/src/views/PreparePitch.vue b/app/src/views/PreparePitch.vue index b0dd72b..e893df8 100644 --- a/app/src/views/PreparePitch.vue +++ b/app/src/views/PreparePitch.vue @@ -16,12 +16,12 @@ import { IonCardTitle, } from "@ionic/vue"; import PitchType from "@/types/PitchType"; -import {BullpenSessionService, bullpenSessionService} from "@/services/BullpenSessionService"; +import BullpenSessionService from "@/services/BullpenSessionService"; import {useRouter} from "vue-router"; const router = useRouter(); const pitchTypes = ref([]); -const bps = ref(bullpenSessionService); +const bps = ref(BullpenSessionService); onMounted(async () => { pitchTypes.value = PitchTypeService.getLocalPitchTypes(); diff --git a/backend/controllers/bullpenSession.controller.js b/backend/controllers/bullpenSession.controller.js index 85b9c73..578662e 100644 --- a/backend/controllers/bullpenSession.controller.js +++ b/backend/controllers/bullpenSession.controller.js @@ -17,7 +17,13 @@ exports.insert = (req, res) => { }; exports.findAll = (req, res) => { + const { user } = req.query; + const filter = {}; + if (user) { + filter.pitcherId = parseInt(user, 10); + } BullpenSession.findAll({ + where: filter, include: { model: Pitch, as: 'pitches' diff --git a/backend/test/bullpenSession.test.js b/backend/test/bullpenSession.test.js index 797d33e..ddbec87 100644 --- a/backend/test/bullpenSession.test.js +++ b/backend/test/bullpenSession.test.js @@ -32,12 +32,58 @@ describe("Test bullpen session", () => { expect(bullpenSessionData.pitches).toBeDefined(); expect(Array.isArray(bullpenSessionData.pitches)).toBe(true); expect(bullpenSessionData.pitches.length).toBe(2); + }); + + test.skip("should get all bullpen sessions", async () => { + let response = await request(app) + .post("/api/auth/login") + .send({ + email: 'player@example.com', + password: 'hash1234' + }); + const user = response.body; response = await request(app) - .get(`/api/bullpen_session/${bullpenSessionData.id}`) + .get("/api/bullpen_session") .set('x-access-token', user.accessToken); - expect(response.statusCode).toBe(200); - // console.log(JSON.stringify(response.body, null, 2)); - }); + expect(response.statusCode).toBe(200); + const bullpenSessionDataArray = await response.body; + expect(bullpenSessionDataArray).toBeDefined(); + expect(Array.isArray(bullpenSessionDataArray)).toBe(true); + expect(bullpenSessionDataArray.length).toBe(1); + const bullpenSessionData = bullpenSessionDataArray[0]; + expect(bullpenSessionData.id).toBeDefined(); + expect(bullpenSessionData.id).toBeGreaterThan(0); + expect(bullpenSessionData.pitches).toBeDefined(); + expect(Array.isArray(bullpenSessionData.pitches)).toBe(true); + expect(bullpenSessionData.pitches.length).toBe(2); + }) + + test("should get all bullpen sessions for user", async () => { + let response = await request(app) + .post("/api/auth/login") + .send({ + email: 'player@example.com', + password: 'hash1234' + }); + const user = response.body; + + response = await request(app) + .get("/api/bullpen_session") + .set('x-access-token', user.accessToken) + .query({ user: user.id }); + + expect(response.statusCode).toBe(200); + const bullpenSessionDataArray = await response.body; + expect(bullpenSessionDataArray).toBeDefined(); + expect(Array.isArray(bullpenSessionDataArray)).toBe(true); + expect(bullpenSessionDataArray.length).toBe(1); + const bullpenSessionData = bullpenSessionDataArray[0]; + expect(bullpenSessionData.id).toBeDefined(); + expect(bullpenSessionData.id).toBeGreaterThan(0); + expect(bullpenSessionData.pitches).toBeDefined(); + expect(Array.isArray(bullpenSessionData.pitches)).toBe(true); + expect(bullpenSessionData.pitches.length).toBe(2); + }) })