Skip to content

Commit

Permalink
Refactor arguments and type tests for admin.workflows.* APIs.
Browse files Browse the repository at this point in the history
  • Loading branch information
Filip Maj committed Dec 12, 2023
1 parent 260e242 commit a193b6e
Show file tree
Hide file tree
Showing 7 changed files with 164 additions and 56 deletions.
59 changes: 23 additions & 36 deletions packages/web-api/src/methods.ts
Original file line number Diff line number Diff line change
Expand Up @@ -238,7 +238,6 @@ import type {
AdminAppsConfigSetResponse,
} from './types/response';
// Request types
import type { TokenOverridable, CursorPaginationEnabled } from './types/request/common';
import type { WorkflowsStepCompletedArguments, WorkflowsStepFailedArguments, WorkflowsUpdateStepArguments } from './types/request/workflows';
import type { ViewsUpdateArguments, ViewsOpenArguments, ViewsPushArguments, ViewsPublishArguments } from './types/request/views';
import type { UsersConversationsArguments, UsersInfoArguments, UsersListArguments, UsersIdentityArguments, UsersSetPhotoArguments, UsersProfileGetArguments, UsersProfileSetArguments, UsersDeletePhotoArguments, UsersGetPresenceArguments, UsersSetPresenceArguments, UsersLookupByEmailArguments } from './types/request/users';
Expand Down Expand Up @@ -279,6 +278,7 @@ import type { AdminRolesAddAssignmentsArguments, AdminRolesListAssignmentsArgume
import type { AdminTeamsAdminsListArguments, AdminTeamsCreateArguments, AdminTeamsListArguments, AdminTeamsOwnersListArguments, AdminTeamsSettingsInfoArguments, AdminTeamsSettingsSetDefaultChannelsArguments, AdminTeamsSettingsSetDescriptionArguments, AdminTeamsSettingsSetDiscoverabilityArguments, AdminTeamsSettingsSetIconArguments, AdminTeamsSettingsSetNameArguments } from './types/request/admin/teams';
import type { AdminUsergroupsAddChannelsArguments, AdminUsergroupsAddTeamsArguments, AdminUsergroupsListChannelsArguments, AdminUsergroupsRemoveChannelsArguments } from './types/request/admin/usergroups';
import type { AdminUsersAssignArguments, AdminUsersInviteArguments, AdminUsersListArguments, AdminUsersRemoveArguments, AdminUsersSessionListArguments, AdminUsersSessionClearSettingsArguments, AdminUsersSessionGetSettingsArguments, AdminUsersSessionInvalidateArguments, AdminUsersSessionResetArguments, AdminUsersSessionResetBulkArguments, AdminUsersSessionSetSettingsArguments, AdminUsersSetAdminArguments, AdminUsersSetExpirationArguments, AdminUsersSetOwnerArguments, AdminUsersSetRegularArguments, AdminUsersUnsupportedVersionsExportArguments } from './types/request/admin/users';
import type { AdminWorkflowsCollaboratorsAddArguments, AdminWorkflowsCollaboratorsRemoveArguments, AdminWorkflowsPermissionsLookupArguments, AdminWorkflowsSearchArguments, AdminWorkflowsUnpublishArguments } from './types/request/admin/workflows';

/**
* Generic method definition
Expand Down Expand Up @@ -968,15 +968,35 @@ export abstract class Methods extends EventEmitter<WebClientEvent> {
},
},
workflows: {
search: bindApiCall<AdminWorkflowsSearchArguments, AdminWorkflowsSearchResponse>(this, 'admin.workflows.search'),
unpublish: bindApiCall<AdminWorkflowsUnpublishArguments, AdminWorkflowsUnpublishResponse>(this, 'admin.workflows.unpublish'),
collaborators: {
/**
* @description Add collaborators to workflows within the team or enterprise.
* @see {@link https://api.slack.com/methods/admin.workflows.collaborators.add `admin.workflows.collaborators.add` API reference}.
*/
add: bindApiCall<AdminWorkflowsCollaboratorsAddArguments, AdminWorkflowsCollaboratorsAddResponse>(this, 'admin.workflows.collaborators.add'),
/**
* @description Remove collaborators from workflows within the team or enterprise.
* @see {@link https://api.slack.com/methods/admin.workflows.collaborators.remove `admin.workflows.collaborators.remove` API reference}.
*/
remove: bindApiCall<AdminWorkflowsCollaboratorsRemoveArguments, AdminWorkflowsCollaboratorsRemoveResponse>(this, 'admin.workflows.collaborators.remove'),
},
permissions: {
/**
* @description Look up the permissions for a set of workflows.
* @see {@link https://api.slack.com/methods/admin.workflows.permissions.lookup `admin.workflows.permissions.lookup` API reference}.
*/
lookup: bindApiCall<AdminWorkflowsPermissionsLookupArguments, AdminWorkflowsPermissionsLookupResponse>(this, 'admin.workflows.permissions.lookup'),
},
/**
* @description Search workflows within the team or enterprise.
* @see {@link https://api.slack.com/methods/admin.workflows.search `admin.workflows.search` API reference}.
*/
search: bindApiCall<AdminWorkflowsSearchArguments, AdminWorkflowsSearchResponse>(this, 'admin.workflows.search'),
/**
* @description Unpublish workflows within the team or enterprise.
* @see {@link https://api.slack.com/methods/admin.workflows.unpublish `admin.workflows.unpublish` API reference}.
*/
unpublish: bindApiCall<AdminWorkflowsUnpublishArguments, AdminWorkflowsUnpublishResponse>(this, 'admin.workflows.unpublish'),
},
};

