Skip to content

Commit

Permalink
Merge pull request #463 from scottux/msteams-hook
Browse files Browse the repository at this point in the history
Create MS Teams Chat Notification
  • Loading branch information
agoldis committed Oct 7, 2021
2 parents 66a33ae + 65a97bd commit af67e4a
Show file tree
Hide file tree
Showing 17 changed files with 680 additions and 3 deletions.
6 changes: 6 additions & 0 deletions packages/api/src/datasources/projects.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import {
CreateGithubHookInput,
CreateProjectInput,
CreateSlackHookInput,
CreateTeamsHookInput,
DeleteHookInput,
Hook,
OrderingOptions,
Expand All @@ -13,6 +14,7 @@ import {
UpdateGithubHookInput,
UpdateProjectInput,
UpdateSlackHookInput,
UpdateTeamsHookInput,
} from '@sorry-cypress/api/generated/graphql';
import {
AggregationFilter,
Expand Down Expand Up @@ -41,10 +43,14 @@ export class ProjectsAPI extends DataSource {
createSlackHook = getCreateHook<CreateSlackHookInput>(HookType.SLACK_HOOK, {
hookEvents: [],
});
createTeamsHook = getCreateHook<CreateTeamsHookInput>(HookType.TEAMS_HOOK, {
hookEvents: [],
});
updateGenericHook = getUpdateHook<UpdateGenericHookInput>(
HookType.GENERIC_HOOK
);
updateSlackHook = getUpdateHook<UpdateSlackHookInput>(HookType.SLACK_HOOK);
updateTeamsHook = getUpdateHook<UpdateTeamsHookInput>(HookType.TEAMS_HOOK);
updateGithubHook = updateGithubHook;
updateBitbucketHook = updateBitbucketHook;
deleteHook = deleteHook;
Expand Down
59 changes: 59 additions & 0 deletions packages/api/src/generated/graphql.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ export type Scalars = {
SlackResultFilter: any;
GithubHookType: any;
BitbucketHookType: any;
TeamsHookType: any;
DateTime: any;
};

Expand All @@ -24,6 +25,7 @@ export type Mutation = {
createGithubHook: GithubHook;
createProject: Project;
createSlackHook: SlackHook;
createTeamsHook: TeamsHook;
deleteHook: DeleteHookResponse;
deleteProject: DeleteProjectResponse;
deleteRun: DeleteRunResponse;
Expand All @@ -35,6 +37,7 @@ export type Mutation = {
updateGithubHook: GithubHook;
updateProject: Project;
updateSlackHook: SlackHook;
updateTeamsHook: TeamsHook;
};


Expand Down Expand Up @@ -63,6 +66,11 @@ export type MutationCreateSlackHookArgs = {
};


export type MutationCreateTeamsHookArgs = {
input: CreateTeamsHookInput;
};


export type MutationDeleteHookArgs = {
input: DeleteHookInput;
};
Expand Down Expand Up @@ -118,6 +126,11 @@ export type MutationUpdateSlackHookArgs = {
input: UpdateSlackHookInput;
};


export type MutationUpdateTeamsHookArgs = {
input: UpdateTeamsHookInput;
};

export type DeleteHookInput = {
projectId: Scalars['String'];
hookId: Scalars['ID'];
Expand Down Expand Up @@ -200,6 +213,26 @@ export type UpdateBitbucketHookInput = {
bitbucketBuildName?: Maybe<Scalars['String']>;
};

export type TeamsHook = {
__typename?: 'TeamsHook';
projectId: Scalars['ID'];
hookId: Scalars['ID'];
url: Scalars['String'];
hookType: Scalars['TeamsHookType'];
hookEvents: Array<Scalars['String']>;
};

export type CreateTeamsHookInput = {
projectId: Scalars['ID'];
};

export type UpdateTeamsHookInput = {
projectId: Scalars['ID'];
hookId: Scalars['ID'];
url: Scalars['String'];
hookEvents: Array<Scalars['String']>;
};

export type GenericHook = {
__typename?: 'GenericHook';
projectId: Scalars['ID'];
Expand Down Expand Up @@ -258,6 +291,7 @@ export type HookInput = {




export type Query = {
__typename?: 'Query';
projects: Array<Project>;
Expand Down Expand Up @@ -655,6 +689,9 @@ export type ResolversTypes = {
BitbucketHook: ResolverTypeWrapper<BitbucketHook>;
CreateBitbucketHookInput: CreateBitbucketHookInput;
UpdateBitbucketHookInput: UpdateBitbucketHookInput;
TeamsHook: ResolverTypeWrapper<TeamsHook>;
CreateTeamsHookInput: CreateTeamsHookInput;
UpdateTeamsHookInput: UpdateTeamsHookInput;
GenericHook: ResolverTypeWrapper<GenericHook>;
CreateGenericHookInput: CreateGenericHookInput;
UpdateGenericHookInput: UpdateGenericHookInput;
Expand All @@ -665,6 +702,7 @@ export type ResolversTypes = {
SlackResultFilter: ResolverTypeWrapper<Scalars['SlackResultFilter']>;
GithubHookType: ResolverTypeWrapper<Scalars['GithubHookType']>;
BitbucketHookType: ResolverTypeWrapper<Scalars['BitbucketHookType']>;
TeamsHookType: ResolverTypeWrapper<Scalars['TeamsHookType']>;
Query: ResolverTypeWrapper<{}>;
DeleteRunResponse: ResolverTypeWrapper<DeleteRunResponse>;
Boolean: ResolverTypeWrapper<Scalars['Boolean']>;
Expand Down Expand Up @@ -718,6 +756,9 @@ export type ResolversParentTypes = {
BitbucketHook: BitbucketHook;
CreateBitbucketHookInput: CreateBitbucketHookInput;
UpdateBitbucketHookInput: UpdateBitbucketHookInput;
TeamsHook: TeamsHook;
CreateTeamsHookInput: CreateTeamsHookInput;
UpdateTeamsHookInput: UpdateTeamsHookInput;
GenericHook: GenericHook;
CreateGenericHookInput: CreateGenericHookInput;
UpdateGenericHookInput: UpdateGenericHookInput;
Expand All @@ -728,6 +769,7 @@ export type ResolversParentTypes = {
SlackResultFilter: Scalars['SlackResultFilter'];
GithubHookType: Scalars['GithubHookType'];
BitbucketHookType: Scalars['BitbucketHookType'];
TeamsHookType: Scalars['TeamsHookType'];
Query: {};
DeleteRunResponse: DeleteRunResponse;
Boolean: Scalars['Boolean'];
Expand Down Expand Up @@ -769,6 +811,7 @@ export type MutationResolvers<ContextType = any, ParentType extends ResolversPar
createGithubHook?: Resolver<ResolversTypes['GithubHook'], ParentType, ContextType, RequireFields<MutationCreateGithubHookArgs, 'input'>>;
createProject?: Resolver<ResolversTypes['Project'], ParentType, ContextType, RequireFields<MutationCreateProjectArgs, 'project'>>;
createSlackHook?: Resolver<ResolversTypes['SlackHook'], ParentType, ContextType, RequireFields<MutationCreateSlackHookArgs, 'input'>>;
createTeamsHook?: Resolver<ResolversTypes['TeamsHook'], ParentType, ContextType, RequireFields<MutationCreateTeamsHookArgs, 'input'>>;
deleteHook?: Resolver<ResolversTypes['DeleteHookResponse'], ParentType, ContextType, RequireFields<MutationDeleteHookArgs, 'input'>>;
deleteProject?: Resolver<ResolversTypes['DeleteProjectResponse'], ParentType, ContextType, RequireFields<MutationDeleteProjectArgs, 'projectId'>>;
deleteRun?: Resolver<ResolversTypes['DeleteRunResponse'], ParentType, ContextType, RequireFields<MutationDeleteRunArgs, 'runId'>>;
Expand All @@ -780,6 +823,7 @@ export type MutationResolvers<ContextType = any, ParentType extends ResolversPar
updateGithubHook?: Resolver<ResolversTypes['GithubHook'], ParentType, ContextType, RequireFields<MutationUpdateGithubHookArgs, 'input'>>;
updateProject?: Resolver<ResolversTypes['Project'], ParentType, ContextType, RequireFields<MutationUpdateProjectArgs, 'input'>>;
updateSlackHook?: Resolver<ResolversTypes['SlackHook'], ParentType, ContextType, RequireFields<MutationUpdateSlackHookArgs, 'input'>>;
updateTeamsHook?: Resolver<ResolversTypes['TeamsHook'], ParentType, ContextType, RequireFields<MutationUpdateTeamsHookArgs, 'input'>>;
};

export type DeleteHookResponseResolvers<ContextType = any, ParentType extends ResolversParentTypes['DeleteHookResponse'] = ResolversParentTypes['DeleteHookResponse']> = {
Expand Down Expand Up @@ -820,6 +864,15 @@ export type BitbucketHookResolvers<ContextType = any, ParentType extends Resolve
__isTypeOf?: IsTypeOfResolverFn<ParentType>;
};

export type TeamsHookResolvers<ContextType = any, ParentType extends ResolversParentTypes['TeamsHook'] = ResolversParentTypes['TeamsHook']> = {
projectId?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;
hookId?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;
url?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
hookType?: Resolver<ResolversTypes['TeamsHookType'], ParentType, ContextType>;
hookEvents?: Resolver<Array<ResolversTypes['String']>, ParentType, ContextType>;
__isTypeOf?: IsTypeOfResolverFn<ParentType>;
};

export type GenericHookResolvers<ContextType = any, ParentType extends ResolversParentTypes['GenericHook'] = ResolversParentTypes['GenericHook']> = {
projectId?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;
hookId?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;
Expand Down Expand Up @@ -866,6 +919,10 @@ export interface BitbucketHookTypeScalarConfig extends GraphQLScalarTypeConfig<R
name: 'BitbucketHookType';
}

export interface TeamsHookTypeScalarConfig extends GraphQLScalarTypeConfig<ResolversTypes['TeamsHookType'], any> {
name: 'TeamsHookType';
}

export type QueryResolvers<ContextType = any, ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query']> = {
projects?: Resolver<Array<ResolversTypes['Project']>, ParentType, ContextType, RequireFields<QueryProjectsArgs, 'orderDirection' | 'filters'>>;
project?: Resolver<Maybe<ResolversTypes['Project']>, ParentType, ContextType, RequireFields<QueryProjectArgs, 'id'>>;
Expand Down Expand Up @@ -1102,13 +1159,15 @@ export type Resolvers<ContextType = any> = {
SlackHook?: SlackHookResolvers<ContextType>;
GithubHook?: GithubHookResolvers<ContextType>;
BitbucketHook?: BitbucketHookResolvers<ContextType>;
TeamsHook?: TeamsHookResolvers<ContextType>;
GenericHook?: GenericHookResolvers<ContextType>;
Hook?: HookResolvers<ContextType>;
GenericHookType?: GraphQLScalarType;
SlackHookType?: GraphQLScalarType;
SlackResultFilter?: GraphQLScalarType;
GithubHookType?: GraphQLScalarType;
BitbucketHookType?: GraphQLScalarType;
TeamsHookType?: GraphQLScalarType;
Query?: QueryResolvers<ContextType>;
DeleteRunResponse?: DeleteRunResponseResolvers<ContextType>;
SpecStats?: SpecStatsResolvers<ContextType>;
Expand Down
9 changes: 9 additions & 0 deletions packages/api/src/resolvers/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {
CreateGithubHookInput,
CreateProjectInput,
CreateSlackHookInput,
CreateTeamsHookInput,
DeleteHookInput,
OrderingOptions,
RunSpec,
Expand All @@ -16,6 +17,7 @@ import {
UpdateGithubHookInput,
UpdateProjectInput,
UpdateSlackHookInput,
UpdateTeamsHookInput,
} from '@sorry-cypress/api/generated/graphql';
import { getTestListRetries, Project } from '@sorry-cypress/common';
import { GraphQLScalarType } from 'graphql';
Expand Down Expand Up @@ -48,6 +50,7 @@ export const resolvers = {
SlackHookType: getStringLiteral('SlackHookType'),
GithubHookType: getStringLiteral('GithubHookType'),
BitbucketHookType: getStringLiteral('BitbucketHookType'),
TeamsHookType: getStringLiteral('TeamsHookType'),

RunSpec: {
results: async (
Expand Down Expand Up @@ -255,6 +258,12 @@ export const resolvers = {
updateSlackHook: getDatasourceWithInput<UpdateSlackHookInput>(
'projectsAPI.updateSlackHook'
),
createTeamsHook: getDatasourceWithInput<CreateTeamsHookInput>(
'projectsAPI.createTeamsHook'
),
updateTeamsHook: getDatasourceWithInput<UpdateTeamsHookInput>(
'projectsAPI.updateTeamsHook'
),
deleteHook: getDatasourceWithInput<DeleteHookInput>(
'projectsAPI.deleteHook'
),
Expand Down
22 changes: 22 additions & 0 deletions packages/api/src/schema/hooks.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ type Mutation {
updateGithubHook(input: UpdateGithubHookInput!): GithubHook!
createSlackHook(input: CreateSlackHookInput!): SlackHook!
updateSlackHook(input: UpdateSlackHookInput!): SlackHook!
createTeamsHook(input: CreateTeamsHookInput!): TeamsHook!
updateTeamsHook(input: UpdateTeamsHookInput!): TeamsHook!
deleteHook(input: DeleteHookInput!): DeleteHookResponse!
}

Expand Down Expand Up @@ -87,6 +89,25 @@ input UpdateBitbucketHookInput {
bitbucketBuildName: String
}

type TeamsHook {
projectId: ID!
hookId: ID!
url: String!
hookType: TeamsHookType!
hookEvents: [String!]!
}

input CreateTeamsHookInput {
projectId: ID!
}

input UpdateTeamsHookInput {
projectId: ID!
hookId: ID!
url: String!
hookEvents: [String!]!
}

type GenericHook {
projectId: ID!
hookId: ID!
Expand Down Expand Up @@ -143,3 +164,4 @@ scalar SlackHookType
scalar SlackResultFilter
scalar GithubHookType
scalar BitbucketHookType
scalar TeamsHookType
10 changes: 8 additions & 2 deletions packages/common/src/hook/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ export enum HookType {
GENERIC_HOOK = 'GENERIC_HOOK',
SLACK_HOOK = 'SLACK_HOOK',
BITBUCKET_STATUS_HOOK = 'BITBUCKET_STATUS_HOOK',
TEAMS_HOOK = 'TEAMS_HOOK',
}

export enum HookEvent {
Expand Down Expand Up @@ -55,5 +56,10 @@ export type BitBucketHook = BaseHook & {
bitbucketBuildName?: string;
};

export type HookWithCustomEvents = SlackHook | GenericHook;
export type Hook = SlackHook | GenericHook | GithubHook | BitBucketHook;
export type TeamsHook = BaseHook & {
hookEvents: HookEvent[];
hookType: HookType.TEAMS_HOOK;
};

export type HookWithCustomEvents = SlackHook | TeamsHook | GenericHook;
export type Hook = SlackHook | TeamsHook | GenericHook | GithubHook | BitBucketHook;
5 changes: 5 additions & 0 deletions packages/common/src/hook/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import {
GithubHook,
Hook,
SlackHook,
TeamsHook,
} from './types';

export function isGenericHook(hook: Hook): hook is GenericHook {
Expand All @@ -21,3 +22,7 @@ export function isGithubHook(hook: Hook): hook is GithubHook {
export function isBitbucketHook(hook: Hook): hook is BitBucketHook {
return hook.hookType === 'BITBUCKET_STATUS_HOOK';
}

export function isTeamsHook(hook: Hook): hook is TeamsHook {
return hook.hookType === 'TEAMS_HOOK';
}

0 comments on commit af67e4a

Please sign in to comment.