import { CommentFetcher } from "../rdrama/services/CommentFetcher"; import { CommentParser } from "../rdrama/services/CommentParser"; import { Database } from 'sqlite'; //import { Comment } from "../rdrama/models/Comment"; class WorkflowOrchestrator { constructor( private commentFetcher: CommentFetcher, private commentParser: CommentParser, private db: Database //private redditNotifier: RedditNotifier // Handles notifications to Reddit users ) { } /** * Executes the defined workflow for processing comments. */ async executeWorkflow() { try { // Fetch comments from the source const comments = await this.commentFetcher.fetchComments(); console.log(`Fetched ${comments.length} comments`); // Extract and deduplicate usernames from comments const allUsernames = comments.flatMap(comment => this.commentParser.extractUsernames(comment)); const uniqueUsernames = [...new Set(allUsernames)]; console.log(`Extracted ${uniqueUsernames.length} unique usernames`); //// Query user information based on usernames //const userInfo = await this.databaseService.queryUsersInfo(uniqueUsernames); //console.log(`Queried information for ${userInfo.length} users`); // //// Filter users who should be notified //const usersToNotify = userInfo.filter(user => this.shouldNotifyUser(user)); //console.log(`Identified ${usersToNotify.length} users to notify`); // //// Notify users //for (const user of usersToNotify) { // await this.redditNotifier.notifyUser(user); // console.log(`Notified user: ${user.username}`); //} console.log('Workflow executed successfully.'); } catch (error) { console.error('An error occurred during workflow execution:', error); } } /** * Determines whether a user should be notified based on certain criteria. * * @param user - The user information object. * @returns A boolean indicating whether the user should be notified. */ //private shouldNotifyUser(user: UserInfo): boolean { // // Placeholder for the actual logic to determine if a user should be notified. // // This could involve checking the last notification time against the current time, // // user preferences, or other criteria defined in the business logic. // // // Example logic (to be replaced with actual implementation): // const lastNotifiedTime = new Date(user.lastNotified); // Assuming 'lastNotified' is a Date or string. // const notificationThreshold = 24 * 60 * 60 * 1000; // 24 hours in milliseconds. // return (Date.now() - lastNotifiedTime.getTime()) > notificationThreshold; //} } export default WorkflowOrchestrator;