Create GitHub Discussions #1
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Create GitHub Discussions | |
on: | |
pull_request: | |
types: [opened] | |
paths: | |
- 'src/content/apps/**' | |
# Allow manual trigger to create discussions for existing apps | |
workflow_dispatch: | |
inputs: | |
createForExisting: | |
description: 'Create discussions for existing apps' | |
required: true | |
default: 'true' | |
type: boolean | |
jobs: | |
create-discussion: | |
runs-on: ubuntu-latest | |
permissions: | |
discussions: write | |
pull-requests: read | |
contents: read | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Create Discussion for PR | |
if: github.event_name == 'pull_request' | |
uses: actions/github-script@v7 | |
with: | |
script: | | |
const fs = require('fs'); | |
const path = require('path'); | |
// Get the changed files from the PR | |
const { data: files } = await github.rest.pulls.listFiles({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
pull_number: context.issue.number | |
}); | |
// Find new app submissions | |
const appFiles = files.filter(file => | |
file.status === 'added' && | |
file.filename.startsWith('src/content/apps/') && | |
!file.filename.endsWith('_template.md') | |
); | |
for (const file of appFiles) { | |
const content = Buffer.from((await github.rest.repos.getContent({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
path: file.filename, | |
ref: context.payload.pull_request.head.sha | |
})).data.content, 'base64').toString(); | |
await createDiscussion(content); | |
} | |
- name: Create Discussions for Existing Apps | |
if: github.event_name == 'workflow_dispatch' && inputs.createForExisting | |
uses: actions/github-script@v7 | |
with: | |
script: | | |
const fs = require('fs'); | |
const path = require('path'); | |
const yaml = require('js-yaml'); | |
// Get all existing app files | |
const appsDir = 'src/content/apps'; | |
const files = fs.readdirSync(appsDir) | |
.filter(file => file.endsWith('.md') && file !== '_template.md'); | |
for (const file of files) { | |
const content = fs.readFileSync(path.join(appsDir, file), 'utf8'); | |
await createDiscussion(content); | |
} | |
async function createDiscussion(content) { | |
// Parse the frontmatter | |
const frontmatter = content.split('---')[1]; | |
const appData = yaml.load(frontmatter); | |
// Check if discussion already exists | |
const { data: discussions } = await github.rest.discussions.list({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
category_id: process.env.DISCUSSION_CATEGORY_ID | |
}); | |
const existingDiscussion = discussions.find(d => | |
d.title === `Vote: ${appData.name} by ${appData.author}` | |
); | |
if (!existingDiscussion) { | |
// Create a discussion | |
await github.rest.discussions.create({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
title: `Vote: ${appData.name} by ${appData.author}`, | |
body: `🗳️ **Vote for this app by giving it a 👍 reaction!**\n\n${appData.description}`, | |
category_id: process.env.DISCUSSION_CATEGORY_ID | |
}); | |
console.log(`Created discussion for ${appData.name}`); | |
} else { | |
console.log(`Discussion already exists for ${appData.name}`); | |
} | |
} |