Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,12 @@ const SCOPE_DESCRIPTIONS: Record<string, string> = {
'https://www.googleapis.com/auth/forms.responses.readonly': 'View responses to your Google Forms',
'https://www.googleapis.com/auth/ediscovery': 'Access Google Vault for eDiscovery',
'https://www.googleapis.com/auth/devstorage.read_only': 'Read files from Google Cloud Storage',
'https://www.googleapis.com/auth/admin.directory.group': 'Manage Google Workspace groups',
'https://www.googleapis.com/auth/admin.directory.group.member':
'Manage Google Workspace group memberships',
'https://www.googleapis.com/auth/admin.directory.group.readonly': 'View Google Workspace groups',
'https://www.googleapis.com/auth/admin.directory.group.member.readonly':
'View Google Workspace group memberships',
'read:confluence-content.all': 'Read all Confluence content',
'read:confluence-space.summary': 'Read Confluence space information',
'read:space:confluence': 'View Confluence spaces',
Expand Down
323 changes: 323 additions & 0 deletions apps/sim/blocks/blocks/google_groups.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,323 @@
import { GoogleGroupsIcon } from '@/components/icons'
import type { BlockConfig } from '@/blocks/types'
import { AuthMode } from '@/blocks/types'

export const GoogleGroupsBlock: BlockConfig = {
type: 'google_groups',
name: 'Google Groups',
description: 'Manage Google Workspace Groups and their members',
authMode: AuthMode.OAuth,
longDescription:
'Connect to Google Workspace to create, update, and manage groups and their members using the Admin SDK Directory API.',
docsLink: 'https://developers.google.com/admin-sdk/directory/v1/guides/manage-groups',
category: 'tools',
bgColor: '#E8F0FE',
icon: GoogleGroupsIcon,
subBlocks: [
{
id: 'operation',
title: 'Operation',
type: 'dropdown',
options: [
{ label: 'List Groups', id: 'list_groups' },
{ label: 'Get Group', id: 'get_group' },
{ label: 'Create Group', id: 'create_group' },
{ label: 'Update Group', id: 'update_group' },
{ label: 'Delete Group', id: 'delete_group' },
{ label: 'List Members', id: 'list_members' },
{ label: 'Get Member', id: 'get_member' },
{ label: 'Add Member', id: 'add_member' },
{ label: 'Update Member Role', id: 'update_member' },
{ label: 'Remove Member', id: 'remove_member' },
{ label: 'Check Membership', id: 'has_member' },
],
value: () => 'list_groups',
},
{
id: 'credential',
title: 'Google Groups Account',
type: 'oauth-input',
required: true,
serviceId: 'google-groups',
requiredScopes: [
'https://www.googleapis.com/auth/admin.directory.group',
'https://www.googleapis.com/auth/admin.directory.group.member',
],
placeholder: 'Select Google Workspace account',
},

// List Groups inputs
{
id: 'customer',
title: 'Customer ID',
type: 'short-input',
placeholder: 'my_customer (default)',
condition: { field: 'operation', value: 'list_groups' },
},
{
id: 'domain',
title: 'Domain',
type: 'short-input',
placeholder: 'Filter by domain (e.g., example.com)',
condition: { field: 'operation', value: 'list_groups' },
},
{
id: 'query',
title: 'Search Query',
type: 'short-input',
placeholder: 'Filter query (e.g., email:admin*)',
condition: { field: 'operation', value: 'list_groups' },
},
{
id: 'maxResults',
title: 'Max Results',
type: 'short-input',
placeholder: 'Maximum results (1-200)',
condition: {
field: 'operation',
value: ['list_groups', 'list_members'],
},
},

// Get/Update/Delete Group inputs
{
id: 'groupKey',
title: 'Group Email or ID',
type: 'short-input',
placeholder: 'group@example.com or group ID',
required: true,
condition: {
field: 'operation',
value: [
'get_group',
'update_group',
'delete_group',
'list_members',
'get_member',
'add_member',
'update_member',
'remove_member',
'has_member',
],
},
},

// Create Group inputs
{
id: 'email',
title: 'Group Email',
type: 'short-input',
placeholder: 'newgroup@example.com',
required: true,
condition: { field: 'operation', value: 'create_group' },
},
{
id: 'name',
title: 'Group Name',
type: 'short-input',
placeholder: 'Display name for the group',
required: true,
condition: { field: 'operation', value: 'create_group' },
},
{
id: 'description',
title: 'Description',
type: 'long-input',
placeholder: 'Optional description for the group',
condition: { field: 'operation', value: ['create_group', 'update_group'] },
},

// Update Group inputs
{
id: 'newName',
title: 'New Name',
type: 'short-input',
placeholder: 'New display name',
condition: { field: 'operation', value: 'update_group' },
},
{
id: 'newEmail',
title: 'New Email',
type: 'short-input',
placeholder: 'New email address',
condition: { field: 'operation', value: 'update_group' },
},

// Member operations inputs
{
id: 'memberKey',
title: 'Member Email or ID',
type: 'short-input',
placeholder: 'user@example.com or member ID',
required: true,
condition: {
field: 'operation',
value: ['get_member', 'update_member', 'remove_member', 'has_member'],
},
},
{
id: 'memberEmail',
title: 'Member Email',
type: 'short-input',
placeholder: 'user@example.com',
required: true,
condition: { field: 'operation', value: 'add_member' },
},
{
id: 'role',
title: 'Member Role',
type: 'dropdown',
options: [
{ id: 'MEMBER', label: 'Member' },
{ id: 'MANAGER', label: 'Manager' },
{ id: 'OWNER', label: 'Owner' },
],
condition: { field: 'operation', value: ['add_member', 'update_member'] },
},
{
id: 'roles',
title: 'Filter by Roles',
type: 'short-input',
placeholder: 'OWNER,MANAGER,MEMBER',
condition: { field: 'operation', value: 'list_members' },
},
],
tools: {
access: [
'google_groups_list',
'google_groups_get',
'google_groups_create',
'google_groups_update',
'google_groups_delete',
'google_groups_list_members',
'google_groups_get_member',
'google_groups_add_member',
'google_groups_update_member',
'google_groups_remove_member',
'google_groups_has_member',
],
config: {
tool: (params) => {
switch (params.operation) {
case 'list_groups':
return 'google_groups_list'
case 'get_group':
return 'google_groups_get'
case 'create_group':
return 'google_groups_create'
case 'update_group':
return 'google_groups_update'
case 'delete_group':
return 'google_groups_delete'
case 'list_members':
return 'google_groups_list_members'
case 'get_member':
return 'google_groups_get_member'
case 'add_member':
return 'google_groups_add_member'
case 'update_member':
return 'google_groups_update_member'
case 'remove_member':
return 'google_groups_remove_member'
case 'has_member':
return 'google_groups_has_member'
default:
throw new Error(`Invalid Google Groups operation: ${params.operation}`)
}
},
params: (params) => {
const { credential, operation, ...rest } = params

// Map block params to tool params based on operation
switch (operation) {
case 'list_groups':
return {
credential,
customer: rest.customer,
domain: rest.domain,
query: rest.query,
maxResults: rest.maxResults ? Number(rest.maxResults) : undefined,
}
case 'get_group':
case 'delete_group':
return {
credential,
groupKey: rest.groupKey,
}
case 'create_group':
return {
credential,
email: rest.email,
name: rest.name,
description: rest.description,
}
case 'update_group':
return {
credential,
groupKey: rest.groupKey,
name: rest.newName,
email: rest.newEmail,
description: rest.description,
}
case 'list_members':
return {
credential,
groupKey: rest.groupKey,
maxResults: rest.maxResults ? Number(rest.maxResults) : undefined,
roles: rest.roles,
}
case 'get_member':
case 'remove_member':
return {
credential,
groupKey: rest.groupKey,
memberKey: rest.memberKey,
}
case 'add_member':
return {
credential,
groupKey: rest.groupKey,
email: rest.memberEmail,
role: rest.role,
}
case 'update_member':
return {
credential,
groupKey: rest.groupKey,
memberKey: rest.memberKey,
role: rest.role,
}
case 'has_member':
return {
credential,
groupKey: rest.groupKey,
memberKey: rest.memberKey,
}
default:
return { credential, ...rest }
}
},
},
},
inputs: {
operation: { type: 'string', description: 'Operation to perform' },
credential: { type: 'string', description: 'Google Workspace OAuth credential' },
customer: { type: 'string', description: 'Customer ID for listing groups' },
domain: { type: 'string', description: 'Domain filter for listing groups' },
query: { type: 'string', description: 'Search query for filtering groups' },
maxResults: { type: 'number', description: 'Maximum results to return' },
groupKey: { type: 'string', description: 'Group email address or ID' },
email: { type: 'string', description: 'Email address for new group' },
name: { type: 'string', description: 'Display name for group' },
description: { type: 'string', description: 'Group description' },
newName: { type: 'string', description: 'New display name for update' },
newEmail: { type: 'string', description: 'New email for update' },
memberKey: { type: 'string', description: 'Member email or ID' },
memberEmail: { type: 'string', description: 'Email of member to add' },
role: { type: 'string', description: 'Member role (MEMBER, MANAGER, OWNER)' },
roles: { type: 'string', description: 'Filter by roles for list members' },
},
outputs: {
output: { type: 'json', description: 'Google Groups API response data' },
},
}
2 changes: 2 additions & 0 deletions apps/sim/blocks/registry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import { GoogleCalendarBlock } from '@/blocks/blocks/google_calendar'
import { GoogleDocsBlock } from '@/blocks/blocks/google_docs'
import { GoogleDriveBlock } from '@/blocks/blocks/google_drive'
import { GoogleFormsBlock } from '@/blocks/blocks/google_form'
import { GoogleGroupsBlock } from '@/blocks/blocks/google_groups'
import { GoogleSheetsBlock } from '@/blocks/blocks/google_sheets'
import { GoogleVaultBlock } from '@/blocks/blocks/google_vault'
import { GrafanaBlock } from '@/blocks/blocks/grafana'
Expand Down Expand Up @@ -173,6 +174,7 @@ export const registry: Record<string, BlockConfig> = {
google_search: GoogleSearchBlock,
google_sheets: GoogleSheetsBlock,
google_vault: GoogleVaultBlock,
google_groups: GoogleGroupsBlock,
hubspot: HubSpotBlock,
huggingface: HuggingFaceBlock,
human_in_the_loop: HumanInTheLoopBlock,
Expand Down
Loading