131 lines
3.3 KiB
JavaScript
131 lines
3.3 KiB
JavaScript
/*
|
|
* Functions for calling the cart API endpoints on the backend.
|
|
*
|
|
* Author: Shiv
|
|
* Date: April 2026
|
|
*/
|
|
|
|
//Base path for all cart API calls
|
|
const BASE = "/api/v1/cart";
|
|
|
|
//Returns the standard headers needed for authenticated requests
|
|
function authHeaders(token) {
|
|
return {
|
|
"Content-Type": "application/json",
|
|
Authorization: `Bearer ${token}`,
|
|
};
|
|
}
|
|
|
|
//Parses the response and throws an error if the request failed
|
|
async function handleResponse(res) {
|
|
if (res.status === 204) return null;
|
|
const data = await res.json();
|
|
|
|
if (!res.ok) throw new Error(data.message || "Cart request failed");
|
|
return data;
|
|
}
|
|
|
|
export async function fetchCart(token, storeId) {
|
|
const res = await fetch(`${BASE}?storeId=${storeId}`, {
|
|
headers: authHeaders(token),
|
|
});
|
|
if (res.status === 204) return null;
|
|
const data = await res.json();
|
|
|
|
if (!res.ok) throw new Error(data.message || "Failed to fetch cart");
|
|
return data;
|
|
}
|
|
|
|
export async function apiAddToCart(token, { prodId, storeId, quantity }) {
|
|
const res = await fetch(`${BASE}/add`, {
|
|
method: "POST",
|
|
headers: authHeaders(token),
|
|
body: JSON.stringify({ prodId, storeId, quantity }),
|
|
});
|
|
return handleResponse(res);
|
|
}
|
|
|
|
export async function apiUpdateCartItem(token, { cartItemId, quantity }) {
|
|
const res = await fetch(`${BASE}/update`, {
|
|
method: "PUT",
|
|
headers: authHeaders(token),
|
|
body: JSON.stringify({ cartItemId, quantity }),
|
|
});
|
|
|
|
return handleResponse(res);
|
|
}
|
|
|
|
export async function apiRemoveCartItem(token, cartItemId) {
|
|
const res = await fetch(`${BASE}/remove/${cartItemId}`, {
|
|
method: "DELETE",
|
|
headers: authHeaders(token),
|
|
});
|
|
|
|
return handleResponse(res);
|
|
}
|
|
|
|
export async function apiClearCart(token, storeId) {
|
|
const res = await fetch(`${BASE}/clear?storeId=${storeId}`, {
|
|
method: "DELETE",
|
|
headers: authHeaders(token),
|
|
});
|
|
|
|
return handleResponse(res);
|
|
}
|
|
|
|
export async function apiApplyCoupon(token, storeId, couponCode) {
|
|
const res = await fetch(`${BASE}/apply-coupon?storeId=${storeId}`, {
|
|
method: "POST",
|
|
headers: authHeaders(token),
|
|
body: JSON.stringify({ couponCode }),
|
|
});
|
|
|
|
return handleResponse(res);
|
|
}
|
|
|
|
export async function apiApplyPoints(token, storeId, useLoyaltyPoints) {
|
|
const res = await fetch(`${BASE}/apply-points?storeId=${storeId}&useLoyaltyPoints=${useLoyaltyPoints}`, {
|
|
method: "POST",
|
|
headers: authHeaders(token),
|
|
});
|
|
|
|
return handleResponse(res);
|
|
}
|
|
|
|
export async function apiRemoveCoupon(token, storeId) {
|
|
const res = await fetch(`${BASE}/coupon?storeId=${storeId}`, {
|
|
method: "DELETE",
|
|
headers: authHeaders(token),
|
|
});
|
|
|
|
return handleResponse(res);
|
|
}
|
|
|
|
export async function apiCheckout(token, { storeId }) {
|
|
const res = await fetch(`${BASE}/checkout`, {
|
|
method: "POST",
|
|
headers: authHeaders(token),
|
|
body: JSON.stringify({ storeId }),
|
|
});
|
|
|
|
return handleResponse(res);
|
|
}
|
|
|
|
export async function apiCompleteCheckout(token, paymentIntentId) {
|
|
const res = await fetch(`${BASE}/checkout/complete?paymentIntentId=${encodeURIComponent(paymentIntentId)}`, {
|
|
method: "POST",
|
|
headers: authHeaders(token),
|
|
});
|
|
|
|
return handleResponse(res);
|
|
}
|
|
|
|
export async function apiCancelCheckout(token, storeId) {
|
|
const res = await fetch(`${BASE}/checkout/cancel?storeId=${storeId}`, {
|
|
method: "POST",
|
|
headers: authHeaders(token),
|
|
});
|
|
|
|
return handleResponse(res);
|
|
}
|