Expand Down Expand Up @@ -1881,38 +1901,5 @@ export abstract class Methods extends EventEmitter<WebClientEvent> {
updateStep: bindApiCall<WorkflowsUpdateStepArguments, WorkflowsUpdateStepResponse>(this, 'workflows.updateStep'),
};
}
// https://api.slack.com/methods/admin.workflows.collaborators.add
export interface AdminWorkflowsCollaboratorsAddArguments
extends TokenOverridable {
collaborator_ids: string[];
workflow_ids: string[];
}
// https://api.slack.com/methods/admin.workflows.collaborators.remove
export interface AdminWorkflowsCollaboratorsRemoveArguments
extends TokenOverridable {
collaborator_ids: string[];
workflow_ids: string[];
}
// https://api.slack.com/methods/admin.workflows.permissions.lookup
export interface AdminWorkflowsPermissionsLookupArguments
extends TokenOverridable {
workflow_ids: string[];
max_workflow_triggers?: number;
}
// https://api.slack.com/methods/admin.workflows.search
export interface AdminWorkflowsSearchArguments extends TokenOverridable, CursorPaginationEnabled {
app_id?: string;
collaborator_ids?: string[];
no_collaborators?: boolean;
num_trigger_ids?: number;
query?: string;
sort?: string;
sort_dir?: 'asc' | 'desc';
source?: 'code' | 'workflow_builder';
}
// https://api.slack.com/methods/admin.workflows.unpublish
export interface AdminWorkflowsUnpublishArguments extends TokenOverridable {
workflow_ids: string[];
}

export * from '@slack/types';
6 changes: 1 addition & 5 deletions packages/web-api/src/types/request/admin/apps.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
import type { CursorPaginationEnabled, TokenOverridable } from '../common';
import type { AppID, CursorPaginationEnabled, TokenOverridable } from '../common';

