Initial commit
This commit is contained in:
89
src/services/productService.jsx
Normal file
89
src/services/productService.jsx
Normal file
@@ -0,0 +1,89 @@
|
||||
// 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();
|
||||
Reference in New Issue
Block a user