From 02ed2033095e5f262850182f2734660c2915ab0e Mon Sep 17 00:00:00 2001 From: derberg Date: Thu, 31 Mar 2022 11:13:00 +0200 Subject: [PATCH 1/8] feat: add asyncapi events scheduling automation --- .github/workflows/cancel-event.yml | 33 + .github/workflows/create-event-ad-hoc.yml | 39 + .../create-event-community-meeting.yml | 33 + .../create-event-helpers/calendar/index.js | 155 ++ .../issues_templates/ad-hoc.md | 75 + .../issues_templates/community.md | 75 + .../lets-talk-about-contrib.md | 62 + .../issues_templates/spec-3-0.md | 74 + .../issues_templates/thinking-out-loud.md | 66 + .../mailchimp/htmlContent.js | 512 +++++++ .../create-event-helpers/mailchimp/index.js | 71 + .../create-event-helpers/package-lock.json | 1345 +++++++++++++++++ .../create-event-helpers/package.json | 12 + .../create-event-helpers/zoom/index.js | 90 ++ .../create-event-issue-community-meeting.yml | 32 - .../create-event-issue-lets-talk-about.yml | 36 - .../workflows/create-event-issue-spec-3-0.yml | 32 - .../create-event-lets-talk-about.yml | 38 + .github/workflows/create-event-spec-3-0.yml | 35 + .../create-event-thinking-out-loud.yml | 41 + .../create-event-workflow-reusable.yml | 130 ++ .../workflows/event_issue_templates/index.js | 28 - .../meetings/community.js | 28 - .../meetings/lets-talk-about-contrib.js | 18 - .../meetings/spec-3-0.js | 30 - .../event_issue_templates/utils/README.md | 1 - .../event_issue_templates/utils/date.js | 19 - .../event_issue_templates/utils/dayjs.min.js | 1 - .../event_issue_templates/utils/utc.js | 1 - .github/workflows/send-events-newsletter.yml | 34 + .gitignore | 1 + 31 files changed, 2921 insertions(+), 226 deletions(-) create mode 100644 .github/workflows/cancel-event.yml create mode 100644 .github/workflows/create-event-ad-hoc.yml create mode 100644 .github/workflows/create-event-community-meeting.yml create mode 100644 .github/workflows/create-event-helpers/calendar/index.js create mode 100644 .github/workflows/create-event-helpers/issues_templates/ad-hoc.md create mode 100644 .github/workflows/create-event-helpers/issues_templates/community.md create mode 100644 .github/workflows/create-event-helpers/issues_templates/lets-talk-about-contrib.md create mode 100644 .github/workflows/create-event-helpers/issues_templates/spec-3-0.md create mode 100644 .github/workflows/create-event-helpers/issues_templates/thinking-out-loud.md create mode 100644 .github/workflows/create-event-helpers/mailchimp/htmlContent.js create mode 100644 .github/workflows/create-event-helpers/mailchimp/index.js create mode 100644 .github/workflows/create-event-helpers/package-lock.json create mode 100644 .github/workflows/create-event-helpers/package.json create mode 100644 .github/workflows/create-event-helpers/zoom/index.js delete mode 100644 .github/workflows/create-event-issue-community-meeting.yml delete mode 100644 .github/workflows/create-event-issue-lets-talk-about.yml delete mode 100644 .github/workflows/create-event-issue-spec-3-0.yml create mode 100644 .github/workflows/create-event-lets-talk-about.yml create mode 100644 .github/workflows/create-event-spec-3-0.yml create mode 100644 .github/workflows/create-event-thinking-out-loud.yml create mode 100644 .github/workflows/create-event-workflow-reusable.yml delete mode 100644 .github/workflows/event_issue_templates/index.js delete mode 100644 .github/workflows/event_issue_templates/meetings/community.js delete mode 100644 .github/workflows/event_issue_templates/meetings/lets-talk-about-contrib.js delete mode 100644 .github/workflows/event_issue_templates/meetings/spec-3-0.js delete mode 100644 .github/workflows/event_issue_templates/utils/README.md delete mode 100644 .github/workflows/event_issue_templates/utils/date.js delete mode 100644 .github/workflows/event_issue_templates/utils/dayjs.min.js delete mode 100644 .github/workflows/event_issue_templates/utils/utc.js create mode 100644 .github/workflows/send-events-newsletter.yml create mode 100644 .gitignore diff --git a/.github/workflows/cancel-event.yml b/.github/workflows/cancel-event.yml new file mode 100644 index 000000000..f7270584f --- /dev/null +++ b/.github/workflows/cancel-event.yml @@ -0,0 +1,33 @@ +name: Cancel event when issue was closed before it took place + +on: + issues: + types: + - closed + +jobs: + + cancel_event: + env: + CALENDAR_ID: ${{ secrets.CALENDAR_ID }} + CALENDAR_SERVICE_ACCOUNT: ${{ secrets.CALENDAR_SERVICE_ACCOUNT }} + name: Remove event from calendar + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v2 + - name: Setup Node.js + uses: actions/setup-node@v2 + with: + node-version: 16 + cache: 'npm' + cache-dependency-path: '**/package-lock.json' + - name: Install deps + run: npm install + working-directory: ./.github/workflows/create-event-helpers + - name: Remove Google Calendar entry + uses: actions/github-script@v4 + with: + script: | + const { deleteEvent } = require('./.github/workflows/create-event-helpers/calendar/index.js'); + deleteEvent('${{ github.event.issue.number }}', '${{ github.event.issue.closed_at }}'); \ No newline at end of file diff --git a/.github/workflows/create-event-ad-hoc.yml b/.github/workflows/create-event-ad-hoc.yml new file mode 100644 index 000000000..87c8cbccd --- /dev/null +++ b/.github/workflows/create-event-ad-hoc.yml @@ -0,0 +1,39 @@ +name: Schedule Ad Hoc Meeting + +on: + workflow_dispatch: + inputs: + time: + description: 'Info about meeting hour in UTC time zone, like: 08 or 16. No PM or AM versions.' + required: true + date: + description: 'Date in a form like: 2022-04-05 where 04 is a month and 05 is a day number.' + required: true + name: + description: 'Provide short title for the meeting.' + required: true + desc: + description: 'Provide description that explains the purpose of the meeting' + required: true + +jobs: + + setup-community-meeting: + uses: ./.github/workflows/create-event-workflow-reusable.yml + with: + time: ${{ github.event.inputs.time }} + date: ${{ github.event.inputs.date }} + meeting_name: ${{ github.event.inputs.name }} + meeting_desc: ${{ github.event.inputs.desc }} + host: lpgornicki@gmail.com + alternative_host: fmvilas@gmail.com + issue_template_path: .github/workflows/create-event-helpers/issues_templates/ad-hoc.md + create_zoom: true + secrets: + GH_TOKEN: ${{ secrets.GH_TOKEN }} + ZOOM_API_KEY: ${{ secrets.ZOOM_API_KEY }} + ZOOM_API_SECRET: ${{ secrets.ZOOM_API_SECRET }} + STREAM_URL: ${{ secrets.STREAM_URL }} + STREAM_KEY: ${{ secrets.STREAM_KEY }} + CALENDAR_ID: ${{ secrets.CALENDAR_ID }} + CALENDAR_SERVICE_ACCOUNT: ${{ secrets.CALENDAR_SERVICE_ACCOUNT }} \ No newline at end of file diff --git a/.github/workflows/create-event-community-meeting.yml b/.github/workflows/create-event-community-meeting.yml new file mode 100644 index 000000000..afdc0336c --- /dev/null +++ b/.github/workflows/create-event-community-meeting.yml @@ -0,0 +1,33 @@ +name: Schedule Community Meeting + +on: + workflow_dispatch: + inputs: + time: + description: 'Info about meeting hour in UTC time zone, like: 08 or 16. No PM or AM versions.' + required: true + date: + description: 'Date in a form like: 2022-04-05 where 04 is a month and 05 is a day number.' + required: true + +jobs: + + setup-community-meeting: + uses: ./.github/workflows/create-event-workflow-reusable.yml + with: + time: ${{ github.event.inputs.time }} + date: ${{ github.event.inputs.date }} + meeting_name: Community Meeting + meeting_desc: This is a community meeting to regularly talk in open about important topics around AsyncAPI Initiative. + host: lpgornicki@gmail.com + alternative_host: fmvilas@gmail.com + issue_template_path: .github/workflows/create-event-helpers/issues_templates/community.md + create_zoom: true + secrets: + GH_TOKEN: ${{ secrets.GH_TOKEN }} + ZOOM_API_KEY: ${{ secrets.ZOOM_API_KEY }} + ZOOM_API_SECRET: ${{ secrets.ZOOM_API_SECRET }} + STREAM_URL: ${{ secrets.STREAM_URL }} + STREAM_KEY: ${{ secrets.STREAM_KEY }} + CALENDAR_ID: ${{ secrets.CALENDAR_ID }} + CALENDAR_SERVICE_ACCOUNT: ${{ secrets.CALENDAR_SERVICE_ACCOUNT }} \ No newline at end of file diff --git a/.github/workflows/create-event-helpers/calendar/index.js b/.github/workflows/create-event-helpers/calendar/index.js new file mode 100644 index 000000000..1132cd85c --- /dev/null +++ b/.github/workflows/create-event-helpers/calendar/index.js @@ -0,0 +1,155 @@ +const { google } = require('googleapis') +const core = require('@actions/core'); + +module.exports = { addEvent, deleteEvent, listEvents } + +const auth = new google.auth.GoogleAuth({ + scopes: ['https://www.googleapis.com/auth/calendar'], + credentials: JSON.parse(process.env.CALENDAR_SERVICE_ACCOUNT) +}); + +const calendar = google.calendar({ version: 'v3', auth }); + +/** + * Adds new single-occuring event + * All events are being linked to their GitHub issues + * @param {String} zoomUrl Zoom url of the meeting + * @param {String} startDate ex. 2022-04-05 + * @param {String} startTime ex. 08 or 16 + * @param {Number} issueNumber GitHub issue number of the event, to find event later + */ +async function addEvent(zoomUrl, startDate, startTime, issueNumber) { + + const communityIssuesUrl = 'https://github.com/asyncapi/community/issues/'; + const title = process.env.MEETING_NAME; + const suffix = process.env.MEETING_NAME_SUFFIX; + const description = process.env.MEETING_DESC; + const guest = process.env.GUEST; + const summary = suffix ? `${title} ${suffix}` : title; + + try { + + //helper to create end time which is always 1h later + const getEndTime = (startTime) => { + const time = Number(startTime); + if (time < 10) return '0' + (time + 1) + + return (time + 1) + '' + } + + //helper to build meeting description + //there is a use case that meeting has no connection over zoom available as it is pure live stream + const getDescription = (description, communityIssuesUrl, issueNumber, zoomUrl, guest) => { + + const zoomDetails = zoomUrl && `Zoom: Meeting Link`; + const agendaDetails = `Agenda and more options to join the meeting: GitHub Issue Link.`; + const guestDetails = guest ? `Special guest: ${ guest }` : ''; + return `${ description }

${ zoomDetails }

${ agendaDetails }

${ guestDetails }` + }; + + await calendar.events.insert({ + calendarId: process.env.CALENDAR_ID, + requestBody: { + summary, + description: getDescription(description, communityIssuesUrl, issueNumber, zoomUrl, guest), + start: { + dateTime: `${ startDate }T${ startTime }:00:00Z` + }, + end: { + dateTime: `${ startDate }T${ getEndTime(startTime) }:00:00Z` + }, + location: zoomUrl, + extendedProperties: { + private: { + 'ISSUE_ID': `${issueNumber}` + } + } + } + }) + + core.info('Event created') + } catch (error) { + core.setFailed(`Faild creating event in Google Calendar: ${ JSON.stringify(error) }`) + } +} + +/** + * Deletes a single-occuring event from issue number + * @param {Number} issueNumber GitHub issue number of the meeting to delete + * @param {Number} closeDate Date when issue was closed + */ +async function deleteEvent(issueNumber, closeDate) { + let events + + try { + events = (await calendar.events.list({ + calendarId: process.env.CALENDAR_ID, + privateExtendedProperty: `ISSUE_ID=${issueNumber}` + })).data; + } catch (error) { + return core.setFailed(`Failed to fetch events for issue numer ${ issueNumber }: ${ JSON.stringify(error) }`) + } + + const eventsItems = events.items; + + if (eventsItems.length > 0) { + + const meetingId = eventsItems[0].id; + const eventStartDate = new Date(eventsItems[0].start.dateTime); + const issueCloseDate = new Date(closeDate); + + try { + //in case of issue was closed after the event, we do not remove it from calendar + if (eventStartDate.getTime() < issueCloseDate.getTime()) return core.info('Event not removed as related issue was closed after the event took place.'); + + await calendar.events.delete({ + calendarId: process.env.CALENDAR_ID, + eventId: meetingId + }) + + core.info('Event deleted from calendar') + } catch (error) { + core.setFailed(`Failed to delete event for issue number ${ issueNumber }: ${ JSON.stringify(error) }`) + } + } else { + core.info('Event not found in calendar') + } +} + +/** + * Lists all events including single-occuring and recurring + */ +async function listEvents() { + + let eventsItems; + + try { + //this runs always on thursday before midnight so folks can read email on friday + const currentTime = new Date(Date.now()).toISOString(); + //we check moday + const timeIn3Days = new Date(Date.parse(currentTime) + 3 * 24 * 60 * 60 * 1000).toISOString(); + //till friday + const timeIn8Days = new Date(Date.parse(currentTime) + 8 * 24 * 60 * 60 * 1000).toISOString(); + + const eventsList = await calendar.events.list({ + calendarId: process.env.CALENDAR_ID, + timeMax: timeIn8Days, + timeMin: timeIn3Days + }) + + eventsItems = eventsList.data.items.map((e) => { + return { + title: e.summary, + issueId: e.extendedProperties.private.ISSUE_ID, + date: new Date(e.start.dateTime).toUTCString() + } + }) + + core.info(`List of all events: ${ JSON.stringify(eventsList.data, null, 4) }`) + } catch (error) { + return core.setFailed(`Faild fetching events from Google Calendar API: ${ JSON.stringify(error) }`) + } + + return eventsItems; + +} \ No newline at end of file diff --git a/.github/workflows/create-event-helpers/issues_templates/ad-hoc.md b/.github/workflows/create-event-helpers/issues_templates/ad-hoc.md new file mode 100644 index 000000000..68def2d35 --- /dev/null +++ b/.github/workflows/create-event-helpers/issues_templates/ad-hoc.md @@ -0,0 +1,75 @@ +--- +title: "{{ env.MEETING_NAME }}, {{ env.FULL_DATE | date('H:mm [UTC] dddd MMMM Do YYYY') }}" +--- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Meeting InfoDetails
Purpose{{ env.MEETING_DESC }}
Time{{ env.FULL_DATE | date('H') }}:00 UTC | Translate to your time zone with time zone converter.
Meeting PlaceLink
ZoomJoin live.
YouTubeWatch live and interact through live chat.
TwitchWatch live.
TwitterWatch live.
LinkedInWatch live.
More InfoDetails
Meeting RecordingsYouTube Playlist.
AsyncAPI Initiative CalendarPublic URL.
iCal FileAdd to your calendar.
NewsletterSubscribe to get weekly updates on upcoming meetings.
+ + +## Agenda + +> Don't wait for the meeting to discuss topics that already have issues. Feel free to comment on them earlier. + +1. Q&A +1. _Place for your topic_ +1. Q&A + +## Notes + +tbd diff --git a/.github/workflows/create-event-helpers/issues_templates/community.md b/.github/workflows/create-event-helpers/issues_templates/community.md new file mode 100644 index 000000000..a362c3edb --- /dev/null +++ b/.github/workflows/create-event-helpers/issues_templates/community.md @@ -0,0 +1,75 @@ +--- +title: "{{ env.MEETING_NAME }}, {{ env.FULL_DATE | date('H:mm [UTC] dddd MMMM Do YYYY') }}" +--- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Meeting InfoDetails
Purpose{{ env.MEETING_DESC }}
Time{{ env.FULL_DATE | date('H') }}:00 UTC | Translate to your time zone with time zone converter.
Meeting PlaceLink
ZoomJoin live.
YouTubeWatch live and interact through live chat.
TwitchWatch live.
TwitterWatch live.
LinkedInWatch live.
More InfoDetails
Meeting RecordingsYouTube Playlist.
AsyncAPI Initiative CalendarPublic URL.
iCal FileAdd to your calendar.
NewsletterSubscribe to get weekly updates on upcoming meetings.
+ + +## Agenda + +> Don't wait for the meeting to discuss topics that already have issues. Feel free to comment on them earlier. + +1. Q&A +1. _Place for your topic_ +1. Q&A + +## Notes + +tbd \ No newline at end of file diff --git a/.github/workflows/create-event-helpers/issues_templates/lets-talk-about-contrib.md b/.github/workflows/create-event-helpers/issues_templates/lets-talk-about-contrib.md new file mode 100644 index 000000000..2b706efaf --- /dev/null +++ b/.github/workflows/create-event-helpers/issues_templates/lets-talk-about-contrib.md @@ -0,0 +1,62 @@ +--- +title: "{{ env.MEETING_NAME }}, {{ env.FULL_DATE | date('H:mm [UTC] dddd MMMM Do YYYY') }} {{ env.MEETING_NAME_SUFFIX }}" +--- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Meeting InfoDetails
Purpose{{ env.MEETING_DESC }}
Time{{ env.FULL_DATE | date('H') }}:00 UTC | Translate to your time zone with time zone converter.
Meeting PlaceLink
ZoomZoom link is not available. This is a live stream event. Watch and interact through one of below mentioned platforms.
YouTubeWatch live and interact through live chat.
TwitchWatch live.
TwitterWatch live.
LinkedInWatch live.
More InfoDetails
Meeting RecordingsYouTube Playlist.
AsyncAPI Initiative CalendarPublic URL.
iCal FileAdd to your calendar.
NewsletterSubscribe to get weekly updates on upcoming meetings.
\ No newline at end of file diff --git a/.github/workflows/create-event-helpers/issues_templates/spec-3-0.md b/.github/workflows/create-event-helpers/issues_templates/spec-3-0.md new file mode 100644 index 000000000..d94fed671 --- /dev/null +++ b/.github/workflows/create-event-helpers/issues_templates/spec-3-0.md @@ -0,0 +1,74 @@ +--- +title: "{{ env.MEETING_NAME }}, {{ env.FULL_DATE | date('H:mm [UTC] dddd MMMM Do YYYY') }}" +--- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Meeting InfoDetails
Purpose{{ env.MEETING_DESC }}
Time{{ env.FULL_DATE | date('H') }}:00 UTC | Translate to your time zone with time zone converter.
Meeting PlaceLink
ZoomZoom link is not available. This is a live stream event. Watch and interact through one of below mentioned platforms.
YouTubeWatch live and interact through live chat.
TwitchWatch live.
TwitterWatch live.
LinkedInWatch live.
More InfoDetails
Meeting RecordingsYouTube Playlist.
AsyncAPI Initiative CalendarPublic URL.
iCal FileAdd to your calendar.
NewsletterSubscribe to get weekly updates on upcoming meetings.
+ +## Agenda + +> Don't wait for the meeting to discuss topics that already have issues. Feel free to comment on them earlier. + +1. Q&A +1. _Place for your topic_ +1. Q&A + +## Notes + +tbd \ No newline at end of file diff --git a/.github/workflows/create-event-helpers/issues_templates/thinking-out-loud.md b/.github/workflows/create-event-helpers/issues_templates/thinking-out-loud.md new file mode 100644 index 000000000..bb5a77b6e --- /dev/null +++ b/.github/workflows/create-event-helpers/issues_templates/thinking-out-loud.md @@ -0,0 +1,66 @@ +--- +title: "{{ env.MEETING_NAME }}, {{ env.FULL_DATE | date('H:mm [UTC] dddd MMMM Do YYYY') }} {{ env.MEETING_NAME_SUFFIX }}" +--- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Meeting InfoDetails
Theme{{ env.MEETING_DESC }}
Guest{{ env.GUEST }}
Time{{ env.FULL_DATE | date('H') }}:00 UTC | Translate to your time zone with time zone converter.
Meeting PlaceLink
ZoomZoom link is not available. This is a live stream event. Watch and interact through one of below mentioned platforms.
YouTubeWatch live and interact through live chat.
TwitchWatch live.
TwitterWatch live.
LinkedInWatch live.
More InfoDetails
Meeting RecordingsYouTube Playlist.
AsyncAPI Initiative CalendarPublic URL.
iCal FileAdd to your calendar.
NewsletterSubscribe to get weekly updates on upcoming meetings.
\ No newline at end of file diff --git a/.github/workflows/create-event-helpers/mailchimp/htmlContent.js b/.github/workflows/create-event-helpers/mailchimp/htmlContent.js new file mode 100644 index 000000000..b0c60b967 --- /dev/null +++ b/.github/workflows/create-event-helpers/mailchimp/htmlContent.js @@ -0,0 +1,512 @@ +module.exports = (list) => { + + const meetingsList = (events) => { + + const communityIssuesUrl = 'https://github.com/asyncapi/community/issues/'; + let bulletPoints = '' + + for (const item of events) { + bulletPoints += `
  • ${ item.title } on ${ item.date}.
    See more details on meeting agenda and connection details in this GitHub issue
  • ` + } + + return bulletPoints; + } + + return ` + + + + + + + + *|MC:SUBJECT|* + + + + + + +
    + + + + +
    + + + + + + + + + + + + +
    + + + + + +
    + + + + + + + + +
    + + Hey *|FNAME|*,
    +
    +I'm excited to share with you what meetings have been planned at AsyncAPI for to coming week: +
    + + + +
    + + + + + +
    + +
      + ${ meetingsList(list) } +
    + +
    + + + + + + + +
    + + + + + + + + +
    + + Best,
    +Fran Mendez
    +AsyncAPI Initiative +
    + + + +
    + + + + + +
    + + + + + + + + +
    + + Want to change how you receive these emails?
    +You can update your preferences or unsubscribe from this list.
    +  +
    + + + +
    + + +
    +
    + + +` +} \ No newline at end of file diff --git a/.github/workflows/create-event-helpers/mailchimp/index.js b/.github/workflows/create-event-helpers/mailchimp/index.js new file mode 100644 index 000000000..b183c3859 --- /dev/null +++ b/.github/workflows/create-event-helpers/mailchimp/index.js @@ -0,0 +1,71 @@ +const mailchimp = require('@mailchimp/mailchimp_marketing'); +const core = require('@actions/core'); +const htmlContent = require('./htmlContent.js'); +const { listEvents } = require('../calendar/index.js'); + +/** + * Listing events from Google Calendar and sending them to Newsletter subscribers. + * This code is not triggered separately in workflow, in 2 separate steps a GitHub actions have issues when doing code.setOutput with complex JSON in String. + */ +module.exports = async () => { + + const events = await listEvents(); + if (!events.length) return core.info('No events scheduled for next week so no email will be sent'); + core.info(`Formatted list of events: ${ JSON.stringify(events, null, 4) }`) + + let newCampaign; + + mailchimp.setConfig({ + apiKey: process.env.MAILCHIMP_API_KEY, + server: 'us12' + }); + + /* + * First we create campaign + */ + try { + newCampaign = await mailchimp.campaigns.create({ + type: 'regular', + recipients: { + list_id: '6e3e437abe' + }, + settings: { + subject_line: 'AsyncAPI meetings scheduled for next week.', + preview_text: 'Check out what AsyncAPI meetings are scheduled for next week and learn how to join them.', + title: `Meetings info - ${ new Date(Date.now()).toUTCString()}`, + from_name: 'Fran Mendez', + reply_to: 'info@asyncapi.io', + } + }); + } catch (error) { + return core.setFailed(`Failed creating campaign: ${ JSON.stringify(error) }`); + } + + /* + * Content of the email is added separately after campaign creation + */ + try { + await mailchimp.campaigns.setContent(newCampaign.id, { html: htmlContent(events) }); + } catch (error) { + return core.setFailed(`Failed adding content to campaign: ${ JSON.stringify(error) }`); + } + + /* + * We schedule an email, we do not send it at midnight immediately but use schedule with `timewarp` to basically send email at the same time for anyone no matter what time zone they live in + */ + try { + const scheduleDate = new Date(Date.now()); + scheduleDate.setUTCHours(11); + scheduleDate.setUTCMinutes(00); + + + await mailchimp.campaigns.schedule(newCampaign.id, { + schedule_time: scheduleDate.toISOString(), + timewarp: true + }); + } catch (error) { + return core.setFailed(`Failed scheduling email: ${ JSON.stringify(error) }`); + } + + core.info(`New email campaign created`); +} \ No newline at end of file diff --git a/.github/workflows/create-event-helpers/package-lock.json b/.github/workflows/create-event-helpers/package-lock.json new file mode 100644 index 000000000..8685660ca --- /dev/null +++ b/.github/workflows/create-event-helpers/package-lock.json @@ -0,0 +1,1345 @@ +{ + "name": "events-creation-automation", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "events-creation-automation", + "license": "Apache 2.0", + "dependencies": { + "@actions/core": "^1.6.0", + "@mailchimp/mailchimp_marketing": "^3.0.74", + "googleapis": "^99.0.0", + "jsonwebtoken": "^8.5.1", + "node-fetch": "2.6.1" + } + }, + "node_modules/@actions/core": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.6.0.tgz", + "integrity": "sha512-NB1UAZomZlCV/LmJqkLhNTqtKfFXJZAUPcfl/zqG7EfsQdeUJtaWO98SGbuQ3pydJ3fHl2CvI/51OKYlCYYcaw==", + "dependencies": { + "@actions/http-client": "^1.0.11" + } + }, + "node_modules/@actions/http-client": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-1.0.11.tgz", + "integrity": "sha512-VRYHGQV1rqnROJqdMvGUbY/Kn8vriQe/F9HR2AlYHzmKuM/p3kjNuXhmdBfcVgsvRWTz5C5XW5xvndZrVBuAYg==", + "dependencies": { + "tunnel": "0.0.6" + } + }, + "node_modules/@mailchimp/mailchimp_marketing": { + "version": "3.0.74", + "resolved": "https://registry.npmjs.org/@mailchimp/mailchimp_marketing/-/mailchimp_marketing-3.0.74.tgz", + "integrity": "sha512-039iu4GRr7wpXqweBLuS05wvOBtPxSa31cjxgftBYSt7031f0sHEi8Up2DicfbSuQK0AynPDeVyuxrb31Lx+yQ==", + "dependencies": { + "dotenv": "^8.2.0", + "superagent": "3.8.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "engines": { + "node": ">=8" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bignumber.js": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz", + "integrity": "sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "node_modules/cookiejar": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz", + "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dotenv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", + "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", + "engines": { + "node": ">=10" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/fast-text-encoding": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz", + "integrity": "sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig==" + }, + "node_modules/form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/formidable": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.6.tgz", + "integrity": "sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==", + "deprecated": "Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau", + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/gaxios": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.3.2.tgz", + "integrity": "sha512-T+ap6GM6UZ0c4E6yb1y/hy2UB6hTrqhglp3XfmU9qbLCGRYhLVV5aRPpC4EmoG8N8zOnkYCgoBz+ScvGAARY6Q==", + "dependencies": { + "abort-controller": "^3.0.0", + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gcp-metadata": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.3.1.tgz", + "integrity": "sha512-x850LS5N7V1F3UcV7PoupzGsyD6iVwTVvsh3tbXfkctZnBnjW5yu5z1/3k3SehF7TyoTIe78rJs02GMMy+LF+A==", + "dependencies": { + "gaxios": "^4.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/google-auth-library": { + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-7.14.1.tgz", + "integrity": "sha512-5Rk7iLNDFhFeBYc3s8l1CqzbEBcdhwR193RlD4vSNFajIcINKI8W8P0JLmBpwymHqqWbX34pJDQu39cSy/6RsA==", + "dependencies": { + "arrify": "^2.0.0", + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "fast-text-encoding": "^1.0.0", + "gaxios": "^4.0.0", + "gcp-metadata": "^4.2.0", + "gtoken": "^5.0.4", + "jws": "^4.0.0", + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/google-auth-library/node_modules/jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/google-auth-library/node_modules/jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "dependencies": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/google-p12-pem": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.1.3.tgz", + "integrity": "sha512-MC0jISvzymxePDVembypNefkAQp+DRP7dBE+zNUPaIjEspIlYg0++OrsNr248V9tPbz6iqtZ7rX1hxWA5B8qBQ==", + "dependencies": { + "node-forge": "^1.0.0" + }, + "bin": { + "gp12-pem": "build/src/bin/gp12-pem.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/googleapis": { + "version": "99.0.0", + "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-99.0.0.tgz", + "integrity": "sha512-ZS+iFrNvvZykpGBgTgaj0FgmKCZnC+0tmbs8b5+vJnVcaaHMp8IPUWruNSFqZjg6M8Yey8/aJxhT5mT5Ja2+VQ==", + "dependencies": { + "google-auth-library": "^7.0.2", + "googleapis-common": "^5.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/googleapis-common": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/googleapis-common/-/googleapis-common-5.1.0.tgz", + "integrity": "sha512-RXrif+Gzhq1QAzfjxulbGvAY3FPj8zq/CYcvgjzDbaBNCD6bUl+86I7mUs4DKWHGruuK26ijjR/eDpWIDgNROA==", + "dependencies": { + "extend": "^3.0.2", + "gaxios": "^4.0.0", + "google-auth-library": "^7.14.0", + "qs": "^6.7.0", + "url-template": "^2.0.8", + "uuid": "^8.0.0" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/gtoken": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-5.3.2.tgz", + "integrity": "sha512-gkvEKREW7dXWF8NV8pVrKfW7WqReAmjjkMBh6lNCCGOM4ucS0r0YyXXl0r/9Yj8wcW/32ISkfc8h5mPTDbtifQ==", + "dependencies": { + "gaxios": "^4.0.0", + "google-p12-pem": "^3.1.3", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gtoken/node_modules/jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/gtoken/node_modules/jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "dependencies": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, + "node_modules/jsonwebtoken": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", + "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=4", + "npm": ">=1.4.28" + } + }, + "node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", + "engines": { + "node": "4.x || >=6.0.0" + } + }, + "node_modules/node-forge": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.0.tgz", + "integrity": "sha512-08ARB91bUi6zNKzVmaj3QO7cr397uiDT2nJ63cHjyNtCTWIgvS47j3eT0WfzUwS9+6Z5YshRaoasFkXCKrIYbA==", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/superagent": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.1.tgz", + "integrity": "sha512-VMBFLYgFuRdfeNQSMLbxGSLfmXL/xc+OO+BZp41Za/NRDBet/BNbkRJrYzCUu0u4GU0i/ml2dtT8b9qgkw9z6Q==", + "deprecated": "Please upgrade to v7.0.2+ of superagent. We have fixed numerous issues with streams, form-data, attach(), filesystem errors not bubbling up (ENOENT on attach()), and all tests are now passing. See the releases tab for more information at .", + "dependencies": { + "component-emitter": "^1.2.0", + "cookiejar": "^2.1.0", + "debug": "^3.1.0", + "extend": "^3.0.0", + "form-data": "^2.3.1", + "formidable": "^1.1.1", + "methods": "^1.1.1", + "mime": "^1.4.1", + "qs": "^6.5.1", + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/superagent/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "engines": { + "node": ">=0.6.11 <=0.7.0 || >=0.7.3" + } + }, + "node_modules/url-template": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", + "integrity": "sha1-/FZaPMy/93MMd19WQflVV5FDnyE=" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + }, + "dependencies": { + "@actions/core": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.6.0.tgz", + "integrity": "sha512-NB1UAZomZlCV/LmJqkLhNTqtKfFXJZAUPcfl/zqG7EfsQdeUJtaWO98SGbuQ3pydJ3fHl2CvI/51OKYlCYYcaw==", + "requires": { + "@actions/http-client": "^1.0.11" + } + }, + "@actions/http-client": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-1.0.11.tgz", + "integrity": "sha512-VRYHGQV1rqnROJqdMvGUbY/Kn8vriQe/F9HR2AlYHzmKuM/p3kjNuXhmdBfcVgsvRWTz5C5XW5xvndZrVBuAYg==", + "requires": { + "tunnel": "0.0.6" + } + }, + "@mailchimp/mailchimp_marketing": { + "version": "3.0.74", + "resolved": "https://registry.npmjs.org/@mailchimp/mailchimp_marketing/-/mailchimp_marketing-3.0.74.tgz", + "integrity": "sha512-039iu4GRr7wpXqweBLuS05wvOBtPxSa31cjxgftBYSt7031f0sHEi8Up2DicfbSuQK0AynPDeVyuxrb31Lx+yQ==", + "requires": { + "dotenv": "^8.2.0", + "superagent": "3.8.1" + } + }, + "abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "requires": { + "event-target-shim": "^5.0.0" + } + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + } + }, + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "bignumber.js": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz", + "integrity": "sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==" + }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "cookiejar": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz", + "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==" + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "dotenv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", + "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==" + }, + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "fast-text-encoding": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz", + "integrity": "sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "formidable": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.6.tgz", + "integrity": "sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "gaxios": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.3.2.tgz", + "integrity": "sha512-T+ap6GM6UZ0c4E6yb1y/hy2UB6hTrqhglp3XfmU9qbLCGRYhLVV5aRPpC4EmoG8N8zOnkYCgoBz+ScvGAARY6Q==", + "requires": { + "abort-controller": "^3.0.0", + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.1" + } + }, + "gcp-metadata": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.3.1.tgz", + "integrity": "sha512-x850LS5N7V1F3UcV7PoupzGsyD6iVwTVvsh3tbXfkctZnBnjW5yu5z1/3k3SehF7TyoTIe78rJs02GMMy+LF+A==", + "requires": { + "gaxios": "^4.0.0", + "json-bigint": "^1.0.0" + } + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "google-auth-library": { + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-7.14.1.tgz", + "integrity": "sha512-5Rk7iLNDFhFeBYc3s8l1CqzbEBcdhwR193RlD4vSNFajIcINKI8W8P0JLmBpwymHqqWbX34pJDQu39cSy/6RsA==", + "requires": { + "arrify": "^2.0.0", + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "fast-text-encoding": "^1.0.0", + "gaxios": "^4.0.0", + "gcp-metadata": "^4.2.0", + "gtoken": "^5.0.4", + "jws": "^4.0.0", + "lru-cache": "^6.0.0" + }, + "dependencies": { + "jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "requires": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + } + } + }, + "google-p12-pem": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.1.3.tgz", + "integrity": "sha512-MC0jISvzymxePDVembypNefkAQp+DRP7dBE+zNUPaIjEspIlYg0++OrsNr248V9tPbz6iqtZ7rX1hxWA5B8qBQ==", + "requires": { + "node-forge": "^1.0.0" + } + }, + "googleapis": { + "version": "99.0.0", + "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-99.0.0.tgz", + "integrity": "sha512-ZS+iFrNvvZykpGBgTgaj0FgmKCZnC+0tmbs8b5+vJnVcaaHMp8IPUWruNSFqZjg6M8Yey8/aJxhT5mT5Ja2+VQ==", + "requires": { + "google-auth-library": "^7.0.2", + "googleapis-common": "^5.0.2" + } + }, + "googleapis-common": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/googleapis-common/-/googleapis-common-5.1.0.tgz", + "integrity": "sha512-RXrif+Gzhq1QAzfjxulbGvAY3FPj8zq/CYcvgjzDbaBNCD6bUl+86I7mUs4DKWHGruuK26ijjR/eDpWIDgNROA==", + "requires": { + "extend": "^3.0.2", + "gaxios": "^4.0.0", + "google-auth-library": "^7.14.0", + "qs": "^6.7.0", + "url-template": "^2.0.8", + "uuid": "^8.0.0" + } + }, + "gtoken": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-5.3.2.tgz", + "integrity": "sha512-gkvEKREW7dXWF8NV8pVrKfW7WqReAmjjkMBh6lNCCGOM4ucS0r0YyXXl0r/9Yj8wcW/32ISkfc8h5mPTDbtifQ==", + "requires": { + "gaxios": "^4.0.0", + "google-p12-pem": "^3.1.3", + "jws": "^4.0.0" + }, + "dependencies": { + "jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "requires": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "requires": { + "bignumber.js": "^9.0.0" + } + }, + "jsonwebtoken": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", + "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "requires": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^5.6.0" + } + }, + "jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "requires": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" + }, + "lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" + }, + "lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" + }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" + }, + "node-forge": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.0.tgz", + "integrity": "sha512-08ARB91bUi6zNKzVmaj3QO7cr397uiDT2nJ63cHjyNtCTWIgvS47j3eT0WfzUwS9+6Z5YshRaoasFkXCKrIYbA==" + }, + "object-inspect": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "superagent": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.1.tgz", + "integrity": "sha512-VMBFLYgFuRdfeNQSMLbxGSLfmXL/xc+OO+BZp41Za/NRDBet/BNbkRJrYzCUu0u4GU0i/ml2dtT8b9qgkw9z6Q==", + "requires": { + "component-emitter": "^1.2.0", + "cookiejar": "^2.1.0", + "debug": "^3.1.0", + "extend": "^3.0.0", + "form-data": "^2.3.1", + "formidable": "^1.1.1", + "methods": "^1.1.1", + "mime": "^1.4.1", + "qs": "^6.5.1", + "readable-stream": "^2.0.5" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" + }, + "url-template": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", + "integrity": "sha1-/FZaPMy/93MMd19WQflVV5FDnyE=" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } +} diff --git a/.github/workflows/create-event-helpers/package.json b/.github/workflows/create-event-helpers/package.json new file mode 100644 index 000000000..c7bef2fbf --- /dev/null +++ b/.github/workflows/create-event-helpers/package.json @@ -0,0 +1,12 @@ +{ + "name": "events-creation-automation", + "description": "This code is responsible for handling automation of meetings creation", + "license": "Apache 2.0", + "dependencies": { + "@actions/core": "^1.6.0", + "@mailchimp/mailchimp_marketing": "^3.0.74", + "googleapis": "^99.0.0", + "jsonwebtoken": "^8.5.1", + "node-fetch": "2.6.1" + } +} diff --git a/.github/workflows/create-event-helpers/zoom/index.js b/.github/workflows/create-event-helpers/zoom/index.js new file mode 100644 index 000000000..160d85ff4 --- /dev/null +++ b/.github/workflows/create-event-helpers/zoom/index.js @@ -0,0 +1,90 @@ +const fetch = require('node-fetch'); +const jwt = require('jsonwebtoken'); +const core = require('@actions/core'); + +/** + * @param {string} date Date as YYYY-MM-DD + * @param {string} time Number that represents hour, 2-digit format + * @param {string} host email address of meeting host + * @param {string} cohost coma-separated list of email addresses of alternative hosts + */ +module.exports = async(date, time, host, cohost) => { + + const meetingTitle = process.env.MEETING_NAME; + let meetingDetails; + + const tokenConfig = { + iss: process.env.ZOOM_API_KEY, + exp: ((new Date()).getTime() + 5000) + } + + const token = jwt.sign(tokenConfig, process.env.ZOOM_API_SECRET); + + const zoomSettings = JSON.stringify({ + topic: meetingTitle, + type: '2', + start_time: `${ date }T${ time }:00:00`, + duration: '60', + timezone: 'UTC', + settings: { + alternative_hosts: cohost, + alternative_hosts_email_notification: false, + contact_email: 'info@asyncapi.io', + email_notification: false, + host_video: true, + mute_upon_entry: true, + participant_video: true, + join_before_host: false + } + }) + + const fetchMeetingCreationOptions = { + method: 'POST', + + headers: { + 'User-Agent': 'Zoom-api-Jwt-Request', + 'content-type': 'application/json', + Authorization: `bearer ${ token }` + }, + + body: zoomSettings + } + + try { + const meetingCreationResponse = await fetch(`https://api.zoom.us/v2/users/${ host }/meetings`, fetchMeetingCreationOptions); + meetingDetails = await meetingCreationResponse.json(); + } catch (error) { + return core.setFailed(`Meeting creation failed: ${ error }`) + } + + //core.debug(JSON.stringify(meetingDetails)); + const meetingId = meetingDetails.id; + const meetingUrl = meetingDetails.join_url; + + const streamOptions = JSON.stringify({ + page_url: 'https://www.youtube.com/asyncapi', + stream_key: process.env.STREAM_KEY, + stream_url: process.env.STREAM_URL + }) + + const fetchMeetingUpdateOptions = { + method: 'PATCH', + + headers: { + 'content-type': 'application/json', + Authorization: `bearer ${ token }` + }, + + body: streamOptions + } + + try { + await fetch(`https://api.zoom.us/v2/meetings/${ meetingId }/livestream`, fetchMeetingUpdateOptions); + } catch (error) { + return core.setFailed(`Meeting update with streaming info failed: ${ error }`) + } + + if (!meetingId) return core.setFailed('meetingId is not available which means something went wrong in communication with Zoom. Most probably the host that you defined is not yet part of related Zoom account'); + core.info(`Created meeting ${ meetingId } that you can join at ${ meetingUrl }`); + core.setOutput('meetingUrl', meetingUrl); +} \ No newline at end of file diff --git a/.github/workflows/create-event-issue-community-meeting.yml b/.github/workflows/create-event-issue-community-meeting.yml deleted file mode 100644 index 7e8751c67..000000000 --- a/.github/workflows/create-event-issue-community-meeting.yml +++ /dev/null @@ -1,32 +0,0 @@ -name: Schedule Community Meeting - -on: - workflow_dispatch: - inputs: - time: - description: 'Info about meeting hour in UTC time zone, like: 08 or 16. No PM or AM versions.' - required: true - date: - description: 'Date in a form like: 2022-04-05 where 04 is a month and 05 is a day number.' - required: true - -jobs: - - setup-community-meeting: - env: - GITHUB_TOKEN: ${{ secrets.GH_TOKEN }} - name: Setup Community meeting - runs-on: ubuntu-latest - steps: - - name: Checkout repository - uses: actions/checkout@v2 - - name: Create issue content - uses: actions/github-script@v4 - id: date - with: - script: | - const { getMeetingIssueContent } = require('./.github/workflows/event_issue_templates/meetings/community.js'); - const setupMeeting = require('./.github/workflows/event_issue_templates/index.js'); - setupMeeting('${{ github.event.inputs.date }}', '${{ github.event.inputs.time }}', core, getMeetingIssueContent); - - name: Create issue with meeting details - run: gh issue create -l meeting -t "Community Meeting, ${{steps.date.outputs.hour}}:00 UTC ${{steps.date.outputs.fullDate}}" -F content.md \ No newline at end of file diff --git a/.github/workflows/create-event-issue-lets-talk-about.yml b/.github/workflows/create-event-issue-lets-talk-about.yml deleted file mode 100644 index ebbf2bd02..000000000 --- a/.github/workflows/create-event-issue-lets-talk-about.yml +++ /dev/null @@ -1,36 +0,0 @@ -name: Schedule Lets talk about contributing Meeting - -on: - workflow_dispatch: - inputs: - time: - description: 'Info about meeting hour in UTC time zone, like: 08 or 16. No PM or AM versions.' - required: true - date: - description: 'Date in a form like: 2022-04-05 where 04 is a month and 05 is a day number.' - required: true - descSuffix: - description: 'You can specify additional text that appears at the end of generated issue title, like: - Product Design' - required: false - default: '' - -jobs: - - setup-lets-talk-about-contrib-stream: - env: - GITHUB_TOKEN: ${{ secrets.GH_TOKEN }} - name: Setup Lets talk about contributing live stream - runs-on: ubuntu-latest - steps: - - name: Checkout repository - uses: actions/checkout@v2 - - name: Create issue content - uses: actions/github-script@v4 - id: date - with: - script: | - const { getMeetingIssueContent } = require('./.github/workflows/event_issue_templates/meetings/lets-talk-about-contrib.js'); - const setupMeeting = require('./.github/workflows/event_issue_templates/index.js'); - setupMeeting('${{ github.event.inputs.date }}', '${{ github.event.inputs.time }}', core, getMeetingIssueContent); - - name: Create issue with meeting details - run: gh issue create -l meeting -t "Let's talk about contributing, ${{steps.date.outputs.hour}}:00 UTC ${{steps.date.outputs.fullDate}} ${{ github.event.inputs.descSuffix }}" -F content.md \ No newline at end of file diff --git a/.github/workflows/create-event-issue-spec-3-0.yml b/.github/workflows/create-event-issue-spec-3-0.yml deleted file mode 100644 index efb501cd6..000000000 --- a/.github/workflows/create-event-issue-spec-3-0.yml +++ /dev/null @@ -1,32 +0,0 @@ -name: Schedule Spec 3.0 Meeting - -on: - workflow_dispatch: - inputs: - time: - description: 'Info about meeting hour in UTC time zone, like: 08 or 16. No PM or AM versions.' - required: true - date: - description: 'Date in a form like: 2022-04-05 where 04 is a month and 05 is a day number.' - required: true - -jobs: - - setup-spec-3-0-meeting: - env: - GITHUB_TOKEN: ${{ secrets.GH_TOKEN }} - name: Setup 3.0 spec meeting - runs-on: ubuntu-latest - steps: - - name: Checkout repository - uses: actions/checkout@v2 - - name: Create issue content - uses: actions/github-script@v4 - id: date - with: - script: | - const { getMeetingIssueContent } = require('./.github/workflows/event_issue_templates/meetings/spec-3-0.js'); - const setupMeeting = require('./.github/workflows/event_issue_templates/index.js'); - setupMeeting('${{ github.event.inputs.date }}', '${{ github.event.inputs.time }}', core, getMeetingIssueContent); - - name: Create issue with meeting details - run: gh issue create -l meeting -t "Spec 3.0 Meeting, ${{steps.date.outputs.hour}}:00 UTC ${{steps.date.outputs.fullDate}}" -F content.md \ No newline at end of file diff --git a/.github/workflows/create-event-lets-talk-about.yml b/.github/workflows/create-event-lets-talk-about.yml new file mode 100644 index 000000000..474ebf1d1 --- /dev/null +++ b/.github/workflows/create-event-lets-talk-about.yml @@ -0,0 +1,38 @@ +name: Schedule Lets talk about contributing Meeting + +on: + workflow_dispatch: + inputs: + time: + description: 'Info about meeting hour in UTC time zone, like: 08 or 16. No PM or AM versions.' + required: true + date: + description: 'Date in a form like: 2022-04-05 where 04 is a month and 05 is a day number.' + required: true + descSuffix: + description: 'You can specify additional text that appears at the end of generated issue title, like: - Product Design' + required: false + default: '' + +jobs: + + setup-lets-talk-about-contrib-stream: + uses: ./.github/workflows/create-event-workflow-reusable.yml + with: + time: ${{ github.event.inputs.time }} + date: ${{ github.event.inputs.date }} + meeting_name: Let's talk about contributing + meeting_name_suffix: ${{ github.event.inputs.descSuffix }} + meeting_desc: The purpose of this meeting is to focus on contributors, focus on people that want to contribute to AsyncAPI Initiative but do not know how to do it. + host: lpgornicki@gmail.com + alternative_host: fmvilas@gmail.com + issue_template_path: .github/workflows/create-event-helpers/issues_templates/lets-talk-about-contrib.md + create_zoom: false + secrets: + GH_TOKEN: ${{ secrets.GH_TOKEN }} + ZOOM_API_KEY: ${{ secrets.ZOOM_API_KEY }} + ZOOM_API_SECRET: ${{ secrets.ZOOM_API_SECRET }} + STREAM_URL: ${{ secrets.STREAM_URL }} + STREAM_KEY: ${{ secrets.STREAM_KEY }} + CALENDAR_ID: ${{ secrets.CALENDAR_ID }} + CALENDAR_SERVICE_ACCOUNT: ${{ secrets.CALENDAR_SERVICE_ACCOUNT }} \ No newline at end of file diff --git a/.github/workflows/create-event-spec-3-0.yml b/.github/workflows/create-event-spec-3-0.yml new file mode 100644 index 000000000..4b648b8e2 --- /dev/null +++ b/.github/workflows/create-event-spec-3-0.yml @@ -0,0 +1,35 @@ +name: Schedule Spec 3.0 Meeting + +on: + workflow_dispatch: + inputs: + time: + description: 'Info about meeting hour in UTC time zone, like: 08 or 16. No PM or AM versions.' + required: true + date: + description: 'Date in a form like: 2022-04-05 where 04 is a month and 05 is a day number.' + required: true + +jobs: + + setup-spec-3-0-meeting: + uses: ./.github/workflows/create-event-workflow-reusable.yml + with: + time: ${{ github.event.inputs.time }} + date: ${{ github.event.inputs.date }} + meeting_name: Spec 3.0 Meeting + meeting_desc: This is the meeting for community member involved in works related to 3.0 release of AsyncAPI Specification. + host: jonas-lt@live.dk + alternative_host: fmvilas@gmail.com + issue_template_path: .github/workflows/create-event-helpers/issues_templates/spec-3-0.md + create_zoom: true + secrets: + GH_TOKEN: ${{ secrets.GH_TOKEN }} + ZOOM_API_KEY: ${{ secrets.ZOOM_API_KEY }} + ZOOM_API_SECRET: ${{ secrets.ZOOM_API_SECRET }} + STREAM_URL: ${{ secrets.STREAM_URL }} + STREAM_KEY: ${{ secrets.STREAM_KEY }} + CALENDAR_ID: ${{ secrets.CALENDAR_ID }} + CALENDAR_SERVICE_ACCOUNT: ${{ secrets.CALENDAR_SERVICE_ACCOUNT }} + + \ No newline at end of file diff --git a/.github/workflows/create-event-thinking-out-loud.yml b/.github/workflows/create-event-thinking-out-loud.yml new file mode 100644 index 000000000..00aa664d2 --- /dev/null +++ b/.github/workflows/create-event-thinking-out-loud.yml @@ -0,0 +1,41 @@ +name: Schedule Thinking Out Loud + +on: + workflow_dispatch: + inputs: + time: + description: 'Info about meeting hour in UTC time zone, like: 08 or 16. No PM or AM versions.' + required: true + date: + description: 'Date in a form like: 2022-04-05 where 04 is a month and 05 is a day number.' + required: true + desc: + description: 'Put short description what is this episode about. Is it about building community or JSON Schema or anything else.' + required: true + guest: + description: 'Provide the name of the guest.' + required: true + +jobs: + + setup-thinking-out-loud: + uses: ./.github/workflows/create-event-workflow-reusable.yml + with: + time: ${{ github.event.inputs.time }} + date: ${{ github.event.inputs.date }} + meeting_name: Thinking Out Loud + meeting_desc: ${{ github.event.inputs.desc }} + guest: ${{ github.event.inputs.guest }} + host: fmvilas@gmail.com + issue_template_path: .github/workflows/create-event-helpers/issues_templates/thinking-out-loud.md + create_zoom: true + secrets: + GH_TOKEN: ${{ secrets.GH_TOKEN }} + ZOOM_API_KEY: ${{ secrets.ZOOM_API_KEY }} + ZOOM_API_SECRET: ${{ secrets.ZOOM_API_SECRET }} + STREAM_URL: ${{ secrets.STREAM_URL }} + STREAM_KEY: ${{ secrets.STREAM_KEY }} + CALENDAR_ID: ${{ secrets.CALENDAR_ID }} + CALENDAR_SERVICE_ACCOUNT: ${{ secrets.CALENDAR_SERVICE_ACCOUNT }} + + \ No newline at end of file diff --git a/.github/workflows/create-event-workflow-reusable.yml b/.github/workflows/create-event-workflow-reusable.yml new file mode 100644 index 000000000..e44bd9007 --- /dev/null +++ b/.github/workflows/create-event-workflow-reusable.yml @@ -0,0 +1,130 @@ +name: Schedule X Template Workflow + +on: + workflow_call: + + inputs: + time: + description: 'Info about meeting hour in UTC time zone, like: 08 or 16. No PM or AM versions.' + required: true + type: string + date: + description: 'Date in a form like: 2022-04-05 where 04 is a month and 05 is a day number.' + required: true + type: string + meeting_name: + description: 'Name of the meeting.' + required: true + type: string + meeting_name_suffix: + description: 'Optional additional description added at the end of meeting title to indicate purpose of given meeting.' + type: string + required: false + meeting_desc: + description: 'Description of the purpose of the meeting.' + required: true + type: string + host: + description: 'Email address of the host of the meeting.' + required: true + type: string + guest: + description: 'Name of extra guest for the meeting.' + required: false + type: string + alternative_host: + description: 'Email address of alternative hosts of the meeting.' + required: false + type: string + issue_template_path: + description: 'Path to the issue template used to create meeting GH issue.' + required: true + type: string + create_zoom: + description: 'Boolean information if meeting.' + required: true + type: boolean + + secrets: + GH_TOKEN: + required: true + ZOOM_API_KEY: + required: true + ZOOM_API_SECRET: + required: true + STREAM_URL: + required: true + STREAM_KEY: + required: true + CALENDAR_ID: + required: true + CALENDAR_SERVICE_ACCOUNT: + required: true + +jobs: + + setup-meeting: + env: + ZOOM_API_KEY: ${{ secrets.ZOOM_API_KEY }} + ZOOM_API_SECRET: ${{ secrets.ZOOM_API_SECRET }} + STREAM_URL: ${{ secrets.STREAM_URL }} + STREAM_KEY: ${{ secrets.STREAM_KEY }} + CALENDAR_ID: ${{ secrets.CALENDAR_ID }} + CALENDAR_SERVICE_ACCOUNT: ${{ secrets.CALENDAR_SERVICE_ACCOUNT }} + name: Setup meeting + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v2 + - name: Setup Node.js + uses: actions/setup-node@v2 + with: + node-version: 16 + cache: 'npm' + cache-dependency-path: '**/package-lock.json' + - name: Install deps + run: npm install + working-directory: ./.github/workflows/create-event-helpers + - if: inputs.create_zoom == true + name: Create zoom meeting + uses: actions/github-script@v4 + id: zoom + env: + MEETING_NAME: ${{ inputs.meeting_name }} + with: + script: | + const setupZoom = require('./.github/workflows/create-event-helpers/zoom/index.js'); + setupZoom('${{ inputs.date }}', '${{ inputs.time }}', '${{ inputs.host }}', '${{ inputs.alternative_host }}'); + - name: Create issue with meeting details + uses: JasonEtco/create-an-issue@v2 + id: create-issue + env: + GITHUB_TOKEN: ${{ secrets.GH_TOKEN }} + FULL_DATE: ${{ inputs.date }}T${{ inputs.time }}:00:00Z + DATE_ONLY: ${{ inputs.date }} + ZOOM_LINK: ${{ steps.zoom.outputs.meetingUrl }} + MEETING_NAME: ${{ inputs.meeting_name }} + MEETING_NAME_SUFFIX: ${{ inputs.meeting_name_suffix }} + MEETING_DESC: ${{ inputs.meeting_desc }} + GUEST: ${{ inputs.guest }} + with: + filename: ${{ inputs.issue_template_path }} + - name: Create Google Calendar entry with zoom + uses: actions/github-script@v4 + env: + MEETING_NAME: ${{ inputs.meeting_name }} + MEETING_NAME_SUFFIX: ${{ inputs.meeting_name_suffix }} + MEETING_DESC: ${{ inputs.meeting_desc }} + GUEST: ${{ inputs.guest }} + with: + script: | + const { addEvent } = require('./.github/workflows/create-event-helpers/calendar/index.js'); + addEvent('${{ steps.zoom.outputs.meetingUrl }}', '${{ inputs.date }}', '${{ inputs.time }}', '${{ steps.create-issue.outputs.number }}'); + - name: Publish information about meeting to Twitter + uses: m1ner79/Github-Twittction@v1.0.1 + with: + twitter_status: "New meeting scheduled 💪\n\nName: ${{ inputs.meeting_name }}\n\nCheck what is it about and how to connect 👇🏼 https://github.com/asyncapi/community/issues/${{ steps.create-issue.outputs.number }}" + twitter_consumer_key: ${{ secrets.TWITTER_CONSUMER_KEY }} + twitter_consumer_secret: ${{ secrets.TWITTER_CONSUMER_SECRET }} + twitter_access_token_key: ${{ secrets.TWITTER_ACCESS_TOKEN_KEY }} + twitter_access_token_secret: ${{ secrets.TWITTER_ACCESS_TOKEN_SECRET }} \ No newline at end of file diff --git a/.github/workflows/event_issue_templates/index.js b/.github/workflows/event_issue_templates/index.js deleted file mode 100644 index 9de4456c9..000000000 --- a/.github/workflows/event_issue_templates/index.js +++ /dev/null @@ -1,28 +0,0 @@ -const { writeFileSync } = require('fs'); -const { getMeetingIssueContent } = require('./meetings/community.js'); -const { parseDate } = require('./utils/date.js'); - -/** - * @param {string} date Date as YYYY-MM-DD - * @param {string} time Number that represents hour, 2-digit format - * @param {string} code Entire core package helper - * @param {string} getMeetingIssueContent Function that returns content of the meeting issue -*/ -module.exports = (date, time, core, getMeetingIssueContent) => { - - core.info(`Workflow triggered with the following hour ${time} and date ${date}`); - const dateDetails = parseDate(`${ date }T${ time }:00:00Z`); - - core.info('This is how time and date looks like after parsing:'); - core.info(JSON.stringify(dateDetails)); - - if (dateDetails === 'Invalid Date') core.setFailed('Invalid date of the event. Make sure that you provided correct hour of the meeting and date in a format described in the meeting input form.') - - const issueContent = getMeetingIssueContent(dateDetails.hour, dateDetails.formattedDate); - - writeFileSync('content.md', issueContent, { encoding: 'utf8'}); - - core.setOutput('formattedDate', dateDetails.formattedDate); - core.setOutput('fullDate', dateDetails.fullDate); - core.setOutput('hour', dateDetails.hour); -} \ No newline at end of file diff --git a/.github/workflows/event_issue_templates/meetings/community.js b/.github/workflows/event_issue_templates/meetings/community.js deleted file mode 100644 index 32deabc6a..000000000 --- a/.github/workflows/event_issue_templates/meetings/community.js +++ /dev/null @@ -1,28 +0,0 @@ -module.exports.getMeetingIssueContent = (time, date) => { - - return `This is the AsyncAPI Community meeting. You're invited to [join us live on Zoom](https://zoom.us/j/165106914) and ask questions. **The meeting takes place on alternate Tuesdays**. Recordings from the previous meetings are available in [this](https://www.youtube.com/playlist?list=PLbi1gRlP7pijUwZJErzyYf_Rc-PWu4lXS) playlist on YouTube. - -**This time we meet at ${time}:00 UTC. Check what time is it in your time zone with [time zone converter](https://dateful.com/convert/coordinated-universal-time-utc?t=${time}&d=${date})** - -Join [this](https://groups.google.com/forum/#!forum/asyncapi-users) mailing list to get an always-up-to-date invite to the meeting in your calendar. You can also check [AsyncAPI Calendar](https://calendar.google.com/calendar/u/0/embed?src=tbrbfq4de5bcngt8okvev4lstk@group.calendar.google.com). - -## Agenda - -> Don't wait for the meeting to discuss topics that already have issues. Feel free to comment on them earlier. - -1. Q&A -1. _Place for your topic_ -1. Q&A - -## Notes - -tbd - -## Chat - -tbd - -## Recording - -tbd` -} \ No newline at end of file diff --git a/.github/workflows/event_issue_templates/meetings/lets-talk-about-contrib.js b/.github/workflows/event_issue_templates/meetings/lets-talk-about-contrib.js deleted file mode 100644 index 38c1f9df6..000000000 --- a/.github/workflows/event_issue_templates/meetings/lets-talk-about-contrib.js +++ /dev/null @@ -1,18 +0,0 @@ -module.exports.getMeetingIssueContent = (time, date) => { - - return `The purpose of this meeting is to focus on contributors, focus on people that want to contribute to AsyncAPI Initiative but do not know how to do it. AsyncAPI Initiative is a large project, with lots of code, lots of docs, and many many other areas that need help, but it is not easy to start. - -Recordings from the previous meetings are available in [this](https://www.youtube.com/playlist?list=PLbi1gRlP7pigPBrBMaNQhUeniR1pdDMiY) playlist on YouTube. - -**This time we meet at ${time}:00 UTC. Check what time is it in your time zone with [time zone converter](https://dateful.com/convert/coordinated-universal-time-utc?t=${time}&d=${date})** - -Join [this](https://groups.google.com/forum/#!forum/asyncapi-users) mailing list to get an always-up-to-date invite to the meeting in your calendar. You can also check [AsyncAPI Calendar](https://calendar.google.com/calendar/u/0/embed?src=tbrbfq4de5bcngt8okvev4lstk@group.calendar.google.com). - -This meatin is a live-stream that goes to the following social media: -- [YouTube](https://www.youtube.com/asyncapi) -- [Twitch](https://www.twitch.tv/asyncapi) -- [Twitter](https://twitter.com/AsyncAPISpec) -- [LinkedIn](https://www.linkedin.com/company/asyncapi) - -To broadcast the live-stream, we are using [Restream](https://restream.io/). You are invited to join us live on the call and not only interact through chats on YouTube and Twitch.` -} \ No newline at end of file diff --git a/.github/workflows/event_issue_templates/meetings/spec-3-0.js b/.github/workflows/event_issue_templates/meetings/spec-3-0.js deleted file mode 100644 index 4dadd7500..000000000 --- a/.github/workflows/event_issue_templates/meetings/spec-3-0.js +++ /dev/null @@ -1,30 +0,0 @@ -module.exports.getMeetingIssueContent = (time, date) => { - - return `This is the meeting for community member involved in works related to 3.0 release of AsyncAPI Specification. - -**The meeting takes place bi-weekly on Wednesdays**. First and third week every month until release. Recordings from the previous meetings are available in [this](https://www.youtube.com/playlist?list=PLbi1gRlP7pihClJY-kXuTRRJ8n1awb0VV) playlist on YouTube. - -**This time we meet at ${time}:00 UTC. Check what time is it in your time zone with [time zone converter](https://dateful.com/convert/coordinated-universal-time-utc?t=${time}&d=${date})** - -Join [this mailing list](https://groups.google.com/forum/#!forum/asyncapi-users) to get an always-up-to-date invite to the meeting in your calendar. You can also check [AsyncAPI Calendar](https://calendar.google.com/calendar/u/0/embed?src=tbrbfq4de5bcngt8okvev4lstk@group.calendar.google.com). - -This meeting is a live-stream that goes to the following social media: -- [YouTube](https://www.youtube.com/asyncapi) -- [Twitch](https://www.twitch.tv/asyncapi) -- [Twitter](https://twitter.com/AsyncAPISpec) -- [LinkedIn](https://www.linkedin.com/company/asyncapi) - -You can also join live the meeting on [Zoom](https://us02web.zoom.us/j/82566953769). - -## Agenda - -> Don't wait for the meeting to discuss topics that already have issues. Feel free to comment on them earlier. - -1. Q&A -1. _Place for your topic_ -1. Q&A - -## Recording - -tbd` -} \ No newline at end of file diff --git a/.github/workflows/event_issue_templates/utils/README.md b/.github/workflows/event_issue_templates/utils/README.md deleted file mode 100644 index 4a31c9a22..000000000 --- a/.github/workflows/event_issue_templates/utils/README.md +++ /dev/null @@ -1 +0,0 @@ -Instead of using `package.json` and building complex build system for scripts that setup AsyncAPI meetings, we keep source code of minified [day.js](https://github.com/iamkun/dayjs) and its UTC-format plugin here in `utils` folder directly. This scripts run on CI, and are not vulerable so do not need `package.json` and regular security updates. \ No newline at end of file diff --git a/.github/workflows/event_issue_templates/utils/date.js b/.github/workflows/event_issue_templates/utils/date.js deleted file mode 100644 index 295975b35..000000000 --- a/.github/workflows/event_issue_templates/utils/date.js +++ /dev/null @@ -1,19 +0,0 @@ -const dayjs = require('./dayjs.min.js'); -const utc = require('./utc.js'); -dayjs.extend(utc); - -/** - * @param {string} date Date as 2019-01-25T08:00:00Z -*/ -module.exports.parseDate = (date) => { - - const meetingDate = dayjs(date); - const formattedDate = meetingDate.utc().format('YYYY-MM-DD'); - const fullDate = meetingDate.utc().format('dddd MMMM D YYYY'); - const hour = meetingDate.utc().format('H'); - - return { formattedDate, fullDate, hour } -} - - - diff --git a/.github/workflows/event_issue_templates/utils/dayjs.min.js b/.github/workflows/event_issue_templates/utils/dayjs.min.js deleted file mode 100644 index 50c5278a3..000000000 --- a/.github/workflows/event_issue_templates/utils/dayjs.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).dayjs=e()}(this,(function(){"use strict";var t=1e3,e=6e4,n=36e5,r="millisecond",i="second",s="minute",u="hour",a="day",o="week",f="month",h="quarter",c="year",d="date",$="Invalid Date",l=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,y=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,M={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_")},m=function(t,e,n){var r=String(t);return!r||r.length>=e?t:""+Array(e+1-r.length).join(n)+t},g={s:m,z:function(t){var e=-t.utcOffset(),n=Math.abs(e),r=Math.floor(n/60),i=n%60;return(e<=0?"+":"-")+m(r,2,"0")+":"+m(i,2,"0")},m:function t(e,n){if(e.date()1)return t(u[0])}else{var a=e.name;D[a]=e,i=a}return!r&&i&&(v=i),i||!r&&v},w=function(t,e){if(p(t))return t.clone();var n="object"==typeof e?e:{};return n.date=t,n.args=arguments,new _(n)},O=g;O.l=S,O.i=p,O.w=function(t,e){return w(t,{locale:e.$L,utc:e.$u,x:e.$x,$offset:e.$offset})};var _=function(){function M(t){this.$L=S(t.locale,null,!0),this.parse(t)}var m=M.prototype;return m.parse=function(t){this.$d=function(t){var e=t.date,n=t.utc;if(null===e)return new Date(NaN);if(O.u(e))return new Date;if(e instanceof Date)return new Date(e);if("string"==typeof e&&!/Z$/i.test(e)){var r=e.match(l);if(r){var i=r[2]-1||0,s=(r[7]||"0").substring(0,3);return n?new Date(Date.UTC(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)):new Date(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)}}return new Date(e)}(t),this.$x=t.x||{},this.init()},m.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},m.$utils=function(){return O},m.isValid=function(){return!(this.$d.toString()===$)},m.isSame=function(t,e){var n=w(t);return this.startOf(e)<=n&&n<=this.endOf(e)},m.isAfter=function(t,e){return w(t) Date: Thu, 31 Mar 2022 11:19:20 +0200 Subject: [PATCH 2/8] fix job id for ad hoc meeting --- .github/workflows/create-event-ad-hoc.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/create-event-ad-hoc.yml b/.github/workflows/create-event-ad-hoc.yml index 87c8cbccd..dcbadc6ee 100644 --- a/.github/workflows/create-event-ad-hoc.yml +++ b/.github/workflows/create-event-ad-hoc.yml @@ -18,7 +18,7 @@ on: jobs: - setup-community-meeting: + setup-ad-hoc: uses: ./.github/workflows/create-event-workflow-reusable.yml with: time: ${{ github.event.inputs.time }} From 485a1501927cec3247b68268bdee681ff258d822 Mon Sep 17 00:00:00 2001 From: derberg Date: Thu, 31 Mar 2022 11:51:57 +0200 Subject: [PATCH 3/8] proper date for getting events list --- .github/workflows/create-event-helpers/calendar/index.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/create-event-helpers/calendar/index.js b/.github/workflows/create-event-helpers/calendar/index.js index 1132cd85c..85f1c23a1 100644 --- a/.github/workflows/create-event-helpers/calendar/index.js +++ b/.github/workflows/create-event-helpers/calendar/index.js @@ -124,17 +124,17 @@ async function listEvents() { let eventsItems; try { - //this runs always on thursday before midnight so folks can read email on friday + //this runs always on friday midnight const currentTime = new Date(Date.now()).toISOString(); //we check moday - const timeIn3Days = new Date(Date.parse(currentTime) + 3 * 24 * 60 * 60 * 1000).toISOString(); + const timeIn2Days = new Date(Date.parse(currentTime) + 2 * 24 * 60 * 60 * 1000).toISOString(); //till friday const timeIn8Days = new Date(Date.parse(currentTime) + 8 * 24 * 60 * 60 * 1000).toISOString(); const eventsList = await calendar.events.list({ calendarId: process.env.CALENDAR_ID, timeMax: timeIn8Days, - timeMin: timeIn3Days + timeMin: timeIn2Days }) eventsItems = eventsList.data.items.map((e) => { From dd3d743dd8f82126d3fb518f339f562d35aec99a Mon Sep 17 00:00:00 2001 From: derberg Date: Thu, 31 Mar 2022 12:56:22 +0200 Subject: [PATCH 4/8] docs --- MEETINGS_ORGANIZATION.md | 67 +++++++++++++++++++++++++++++++--------- 1 file changed, 52 insertions(+), 15 deletions(-) diff --git a/MEETINGS_ORGANIZATION.md b/MEETINGS_ORGANIZATION.md index 3cb475cd4..25f536ecd 100644 --- a/MEETINGS_ORGANIZATION.md +++ b/MEETINGS_ORGANIZATION.md @@ -1,27 +1,64 @@ -This document covers the technical aspect of events organization. It describes the basic steps required for every official AsyncAPI event. +This document covers the aspect of different meetings organization at AsyncAPI. -## AsyncAPI Calendar +## FAQ -Every event must be created in [AsyncAPI Google Calendar](https://calendar.google.com/calendar/u/0/embed?src=tbrbfq4de5bcngt8okvev4lstk@group.calendar.google.com) and an invitation sent to asyncapi-users@googlegroups.com. +### What I need to schedule a meeting? -You need to be a member of [this](https://groups.google.com/u/1/g/asyncapi-users) user group to get an invitation. +To schedule a meeting you need to be: +- one of licensed Zoom users associated with AsyncAPI Zoom account. It is required because only licensed users can start meeting, live transcripts and streaming. +- GitHub Action workflow for `Ad Hoc` meeting scheduling should be updated. New licensed user should be added as alternative host. +- a member of [GitHub team called meetings-organizars](https://github.com/orgs/asyncapi/teams/meetings-organizers). It is required because only maintainers of given repository can manually trigger GitHub Actions workflows. This group has `Maintain` role in `community` repository where meeting automation is implemented. +- a member of a team in AsyncAPI Restream account. It is required because hosts, before they start streaming the meeting from Zoom, must login to Restream and modify the title of the stream that will show up in social platforms. -## Event-related GitHub issue +### What meetings do we have/ -Every event instance must have a corresponding GitHub issue with details on schedule and how to participate. Such an issue must be created in [the community repository](https://github.com/asyncapi/community/issues). +* `Regular` meetings: meetings like `Community Meeting` or `Thinking Out Loud` that happen regularly, have their dedicated area of interest and own brand. +* `Ad Hoc` meetings: meetings for topic that do not match any `Regular` meeting and should be organized separately. Every official AsyncAPI Zoom licensed user should have right to schedule it. -The issue creation process for official AsyncAPI events is semi-automated. You do not have to create an issue on your own, but you can trigger a dedicated GitHub Action workflow to do it for you. +### How to schedule new meeting? 1. Go to [**Actions** tab](https://github.com/asyncapi/community/actions) -2. Select one of the workflows that starts with **Schedule**. Choose the one that represents the meeting that you are scheduling -3. Click **Run workflow** button -4. Provide data required by the form and click another **Run workflow** button visible in the form +1. Select one of the workflows that starts with **Schedule**. Choose the one that represents the meeting that you want to schedule +1. Click **Run workflow** button +1. Provide data required by the form and click another **Run workflow** button visible in the form -As a result, a new GitHub issue is created in the repository. +We have an automated workflow in place: +1. Automation starts after clicking **Run workflow**. Unless there is another GitHub Actions outage and proper events are not delivered to automation :smiley: +1. It creates new meeting in Zoom. It is by default configured to support live streaming +1. It creates a GitHub issue with all details about the meeting +1. It creates a new Google Calendar entry with special metadata containing the GitHub issue number +1. It sends a tweet with information about newly scheduled event -> You need to manually close issues for old meetings and manage pinned issues. +### How do I get notified about upcomming meetings? -## New events registration +TODO: add missing link where folks can find subscription form +Subscribe to AsyncAPI Newsletter to get information about upcomming meetings. -* To get a new issue registered in AsyncAPI Calendar, contact the community in the `#events` channel in [Slack](https://www.asyncapi.com/slack-invite), -* To modify an issue creation workflow to support a new event, add new workflow like [this one](.github/workflows/create-event-issue-community-meeting.yml) and add a new script like [this one](.github/workflows/event_issue_templates/meetings/community.js). \ No newline at end of file +We have an automated workflow in place: +1. Automation starts every Friday, midnight +1. It gets from Google Calendar information about all the meetings scheduled for upcomming week +1. It schedules a MailChipm campaign to send email with list of meetings. It is sent on Friday at 11AM in subscriber's time zone + +### Where can I find AsyncAPI calendar? + +- [Main link to calendar](https://calendar.google.com/calendar/embed?src=c_q9tseiglomdsj6njuhvbpts11c%40group.calendar.google.com&ctz=UTC) +- [iCal/ics file](https://calendar.google.com/calendar/ical/c_q9tseiglomdsj6njuhvbpts11c%40group.calendar.google.com/public/basic.ics) + +### How to cancel the meeting? + +If you scheduled a meeting but for some reason it needs to be canceled, just close the corresponding meeting issue. +We have an automated workflow in place: +1. Automation starts when GitHub issue is closed +1. It checks if closed issue represents a future event +1. It removes meeting from AsyncAPI Google Calendar + +### How to register a new regular meeting? + +Start [discussion in community repository](https://github.com/asyncapi/community/discussions). Explain the idea and justify why it requires separate meeting. At the moment we have [approval from Technical Steering Commitee](https://github.com/asyncapi/community/discussions/295) to pay for 8 Zoom licenses. + +Once new meeting is approved, add new workflow like [this one](.github/workflows/create-event-community-meeting.yml) and add a new GitHub issue template like [this one](.github/workflows/create-event-helpers/issues_templates/community.md). + + +### How to become a host? + +Once your `Regular` meeting got approved contact `Fran Mendez` so he can give you access to all required tools. \ No newline at end of file From 6f9ecfa7265de8cb8f9aeaeaf24a2a57cfcbde37 Mon Sep 17 00:00:00 2001 From: derberg Date: Thu, 31 Mar 2022 13:14:03 +0200 Subject: [PATCH 5/8] host responsibilities docs --- MEETINGS_ORGANIZATION.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/MEETINGS_ORGANIZATION.md b/MEETINGS_ORGANIZATION.md index 25f536ecd..1bc0aba49 100644 --- a/MEETINGS_ORGANIZATION.md +++ b/MEETINGS_ORGANIZATION.md @@ -9,6 +9,7 @@ To schedule a meeting you need to be: - GitHub Action workflow for `Ad Hoc` meeting scheduling should be updated. New licensed user should be added as alternative host. - a member of [GitHub team called meetings-organizars](https://github.com/orgs/asyncapi/teams/meetings-organizers). It is required because only maintainers of given repository can manually trigger GitHub Actions workflows. This group has `Maintain` role in `community` repository where meeting automation is implemented. - a member of a team in AsyncAPI Restream account. It is required because hosts, before they start streaming the meeting from Zoom, must login to Restream and modify the title of the stream that will show up in social platforms. +- a member of AsyncAPI YouTube account. It is required because hosts, after meeting is over, need to add live stream recording to proper YouTube Playlist to improve recording discoverability. ### What meetings do we have/ @@ -29,6 +30,21 @@ We have an automated workflow in place: 1. It creates a new Google Calendar entry with special metadata containing the GitHub issue number 1. It sends a tweet with information about newly scheduled event +### What are my responsibilities as meeting host? + +In case your meeting is Zoom-first, this is what you need to do to kick it off: +1. Start meeting by opening Zoom meeting. Make sure you are logged in to Zoom with your AsyncAPI licensed account. +1. In Zoom, click `Live Transcript` button to start transcripting the meeting. +1. Log into [Restream.io](https://app.restream.io/home) and select `Set up for OBS, Zoom, etc.` option. +1. Click `Update Titles` and set proper title for the live stream that correcponds with the meeting that you just started. +1. In Zoom, click `More` > `Live on Custom Live Stream Service` to start streaming to Restream, and therefore to official AsyncAPI social networks. + +> Some meetings like for example `Thinking Out Loud` live stream are not available on Zoom and community can only join live chat. Thus above instruncions do not apply to them. + +Once the meeting is over: +1. Provide in related GitHub Issue meeting notes and then close the issue. +1. Login to YouTube and add recorded live stream to respective YouTube Playlist. + ### How do I get notified about upcomming meetings? TODO: add missing link where folks can find subscription form From de0c64acce06cf4ce75664bc86ebf3b55244b33f Mon Sep 17 00:00:00 2001 From: Lukasz Gornicki Date: Tue, 5 Apr 2022 17:37:43 +0200 Subject: [PATCH 6/8] add newsletter link --- MEETINGS_ORGANIZATION.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/MEETINGS_ORGANIZATION.md b/MEETINGS_ORGANIZATION.md index 1bc0aba49..3fe91c0b1 100644 --- a/MEETINGS_ORGANIZATION.md +++ b/MEETINGS_ORGANIZATION.md @@ -47,8 +47,7 @@ Once the meeting is over: ### How do I get notified about upcomming meetings? -TODO: add missing link where folks can find subscription form -Subscribe to AsyncAPI Newsletter to get information about upcomming meetings. +Subscribe to [AsyncAPI Newsletter](https://asyncapi.com/newsletter) to get information about upcomming meetings. We have an automated workflow in place: 1. Automation starts every Friday, midnight @@ -77,4 +76,4 @@ Once new meeting is approved, add new workflow like [this one](.github/workflows ### How to become a host? -Once your `Regular` meeting got approved contact `Fran Mendez` so he can give you access to all required tools. \ No newline at end of file +Once your `Regular` meeting got approved contact `Fran Mendez` so he can give you access to all required tools. From d6e47c946f6ec8926af2e5196353a561c720d2bc Mon Sep 17 00:00:00 2001 From: Lukasz Gornicki Date: Thu, 7 Apr 2022 11:26:31 +0200 Subject: [PATCH 7/8] Apply suggestions from code review Co-authored-by: Alejandra Quetzalli --- .../issues_templates/ad-hoc.md | 2 +- .../issues_templates/community.md | 2 +- .../lets-talk-about-contrib.md | 2 +- .../issues_templates/spec-3-0.md | 2 +- .../issues_templates/thinking-out-loud.md | 2 +- MEETINGS_ORGANIZATION.md | 81 ++++++++++--------- 6 files changed, 46 insertions(+), 45 deletions(-) diff --git a/.github/workflows/create-event-helpers/issues_templates/ad-hoc.md b/.github/workflows/create-event-helpers/issues_templates/ad-hoc.md index 68def2d35..582a0d7e2 100644 --- a/.github/workflows/create-event-helpers/issues_templates/ad-hoc.md +++ b/.github/workflows/create-event-helpers/issues_templates/ad-hoc.md @@ -13,7 +13,7 @@ title: "{{ env.MEETING_NAME }}, {{ env.FULL_DATE | date('H:mm [UTC] dddd MMMM Do Time -{{ env.FULL_DATE | date('H') }}:00 UTC | Translate to your time zone with time zone converter. +{{ env.FULL_DATE | date('H') }}:00 UTC | Translate to your time zone with the time zone converter. Meeting Place diff --git a/.github/workflows/create-event-helpers/issues_templates/community.md b/.github/workflows/create-event-helpers/issues_templates/community.md index a362c3edb..a4bc30c49 100644 --- a/.github/workflows/create-event-helpers/issues_templates/community.md +++ b/.github/workflows/create-event-helpers/issues_templates/community.md @@ -13,7 +13,7 @@ title: "{{ env.MEETING_NAME }}, {{ env.FULL_DATE | date('H:mm [UTC] dddd MMMM Do Time -{{ env.FULL_DATE | date('H') }}:00 UTC | Translate to your time zone with time zone converter. +{{ env.FULL_DATE | date('H') }}:00 UTC | Translate to your time zone with the time zone converter. Meeting Place diff --git a/.github/workflows/create-event-helpers/issues_templates/lets-talk-about-contrib.md b/.github/workflows/create-event-helpers/issues_templates/lets-talk-about-contrib.md index 2b706efaf..37636c492 100644 --- a/.github/workflows/create-event-helpers/issues_templates/lets-talk-about-contrib.md +++ b/.github/workflows/create-event-helpers/issues_templates/lets-talk-about-contrib.md @@ -13,7 +13,7 @@ title: "{{ env.MEETING_NAME }}, {{ env.FULL_DATE | date('H:mm [UTC] dddd MMMM Do Time -{{ env.FULL_DATE | date('H') }}:00 UTC | Translate to your time zone with time zone converter. +{{ env.FULL_DATE | date('H') }}:00 UTC | Translate to your time zone with the time zone converter. Meeting Place diff --git a/.github/workflows/create-event-helpers/issues_templates/spec-3-0.md b/.github/workflows/create-event-helpers/issues_templates/spec-3-0.md index d94fed671..fc43a3bf9 100644 --- a/.github/workflows/create-event-helpers/issues_templates/spec-3-0.md +++ b/.github/workflows/create-event-helpers/issues_templates/spec-3-0.md @@ -13,7 +13,7 @@ title: "{{ env.MEETING_NAME }}, {{ env.FULL_DATE | date('H:mm [UTC] dddd MMMM Do Time -{{ env.FULL_DATE | date('H') }}:00 UTC | Translate to your time zone with time zone converter. +{{ env.FULL_DATE | date('H') }}:00 UTC | Translate to your time zone with the time zone converter. Meeting Place diff --git a/.github/workflows/create-event-helpers/issues_templates/thinking-out-loud.md b/.github/workflows/create-event-helpers/issues_templates/thinking-out-loud.md index bb5a77b6e..c75230f9e 100644 --- a/.github/workflows/create-event-helpers/issues_templates/thinking-out-loud.md +++ b/.github/workflows/create-event-helpers/issues_templates/thinking-out-loud.md @@ -17,7 +17,7 @@ title: "{{ env.MEETING_NAME }}, {{ env.FULL_DATE | date('H:mm [UTC] dddd MMMM Do Time -{{ env.FULL_DATE | date('H') }}:00 UTC | Translate to your time zone with time zone converter. +{{ env.FULL_DATE | date('H') }}:00 UTC | Translate to your time zone with the time zone converter. Meeting Place diff --git a/MEETINGS_ORGANIZATION.md b/MEETINGS_ORGANIZATION.md index 3fe91c0b1..b9d5f8776 100644 --- a/MEETINGS_ORGANIZATION.md +++ b/MEETINGS_ORGANIZATION.md @@ -2,78 +2,79 @@ This document covers the aspect of different meetings organization at AsyncAPI. ## FAQ -### What I need to schedule a meeting? +### What do I need to schedule a meeting? -To schedule a meeting you need to be: -- one of licensed Zoom users associated with AsyncAPI Zoom account. It is required because only licensed users can start meeting, live transcripts and streaming. -- GitHub Action workflow for `Ad Hoc` meeting scheduling should be updated. New licensed user should be added as alternative host. -- a member of [GitHub team called meetings-organizars](https://github.com/orgs/asyncapi/teams/meetings-organizers). It is required because only maintainers of given repository can manually trigger GitHub Actions workflows. This group has `Maintain` role in `community` repository where meeting automation is implemented. -- a member of a team in AsyncAPI Restream account. It is required because hosts, before they start streaming the meeting from Zoom, must login to Restream and modify the title of the stream that will show up in social platforms. -- a member of AsyncAPI YouTube account. It is required because hosts, after meeting is over, need to add live stream recording to proper YouTube Playlist to improve recording discoverability. +To schedule a meeting, you need to be: +- one of the licensed Zoom users associated with the AsyncAPI Zoom account. It is required because only licensed users can start meeting, live transcripts, and streaming. +- GitHub Action workflow for `Ad Hoc` meeting scheduling should be updated. Newly licensed users should be added as alternative hosts. +- a member of [GitHub team called meetings-organizars](https://github.com/orgs/asyncapi/teams/meetings-organizers). It is required because only maintainers of the given repository can manually trigger GitHub Actions workflows. This group has a `Maintain` role in the `community` repository where meeting automation is implemented. +- a member of a team in the AsyncAPI Restream account. It is required because hosts must log in to Restream before they start streaming the meeting from Zoom and modify the stream's title that will show up on social platforms. +- a member of the AsyncAPI YouTube account. It is required because after the meeting is over, hosts need to add live their stream recording to the proper YouTube Playlist to improve recording discoverability. -### What meetings do we have/ +### What meetings do we have? -* `Regular` meetings: meetings like `Community Meeting` or `Thinking Out Loud` that happen regularly, have their dedicated area of interest and own brand. -* `Ad Hoc` meetings: meetings for topic that do not match any `Regular` meeting and should be organized separately. Every official AsyncAPI Zoom licensed user should have right to schedule it. +* `Regular` meetings: regular meetings with a dedicated area of interest and individual brand (Examples: `Community Meeting` or `Thinking Out Loud`) +* `Ad Hoc` meetings: meetings for topics that do not match any **regular** meetings and should be organized separately. Every official AsyncAPI Zoom licensed user should have the right to schedule it. -### How to schedule new meeting? +### How do I schedule a new meeting? 1. Go to [**Actions** tab](https://github.com/asyncapi/community/actions) -1. Select one of the workflows that starts with **Schedule**. Choose the one that represents the meeting that you want to schedule -1. Click **Run workflow** button -1. Provide data required by the form and click another **Run workflow** button visible in the form +1. Select one of the workflows that start with **Schedule**. Choose one that represents the meeting you want to schedule. +1. Click the **Run workflow** button. +1. Provide data required by the form and click the **Run workflow** button within the form. We have an automated workflow in place: -1. Automation starts after clicking **Run workflow**. Unless there is another GitHub Actions outage and proper events are not delivered to automation :smiley: -1. It creates new meeting in Zoom. It is by default configured to support live streaming +1. Automation starts after clicking **Run workflow**. (Unless there is another GitHub Actions outage and proper events are not delivered to automation :smiley: ) +1. It creates a new meeting in Zoom. It is by default configured to support live streaming 1. It creates a GitHub issue with all details about the meeting 1. It creates a new Google Calendar entry with special metadata containing the GitHub issue number -1. It sends a tweet with information about newly scheduled event +1. It sends a tweet with information about a newly scheduled event ### What are my responsibilities as meeting host? In case your meeting is Zoom-first, this is what you need to do to kick it off: -1. Start meeting by opening Zoom meeting. Make sure you are logged in to Zoom with your AsyncAPI licensed account. -1. In Zoom, click `Live Transcript` button to start transcripting the meeting. +1. Start your meeting by opening a Zoom meeting. Make sure you are logged into Zoom with your AsyncAPI licensed account. +1. In Zoom, click the `Live Transcript` button to start transcribing the meeting. 1. Log into [Restream.io](https://app.restream.io/home) and select `Set up for OBS, Zoom, etc.` option. -1. Click `Update Titles` and set proper title for the live stream that correcponds with the meeting that you just started. -1. In Zoom, click `More` > `Live on Custom Live Stream Service` to start streaming to Restream, and therefore to official AsyncAPI social networks. +1. Click `Update Titles` and set the proper title for the live stream that corresponds with the meeting you just started. +1. In Zoom, click `More` > `Live on Custom Live Stream Service` to start streaming to Restream and, therefore, to official AsyncAPI social networks. -> Some meetings like for example `Thinking Out Loud` live stream are not available on Zoom and community can only join live chat. Thus above instruncions do not apply to them. +> Some meetings, such as the `Thinking Out Loud` live stream, are unavailable on Zoom. This means the community can only join via live chat. Thus, the above instructions do not apply to them. Once the meeting is over: -1. Provide in related GitHub Issue meeting notes and then close the issue. -1. Login to YouTube and add recorded live stream to respective YouTube Playlist. +1. Provide related GitHub Issue meeting notes and then close the issue. +1. Login to YouTube and add the recorded live stream to the respective YouTube Playlist. -### How do I get notified about upcomming meetings? +### How can I get notified about upcoming meetings? -Subscribe to [AsyncAPI Newsletter](https://asyncapi.com/newsletter) to get information about upcomming meetings. +Subscribe to the [AsyncAPI Newsletter](https://asyncapi.com/newsletter) to get information about upcoming meetings. We have an automated workflow in place: -1. Automation starts every Friday, midnight -1. It gets from Google Calendar information about all the meetings scheduled for upcomming week -1. It schedules a MailChipm campaign to send email with list of meetings. It is sent on Friday at 11AM in subscriber's time zone +1. Automation starts every Friday at midnight +1. It gets information from Google Calendar about all the meetings scheduled for the upcoming week +1. It schedules a MailChimp campaign to send emails with a list of meetings. It's sent on Friday at 11AM in the subscriber's time zone -### Where can I find AsyncAPI calendar? +### Where can I find the AsyncAPI calendar? - [Main link to calendar](https://calendar.google.com/calendar/embed?src=c_q9tseiglomdsj6njuhvbpts11c%40group.calendar.google.com&ctz=UTC) - [iCal/ics file](https://calendar.google.com/calendar/ical/c_q9tseiglomdsj6njuhvbpts11c%40group.calendar.google.com/public/basic.ics) -### How to cancel the meeting? +### How do I cancel a meeting? + +If you need to cancel a meeting, simply close the corresponding meeting issue. -If you scheduled a meeting but for some reason it needs to be canceled, just close the corresponding meeting issue. We have an automated workflow in place: -1. Automation starts when GitHub issue is closed -1. It checks if closed issue represents a future event -1. It removes meeting from AsyncAPI Google Calendar +1. Automation starts when the GitHub issue is closed +1. It checks if a closed issue represents a future event +1. It removes meetings from the AsyncAPI Google Calendar -### How to register a new regular meeting? +### How do I register a new regular meeting? -Start [discussion in community repository](https://github.com/asyncapi/community/discussions). Explain the idea and justify why it requires separate meeting. At the moment we have [approval from Technical Steering Commitee](https://github.com/asyncapi/community/discussions/295) to pay for 8 Zoom licenses. +Start [discussion in community repository](https://github.com/asyncapi/community/discussions). Explain the idea and justify why it requires a separate meeting. We currently have [approval from the Technical Steering Commitee](https://github.com/asyncapi/community/discussions/295) to pay for up to 8 Zoom licenses. -Once new meeting is approved, add new workflow like [this one](.github/workflows/create-event-community-meeting.yml) and add a new GitHub issue template like [this one](.github/workflows/create-event-helpers/issues_templates/community.md). +Once a new meeting is approved, add a [new workflow like this one](.github/workflows/create-event-community-meeting.yml) and a [new GitHub issue template like this one](.github/workflows/create-event-helpers/issues_templates/community.md). -### How to become a host? +### How can I become a host? -Once your `Regular` meeting got approved contact `Fran Mendez` so he can give you access to all required tools. +Once your `Regular` meeting gets approved, contact `Fran Mendez` so that he can give you access to all required tools. From 4fc8a8bfd57bd31e0f362ca579072f77b43f7ae0 Mon Sep 17 00:00:00 2001 From: derberg Date: Fri, 8 Apr 2022 10:29:30 +0200 Subject: [PATCH 8/8] added info about notes --- .../workflows/create-event-helpers/issues_templates/ad-hoc.md | 2 +- .../create-event-helpers/issues_templates/community.md | 2 +- .../workflows/create-event-helpers/issues_templates/spec-3-0.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/create-event-helpers/issues_templates/ad-hoc.md b/.github/workflows/create-event-helpers/issues_templates/ad-hoc.md index 582a0d7e2..22ec7cad7 100644 --- a/.github/workflows/create-event-helpers/issues_templates/ad-hoc.md +++ b/.github/workflows/create-event-helpers/issues_templates/ad-hoc.md @@ -72,4 +72,4 @@ title: "{{ env.MEETING_NAME }}, {{ env.FULL_DATE | date('H:mm [UTC] dddd MMMM Do ## Notes -tbd +_Add notes here after the meeting._ diff --git a/.github/workflows/create-event-helpers/issues_templates/community.md b/.github/workflows/create-event-helpers/issues_templates/community.md index a4bc30c49..437296d7e 100644 --- a/.github/workflows/create-event-helpers/issues_templates/community.md +++ b/.github/workflows/create-event-helpers/issues_templates/community.md @@ -72,4 +72,4 @@ title: "{{ env.MEETING_NAME }}, {{ env.FULL_DATE | date('H:mm [UTC] dddd MMMM Do ## Notes -tbd \ No newline at end of file +_Add notes here after the meeting._ \ No newline at end of file diff --git a/.github/workflows/create-event-helpers/issues_templates/spec-3-0.md b/.github/workflows/create-event-helpers/issues_templates/spec-3-0.md index fc43a3bf9..1b0d8f78d 100644 --- a/.github/workflows/create-event-helpers/issues_templates/spec-3-0.md +++ b/.github/workflows/create-event-helpers/issues_templates/spec-3-0.md @@ -71,4 +71,4 @@ title: "{{ env.MEETING_NAME }}, {{ env.FULL_DATE | date('H:mm [UTC] dddd MMMM Do ## Notes -tbd \ No newline at end of file +_Add notes here after the meeting._ \ No newline at end of file