Skip to content

Commit

Permalink
Merge pull request #16 from prototype99/category-topic
Browse files Browse the repository at this point in the history
Category topic
  • Loading branch information
Sean12697 authored Oct 22, 2021
2 parents 80710ed + 9781a69 commit 25ab8e0
Show file tree
Hide file tree
Showing 12 changed files with 421 additions and 41 deletions.
5 changes: 5 additions & 0 deletions .idea/.gitignore

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 12 additions & 0 deletions .idea/compiled-mcr-events.iml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/jsLibraryMappings.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions .idea/modules.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 12 additions & 0 deletions .idea/runConfigurations/build.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

67 changes: 62 additions & 5 deletions _data/sources/eventbrite.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ class eventbrite {
this.baseAPI = "https://www.eventbriteapi.com/v3/";
this.apiEvents = this.baseAPI + "organizers/";
this.apiVenue = this.baseAPI + "venues/";
this.apiCat = this.baseAPI + "categories/";
this.apiTopic = this.baseAPI + "subcategories/";
this.token = token; // Can be generated from the following link: https://www.eventbrite.com/platform/api-keys/
this.params = { headers: { 'Authorization': "Bearer " + this.token } };
this.urls = this.organizers.map(g => this.apiEvents + g.id + "/events/?status=live");
Expand All @@ -19,10 +21,42 @@ class eventbrite {
let description = "";
if (event.summary) description = event.summary;
if (event.description) if (event.description.text) description = event.description.text;
return new this.eventClass(event.name.text, event.url, event.venue, description, event.start.utc, event.end.utc, null, event.capacity, event.id_free, null, event.groupName, event.groupLink, "Eventbrite", false);
return new this.eventClass(
event.name.text,
event.url,
event.venue,
description,
event.start.utc,
event.end.utc,
null,
event.capacity,
event.id_free,
null,
event.groupName,
event.groupLink,
"Eventbrite",
false,
event.online_event,
! event.online_event,
event.cat,
event.topic
);
}
}

getVenues(flattened) {
return flattened.map(event => fetch(this.apiVenue + event.venue_id, this.params)).then(responses =>
Promise.all(responses.map(res => res.text())))
}
getCats(flattened) {
return flattened.map(event => fetch(this.apiCat + event.category_id, this.params)).then(responses =>
Promise.all(responses.map(res => res.text())))
}
getTopics(flattened) {
return flattened.map(event => fetch(this.apiTopic + event.subcategory_id, this.params)).then(responses =>
Promise.all(responses.map(res => res.text())))
}

async getData() {
return new Promise(resolve => {
this.getEvents().then(events => {
Expand Down Expand Up @@ -58,23 +92,46 @@ class eventbrite {
event.groupLink = this.organizers[i].url;
return event;
}));
let flatterned = [].concat(...json);
//the IDS can be referenced because the api returns the entire event object
let flattened = [].concat(...json);
// Adding Venue Info from ID
Promise.all(flatterned.map(event => fetch(this.apiVenue + event.venue_id, this.params))).then(responses =>
Promise.all(flattened.map(event => fetch(this.apiVenue + event.venue_id, this.params))).then(responses =>
Promise.all(responses.map(res => res.text()))
).then(venues => {
venues = venues.map(venue => JSON.parse(venue));
let data = flatterned.map((event, i) => {
let data = flattened.map((event, i) => {
event.venue = venues[i].address != undefined ? venues[i].address.localized_address_display : "N/A";
return event;
}) // Once all venues have been added, return
resolve(data);
});
// Adding category Info from ID
Promise.all(flattened.map(event => fetch(this.apiCat + event.category_id, this.params))).then(responses =>
Promise.all(responses.map(res => res.text()))
).then(cats => {
cats = cats.map(cat => JSON.parse(cat));
let data = flattened.map((event, i) => {
event.cat = cats[i].name;
return event;
}) // Once all categories have been added, return
resolve(data);
});
// Adding topic Info from ID
Promise.all(flattened.map(event => fetch(this.apiTopic + event.subcategory_id, this.params))).then(responses =>
Promise.all(responses.map(res => res.text()))
).then(topics => {
topics = topics.map(topic => JSON.parse(topic));
let data = flattened.map((event, i) => {
event.topic = topics[i].name;
return event;
}) // Once all topics have been added, return
resolve(data);
});
})
})
}
}

