diff --git a/backend/Makefile b/backend/Makefile
index a16919b6b8..b90a437e3c 100644
--- a/backend/Makefile
+++ b/backend/Makefile
@@ -250,4 +250,5 @@ update-data: \
owasp-update-events \
owasp-sync-posts \
owasp-update-sponsors \
- slack-sync-data
+ slack-sync-data \
+ slack-match-channels
diff --git a/backend/apps/owasp/api/internal/nodes/common.py b/backend/apps/owasp/api/internal/nodes/common.py
index 2a631800f6..3bb5e7610f 100644
--- a/backend/apps/owasp/api/internal/nodes/common.py
+++ b/backend/apps/owasp/api/internal/nodes/common.py
@@ -2,9 +2,21 @@
import strawberry
import strawberry_django
+from django.contrib.contenttypes.prefetch import GenericPrefetch
+from django.db.models import Prefetch
from apps.github.api.internal.nodes.repository_contributor import RepositoryContributorNode
+from apps.owasp.api.internal.nodes.entity_channel import EntityChannelNode
from apps.owasp.api.internal.nodes.entity_member import EntityMemberNode
+from apps.owasp.models.entity_channel import EntityChannel
+from apps.slack.models.conversation import Conversation
+
+ENTITY_CHANNELS_PREFETCH = Prefetch(
+ "entity_channels",
+ queryset=EntityChannel.objects.filter(is_active=True).prefetch_related(
+ GenericPrefetch("channel", [Conversation.objects.all()]),
+ ),
+)
@strawberry.type
@@ -16,6 +28,11 @@ def entity_leaders(self, root) -> list[EntityMemberNode]:
"""Resolve entity leaders."""
return root.entity_leaders
+ @strawberry_django.field(prefetch_related=[ENTITY_CHANNELS_PREFETCH])
+ def entity_channels(self, root) -> list[EntityChannelNode]:
+ """Resolve entity channels."""
+ return list(root.entity_channels.all())
+
@strawberry_django.field
def leaders(self, root) -> list[str]:
"""Resolve leaders."""
diff --git a/backend/apps/owasp/api/internal/nodes/entity_channel.py b/backend/apps/owasp/api/internal/nodes/entity_channel.py
new file mode 100644
index 0000000000..2fc9510bde
--- /dev/null
+++ b/backend/apps/owasp/api/internal/nodes/entity_channel.py
@@ -0,0 +1,31 @@
+"""OWASP app entity channel GraphQL node."""
+
+import strawberry
+import strawberry_django
+
+from apps.owasp.models.entity_channel import EntityChannel
+
+
+@strawberry_django.type(
+ EntityChannel,
+ fields=[
+ "is_active",
+ "is_default",
+ "is_reviewed",
+ "platform",
+ ],
+)
+class EntityChannelNode(strawberry.relay.Node):
+ """Entity channel node."""
+
+ @strawberry_django.field
+ def name(self, root: EntityChannel) -> str:
+ """Channel display name from the linked Slack Conversation."""
+ conv = root.channel
+ return conv.name if conv else ""
+
+ @strawberry_django.field
+ def slack_channel_id(self, root: EntityChannel) -> str:
+ """Slack channel ID for linking (e.g. C123ABC)."""
+ conv = root.channel
+ return conv.slack_channel_id if conv else ""
diff --git a/backend/apps/owasp/models/common.py b/backend/apps/owasp/models/common.py
index cfbf815cff..9e10659553 100644
--- a/backend/apps/owasp/models/common.py
+++ b/backend/apps/owasp/models/common.py
@@ -20,6 +20,7 @@
GITHUB_USER_RE,
)
from apps.github.utils import get_repository_file_content
+from apps.owasp.models.entity_channel import EntityChannel
from apps.owasp.models.entity_member import EntityMember
from apps.owasp.models.enums.project import AudienceChoices
@@ -100,6 +101,13 @@ class Meta:
related_query_name="entity_member",
)
+ entity_channels = GenericRelation(
+ EntityChannel,
+ content_type_field="entity_type",
+ object_id_field="entity_id",
+ related_query_name="entity_channel",
+ )
+
@cached_property
def entity_leaders(self) -> list[EntityMember]:
"""Return entity's leaders."""
diff --git a/backend/apps/slack/Makefile b/backend/apps/slack/Makefile
index 1ed9e78328..fb63d4284f 100644
--- a/backend/apps/slack/Makefile
+++ b/backend/apps/slack/Makefile
@@ -15,6 +15,10 @@ slack-set-conversation-sync-messages-flags:
@echo "Setting conversation sync messages flags"
@CMD="python manage.py slack_set_conversation_sync_messages_flags" $(MAKE) exec-backend-command
+slack-match-channels:
+ @echo "Matching Slack channels to OWASP chapters, committees, and projects"
+ @CMD="python manage.py owasp_match_channels" $(MAKE) exec-backend-command
+
slack-sync-data:
@echo "Syncing Slack data"
@CMD="python manage.py slack_sync_data" $(MAKE) exec-backend-command
diff --git a/backend/tests/apps/owasp/api/internal/nodes/common_test.py b/backend/tests/apps/owasp/api/internal/nodes/common_test.py
index 2d446b3aff..52ec2bebad 100644
--- a/backend/tests/apps/owasp/api/internal/nodes/common_test.py
+++ b/backend/tests/apps/owasp/api/internal/nodes/common_test.py
@@ -19,6 +19,19 @@ def test_entity_leaders_resolver(self):
assert result == [mock_leader1, mock_leader2]
+ def test_entity_channels_resolver_uses_prefetched_all(self):
+ """Test entity_channels resolver consumes prefetched relation via .all()."""
+ mock_entity = Mock()
+ mock_channels_manager = Mock()
+ mock_channel = Mock()
+ mock_channels_manager.all.return_value = [mock_channel]
+ mock_entity.entity_channels = mock_channels_manager
+
+ result = GenericEntityNode.entity_channels(None, mock_entity)
+
+ mock_channels_manager.all.assert_called_once()
+ assert result == [mock_channel]
+
def test_leaders_resolver(self):
"""Test leaders returns indexed leaders list."""
mock_entity = Mock()
diff --git a/backend/tests/apps/owasp/api/internal/nodes/entity_channel_test.py b/backend/tests/apps/owasp/api/internal/nodes/entity_channel_test.py
new file mode 100644
index 0000000000..2d087f5a1e
--- /dev/null
+++ b/backend/tests/apps/owasp/api/internal/nodes/entity_channel_test.py
@@ -0,0 +1,44 @@
+"""Tests for EntityChannel GraphQL node resolvers."""
+
+from unittest.mock import Mock
+
+from apps.owasp.api.internal.nodes.entity_channel import EntityChannelNode
+
+
+class TestEntityChannelNodeResolvers:
+ def _get_resolver(self, field_name):
+ """Get the resolver function for a field."""
+ for field in EntityChannelNode.__strawberry_definition__.fields:
+ if field.name == field_name:
+ return field.base_resolver.wrapped_func if field.base_resolver else None
+ return None
+
+ def test_name_and_slack_channel_id_resolvers_return_values_from_channel(self):
+ """Return channel name and slack channel id when channel is present."""
+ mock_channel = Mock(name="mock-conversation")
+ mock_channel.name = "chapter-general"
+ mock_channel.slack_channel_id = "C123ABC"
+
+ mock_entity_channel = Mock()
+ mock_entity_channel.channel = mock_channel
+
+ name_resolver = self._get_resolver("name")
+ slack_channel_id_resolver = self._get_resolver("slack_channel_id")
+
+ assert name_resolver is not None
+ assert slack_channel_id_resolver is not None
+ assert name_resolver(None, mock_entity_channel) == "chapter-general"
+ assert slack_channel_id_resolver(None, mock_entity_channel) == "C123ABC"
+
+ def test_name_and_slack_channel_id_resolvers_return_empty_when_channel_missing(self):
+ """Return empty strings when no linked channel exists."""
+ mock_entity_channel = Mock()
+ mock_entity_channel.channel = None
+
+ name_resolver = self._get_resolver("name")
+ slack_channel_id_resolver = self._get_resolver("slack_channel_id")
+
+ assert name_resolver is not None
+ assert slack_channel_id_resolver is not None
+ assert name_resolver(None, mock_entity_channel) == ""
+ assert slack_channel_id_resolver(None, mock_entity_channel) == ""
diff --git a/frontend/__tests__/e2e/pages/ChapterDetails.spec.ts b/frontend/__tests__/e2e/pages/ChapterDetails.spec.ts
index 0811c41278..23f70f51d6 100644
--- a/frontend/__tests__/e2e/pages/ChapterDetails.spec.ts
+++ b/frontend/__tests__/e2e/pages/ChapterDetails.spec.ts
@@ -31,6 +31,13 @@ test.describe('Chapter Details Page', () => {
await expect(page.getByRole('link', { name: 'https://owasp.org/test-chapter' })).toBeVisible()
})
+ test('should have Slack channel link', async ({ page }) => {
+ const slackLink = page.getByRole('link', { name: 'chapter-test' })
+ await expect(slackLink).toBeVisible()
+ await expect(slackLink).toHaveAttribute('href', 'https://owasp.slack.com/archives/C123ABC')
+ await expect(slackLink).toHaveAttribute('target', '_blank')
+ })
+
test('should have map with geolocation', async ({ page }) => {
const unlockButton = page.getByRole('button', { name: 'Unlock map' })
await expect(unlockButton).toBeVisible()
diff --git a/frontend/__tests__/e2e/pages/ProjectDetails.spec.ts b/frontend/__tests__/e2e/pages/ProjectDetails.spec.ts
index d6d9b5baa2..f00ad02a66 100644
--- a/frontend/__tests__/e2e/pages/ProjectDetails.spec.ts
+++ b/frontend/__tests__/e2e/pages/ProjectDetails.spec.ts
@@ -37,6 +37,13 @@ test.describe('Project Details Page', () => {
await expect(page.getByText('URL: https://github.com/')).toBeVisible()
})
+ test('should have Slack channel link', async ({ page }) => {
+ const slackLink = page.getByRole('link', { name: '#project-security' })
+ await expect(slackLink).toBeVisible()
+ await expect(slackLink).toHaveAttribute('href', 'https://owasp.slack.com/archives/C456DEF')
+ await expect(slackLink).toHaveAttribute('target', '_blank')
+ })
+
test('should have project statics block', async ({ page }) => {
await expect(page.getByText('2.2K Stars')).toBeVisible()
await expect(page.getByText('10 Forks')).toBeVisible()
diff --git a/frontend/__tests__/mockData/mockChapterDetailsData.ts b/frontend/__tests__/mockData/mockChapterDetailsData.ts
index 067e7aaf67..bc89960f16 100644
--- a/frontend/__tests__/mockData/mockChapterDetailsData.ts
+++ b/frontend/__tests__/mockData/mockChapterDetailsData.ts
@@ -31,6 +31,12 @@ export const mockChapterDetailsData = {
},
},
],
+ entityChannels: [
+ {
+ name: 'chapter-test',
+ slackChannelId: 'C123ABC',
+ },
+ ],
establishedYear: 2020,
key: 'test-chapter',
},
diff --git a/frontend/__tests__/mockData/mockProjectDetailsData.ts b/frontend/__tests__/mockData/mockProjectDetailsData.ts
index fb21da8f27..14835f090c 100644
--- a/frontend/__tests__/mockData/mockProjectDetailsData.ts
+++ b/frontend/__tests__/mockData/mockProjectDetailsData.ts
@@ -13,6 +13,12 @@ export const mockProjectDetailsData = {
},
},
],
+ entityChannels: [
+ {
+ name: 'project-security',
+ slackChannelId: 'C456DEF',
+ },
+ ],
forksCount: 10,
healthMetricsList: [
{
diff --git a/frontend/__tests__/unit/pages/ChapterDetails.test.tsx b/frontend/__tests__/unit/pages/ChapterDetails.test.tsx
index 2d663ef00c..ac3811001d 100644
--- a/frontend/__tests__/unit/pages/ChapterDetails.test.tsx
+++ b/frontend/__tests__/unit/pages/ChapterDetails.test.tsx
@@ -110,6 +110,17 @@ describe('chapterDetailsPage Component', () => {
})
})
+ test('renders Slack channel link with expected Slack URL', async () => {
+ render()
+
+ await waitFor(() => {
+ const slackLink = screen.getByRole('link', { name: 'chapter-test' })
+ expect(slackLink).toHaveAttribute('href', 'https://owasp.slack.com/archives/C123ABC')
+ expect(slackLink).toHaveAttribute('target', '_blank')
+ expect(slackLink).toHaveAttribute('rel', 'noopener noreferrer')
+ })
+ })
+
test('handles contributors with missing names gracefully', async () => {
const chapterDataWithIncompleteContributors = {
...mockChapterDetailsData,
diff --git a/frontend/__tests__/unit/pages/ProjectDetails.test.tsx b/frontend/__tests__/unit/pages/ProjectDetails.test.tsx
index 7875b874ed..33a793d707 100644
--- a/frontend/__tests__/unit/pages/ProjectDetails.test.tsx
+++ b/frontend/__tests__/unit/pages/ProjectDetails.test.tsx
@@ -301,4 +301,15 @@ describe('ProjectDetailsPage', () => {
expect(screen.getByText('Project Leader')).toBeInTheDocument()
})
})
+
+ test('renders Slack channel link with expected Slack URL', async () => {
+ render()
+
+ await waitFor(() => {
+ const slackLink = screen.getByRole('link', { name: '#project-security' })
+ expect(slackLink).toHaveAttribute('href', 'https://owasp.slack.com/archives/C456DEF')
+ expect(slackLink).toHaveAttribute('target', '_blank')
+ expect(slackLink).toHaveAttribute('rel', 'noopener noreferrer')
+ })
+ })
})
diff --git a/frontend/src/app/chapters/[chapterKey]/page.tsx b/frontend/src/app/chapters/[chapterKey]/page.tsx
index 663ea1311a..85a277d0aa 100644
--- a/frontend/src/app/chapters/[chapterKey]/page.tsx
+++ b/frontend/src/app/chapters/[chapterKey]/page.tsx
@@ -55,6 +55,9 @@ export default function ChapterDetailsPage() {
)
}
+ const slackChannelUrl = (slackChannelId: string) =>
+ `https://owasp.slack.com/archives/${slackChannelId}`
+
const details = [
{ label: 'Last Updated', value: formatDate(chapter.updatedAt) },
{ label: 'Location', value: chapter.suggestedLocation ?? '' },
@@ -67,6 +70,28 @@ export default function ChapterDetailsPage() {
),
},
+ ...(chapter.entityChannels && chapter.entityChannels.length > 0
+ ? [
+ {
+ label: 'Slack',
+ value: (
+
+ {chapter.entityChannels.map((ch) => (
+
+ {ch.name}
+
+ ))}
+
+ ),
+ },
+ ]
+ : []),
]
const { startDate, endDate } = getDateRange({ years: 1 })
diff --git a/frontend/src/app/projects/[projectKey]/page.tsx b/frontend/src/app/projects/[projectKey]/page.tsx
index 456b060f16..6d84accfe4 100644
--- a/frontend/src/app/projects/[projectKey]/page.tsx
+++ b/frontend/src/app/projects/[projectKey]/page.tsx
@@ -62,6 +62,9 @@ const ProjectDetailsPage = () => {
/>
)
}
+ const slackChannelUrl = (slackChannelId: string) =>
+ `https://owasp.slack.com/archives/${slackChannelId}`
+
const projectDetails = [
{ label: 'Last Updated', value: formatDate(project.updatedAt) },
{ label: 'Leaders', value: project.leaders.join(', ') },
@@ -73,11 +76,33 @@ const ProjectDetailsPage = () => {
{
label: 'URL',
value: (
-
+
{project.url}
),
},
+ ...(project.entityChannels && project.entityChannels.length > 0
+ ? [
+ {
+ label: 'Slack',
+ value: (
+
+ {project.entityChannels.map((ch) => (
+
+ #{ch.name}
+
+ ))}
+
+ ),
+ },
+ ]
+ : []),
]
const projectStats = [
{ icon: FaStar, value: project.starsCount, unit: 'Star' },
diff --git a/frontend/src/server/queries/chapterQueries.ts b/frontend/src/server/queries/chapterQueries.ts
index ceeee6a7d2..d14f20c701 100644
--- a/frontend/src/server/queries/chapterQueries.ts
+++ b/frontend/src/server/queries/chapterQueries.ts
@@ -30,6 +30,10 @@ export const GET_CHAPTER_DATA = gql`
summary
updatedAt
url
+ entityChannels {
+ name
+ slackChannelId
+ }
}
topContributors(chapter: $key) {
id
diff --git a/frontend/src/server/queries/projectQueries.ts b/frontend/src/server/queries/projectQueries.ts
index 8d4c261519..9ed197bf54 100644
--- a/frontend/src/server/queries/projectQueries.ts
+++ b/frontend/src/server/queries/projectQueries.ts
@@ -92,6 +92,10 @@ export const GET_PROJECT_DATA = gql`
type
updatedAt
url
+ entityChannels {
+ name
+ slackChannelId
+ }
recentMilestones(limit: 5) {
author {
id
diff --git a/frontend/src/types/__generated__/chapterQueries.generated.ts b/frontend/src/types/__generated__/chapterQueries.generated.ts
index 2f8993c04a..d0fa6dfb46 100644
--- a/frontend/src/types/__generated__/chapterQueries.generated.ts
+++ b/frontend/src/types/__generated__/chapterQueries.generated.ts
@@ -6,7 +6,7 @@ export type GetChapterDataQueryVariables = Types.Exact<{
}>;
-export type GetChapterDataQuery = { chapter: { __typename: 'ChapterNode', contributionData: any, contributionStats: any | null, id: string, isActive: boolean, key: string, name: string, region: string, relatedUrls: Array, suggestedLocation: string | null, summary: string, updatedAt: number, url: string, entityLeaders: Array<{ __typename: 'EntityMemberNode', id: string, description: string, memberName: string, member: { __typename: 'UserNode', id: string, login: string, name: string, avatarUrl: string } | null }>, geoLocation: { __typename: 'GeoLocationType', lat: number, lng: number } | null } | null, topContributors: Array<{ __typename: 'RepositoryContributorNode', id: string, avatarUrl: string, login: string, name: string }> };
+export type GetChapterDataQuery = { chapter: { __typename: 'ChapterNode', contributionData: any, contributionStats: any | null, id: string, isActive: boolean, key: string, name: string, region: string, relatedUrls: Array, suggestedLocation: string | null, summary: string, updatedAt: number, url: string, entityLeaders: Array<{ __typename: 'EntityMemberNode', id: string, description: string, memberName: string, member: { __typename: 'UserNode', id: string, login: string, name: string, avatarUrl: string } | null }>, geoLocation: { __typename: 'GeoLocationType', lat: number, lng: number } | null, entityChannels: Array<{ __typename: 'EntityChannelNode', name: string, slackChannelId: string }> } | null, topContributors: Array<{ __typename: 'RepositoryContributorNode', id: string, avatarUrl: string, login: string, name: string }> };
export type GetChapterMetadataQueryVariables = Types.Exact<{
key: Types.Scalars['String']['input'];
@@ -16,5 +16,5 @@ export type GetChapterMetadataQueryVariables = Types.Exact<{
export type GetChapterMetadataQuery = { chapter: { __typename: 'ChapterNode', id: string, name: string, summary: string } | null };
-export const GetChapterDataDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetChapterData"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"key"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"chapter"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"key"},"value":{"kind":"Variable","name":{"kind":"Name","value":"key"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"contributionData"}},{"kind":"Field","name":{"kind":"Name","value":"contributionStats"}},{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"entityLeaders"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"memberName"}},{"kind":"Field","name":{"kind":"Name","value":"member"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"login"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"geoLocation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lat"}},{"kind":"Field","name":{"kind":"Name","value":"lng"}}]}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"region"}},{"kind":"Field","name":{"kind":"Name","value":"relatedUrls"}},{"kind":"Field","name":{"kind":"Name","value":"suggestedLocation"}},{"kind":"Field","name":{"kind":"Name","value":"summary"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"url"}}]}},{"kind":"Field","name":{"kind":"Name","value":"topContributors"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"chapter"},"value":{"kind":"Variable","name":{"kind":"Name","value":"key"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}},{"kind":"Field","name":{"kind":"Name","value":"login"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}}]} as unknown as DocumentNode;
+export const GetChapterDataDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetChapterData"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"key"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"chapter"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"key"},"value":{"kind":"Variable","name":{"kind":"Name","value":"key"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"contributionData"}},{"kind":"Field","name":{"kind":"Name","value":"contributionStats"}},{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"entityLeaders"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"memberName"}},{"kind":"Field","name":{"kind":"Name","value":"member"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"login"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"geoLocation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"lat"}},{"kind":"Field","name":{"kind":"Name","value":"lng"}}]}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"region"}},{"kind":"Field","name":{"kind":"Name","value":"relatedUrls"}},{"kind":"Field","name":{"kind":"Name","value":"suggestedLocation"}},{"kind":"Field","name":{"kind":"Name","value":"summary"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"url"}},{"kind":"Field","name":{"kind":"Name","value":"entityChannels"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"slackChannelId"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"topContributors"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"chapter"},"value":{"kind":"Variable","name":{"kind":"Name","value":"key"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}},{"kind":"Field","name":{"kind":"Name","value":"login"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}}]} as unknown as DocumentNode;
export const GetChapterMetadataDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetChapterMetadata"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"key"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"chapter"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"key"},"value":{"kind":"Variable","name":{"kind":"Name","value":"key"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"summary"}}]}}]}}]} as unknown as DocumentNode;
\ No newline at end of file
diff --git a/frontend/src/types/__generated__/graphql.ts b/frontend/src/types/__generated__/graphql.ts
index 9c6f090df2..be93843fad 100644
--- a/frontend/src/types/__generated__/graphql.ts
+++ b/frontend/src/types/__generated__/graphql.ts
@@ -72,6 +72,7 @@ export type ChapterNode = Node & {
contributionStats?: Maybe;
country: Scalars['String']['output'];
createdAt: Scalars['Float']['output'];
+ entityChannels: Array;
entityLeaders: Array;
geoLocation?: Maybe;
/** The Globally Unique ID of this object */
@@ -96,6 +97,7 @@ export type CommitteeNode = Node & {
__typename?: 'CommitteeNode';
contributorsCount: Scalars['Int']['output'];
createdAt?: Maybe;
+ entityChannels: Array;
entityLeaders: Array;
forksCount: Scalars['Int']['output'];
/** The Globally Unique ID of this object */
@@ -146,6 +148,18 @@ export type CreateProgramInput = {
tags?: Array;
};
+export type EntityChannelNode = Node & {
+ __typename?: 'EntityChannelNode';
+ /** The Globally Unique ID of this object */
+ id: Scalars['ID']['output'];
+ isActive: Scalars['Boolean']['output'];
+ isDefault: Scalars['Boolean']['output'];
+ isReviewed: Scalars['Boolean']['output'];
+ name: Scalars['String']['output'];
+ platform: Scalars['String']['output'];
+ slackChannelId: Scalars['String']['output'];
+};
+
export type EntityMemberNode = Node & {
__typename?: 'EntityMemberNode';
description: Scalars['String']['output'];
@@ -637,6 +651,7 @@ export type ProjectNode = Node & {
contributionStats?: Maybe;
contributorsCount: Scalars['Int']['output'];
createdAt?: Maybe;
+ entityChannels: Array;
entityLeaders: Array;
forksCount: Scalars['Int']['output'];
healthMetricsLatest?: Maybe;
diff --git a/frontend/src/types/__generated__/projectQueries.generated.ts b/frontend/src/types/__generated__/projectQueries.generated.ts
index 6f1e5cb5da..48cb19d2c7 100644
--- a/frontend/src/types/__generated__/projectQueries.generated.ts
+++ b/frontend/src/types/__generated__/projectQueries.generated.ts
@@ -6,7 +6,7 @@ export type GetProjectQueryVariables = Types.Exact<{
}>;
-export type GetProjectQuery = { project: { __typename: 'ProjectNode', contributionData: any | null, contributionStats: any | null, contributorsCount: number, forksCount: number, id: string, isActive: boolean, issuesCount: number, key: string, languages: Array, leaders: Array, level: string, name: string, repositoriesCount: number, starsCount: number, summary: string, topics: Array, type: string, updatedAt: number, url: string, entityLeaders: Array<{ __typename: 'EntityMemberNode', description: string, id: string, memberName: string, member: { __typename: 'UserNode', avatarUrl: string, id: string, login: string, name: string } | null }>, healthMetricsList: Array<{ __typename: 'ProjectHealthMetricsNode', id: string, createdAt: any, forksCount: number, lastCommitDays: number, lastCommitDaysRequirement: number, lastReleaseDays: number, lastReleaseDaysRequirement: number, openIssuesCount: number, openPullRequestsCount: number, score: number | null, starsCount: number, unassignedIssuesCount: number, unansweredIssuesCount: number }>, recentIssues: Array<{ __typename: 'IssueNode', createdAt: any, organizationName: string | null, repositoryName: string | null, title: string, url: string, author: { __typename: 'UserNode', id: string, avatarUrl: string, login: string, name: string, url: string } | null }>, recentReleases: Array<{ __typename: 'ReleaseNode', id: string, name: string, organizationName: string | null, publishedAt: any | null, repositoryName: string | null, tagName: string, url: string, author: { __typename: 'UserNode', id: string, avatarUrl: string, login: string, name: string } | null }>, repositories: Array<{ __typename: 'RepositoryNode', id: string, contributorsCount: number, forksCount: number, isArchived: boolean, key: string, name: string, openIssuesCount: number, starsCount: number, subscribersCount: number, url: string, organization: { __typename: 'OrganizationNode', login: string } | null }>, recentMilestones: Array<{ __typename: 'MilestoneNode', title: string, openIssuesCount: number, closedIssuesCount: number, repositoryName: string | null, organizationName: string | null, createdAt: any, url: string, author: { __typename: 'UserNode', id: string, avatarUrl: string, login: string, name: string } | null }>, recentPullRequests: Array<{ __typename: 'PullRequestNode', createdAt: any, organizationName: string | null, repositoryName: string | null, title: string, url: string, author: { __typename: 'UserNode', id: string, avatarUrl: string, login: string, name: string } | null }> } | null, topContributors: Array<{ __typename: 'RepositoryContributorNode', id: string, avatarUrl: string, login: string, name: string }> };
+export type GetProjectQuery = { project: { __typename: 'ProjectNode', contributionData: any | null, contributionStats: any | null, contributorsCount: number, forksCount: number, id: string, isActive: boolean, issuesCount: number, key: string, languages: Array, leaders: Array, level: string, name: string, repositoriesCount: number, starsCount: number, summary: string, topics: Array, type: string, updatedAt: number, url: string, entityLeaders: Array<{ __typename: 'EntityMemberNode', description: string, id: string, memberName: string, member: { __typename: 'UserNode', avatarUrl: string, id: string, login: string, name: string } | null }>, healthMetricsList: Array<{ __typename: 'ProjectHealthMetricsNode', id: string, createdAt: any, forksCount: number, lastCommitDays: number, lastCommitDaysRequirement: number, lastReleaseDays: number, lastReleaseDaysRequirement: number, openIssuesCount: number, openPullRequestsCount: number, score: number | null, starsCount: number, unassignedIssuesCount: number, unansweredIssuesCount: number }>, recentIssues: Array<{ __typename: 'IssueNode', createdAt: any, organizationName: string | null, repositoryName: string | null, title: string, url: string, author: { __typename: 'UserNode', id: string, avatarUrl: string, login: string, name: string, url: string } | null }>, recentReleases: Array<{ __typename: 'ReleaseNode', id: string, name: string, organizationName: string | null, publishedAt: any | null, repositoryName: string | null, tagName: string, url: string, author: { __typename: 'UserNode', id: string, avatarUrl: string, login: string, name: string } | null }>, repositories: Array<{ __typename: 'RepositoryNode', id: string, contributorsCount: number, forksCount: number, isArchived: boolean, key: string, name: string, openIssuesCount: number, starsCount: number, subscribersCount: number, url: string, organization: { __typename: 'OrganizationNode', login: string } | null }>, entityChannels: Array<{ __typename: 'EntityChannelNode', name: string, slackChannelId: string }>, recentMilestones: Array<{ __typename: 'MilestoneNode', title: string, openIssuesCount: number, closedIssuesCount: number, repositoryName: string | null, organizationName: string | null, createdAt: any, url: string, author: { __typename: 'UserNode', id: string, avatarUrl: string, login: string, name: string } | null }>, recentPullRequests: Array<{ __typename: 'PullRequestNode', createdAt: any, organizationName: string | null, repositoryName: string | null, title: string, url: string, author: { __typename: 'UserNode', id: string, avatarUrl: string, login: string, name: string } | null }> } | null, topContributors: Array<{ __typename: 'RepositoryContributorNode', id: string, avatarUrl: string, login: string, name: string }> };
export type GetProjectMetadataQueryVariables = Types.Exact<{
key: Types.Scalars['String']['input'];
@@ -33,7 +33,7 @@ export type SearchProjectNamesQueryVariables = Types.Exact<{
export type SearchProjectNamesQuery = { searchProjects: Array<{ __typename: 'ProjectNode', id: string, name: string }> };
-export const GetProjectDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetProject"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"key"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"project"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"key"},"value":{"kind":"Variable","name":{"kind":"Name","value":"key"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"contributionData"}},{"kind":"Field","name":{"kind":"Name","value":"contributionStats"}},{"kind":"Field","name":{"kind":"Name","value":"contributorsCount"}},{"kind":"Field","name":{"kind":"Name","value":"entityLeaders"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"memberName"}},{"kind":"Field","name":{"kind":"Name","value":"member"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}},{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"login"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"forksCount"}},{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"issuesCount"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"languages"}},{"kind":"Field","name":{"kind":"Name","value":"leaders"}},{"kind":"Field","name":{"kind":"Name","value":"level"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"healthMetricsList"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"IntValue","value":"30"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"forksCount"}},{"kind":"Field","name":{"kind":"Name","value":"lastCommitDays"}},{"kind":"Field","name":{"kind":"Name","value":"lastCommitDaysRequirement"}},{"kind":"Field","name":{"kind":"Name","value":"lastReleaseDays"}},{"kind":"Field","name":{"kind":"Name","value":"lastReleaseDaysRequirement"}},{"kind":"Field","name":{"kind":"Name","value":"openIssuesCount"}},{"kind":"Field","name":{"kind":"Name","value":"openPullRequestsCount"}},{"kind":"Field","name":{"kind":"Name","value":"score"}},{"kind":"Field","name":{"kind":"Name","value":"starsCount"}},{"kind":"Field","name":{"kind":"Name","value":"unassignedIssuesCount"}},{"kind":"Field","name":{"kind":"Name","value":"unansweredIssuesCount"}}]}},{"kind":"Field","name":{"kind":"Name","value":"recentIssues"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"author"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}},{"kind":"Field","name":{"kind":"Name","value":"login"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"url"}}]}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"organizationName"}},{"kind":"Field","name":{"kind":"Name","value":"repositoryName"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"url"}}]}},{"kind":"Field","name":{"kind":"Name","value":"recentReleases"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"author"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}},{"kind":"Field","name":{"kind":"Name","value":"login"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"organizationName"}},{"kind":"Field","name":{"kind":"Name","value":"publishedAt"}},{"kind":"Field","name":{"kind":"Name","value":"repositoryName"}},{"kind":"Field","name":{"kind":"Name","value":"tagName"}},{"kind":"Field","name":{"kind":"Name","value":"url"}}]}},{"kind":"Field","name":{"kind":"Name","value":"repositories"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"contributorsCount"}},{"kind":"Field","name":{"kind":"Name","value":"forksCount"}},{"kind":"Field","name":{"kind":"Name","value":"isArchived"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"openIssuesCount"}},{"kind":"Field","name":{"kind":"Name","value":"organization"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"login"}}]}},{"kind":"Field","name":{"kind":"Name","value":"starsCount"}},{"kind":"Field","name":{"kind":"Name","value":"subscribersCount"}},{"kind":"Field","name":{"kind":"Name","value":"url"}}]}},{"kind":"Field","name":{"kind":"Name","value":"repositoriesCount"}},{"kind":"Field","name":{"kind":"Name","value":"starsCount"}},{"kind":"Field","name":{"kind":"Name","value":"summary"}},{"kind":"Field","name":{"kind":"Name","value":"topics"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"url"}},{"kind":"Field","name":{"kind":"Name","value":"recentMilestones"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"IntValue","value":"5"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"author"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}},{"kind":"Field","name":{"kind":"Name","value":"login"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"openIssuesCount"}},{"kind":"Field","name":{"kind":"Name","value":"closedIssuesCount"}},{"kind":"Field","name":{"kind":"Name","value":"repositoryName"}},{"kind":"Field","name":{"kind":"Name","value":"organizationName"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"url"}}]}},{"kind":"Field","name":{"kind":"Name","value":"recentPullRequests"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"author"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}},{"kind":"Field","name":{"kind":"Name","value":"login"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"organizationName"}},{"kind":"Field","name":{"kind":"Name","value":"repositoryName"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"url"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"topContributors"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"project"},"value":{"kind":"Variable","name":{"kind":"Name","value":"key"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}},{"kind":"Field","name":{"kind":"Name","value":"login"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}}]} as unknown as DocumentNode;
+export const GetProjectDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetProject"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"key"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"project"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"key"},"value":{"kind":"Variable","name":{"kind":"Name","value":"key"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"contributionData"}},{"kind":"Field","name":{"kind":"Name","value":"contributionStats"}},{"kind":"Field","name":{"kind":"Name","value":"contributorsCount"}},{"kind":"Field","name":{"kind":"Name","value":"entityLeaders"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"memberName"}},{"kind":"Field","name":{"kind":"Name","value":"member"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}},{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"login"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"forksCount"}},{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"issuesCount"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"languages"}},{"kind":"Field","name":{"kind":"Name","value":"leaders"}},{"kind":"Field","name":{"kind":"Name","value":"level"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"healthMetricsList"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"IntValue","value":"30"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"forksCount"}},{"kind":"Field","name":{"kind":"Name","value":"lastCommitDays"}},{"kind":"Field","name":{"kind":"Name","value":"lastCommitDaysRequirement"}},{"kind":"Field","name":{"kind":"Name","value":"lastReleaseDays"}},{"kind":"Field","name":{"kind":"Name","value":"lastReleaseDaysRequirement"}},{"kind":"Field","name":{"kind":"Name","value":"openIssuesCount"}},{"kind":"Field","name":{"kind":"Name","value":"openPullRequestsCount"}},{"kind":"Field","name":{"kind":"Name","value":"score"}},{"kind":"Field","name":{"kind":"Name","value":"starsCount"}},{"kind":"Field","name":{"kind":"Name","value":"unassignedIssuesCount"}},{"kind":"Field","name":{"kind":"Name","value":"unansweredIssuesCount"}}]}},{"kind":"Field","name":{"kind":"Name","value":"recentIssues"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"author"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}},{"kind":"Field","name":{"kind":"Name","value":"login"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"url"}}]}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"organizationName"}},{"kind":"Field","name":{"kind":"Name","value":"repositoryName"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"url"}}]}},{"kind":"Field","name":{"kind":"Name","value":"recentReleases"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"author"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}},{"kind":"Field","name":{"kind":"Name","value":"login"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"organizationName"}},{"kind":"Field","name":{"kind":"Name","value":"publishedAt"}},{"kind":"Field","name":{"kind":"Name","value":"repositoryName"}},{"kind":"Field","name":{"kind":"Name","value":"tagName"}},{"kind":"Field","name":{"kind":"Name","value":"url"}}]}},{"kind":"Field","name":{"kind":"Name","value":"repositories"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"contributorsCount"}},{"kind":"Field","name":{"kind":"Name","value":"forksCount"}},{"kind":"Field","name":{"kind":"Name","value":"isArchived"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"openIssuesCount"}},{"kind":"Field","name":{"kind":"Name","value":"organization"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"login"}}]}},{"kind":"Field","name":{"kind":"Name","value":"starsCount"}},{"kind":"Field","name":{"kind":"Name","value":"subscribersCount"}},{"kind":"Field","name":{"kind":"Name","value":"url"}}]}},{"kind":"Field","name":{"kind":"Name","value":"repositoriesCount"}},{"kind":"Field","name":{"kind":"Name","value":"starsCount"}},{"kind":"Field","name":{"kind":"Name","value":"summary"}},{"kind":"Field","name":{"kind":"Name","value":"topics"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"url"}},{"kind":"Field","name":{"kind":"Name","value":"entityChannels"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"slackChannelId"}}]}},{"kind":"Field","name":{"kind":"Name","value":"recentMilestones"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"IntValue","value":"5"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"author"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}},{"kind":"Field","name":{"kind":"Name","value":"login"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"openIssuesCount"}},{"kind":"Field","name":{"kind":"Name","value":"closedIssuesCount"}},{"kind":"Field","name":{"kind":"Name","value":"repositoryName"}},{"kind":"Field","name":{"kind":"Name","value":"organizationName"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"url"}}]}},{"kind":"Field","name":{"kind":"Name","value":"recentPullRequests"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"author"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}},{"kind":"Field","name":{"kind":"Name","value":"login"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"organizationName"}},{"kind":"Field","name":{"kind":"Name","value":"repositoryName"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"url"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"topContributors"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"project"},"value":{"kind":"Variable","name":{"kind":"Name","value":"key"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}},{"kind":"Field","name":{"kind":"Name","value":"login"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}}]} as unknown as DocumentNode;
export const GetProjectMetadataDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetProjectMetadata"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"key"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"project"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"key"},"value":{"kind":"Variable","name":{"kind":"Name","value":"key"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"contributorsCount"}},{"kind":"Field","name":{"kind":"Name","value":"forksCount"}},{"kind":"Field","name":{"kind":"Name","value":"issuesCount"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"starsCount"}},{"kind":"Field","name":{"kind":"Name","value":"summary"}},{"kind":"Field","name":{"kind":"Name","value":"recentMilestones"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"IntValue","value":"25"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"url"}},{"kind":"Field","name":{"kind":"Name","value":"body"}},{"kind":"Field","name":{"kind":"Name","value":"progress"}},{"kind":"Field","name":{"kind":"Name","value":"state"}}]}}]}}]}}]} as unknown as DocumentNode;
export const GetTopContributorsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetTopContributors"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"excludedUsernames"}},"type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"hasFullName"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Boolean"}},"defaultValue":{"kind":"BooleanValue","value":false}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"key"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"limit"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}},"defaultValue":{"kind":"IntValue","value":"20"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"topContributors"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"excludedUsernames"},"value":{"kind":"Variable","name":{"kind":"Name","value":"excludedUsernames"}}},{"kind":"Argument","name":{"kind":"Name","value":"hasFullName"},"value":{"kind":"Variable","name":{"kind":"Name","value":"hasFullName"}}},{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"Variable","name":{"kind":"Name","value":"limit"}}},{"kind":"Argument","name":{"kind":"Name","value":"project"},"value":{"kind":"Variable","name":{"kind":"Name","value":"key"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}},{"kind":"Field","name":{"kind":"Name","value":"login"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}}]} as unknown as DocumentNode;
export const SearchProjectNamesDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"SearchProjectNames"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"query"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"searchProjects"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"query"},"value":{"kind":"Variable","name":{"kind":"Name","value":"query"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}}]} as unknown as DocumentNode;
\ No newline at end of file