Files
warfle_webpage/src/services/productService.jsx
2025-11-25 00:43:00 +05:30

89 lines
2.8 KiB
JavaScript

// src/services/productService.jsx
import axios from 'axios';
import API_BASE_URL from '../config/api';
class ProductService {
constructor() {
this.token = null; // in-memory token
this.api = axios.create({
baseURL: API_BASE_URL,
headers: {
'Content-Type': 'application/json',
},
// withCredentials: true // keep commented unless you use cookie auth
});
// Interceptor uses this.token (in-memory)
this.api.interceptors.request.use((config) => {
const t = this.token;
if (t) {
// ensure token is clean string
const token = String(t).replace(/(^"|"$)/g, '').trim().replace(/[\r\n\t]+/g, '');
config.headers = { ...config.headers, Authorization: `Bearer ${token}` };
}
return config;
}, (err) => Promise.reject(err));
}
// call this after login or when token becomes available
setToken(token) {
this.token = token;
}
// optional: allow clearing token (logout)
clearToken() {
this.token = null;
}
async getProducts(params = {}) {
const response = await this.api.get('/products', { params });
return response.data;
}
async getProduct(id) {
const response = await this.api.get(`/products/${id}`);
return response.data;
}
async getCategories() {
const response = await this.api.get('/products/categories/all');
return response.data;
}
// Note: backend column names use snake_case (see DB). Map fields accordingly.
async addProduct(productData) {
// map camelCase keys to DB expected snake_case if needed
const payload = this._mapClientToServer(productData);
const response = await this.api.post('/products', payload);
return response.data;
}
async updateProduct(id, productData) {
const payload = this._mapClientToServer(productData);
const response = await this.api.put(`/products/${id}`, payload);
return response.data;
}
async deleteProduct(id) {
const response = await this.api.delete(`/products/${id}`);
return response.data;
}
// helper to map client camelCase -> server snake_case (adjust as necessary)
_mapClientToServer(data = {}) {
const mapped = {};
if (data.name !== undefined) mapped.name = data.name;
if (data.description !== undefined) mapped.description = data.description;
if (data.price !== undefined) mapped.price = data.price;
if (data.imageUrl !== undefined) mapped.image_url = data.imageUrl;
if (data.imageUrl1 !== undefined) mapped.image_url1 = data.imageUrl1;
if (data.stockQuantity !== undefined) mapped.stock_quantity = data.stockQuantity;
if (data.category !== undefined) mapped.category = data.category;
if (data.details !== undefined) mapped.details = data.details;
if (data.sizeAvailable !== undefined) mapped.size_available = data.sizeAvailable;
return mapped;
}
}
export default new ProductService();