import axios from "axios"; import { useAuthStore } from "@/stores/authStore.js"; import jwt_decode from "jwt-decode"; import router from "@/router/index"; export const API = { /** * API method to send a login request. * If login succeeds, the logged in User and their token * is saved to the Pinia AuthStore * * @param email email address of the user to log in as * @param password password to log in with * @returns a Result with whether the login attempt succeeded */ login: async (request) => { const authStore = useAuthStore(); let token; authStore.logout(); //in case someone for some reason is logged in return axios.post( `${import.meta.env.VITE_BACKEND_URL}/login`, request, ) .then(async (response) => { token = response.data; const id = (jwt_decode(token)).id; return API.getAccount(id, token) .then((user) => { authStore.setAccount(user); authStore.setToken(token); API.getProfiles() .then(response => {authStore.setProfiles(response)}) .catch(() => {throw new Error()}) return; }) .catch(() => { throw new Error(); }); }) .catch(() => { throw new Error(); }); }, /** * API method to get a account by their ID * @param id ID number of the account to retrieve * @returns A promise that resolves to a User if the API call succeeds, * or is rejected if the API call fails */ getAccount: async (id, token) => { return axios.get(`${import.meta.env.VITE_BACKEND_URL}/account/${id}`, { headers: { Authorization: `Bearer ${token}` }, }) .then((response) => { return response.data; }) .catch(() => { throw new Error("Account not found or not accessible"); }); }, // Sends the user into the home page logged in as the profile they clicked on selectProfile: async (id) => { const authStore = useAuthStore() return axios.get(`${import.meta.env.VITE_BACKEND_URL}/profile/${id}`, { headers: { Authorization: `Bearer ${authStore.token}` }, }) .then((response) => { authStore.setProfile(response.data) router.push("/") }) .catch(() => { throw new Error("Profile not found or not accessible") }) }, // Sends the user into the "register profile" view addProfile: async () => { console.log("todo"); }, // Returns all profiles to the logged in user getProfiles: async () => { const authStore = useAuthStore(); if (!authStore.isLoggedIn) { throw new Error(); } return axios.get(import.meta.env.VITE_BACKEND_URL + '/profile', { headers: { Authorization: "Bearer " + authStore.token }, }, ) .then(response => { return response.data }).catch(() => { throw new Error(); }); }, // Registers a new account and logs into it addAccount: async (request) => { const authStore = useAuthStore(); axios.post(import.meta.env.VITE_BACKEND_URL + '/account', request) .then(() => { API.login({email: request.email, password: request.password}) .catch(err => {console.log(err)}) }) .catch(() => {throw new Error()}) } } export const API = { /** * Fetches all fridgeItems */ getFridgeItems(){ return axios.get(`${import.meta.env.VITE_BACKEND_URL}/fridge`) .then((response) => { return response.data; }).catch(() => { throw new Error(); }); } }