const { graphql_endpoint } = require('./constants'); const { map_event, get_past_events_from_page, get_upcoming_events_from_page, get_page_info, get_edges, sleep, } = require('./logic'); const fetch = require('node-fetch'); const last = require('ramda/src/last'); const do_request = async (doc_id, variables) => { const params = new URLSearchParams(); params.append('doc_id', doc_id); params.append('variables', JSON.stringify(variables)); const fetch_options = { headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, body: params, method: 'POST', }; let res = null; try { res = await fetch(graphql_endpoint, fetch_options); } catch (e) { console.error(e); return null; } if (!res.ok) { return null; } try { res = await res.json(); } catch (e) { console.error(e); return null; } return res; }; const do_events_request = async (page_id, doc_id, cursor = null) => { let variables = { pageID: `${page_id}`, allowedStates: ['PUBLISHED', 'CANCELED'], cacheBreaker: 0, }; if (cursor !== null) { variables = { ...variables, count: 20, cursor }; } const res = await do_request(doc_id, variables); return res; }; const get_events = async (page_id, doc_id, get_events_from_page, events) => { let { edges, cursor } = events; let next = cursor !== null; while (next) { let page; page = await do_events_request(page_id, doc_id, cursor); const { has_next_page } = get_page_info(page); page = get_events_from_page(page); edges = [...edges, ...get_edges(page)]; next = has_next_page; cursor = last(edges).cursor; if (next) { await sleep(2); } } return edges; }; const get_upcoming_events = async (page_id, events) => { const doc_id = '3911675102281316'; const upcoming_events = await get_events( page_id, doc_id, get_upcoming_events_from_page, events, ); return upcoming_events; }; const get_past_events = async (page_id, events) => { const doc_id = '3972530646159673'; const past_events = await get_events( page_id, doc_id, get_past_events_from_page, events, ); return past_events; }; const get_reoccuring_events = () => {}; const init_scrape = async (page_id) => { const doc_id = '3636086023161977'; const res = await do_events_request(page_id, doc_id); const upcoming_events = get_upcoming_events_from_page(res); const past_events = get_past_events_from_page(res); const upcoming_edges = get_edges(upcoming_events); const past_edges = get_edges(past_events); const upcoming_has_next_page = get_page_info(upcoming_events).has_next_page; const past_has_next_page = get_page_info(past_events).has_next_page; return { upcoming_events: { edges: upcoming_edges, cursor: upcoming_has_next_page ? last(upcoming_edges).cursor : null, }, past_events: { cursor: past_has_next_page ? last(past_edges).cursor : null, edges: past_edges, }, }; }; const get_page_events = async (opt) => { const { page_id } = opt; let { upcoming_events, past_events } = await init_scrape(page_id); if (opt.get_past_events) { await sleep(2); past_events = await get_past_events(page_id, past_events); } else { past_events = []; } if (opt.get_upcoming_events) { await sleep(2); upcoming_events = await get_upcoming_events(page_id, upcoming_events); } else { upcoming_events = []; } const nodes = [...upcoming_events, ...past_events]; return nodes.map(map_event); }; module.exports = { get_page_events, };