Skip to content

Commit

Permalink
chore: Move to components
Browse files Browse the repository at this point in the history
  • Loading branch information
Al-Dani committed Mar 25, 2024
1 parent 32b4401 commit bf153c0
Show file tree
Hide file tree
Showing 4 changed files with 142 additions and 4 deletions.
12 changes: 12 additions & 0 deletions .github/workflows/lock-discussion/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
node_modules

# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
100 changes: 100 additions & 0 deletions .github/workflows/lock-discussion/index.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
//import fetch from "node-fetch";
import { graphql } from "@octokit/graphql"
//global.fetch = fetch;

const graphqlWithAuth = graphql.defaults({
headers: {
authorization: process.env.TOKEN,
},
});

async function lockDiscussions(ids) {
for (let discussionId of ids) {
try {
await graphqlWithAuth(
`
mutation lock ($id: ID!) {
lockLockable(input:{lockableId: $id}) {
clientMutationId
}
}
`,
{
id: discussionId,
}
);
} catch (e) {
console.log(e);
}
}
}

async function main () {
const unlockedNodes = []
const oneDay = 1000 * 60 * 60 * 24; // one day in ms
const today = new Date();
let readDiscussions = true
let cursor = null
while (readDiscussions) {
const {repository} = await graphqlWithAuth(`
query discussionListQuery ($owner: String!, $repo: String!, $lastId: String) {
repository(owner:$owner, name:$repo) {
discussions(states:[OPEN], first:4, after: $lastId) {
totalCount
nodes {
id
answerChosenAt
createdAt
updatedAt
locked
title
category {
name
}
}
pageInfo {
endCursor
hasNextPage
}
}
}
}
`, {
owner: "cloudscape-design",
repo: "components",
lastId: cursor,
});

repository.discussions.nodes.forEach(discussion => {
if (!discussion.locked) {
const isQA = discussion.category.name === 'Q&A'
const lockQA = !!discussion.answerChosenAt
&& (today - new Date(discussion.answerChosenAt).getTime()) / oneDay > 7

// there is no reliable way to detect if it was answered,
// so we give it 2 weeks
const lockGeneral = !!discussion.updatedAt
&& discussion.updatedAt !== discussion.createdAt
&& (today - new Date(discussion.updatedAt).getTime()) / oneDay > 14

const shouldBeLocked = isQA ? lockQA : lockGeneral;
if (shouldBeLocked) {
unlockedNodes.push(discussion.id)
}
}
})
const {endCursor, hasNextPage} = repository.discussions.pageInfo;
readDiscussions = hasNextPage
cursor = endCursor
}

console.log(`Discussions to lock: ${unlockedNodes.length}`);
if (unlockedNodes.length) {
await lockDiscussions(unlockedNodes);
}
console.log('Locking completed');
}

main();
18 changes: 18 additions & 0 deletions .github/workflows/lock-discussion/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"name": "lock-discussion",
"version": "1.0.0",
"description": "",
"main": "index.mjs",
"type": "module",
"scripts": {
"lock": "node index.mjs $TOKEN"
},
"repository": {
"type": "git",
"url": "https://github.com/cloudscape-design/actions.git"
},
"private": true,
"dependencies": {
"@octokit/graphql": "^7.0.2"
}
}
16 changes: 12 additions & 4 deletions .github/workflows/lock.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ name: Lock threads

on:
schedule:
- cron: '0 0 * * *'
- cron: '0 0 * * 1'

workflow_dispatch:
pull_request:
Expand All @@ -16,6 +16,14 @@ permissions:
jobs:
lock-discussion:
secrets: inherit
uses: cloudscape-design/actions/.github/workflows/lock.yml@lock-discussion
with:
repository: 'components'
steps:
- name: Setup lock-discussion project
run: |
cp -r actions/.github/workflows/lock-discussion lock-discussion
cd lock-discussion
npm i --force
- name: Run lock discussion
run: |
cd lock-discussion
npm run lock --TOKEN=${{ secrets.GITHUB_TOKEN }}

0 comments on commit bf153c0

Please sign in to comment.