Skip to content

Commit fda8ee2

Browse files
authored
Merge pull request #1800 from OneSignal/user_model/copy_actions_from_main
[ User model] Adding zapier, release-drafter, and response time actions
2 parents b8441cc + 5fd6dfb commit fda8ee2

File tree

6 files changed

+237
-0
lines changed

6 files changed

+237
-0
lines changed

.github/os_probot_metadata.js

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
/**
2+
* Based on probot-metadata - https://github.com/probot/metadata
3+
*/
4+
const regex = /\n\n<!-- probot = (.*) -->/
5+
6+
const { Octokit } = require("@octokit/action")
7+
8+
const octokit = new Octokit()
9+
10+
module.exports = (context, issue = null) => {
11+
console.log(context)
12+
const prefix = "onesignal-probot"
13+
14+
if (!issue) issue = context.payload.issue
15+
16+
return {
17+
async get (key = null) {
18+
let body = issue.body
19+
20+
if (!body) {
21+
body = (await octokit.issues.get(issue)).data.body || ''
22+
}
23+
24+
const match = body.match(regex)
25+
26+
if (match) {
27+
const data = JSON.parse(match[1])[prefix]
28+
return key ? data && data[key] : data
29+
}
30+
},
31+
32+
async set (key, value) {
33+
let body = issue.body
34+
let data = {}
35+
36+
if (!body) body = (await octokit.issues.get(issue)).data.body || ''
37+
38+
body = body.replace(regex, (_, json) => {
39+
data = JSON.parse(json)
40+
return ''
41+
})
42+
43+
if (!data[prefix]) data[prefix] = {}
44+
45+
if (typeof key === 'object') {
46+
Object.assign(data[prefix], key)
47+
} else {
48+
data[prefix][key] = value
49+
}
50+
51+
body = `${body}\n\n<!-- probot = ${JSON.stringify(data)} -->`
52+
53+
const [owner, repo] = process.env.GITHUB_REPOSITORY.split("/")
54+
const issue_number = context.payload.issue.number
55+
return octokit.issues.update({ owner, repo, issue_number, body })
56+
}
57+
}
58+
}

.github/release-drafter.yml

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
name-template: $RESOLVED_VERSION
2+
tag-template: $RESOLVED_VERSION
3+
categories:
4+
- title: 🚀 Features
5+
label: Enhancement / Feature
6+
- title: 🐛 Bug Fixes
7+
label: Bug
8+
- title: 🧰 Improvements
9+
label: Improvement
10+
change-template: '- $TITLE (#$NUMBER)'
11+
version-resolver:
12+
major:
13+
labels:
14+
- 'major'
15+
minor:
16+
labels:
17+
- 'minor'
18+
patch:
19+
labels:
20+
- 'patch'
21+
default: patch
22+
template: |
23+
## Other Changes
24+
25+
$CHANGES

.github/set_response_times.js

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
function calcResponseTimeForIssueCreatedAt(createdAt) {
2+
const issueOpenedDate = new Date(createdAt);
3+
const issueTriagedDate = new Date();
4+
const businessDaysResponseTime = calcBusinessDaysBetweenDates(issueOpenedDate, issueTriagedDate);
5+
return businessDaysResponseTime;
6+
}
7+
8+
function calcBusinessDaysBetweenDates(openedDate, triagedDate) {
9+
let differenceInWeeks, responseTime;
10+
if (triagedDate < openedDate)
11+
return -1; // error code if dates transposed
12+
let openedDay = openedDate.getDay(); // day of week
13+
let triagedDay = triagedDate.getDay();
14+
openedDay = (openedDay == 0) ? 7 : openedDay; // change Sunday from 0 to 7
15+
triagedDay = (triagedDay == 0) ? 7 : triagedDay;
16+
openedDay = (openedDay > 5) ? 5 : openedDay; // only count weekdays
17+
triagedDay = (triagedDay > 5) ? 5 : triagedDay;
18+
// calculate differnece in weeks (1000mS * 60sec * 60min * 24hrs * 7 days = 604800000)
19+
differenceInWeeks = Math.floor((triagedDate.getTime() - openedDate.getTime()) / 604800000);
20+
if (openedDay < triagedDay) { //Equal to makes it reduce 5 days
21+
responseTime = (differenceInWeeks * 5) + (triagedDay - openedDay);
22+
}
23+
else if (openedDay == triagedDay) {
24+
responseTime = differenceInWeeks * 5;
25+
}
26+
else {
27+
responseTime = ((differenceInWeeks + 1) * 5) - (openedDay - triagedDay);
28+
}
29+
return (responseTime);
30+
}
31+
32+
module.exports = async(context, osmetadata) => {
33+
const foundResponseTime = await osmetadata(context).get('response_time_in_business_days');
34+
if (foundResponseTime) {
35+
const foundString = "already found response time in business days: " + foundResponseTime
36+
console.log(foundString);
37+
return foundString;
38+
}
39+
if (context.payload.comment && context.payload.comment.author_association != "MEMBER" && context.payload.comment.author_association != "OWNER" && context.payload.comment.author_association != "CONTRIBUTOR") {
40+
return;
41+
}
42+
const businessDaysResponseTime = calcResponseTimeForIssueCreatedAt(context.payload.issue.created_at);
43+
console.log("response time in business days: " + businessDaysResponseTime);
44+
const result = osmetadata(context, context.payload.issue).set('response_time_in_business_days', businessDaysResponseTime)
45+
console.log("osmetadata update result: " + result);
46+
return "set response time in business days: " + businessDaysResponseTime;
47+
}