// new eventbrite().getEvents().then(console.log)

module.exports = eventbrite;
module.exports = eventbrite;
30 changes: 28 additions & 2 deletions _data/sources/googleCalendar.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,33 @@ class googleCalendar {
this.name = name || "N/A";
// Converters
this.eventClass = event;
this.event = (event) => new this.eventClass(event.summary, event.htmlLink, event.location, this.removeHTML(event.description || ""), event.start.dateTime, event.end.dateTime || event.start.dateTime, null, null, null, null, this.name, this.link, this.name, false);
this.event = (event) => new this.eventClass(
event.summary,
event.htmlLink,
event.location,
this.removeHTML(event.description || ""),
event.start.dateTime,
event.end.dateTime || event.start.dateTime,
null,
null,
null,
null,
this.name,
this.link,
this.name,
false,
this.chkOnline(event.location),
! this.chkOnline(event.location),
[],
[]
);
}

chkOnline(location) {
if(location == undefined) {
location = "";
}
return !!(location.includes("Online") || location.includes("online"));
}

async getData() {
Expand Down Expand Up @@ -41,4 +67,4 @@ class googleCalendar {
}
}

module.exports = googleCalendar;
module.exports = googleCalendar;
141 changes: 108 additions & 33 deletions _data/sources/meetup.js
Original file line number Diff line number Diff line change
@@ -1,46 +1,115 @@
const fetch = require("node-fetch"),
const {gql, request} = require("graphql-request"),
group = require("./templates/group"),
event = require("./templates/event");

