Skip to content

Create GitHub Discussions #1

Create GitHub Discussions

Create GitHub Discussions #1

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}`);
}
}