89 lines
2.8 KiB
JavaScript
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(); |