interface AppID {
/** @description The ID of the app. */
app_id: string;
}
interface RequestID {
/** @description The id of the request. */
request_id: string;
Expand Down
44 changes: 44 additions & 0 deletions packages/web-api/src/types/request/admin/workflows.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import type { AppID, CursorPaginationEnabled, SortDir, TokenOverridable } from '../common';

interface CollaboratorIDs {
/** @description Array of collaborators (encoded user IDs) - maximum of 50 items. */
collaborator_ids: [string, ...string[]];
}

interface WorkflowIDs {
/** @description Array of workflow IDs - maximum of 50 items. */
workflow_ids: [string, ...string[]];
}

// https://api.slack.com/methods/admin.workflows.collaborators.add
export interface AdminWorkflowsCollaboratorsAddArguments extends CollaboratorIDs, WorkflowIDs, TokenOverridable {}

// https://api.slack.com/methods/admin.workflows.collaborators.remove
export interface AdminWorkflowsCollaboratorsRemoveArguments extends CollaboratorIDs, WorkflowIDs, TokenOverridable {}

// https://api.slack.com/methods/admin.workflows.permissions.lookup
export interface AdminWorkflowsPermissionsLookupArguments extends WorkflowIDs, TokenOverridable {
/**
* @description Maximum number of triggers to fetch for each workflow when determining overall run permissions.
* Defaults to `100`. Maximum of `1000`.
*/
max_workflow_triggers?: number;
}

// https://api.slack.com/methods/admin.workflows.search
export interface AdminWorkflowsSearchArguments extends Partial<AppID>, Partial<CollaboratorIDs>, SortDir,
TokenOverridable, CursorPaginationEnabled {
/** @description Only include workflows with no collaborators in the result; default is `false`. */
no_collaborators?: boolean;
/** @description Number of trigger IDs to fetch for each workflow; default is `0`. */
num_trigger_ids?: number;
/** @description A search query to filter for workflow name or description. */
query?: string;
/** @description The field used to sort the returned workflows. Currently only `premium_runs` is supported. */
sort?: 'premium_runs';
/** @description Source of workflow creation, either from `code` or `workflow_builder`. */
source?: 'code' | 'workflow_builder';
}

// https://api.slack.com/methods/admin.workflows.unpublish
export interface AdminWorkflowsUnpublishArguments extends WorkflowIDs, TokenOverridable {}
16 changes: 5 additions & 11 deletions packages/web-api/src/types/request/apps.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { CursorPaginationEnabled, TokenOverridable, OAuthCredentials } from './common';
import type { AppID, CursorPaginationEnabled, TokenOverridable, OAuthCredentials } from './common';

// https://api.slack.com/methods/apps.connections.open
// eslint-disable-next-line @typescript-eslint/no-empty-interface
Expand All @@ -21,24 +21,18 @@ export interface AppsManifestCreateArguments extends TokenOverridable {
}

// https://api.slack.com/methods/apps.manifest.delete
export interface AppsManifestDeleteArguments extends TokenOverridable {
app_id: string;
}
export interface AppsManifestDeleteArguments extends AppID, TokenOverridable {}

// https://api.slack.com/methods/apps.manifest.export
export interface AppsManifestExportArguments extends TokenOverridable {
app_id: string;
}
export interface AppsManifestExportArguments extends AppID, TokenOverridable {}

// https://api.slack.com/methods/apps.manifest.update
export interface AppsManifestUpdateArguments extends TokenOverridable {
app_id: string;
export interface AppsManifestUpdateArguments extends AppID, TokenOverridable {
manifest: string;
}

// https://api.slack.com/methods/apps.manifest.validate
export interface AppsManifestValidateArguments extends TokenOverridable {
app_id?: string;
export interface AppsManifestValidateArguments extends Partial<AppID>, TokenOverridable {
manifest: string;
}

Expand Down
5 changes: 5 additions & 0 deletions packages/web-api/src/types/request/common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,11 @@ export interface UserIDs {
user_ids: [string, ...string[]];
}

export interface AppID {
/** @description The ID of the app. */
app_id: string;
}

/**
* Some API methods use arguments for specifying a message, file or file comment.
* E.g. `stars.*` and `reactions.*`
Expand Down
6 changes: 2 additions & 4 deletions packages/web-api/src/types/request/team.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { OptionalTeamAssignable, TokenOverridable, CursorPaginationEnabled, TraditionalPagingEnabled } from './common';
import { AppID, OptionalTeamAssignable, TokenOverridable, CursorPaginationEnabled, TraditionalPagingEnabled } from './common';

// https://api.slack.com/methods/team.accessLogs
export interface TeamAccessLogsArguments extends TokenOverridable, CursorPaginationEnabled,
Expand Down Expand Up @@ -28,10 +28,8 @@ export interface TeamInfoArguments extends TokenOverridable {
team?: string;
}
// https://api.slack.com/methods/team.integrationLogs
export interface TeamIntegrationLogsArguments extends TokenOverridable,
export interface TeamIntegrationLogsArguments extends Partial<AppID>, TokenOverridable,
OptionalTeamAssignable, TraditionalPagingEnabled {
/** @description Filter logs to this Slack app. Defaults to all logs. */
app_id?: string;
/** @description Filter logs with this change type. Defaults to all logs. */
change_type?: 'added' | 'removed' | 'enabled' | 'disabled' | 'updated';
/** @description Filter logs to this service. Defaults to all logs. */
Expand Down
84 changes: 84 additions & 0 deletions packages/web-api/test/types/methods/admin.workflows.test-d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
import { expectAssignable, expectError } from 'tsd';
import { WebClient } from '../../../src/WebClient';

const web = new WebClient('TOKEN');

// admin.workflows.collaborators.add
// -- sad path
expectError(web.admin.workflows.collaborators.add()); // lacking argument
expectError(web.admin.workflows.collaborators.add({})); // empty argument
expectError(web.admin.workflows.collaborators.add({
collaborator_ids: ['U1234'], // missing workflow_ids
}));
expectError(web.admin.workflows.collaborators.add({
workflow_ids: ['Wf1234'], // missing user_ids
}));
expectError(web.admin.workflows.collaborators.add({
collaborator_ids: ['U1234'],
workflow_ids: [], // must provide at least 1 id
}));
expectError(web.admin.workflows.collaborators.add({
workflow_ids: ['Wf1234'],
collaborator_ids: [], // must provide at least 1 id
}));
// -- happy path
expectAssignable<Parameters<typeof web.admin.workflows.collaborators.add>>([{
collaborator_ids: ['U1234'],
workflow_ids: ['Wf1234'],
}]);

// admin.workflows.collaborators.remove
// -- sad path
expectError(web.admin.workflows.collaborators.remove()); // lacking argument
expectError(web.admin.workflows.collaborators.remove({})); // empty argument
expectError(web.admin.workflows.collaborators.remove({
collaborator_ids: ['U1234'], // missing workflow_ids
}));
expectError(web.admin.workflows.collaborators.remove({
workflow_ids: ['Wf1234'], // missing user_ids
}));
expectError(web.admin.workflows.collaborators.remove({
collaborator_ids: ['U1234'],
workflow_ids: [], // must provide at least 1 id
}));
expectError(web.admin.workflows.collaborators.remove({
workflow_ids: ['Wf1234'],
collaborator_ids: [], // must provide at least 1 id
}));
// -- happy path
expectAssignable<Parameters<typeof web.admin.workflows.collaborators.remove>>([{
collaborator_ids: ['U1234'],
workflow_ids: ['Wf1234'],
}]);

// admin.workflows.permissions.lookup
// -- sad path
expectError(web.admin.workflows.permissions.lookup()); // lacking argument
expectError(web.admin.workflows.permissions.lookup({})); // empty argument
expectError(web.admin.workflows.permissions.lookup({
workflow_ids: [], // must provide at least 1 id
}));
// -- happy path
expectAssignable<Parameters<typeof web.admin.workflows.permissions.lookup>>([{
workflow_ids: ['Wf1234'],
}]);

// admin.workflows.search
// -- sad path
expectError(web.admin.workflows.search()); // lacking argument
expectError(web.admin.workflows.search({
collaborator_ids: [], // must provide at least 1 ID
}));
// -- happy path
expectAssignable<Parameters<typeof web.admin.workflows.search>>([{}]); // all optional args OK

// admin.workflows.unpublish
// -- sad path
expectError(web.admin.workflows.unpublish()); // lacking argument
expectError(web.admin.workflows.unpublish({
workflow_ids: [], // must provide at least 1 ID
}));
// -- happy path
expectAssignable<Parameters<typeof web.admin.workflows.unpublish>>([{
workflow_ids: ['Wf1234'],
}]);

0 comments on commit a193b6e

Please sign in to comment.