import { TEventType } from "./component/event/event.types"; import { db } from "./sql"; import { Event, type TEventEntityNew, type TGetEventsOptions } from "./component/event/events"; import { createPlaceholders, getTsNow, pad_l2 } from "./util"; import { sendNotification } from "./sendNotification"; const argv = require('minimist')(process.argv.slice(2)); console.log("App started"); console.dir({argv}) async function main ( ) { console.log("Excecuting main()"); const TODAY = getTsNow(); console.dir(TODAY); const events_currentMonth = await Event.fetch_events( TODAY.year, TODAY.month , -120 ); console.log("events_currentMonth.length:" + events_currentMonth.length ); const events_nextMonth = await Event.fetch_events( TODAY.year, TODAY.month + 1 , -120 ); console.log("events_nextMonth.length:" + events_nextMonth.length ); const events = [...events_currentMonth, ...events_nextMonth]; console.log("events.length:" + events.length ); // const TS_TODAY = new Date(); // Write to JSON File Section START // const data = JSON.stringify(events, null, 2); // const TS = `${TS_TODAY.getFullYear()}-${TS_TODAY.getMonth() + 1}-${TS_TODAY.getDate()}_${TS_TODAY.getHours()}-${TS_TODAY.getMinutes()}-${TS_TODAY.getSeconds()}`; // await Bun.write(path.join(import.meta.dir, "output", `output_${TS}.json`), data ); // Write to JSON File Section END const allEventUids = events.map( event => { return event.uid; }); console.dir(allEventUids ); const placeholders = createPlaceholders( allEventUids ); const getAllRelevantEventsQuery = db.query( `SELECT * FROM events WHERE uid IN (${placeholders}); ` ).as(Event ); const AllRelevantEvents = getAllRelevantEventsQuery.all(...allEventUids); console.log("AllRelevantEvents.length:" + AllRelevantEvents.length ); const eventsToInsert: TEventEntityNew[] = []; for ( const ev of events ) { console.log("loop ev: " + [ ev.uid, ev.title, ev.date_at ].join( ", " ) ); const found = AllRelevantEvents.find(event => event.uid === ev.uid); if ( found ) { console.log("loop ev found: " + [ found.uid, found.title, found.date_at ].join( ", " ) ); if ( found.title != ev.title || found.description != ev.description || found.date_at != ev.date_at || found.time_start != ev.time_start || found.time_end != ev.time_end || found.posted_by != ev.posted_by || found.location != ev.location || found.event_type != ev.event_type || found.timezone != ev.timezone || found.link != ev.link ) { console.log("loop ev different (changed): " + [ ev.uid, ev.title, ev.date_at ].join( ", " ) ); const newEventToInsert: TEventEntityNew = {... ev, notification: "changed"}; eventsToInsert.push( newEventToInsert ); } } else { console.log("loop ev added (new): " + [ ev.uid, ev.title, ev.date_at ].join( ", " ) ); const newEventToInsert: TEventEntityNew = {... ev, notification: "new"}; eventsToInsert.push( newEventToInsert ); } } console.dir(eventsToInsert) Event.insert( eventsToInsert, db); const where: TGetEventsOptions = {} where.notification = ["new", "changed"] if ( argv.today ) { where.date = { year: TODAY.year, month: TODAY.month, day: TODAY.day } } const list_of_events = Event.get_events( where, db ); console.dir({ list_of_events, where }); for ( const ev of list_of_events ) { console.log("loop list_of_events - ev: " + [ev.uid, ev.title, ev.date_at, "notification:" + ev.notification].join( ", " ) ); const body = [ `Title: ${ev.title}`, `Location: ${ev.location}`, `Type: ${ TEventType[ ev.event_type ] }`, `Date: ${ev.date_at}`, `Time: ${ev.time_start}`, `By: ${ev.posted_by}`, `Link: ${ev.link}`, ].join("\n"); console.log("loop list_of_events - ev 'body': " + body ); const notification_prefix = ( (event: Event) => { switch( event.notification) { case "new": return "New"; case "changed": return "Changed"; case "deleted": return "Deleted"; default: return null; } } ) ( ev ); const today_prefix = ( (ev: Event) => { const now = getTsNow(); const [year, month, day] = ev.date_at.split("-") if ( year == String(now.year) && month == pad_l2( String(now.month) ) && day == pad_l2( String( now.day ) ) ) { return true; } return false; })( ev ); const title = `${today_prefix ? "TODAY " : ""}${notification_prefix ? notification_prefix + ": " : ""} ${ev.title} (${ TEventType[ ev.event_type ] })`; console.log("loop list_of_events - ev 'title': " + title ); await sendNotification( title, body, ev.link ? ev.link : null); ev.set_notification("done", db); } }; main();