Files
store-scraper-bot/src/index.js
T
tiennm99 a656a18ce8 feat: initial JavaScript port of store-scraper-bot
Node.js 20+ ESM port mirroring Java/Go implementations.

- 13 Telegram commands matching Java identifiers
- MongoDB schema parity (common, group, apple_app, google_app collections)
- Apple/Google scrapers calling store-scraper.vercel.app with 10-min cache
- Daily 7am Vietnam-time cron with weekend-silent mode
- HTML table renderer matching Java/Go output
- Docker + Compose (prod and dev)

Untested end-to-end against live Telegram or upstream API.
2026-04-26 20:16:00 +07:00

44 lines
1.4 KiB
JavaScript

import { loadConfig } from './config.js';
import { closeMongoDB, initMongoDB } from './repository/mongodb.js';
import { initAdmin } from './repository/admin-repository.js';
import { createAppleScraper } from './api/apple-scraper.js';
import { createGoogleScraper } from './api/google-scraper.js';
import { createBot } from './bot/bot.js';
import { createScheduler } from './scheduler/scheduler.js';
async function main() {
const config = loadConfig();
const logger = config.logger;
logger.info({ env: config.env, commit: config.sourceCommit }, 'Starting Store Scraper Bot');
await initMongoDB(config);
await initAdmin(); // Java parity: ensure singleton "common/admin" doc exists.
const appleScraper = createAppleScraper(config);
const googleScraper = createGoogleScraper(config);
const bot = createBot(config, appleScraper, googleScraper);
const scheduler = createScheduler(config, bot.sender, appleScraper, googleScraper);
scheduler.start();
logger.info('Starting Telegram bot polling');
const shutdown = async (signal) => {
logger.info({ signal }, 'Received shutdown signal, stopping bot...');
try {
scheduler.stop();
await bot.telegram.stopPolling();
await closeMongoDB();
} finally {
process.exit(0);
}
};
process.on('SIGINT', () => shutdown('SIGINT'));
process.on('SIGTERM', () => shutdown('SIGTERM'));
}
main().catch((err) => {
console.error('Fatal:', err);
process.exit(1);
});