9 -> 11: Import time table from CSV and Validation #80
This file contains hidden or 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: 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! 🚀` | |
| }); |