class meetup {
constructor() {
constructor(token = process.env.MEETUP_TOKEN, requestTimeout = (process.env.REQUEST_TIMEOUT || 0)) {
this.requestTimeout = requestTimeout;
this.groups = require("./groupIds/meetup").filter((value, index, self) => self.indexOf(value) === index);
this.apiEvents = (group) => 'https://api.meetup.com/' + group + '/events';
this.queryEvent = gql`
query($group: String!) {
groupByUrlname(urlname: $group) {
unifiedEvents {
edges {
node {
title
shortUrl
venue {
name
address
postalCode
}
description
dateTime
endTime
going
maxTickets
price
currency
isOnline
}
}
}
name
link
topics {
name
}
}
}
`;
this.apiPastEvents = (group) => 'https://api.meetup.com/' + group + '/events?desc=true&status=past';
this.apiGroup = (group) => 'https://api.meetup.com/' + group;
this.header = {
method: 'GET',
dataType: 'jsonp'
};
this.queryGroup = gql`
query($group: String!) {
groupByUrlname(urlname: $group) {
urlname
name
description
link
logo {
id
baseUrl
}
memberships {
count
}
}
}
`;
// Converters
this.groupClass = group;
this.eventClass = event;
this.group = (group) => new this.groupClass(group.urlname, group.name, group.description || "", group.link, this.rtnGroupImg(group), group.members, null, null, "Meetup", false);
this.event = (event) => new this.eventClass(event.name, event.link, this.rtnEventVenue(event), this.removeHTML(event.description || ""), event.time, event.time + (event.duration || 7200000), event.yes_rsvp_count, event.rsvp_limit || Infinity, event.hasOwnProperty('fee') ? false : true, this.rtnEventFee(event), event.group.name, "https://www.meetup.com/" + event.group.urlname, "Meetup", false);
this.group = (group) => new this.groupClass(
group.groupByUrlname.urlname,
group.groupByUrlname.name,
group.groupByUrlname.description || "",
group.groupByUrlname.link, this.rtnGroupImg(group),
(group.groupByUrlname.memberships || {count: undefined}).count,
null,
null,
"Meetup",
false
);
this.event = (event) => {
return new this.eventClass(
event.title,
event.shortUrl,
this.rtnEventVenue(event),
this.removeHTML(event.description || ""),
event.dateTime,
event.endTime,
event.going,
event.maxTickets || Infinity,
event.price == null,
this.rtnEventFee(event),
event.name,
event.link,
"Meetup",
false,
event.isOnline,
! event.isOnline,
[],
event.topics
);
};
}

rtnGroupImg(group) {
let thumb = './img/blank_meetup.png';
if (group.hasOwnProperty('group_photo')) {
thumb = group.group_photo.photo_link;
} else {
if (group.hasOwnProperty('organizer')) {
if (group.organizer.hasOwnProperty('photo')) {
thumb = group.organizer.photo.photo_link;
}
}
if (group.groupByUrlname.hasOwnProperty('logo')) {
thumb = group.groupByUrlname.logo.baseUrl + group.groupByUrlname.logo.id + '/1000x1000.webp';
}
return thumb;
}

rtnEventFee(event) {
return event.hasOwnProperty('fee') ? ((event.fee.currency == "GBP") ? "£" : event.fee.currency) + (Math.round(event.fee.amount * 100) / 100) : null;
return event.price ? ((event.currency == "GBP") ? "£" : event.currency) + (Math.round(event.price * 100) / 100) : null;
}

rtnEventVenue(event) {
let venueName = (event.hasOwnProperty('venue')) ? event.venue.name : "N/A";
let venueAddress = (event.hasOwnProperty('venue')) ? event.venue.address_1 : "";
let venuePostcode = (event.hasOwnProperty('venue')) ? event.venue.city : "";
let venueName = (event.venue != null) ? event.venue.name : "N/A";
let venueAddress = (event.venue != null) ? event.venue.address : "";
let venuePostcode = (event.venue != null) ? event.venue.postalCode : "";
let venue = (venueName == "N/A") ? "N/A" : venueName + ' - ' + venueAddress + ' (' + venuePostcode + ')';
return venue.replace("undefined", "").replace("undefined", "").replace(' - ()', "");
}
Expand All @@ -57,28 +126,34 @@ class meetup {

async getGroups() {
return new Promise(resolve => {
Promise.all(this.groups.map((groupId, i) => new Promise(resolve => setTimeout(() => resolve(groupId), i*400)).then(groupId => {
console.log('Fetching group details for: ', groupId);
return fetch(this.apiGroup(groupId), this.header);
Promise.all(this.groups.map((groupId, i) => new Promise(resolve => setTimeout(() => resolve(groupId), i*this.requestTimeout)).then(async groupId => {
console.log('Fetching group details for: ', groupId);
return await request('https://api.meetup.com/gql', this.queryGroup, {group: groupId,});
}))).then(responses =>
Promise.all(responses.map(res => res.text()))
Promise.all(responses)
).then(texts => {
let json = texts.map(t => JSON.parse(t)).filter(e => !e.hasOwnProperty("errors")).map(this.group);
let json = texts.filter(e => e.groupByUrlname != null).map(this.group);
resolve(json);
})
})
}

async getEvents() {
return new Promise(resolve => {
Promise.all(this.groups.map((groupId, i) => new Promise(resolve => setTimeout(() => resolve(groupId), i*400)).then(groupId => {
console.log('Fetching events for: ', groupId);
return fetch(this.apiEvents(groupId), this.header);
Promise.all(this.groups.map((groupId, i) => new Promise(resolve => setTimeout(() => resolve(groupId), i*this.requestTimeout)).then(async groupId => {
console.log('Fetching events for: ', groupId);
return await request('https://api.meetup.com/gql', this.queryEvent, {group: groupId,});
}))).then(responses =>
Promise.all(responses.map(res => res.text()))
Promise.all(responses)
).then(texts => {
let json = texts.map(t => JSON.parse(t));
let converted = [].concat(...json).filter(e => !e.hasOwnProperty("errors")).map(this.event);
let converted = [].concat(...texts.filter(e => e.groupByUrlname != null).map(group => {
return group.groupByUrlname.unifiedEvents.edges.map(event => {
event.node.name = group.groupByUrlname.name;
event.node.link = group.groupByUrlname.link;
event.node.topics = (group.groupByUrlname.topics || []).map(e => e.name);
return event.node;
});
})).map(this.event);
resolve(converted);
})
})
Expand Down
Loading

0 comments on commit 25ab8e0

Please sign in to comment.