.github/workflows/Zapier.yml

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# This is an action to close asana tasks that were generated by Github issues
2+
3+
name: Zapier web hook
4+
5+
# Controls when the workflow will run
6+
on:
7+
# Triggers the workflow on push or pull request events but only for the "main" branch
8+
issues:
9+
types: [closed]
10+
11+
permissions:
12+
issues: read
13+
14+
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
15+
jobs:
16+
# This workflow contains a single job called "build"
17+
build:
18+
# The type of runner that the job will run on
19+
runs-on: ubuntu-latest
20+
21+
# Steps represent a sequence of tasks that will be executed as part of the job
22+
steps:
23+
# Runs a set of commands using the runners shell
24+
- name: Call Zapier web hook to close Asana task
25+
if: ${{ !github.event.issue.pull_request }}
26+
env:
27+
ISSUE_TITLE: ${{ github.event.issue.title }}
28+
run: |
29+
curl --location --request POST 'https://hooks.zapier.com/hooks/catch/12728683/b7009qc/' \
30+
--header 'Content-Type: application/json' \
31+
--header 'Accept: application/json' \
32+
--data-raw '{
33+
"task_name" : "$ISSUE_TITLE"
34+
}'

.github/workflows/release-drafter.yml

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
name: Release Drafter
2+
3+
on:
4+
push:
5+
# branches to consider in the event; optional, defaults to all
6+
branches:
7+
- main
8+
# pull_request event is required only for autolabeler
9+
pull_request:
10+
# Only following types are handled by the action, but one can default to all as well
11+
types: [opened, reopened, synchronize]
12+
# pull_request_target event is required for autolabeler to support PRs from forks
13+
# pull_request_target:
14+
# types: [opened, reopened, synchronize]
15+
16+
permissions:
17+
contents: read
18+
19+
jobs:
20+
update_release_draft:
21+
permissions:
22+
# write permission is required to create a github release
23+
contents: write
24+
# write permission is required for autolabeler
25+
# otherwise, read permission is required at least
26+
pull-requests: write
27+
runs-on: ubuntu-latest
28+
steps:
29+
# (Optional) GitHub Enterprise requires GHE_HOST variable set
30+
#- name: Set GHE_HOST
31+
# run: |
32+
# echo "GHE_HOST=${GITHUB_SERVER_URL##https:\/\/}" >> $GITHUB_ENV
33+
34+
# Drafts your next Release notes as Pull Requests are merged into "master"
35+
- uses: release-drafter/release-drafter@v5
36+
# (Optional) specify config name to use, relative to .github/. Default: release-drafter.yml
37+
# with:
38+
# config-name: my-config.yml
39+
# disable-autolabeler: true
40+
env:
41+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
name: Set Response Time
2+
on:
3+
issue_comment:
4+
types:
5+
- created
6+
issues:
7+
types:
8+
- closed
9+
jobs:
10+
calculate:
11+
name: set reponse time for the issue
12+
if: github.event.issue.pull_request == null
13+
runs-on: ubuntu-latest
14+
permissions:
15+
issues: write
16+
steps:
17+
- uses: actions/checkout@v3
18+
with:
19+
token: ${{ secrets.GITHUB_TOKEN }}
20+
- run: npm install @octokit/action
21+
- uses: actions/github-script@v6
22+
id: set-time
23+
with:
24+
result-encoding: string
25+
script: |
26+
const os_probot_metadata = require('./.github/os_probot_metadata.js')
27+
const set_response_time = require('./.github/set_response_times.js')
28+
return await set_response_time(context, os_probot_metadata)
29+
env:
30+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
31+
- name: Get result
32+
run: echo "${{steps.set-time.outputs.result}}" >> $GITHUB_STEP_SUMMARY

0 commit comments

Comments
 (0)