Deploy to production #11

Merged
zelda merged 12 commits from staging into production 2025-04-16 17:40:57 +10:00
3 changed files with 111 additions and 93 deletions
Showing only changes of commit 5c7d2a988f - Show all commits

View File

@ -46,22 +46,29 @@ const handleUpdateProductTabs = (data) => {
}; };
// const tracking = async () => { // const tracking = async () => {
// if (_INTERVAL_TRACKING_ID) { // console.log('🚀 Tracking process started...');
// clearInterval(_INTERVAL_TRACKING_ID);
// _INTERVAL_TRACKING_ID = null;
// }
// _INTERVAL_TRACKING_ID = setInterval(async () => { // while (true) {
// console.log('🔍 Scanning active bids...');
// const productTabs = _.flatMap(MANAGER_BIDS, 'children'); // const productTabs = _.flatMap(MANAGER_BIDS, 'children');
// for (const apiBid of MANAGER_BIDS) {
// if (apiBid.page_context) continue;
// console.log(`🎧 Listening to events for API Bid ID: ${apiBid.id}`);
// await apiBid.listen_events();
// }
// for (const productTab of productTabs) { // for (const productTab of productTabs) {
// console.log(`📌 Processing Product ID: ${productTab.id}`);
// // Tìm parent context nếu chưa có // // Tìm parent context nếu chưa có
// if (!productTab.parent_browser_context) { // if (!productTab.parent_browser_context) {
// const parent = _.find(MANAGER_BIDS, { id: productTab.web_bid.id }); // const parent = _.find(MANAGER_BIDS, { id: productTab.web_bid.id });
// productTab.parent_browser_context = parent?.browser_context; // productTab.parent_browser_context = parent?.browser_context;
// if (!productTab.parent_browser_context) { // if (!productTab.parent_browser_context) {
// console.log(`🔄 Waiting for parent process to start... (Product ID: ${productTab.id})`); // console.log(` Waiting for parent process to start... (Product ID: ${productTab.id})`);
// continue; // continue;
// } // }
// } // }
@ -74,6 +81,7 @@ const handleUpdateProductTabs = (data) => {
// // Nếu URL thay đổi, điều hướng đến URL mới // // Nếu URL thay đổi, điều hướng đến URL mới
// if (productTab.page_context.url() !== productTab.url) { // if (productTab.page_context.url() !== productTab.url) {
// console.log(`🔄 Redirecting to new URL for Product ID: ${productTab.id}`);
// await productTab.gotoLink(); // await productTab.gotoLink();
// } // }
@ -87,7 +95,7 @@ const handleUpdateProductTabs = (data) => {
// // Nếu chưa có first_bid (trạng thái chưa đặt giá) // // Nếu chưa có first_bid (trạng thái chưa đặt giá)
// if (!productTab.first_bid) { // if (!productTab.first_bid) {
// console.log(`🎯 Tracking out-bid event for Product ID: ${productTab.id}`); // console.log(`🎯 Waiting for first bid for Product ID: ${productTab.id}`);
// continue; // continue;
// } // }
@ -100,84 +108,18 @@ const handleUpdateProductTabs = (data) => {
// console.log(`🚀 Executing action for Product ID: ${productTab.id}`); // console.log(`🚀 Executing action for Product ID: ${productTab.id}`);
// await productTab.action(); // await productTab.action();
// } // }
// }, configs.AUTO_TRACKING_DELAY);
// console.log('🧹 Cleaning up unused tabs...');
// await clearLazyTab();
// console.log('📊 Tracking work status...');
// workTracking();
// console.log(`⏳ Waiting ${configs.AUTO_TRACKING_DELAY / 1000} seconds before the next iteration...`);
// await delay(configs.AUTO_TRACKING_DELAY);
// }
// }; // };
const tracking = async () => {
console.log('🚀 Tracking process started...');
while (true) {
console.log('🔍 Scanning active bids...');
const productTabs = _.flatMap(MANAGER_BIDS, 'children');
for (const apiBid of MANAGER_BIDS) {
if (apiBid.page_context) continue;
console.log(`🎧 Listening to events for API Bid ID: ${apiBid.id}`);
await apiBid.listen_events();
}
for (const productTab of productTabs) {
console.log(`📌 Processing Product ID: ${productTab.id}`);
// Tìm parent context nếu chưa có
if (!productTab.parent_browser_context) {
const parent = _.find(MANAGER_BIDS, { id: productTab.web_bid.id });
productTab.parent_browser_context = parent?.browser_context;
if (!productTab.parent_browser_context) {
console.log(`⏳ Waiting for parent process to start... (Product ID: ${productTab.id})`);
continue;
}
}
// Kết nối Puppeteer nếu chưa có page_context
if (!productTab.page_context) {
console.log(`🔌 Connecting to page for Product ID: ${productTab.id}`);
await productTab.puppeteer_connect();
}
// Nếu URL thay đổi, điều hướng đến URL mới
if (productTab.page_context.url() !== productTab.url) {
console.log(`🔄 Redirecting to new URL for Product ID: ${productTab.id}`);
await productTab.gotoLink();
}
// Kiểm tra nếu cần cập nhật trước khi gọi update()
if (shouldUpdateProductTab(productTab)) {
console.log(`🔄 Updating Product ID: ${productTab.id}...`);
await productTab.update();
} else {
console.log(`⏳ Product ID: ${productTab.id} was updated recently. Skipping update.`);
}
// Nếu chưa có first_bid (trạng thái chưa đặt giá)
if (!productTab.first_bid) {
console.log(`🎯 Waiting for first bid for Product ID: ${productTab.id}`);
continue;
}
// Nếu chưa đến giờ bid
if (productTab.start_bid_time && !isTimeReached(productTab.start_bid_time)) {
console.log(`⏳ Not yet time to bid. Skipping Product ID: ${productTab.id}`);
continue;
}
console.log(`🚀 Executing action for Product ID: ${productTab.id}`);
await productTab.action();
}
console.log('🧹 Cleaning up unused tabs...');
await clearLazyTab();
console.log('📊 Tracking work status...');
workTracking();
console.log(`⏳ Waiting ${configs.AUTO_TRACKING_DELAY / 1000} seconds before the next iteration...`);
await delay(configs.AUTO_TRACKING_DELAY);
}
};
// const clearLazyTab = async () => { // const clearLazyTab = async () => {
// if (!browser) { // if (!browser) {
// console.warn('⚠️ Browser is not available or disconnected.'); // console.warn('⚠️ Browser is not available or disconnected.');
@ -231,6 +173,91 @@ const tracking = async () => {
// } // }
// }; // };
const tracking = async () => {
console.log('🚀 Tracking process started...');
while (true) {
try {
console.log('🔍 Scanning active bids...');
const productTabs = _.flatMap(MANAGER_BIDS, 'children');
// Lắng nghe sự kiện của API bids (chạy song song)
await Promise.allSettled(
MANAGER_BIDS.filter((bid) => !bid.page_context).map((apiBid) => {
console.log(`🎧 Listening to events for API Bid ID: ${apiBid.id}`);
return apiBid.listen_events();
}),
);
// Duyệt qua từng productTab
await Promise.allSettled(
productTabs.map(async (productTab) => {
console.log(`📌 Processing Product ID: ${productTab.id}`);
// Xác định parent context
if (!productTab.parent_browser_context) {
const parent = _.find(MANAGER_BIDS, { id: productTab.web_bid.id });
productTab.parent_browser_context = parent?.browser_context;
if (!productTab.parent_browser_context) {
console.log(`⏳ Waiting for parent process... (Product ID: ${productTab.id})`);
return;
}
}
// Kết nối Puppeteer nếu chưa có page_context
if (!productTab.page_context) {
console.log(`🔌 Connecting to page for Product ID: ${productTab.id}`);
await productTab.puppeteer_connect();
}
// Kiểm tra URL và điều hướng nếu cần
if (productTab.page_context.url() !== productTab.url) {
console.log(`🔄 Redirecting to new URL for Product ID: ${productTab.id}`);
await productTab.gotoLink();
}
// Cập nhật nếu cần thiết
if (shouldUpdateProductTab(productTab)) {
console.log(`🔄 Updating Product ID: ${productTab.id}...`);
await productTab.update();
} else {
console.log(`⏳ Product ID: ${productTab.id} was updated recently. Skipping update.`);
}
// Chờ first bid
if (!productTab.first_bid) {
console.log(`🎯 Waiting for first bid for Product ID: ${productTab.id}`);
return;
}
// Kiểm tra thời gian bid
if (productTab.start_bid_time && !isTimeReached(productTab.start_bid_time)) {
console.log(`⏳ Not yet time to bid. Skipping Product ID: ${productTab.id}`);
return;
}
// Thực thi hành động
console.log(`🚀 Executing action for Product ID: ${productTab.id}`);
await productTab.action();
}),
);
// Dọn dẹp tab không dùng
console.log('🧹 Cleaning up unused tabs...');
await clearLazyTab();
// Cập nhật trạng thái tracking
console.log('📊 Tracking work status...');
workTracking();
} catch (error) {
console.error('❌ Error in tracking loop:', error);
}
console.log(`⏳ Waiting ${configs.AUTO_TRACKING_DELAY / 1000} seconds before the next iteration...`);
await delay(configs.AUTO_TRACKING_DELAY);
}
};
const clearLazyTab = async () => { const clearLazyTab = async () => {
if (!browser) { if (!browser) {
console.warn('⚠️ Browser is not available or disconnected.'); console.warn('⚠️ Browser is not available or disconnected.');

View File

@ -19,7 +19,7 @@ export class Bid {
if (!this.page_context) return; if (!this.page_context) return;
try { try {
await this.page_context.waitForSelector('#pageContainer', { timeout: 10000 }); // await this.page_context.waitForSelector('#pageContainer', { timeout: 10000 });
console.log(`✅ Page fully loaded. Taking snapshot for Product ID: ${this.id}`); console.log(`✅ Page fully loaded. Taking snapshot for Product ID: ${this.id}`);
takeSnapshot(this.page_context, this, 'working', CONSTANTS.TYPE_IMAGE.WORK); takeSnapshot(this.page_context, this, 'working', CONSTANTS.TYPE_IMAGE.WORK);
} catch (error) { } catch (error) {

View File

@ -38,8 +38,6 @@ export class GraysProductBid extends ProductBid {
}); });
if (!response.status) { if (!response.status) {
// await this.handleReturnProductPage(page);
// await safeClosePage(this);
return { result: false, bid_price: 0 }; return { result: false, bid_price: 0 };
} }
@ -95,7 +93,6 @@ export class GraysProductBid extends ProductBid {
if (!close_time || new Date(close_time).getTime() <= new Date().getTime()) { if (!close_time || new Date(close_time).getTime() <= new Date().getTime()) {
console.log(`Product is close ${close_time}`); console.log(`Product is close ${close_time}`);
// await safeClosePage(this);
return { result: true, close_time }; return { result: true, close_time };
} }
@ -126,10 +123,8 @@ export class GraysProductBid extends ProductBid {
await takeSnapshot(page, this, 'bid-success', CONSTANTS.TYPE_IMAGE.SUCCESS); await takeSnapshot(page, this, 'bid-success', CONSTANTS.TYPE_IMAGE.SUCCESS);
return true; return true;
} catch (error) { } catch (error) {
console.log({ error: error.message });
console.log('❌ Timeout to loading'); console.log('❌ Timeout to loading');
await takeSnapshot(page, this, 'timeout to loading'); await takeSnapshot(page, this, 'timeout to loading');
// await safeClosePage(this);
return false; return false;
} }
} }
@ -140,8 +135,6 @@ export class GraysProductBid extends ProductBid {
} }
async handleUpdateBid({ lot_id, close_time, name, current_price, reserve_price }) { async handleUpdateBid({ lot_id, close_time, name, current_price, reserve_price }) {
// if (close_time && this.close_time == close_time) return;
const response = await updateBid(this.id, { lot_id, close_time, name, current_price, reserve_price: Number(reserve_price) || 0 }); const response = await updateBid(this.id, { lot_id, close_time, name, current_price, reserve_price: Number(reserve_price) || 0 });
if (response) { if (response) {
@ -236,7 +229,6 @@ export class GraysProductBid extends ProductBid {
if (!resultPlaceBid) { if (!resultPlaceBid) {
console.log('❌ Error occurred while placing the bid.'); console.log('❌ Error occurred while placing the bid.');
await takeSnapshot(page, this, 'place-bid-action'); await takeSnapshot(page, this, 'place-bid-action');
// await safeClosePage(this);
return; return;
} }
@ -245,7 +237,6 @@ export class GraysProductBid extends ProductBid {
await this.handleReturnProductPage(page); await this.handleReturnProductPage(page);
} catch (error) { } catch (error) {
console.error(`🚨 Error navigating the page: ${error.message}`); console.error(`🚨 Error navigating the page: ${error.message}`);
// safeClosePage(this);
} }
}; };
} }