Skip to content

9 -> 11: Import time table from CSV and Validation #80

9 -> 11: Import time table from CSV and Validation

9 -> 11: Import time table from CSV and Validation #80

name: Issue Management
on:
issue_comment:
types: [created]
issues:
types: [opened, closed, reopened]
jobs:
handle_issue_commands:
if: github.event_name == 'issue_comment'
runs-on: ubuntu-latest
permissions:
issues: write
contents: read
steps:
- name: Handle /assign command
if: contains(github.event.comment.body, '/assign')
uses: actions/github-script@v7
with:
script: |
const commenter = context.payload.comment.user.login;
// Get issue details
const { data: issue } = await github.rest.issues.get({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number
});
// Check if issue is already assigned
if (issue.assignees.length > 0) {
const assignees = issue.assignees.map(a => a.login).join(', ');
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
body: `❌ This issue is already assigned to: ${assignees}`
});
return;
}
// Check if issue has "active" label
const hasActiveLabel = issue.labels.some(label =>
label.name.toLowerCase() === 'active'
);
if (!hasActiveLabel) {
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
body: `❌ This issue is not available for assignment. It must have the "active" label.`
});
return;
}
// Assign the issue
await github.rest.issues.addAssignees({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
assignees: [commenter]
});
// Add in-progress label
const currentLabels = issue.labels.map(label => label.name);
const newLabels = [...currentLabels.filter(label => label !== 'active'), 'in-progress'];
await github.rest.issues.setLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
labels: newLabels
});
// Confirmation comment
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
body: `✅ Issue assigned to @${commenter}!\n\n**Next steps:**\n1. Read our [Contributing Guidelines](.github/CONTRIBUTING.md)\n2. Check for any issue dependencies in the issue description\n3. Set up your development environment using [SETUP.md](.github/SETUP.md)\n4. Create a branch: \`git checkout -b feature/#${context.issue.number}\`\n5. Start working on the issue!\n\n**Remember:** Please close this issue after your PR is successfully merged.\n\nGood luck! 🚀`
});
- name: Handle /unassign command
if: contains(github.event.comment.body, '/unassign')
uses: actions/github-script@v7
with:
script: |
const commenter = context.payload.comment.user.login;
// Get issue details
const { data: issue } = await github.rest.issues.get({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number
});
// Check if commenter is assigned to the issue or is a collaborator
const isAssigned = issue.assignees.some(assignee => assignee.login === commenter);
let isCollaborator = false;
try {
await github.rest.repos.checkCollaborator({
owner: context.repo.owner,
repo: context.repo.repo,
username: commenter
});
isCollaborator = true;
} catch (error) {
isCollaborator = false;
}
if (!isAssigned && !isCollaborator) {
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
body: `❌ Only the assigned person or a collaborator can unassign this issue.`
});
return;
}
// Remove all assignees
await github.rest.issues.removeAssignees({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
assignees: issue.assignees.map(a => a.login)
});
// Update labels: remove in-progress, add active
const currentLabels = issue.labels.map(label => label.name);
const newLabels = [...currentLabels.filter(label => label !== 'in-progress'), 'active'];
await github.rest.issues.setLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
labels: newLabels
});
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
body: `✅ Issue unassigned and is now available for assignment.\n\nAnyone can comment \`/assign\` to take this issue.`
});
auto_label_new_issues:
if: github.event.action == 'opened' && github.event_name == 'issues'
runs-on: ubuntu-latest
permissions:
issues: write
contents: read
steps:
- name: Add active label to new issues
uses: actions/github-script@v7
with:
script: |
// Add active label to new issues
await github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
labels: ['active']
});
// Welcome comment
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
body: `👋 Thanks for opening this issue!\n\n**For contributors:**\n- Comment \`/assign\` to assign this issue to yourself\n- Read our [Contributing Guidelines](.github/CONTRIBUTING.md) before starting\n- Check the issue description for any dependencies\n\n**For maintainers:**\n- Review and add appropriate labels\n- Ensure issue has sufficient detail\n- Check for duplicates\n\nHappy coding! 🚀`
});