153 lines
3.8 KiB
JavaScript
153 lines
3.8 KiB
JavaScript
const fs = require('fs');
|
|
const path = require('path');
|
|
|
|
// Simple file-based storage for demo purposes
|
|
const ORDERS_FILE = path.join(__dirname, '../data/orders.json');
|
|
|
|
// Ensure data directory exists
|
|
const dataDir = path.dirname(ORDERS_FILE);
|
|
if (!fs.existsSync(dataDir)) {
|
|
fs.mkdirSync(dataDir, { recursive: true });
|
|
}
|
|
|
|
// Initialize orders file if it doesn't exist
|
|
if (!fs.existsSync(ORDERS_FILE)) {
|
|
fs.writeFileSync(ORDERS_FILE, JSON.stringify([], null, 2));
|
|
}
|
|
|
|
// Order Schema (simplified for file storage)
|
|
class Order {
|
|
constructor(data) {
|
|
this._id = data._id || Date.now().toString();
|
|
this.userId = data.userId;
|
|
this.items = data.items || []; // Array of {productId, name, price, quantity}
|
|
this.total = data.total || 0;
|
|
this.status = data.status || 'pending'; // pending, confirmed, preparing, ready, delivered, cancelled
|
|
this.deliveryAddress = data.deliveryAddress || {};
|
|
this.paymentMethod = data.paymentMethod || 'cash';
|
|
this.notes = data.notes || '';
|
|
this.createdAt = data.createdAt || new Date();
|
|
this.updatedAt = data.updatedAt || new Date();
|
|
}
|
|
|
|
// Save order to file
|
|
async save() {
|
|
this.updatedAt = new Date();
|
|
|
|
try {
|
|
const data = fs.readFileSync(ORDERS_FILE, 'utf8');
|
|
let orders = JSON.parse(data);
|
|
|
|
const index = orders.findIndex(o => o._id === this._id);
|
|
if (index === -1) {
|
|
orders.push(this);
|
|
} else {
|
|
orders[index] = this;
|
|
}
|
|
|
|
fs.writeFileSync(ORDERS_FILE, JSON.stringify(orders, null, 2));
|
|
return this;
|
|
} catch (error) {
|
|
console.error('Error saving order:', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
// Get public order data (without sensitive info)
|
|
getPublicData() {
|
|
return {
|
|
_id: this._id,
|
|
userId: this.userId,
|
|
items: this.items,
|
|
total: this.total,
|
|
status: this.status,
|
|
deliveryAddress: this.deliveryAddress,
|
|
paymentMethod: this.paymentMethod,
|
|
notes: this.notes,
|
|
createdAt: this.createdAt,
|
|
updatedAt: this.updatedAt
|
|
};
|
|
}
|
|
}
|
|
|
|
// Static methods for file operations
|
|
Order.find = async (query = {}) => {
|
|
try {
|
|
const data = fs.readFileSync(ORDERS_FILE, 'utf8');
|
|
let orders = JSON.parse(data);
|
|
|
|
// Apply filters
|
|
if (query.userId) {
|
|
orders = orders.filter(o => o.userId === query.userId);
|
|
}
|
|
if (query.status) {
|
|
orders = orders.filter(o => o.status === query.status);
|
|
}
|
|
|
|
return orders.map(o => new Order(o));
|
|
} catch (error) {
|
|
console.error('Error reading orders:', error);
|
|
return [];
|
|
}
|
|
};
|
|
|
|
Order.findById = async (id) => {
|
|
try {
|
|
const orders = await Order.find();
|
|
const order = orders.find(o => o._id === id);
|
|
return order || null;
|
|
} catch (error) {
|
|
console.error('Error finding order:', error);
|
|
return null;
|
|
}
|
|
};
|
|
|
|
Order.findByIdAndUpdate = async (id, updateData) => {
|
|
try {
|
|
const order = await Order.findById(id);
|
|
if (!order) {
|
|
return null;
|
|
}
|
|
|
|
Object.assign(order, updateData);
|
|
await order.save();
|
|
|
|
return order;
|
|
} catch (error) {
|
|
console.error('Error updating order:', error);
|
|
throw error;
|
|
}
|
|
};
|
|
|
|
Order.findByIdAndDelete = async (id) => {
|
|
try {
|
|
const data = fs.readFileSync(ORDERS_FILE, 'utf8');
|
|
let orders = JSON.parse(data);
|
|
|
|
const index = orders.findIndex(o => o._id === id);
|
|
if (index === -1) {
|
|
return null;
|
|
}
|
|
|
|
const deletedOrder = orders.splice(index, 1)[0];
|
|
fs.writeFileSync(ORDERS_FILE, JSON.stringify(orders, null, 2));
|
|
|
|
return new Order(deletedOrder);
|
|
} catch (error) {
|
|
console.error('Error deleting order:', error);
|
|
throw error;
|
|
}
|
|
};
|
|
|
|
Order.create = async (data) => {
|
|
try {
|
|
const newOrder = new Order(data);
|
|
await newOrder.save();
|
|
return newOrder;
|
|
} catch (error) {
|
|
console.error('Error creating order:', error);
|
|
throw error;
|
|
}
|
|
};
|
|
|
|
module.exports = Order; |