diff --git a/packages/api/src/generated/graphql.ts b/packages/api/src/generated/graphql.ts index 592927875..f6b93caa6 100644 --- a/packages/api/src/generated/graphql.ts +++ b/packages/api/src/generated/graphql.ts @@ -502,6 +502,24 @@ export type DeleteReminderSuccess = { reminder: Reminder; }; +export type DeleteWebhookError = { + __typename?: 'DeleteWebhookError'; + errorCodes: Array; +}; + +export enum DeleteWebhookErrorCode { + BadRequest = 'BAD_REQUEST', + NotFound = 'NOT_FOUND', + Unauthorized = 'UNAUTHORIZED' +} + +export type DeleteWebhookResult = DeleteWebhookError | DeleteWebhookSuccess; + +export type DeleteWebhookSuccess = { + __typename?: 'DeleteWebhookSuccess'; + webhook: Webhook; +}; + export type DeviceToken = { __typename?: 'DeviceToken'; createdAt: Scalars['Date']; @@ -817,6 +835,7 @@ export type Mutation = { deleteNewsletterEmail: DeleteNewsletterEmailResult; deleteReaction: DeleteReactionResult; deleteReminder: DeleteReminderResult; + deleteWebhook: DeleteWebhookResult; generateApiKey: GenerateApiKeyResult; googleLogin: LoginResult; googleSignup: GoogleSignupResult; @@ -923,6 +942,11 @@ export type MutationDeleteReminderArgs = { }; +export type MutationDeleteWebhookArgs = { + id: Scalars['ID']; +}; + + export type MutationGenerateApiKeyArgs = { input: GenerateApiKeyInput; }; @@ -1186,6 +1210,8 @@ export type Query = { user: UserResult; users: UsersResult; validateUsername: Scalars['Boolean']; + webhook: WebhookResult; + webhooks: WebhooksResult; }; @@ -1262,6 +1288,11 @@ export type QueryValidateUsernameArgs = { username: Scalars['String']; }; + +export type QueryWebhookArgs = { + id: Scalars['ID']; +}; + export type Reaction = { __typename?: 'Reaction'; code: ReactionType; @@ -2119,6 +2150,17 @@ export type Webhook = { url: Scalars['String']; }; +export type WebhookError = { + __typename?: 'WebhookError'; + errorCodes: Array; +}; + +export enum WebhookErrorCode { + BadRequest = 'BAD_REQUEST', + NotFound = 'NOT_FOUND', + Unauthorized = 'UNAUTHORIZED' +} + export enum WebhookEvent { HighlightCreated = 'HIGHLIGHT_CREATED', HighlightDeleted = 'HIGHLIGHT_DELETED', @@ -2131,6 +2173,30 @@ export enum WebhookEvent { PageUpdated = 'PAGE_UPDATED' } +export type WebhookResult = WebhookError | WebhookSuccess; + +export type WebhooksError = { + __typename?: 'WebhooksError'; + errorCodes: Array; +}; + +export enum WebhooksErrorCode { + BadRequest = 'BAD_REQUEST', + Unauthorized = 'UNAUTHORIZED' +} + +export type WebhooksResult = WebhooksError | WebhooksSuccess; + +export type WebhooksSuccess = { + __typename?: 'WebhooksSuccess'; + webhooks: Array; +}; + +export type WebhookSuccess = { + __typename?: 'WebhookSuccess'; + webhook: Webhook; +}; + export type ResolverTypeWrapper = Promise | T; @@ -2292,6 +2358,10 @@ export type ResolversTypes = { DeleteReminderErrorCode: DeleteReminderErrorCode; DeleteReminderResult: ResolversTypes['DeleteReminderError'] | ResolversTypes['DeleteReminderSuccess']; DeleteReminderSuccess: ResolverTypeWrapper; + DeleteWebhookError: ResolverTypeWrapper; + DeleteWebhookErrorCode: DeleteWebhookErrorCode; + DeleteWebhookResult: ResolversTypes['DeleteWebhookError'] | ResolversTypes['DeleteWebhookSuccess']; + DeleteWebhookSuccess: ResolverTypeWrapper; DeviceToken: ResolverTypeWrapper; FeedArticle: ResolverTypeWrapper; FeedArticleEdge: ResolverTypeWrapper; @@ -2520,7 +2590,15 @@ export type ResolversTypes = { UsersSuccess: ResolverTypeWrapper; UserSuccess: ResolverTypeWrapper; Webhook: ResolverTypeWrapper; + WebhookError: ResolverTypeWrapper; + WebhookErrorCode: WebhookErrorCode; WebhookEvent: WebhookEvent; + WebhookResult: ResolversTypes['WebhookError'] | ResolversTypes['WebhookSuccess']; + WebhooksError: ResolverTypeWrapper; + WebhooksErrorCode: WebhooksErrorCode; + WebhooksResult: ResolversTypes['WebhooksError'] | ResolversTypes['WebhooksSuccess']; + WebhooksSuccess: ResolverTypeWrapper; + WebhookSuccess: ResolverTypeWrapper; }; /** Mapping between all available schema types and the resolvers parents */ @@ -2596,6 +2674,9 @@ export type ResolversParentTypes = { DeleteReminderError: DeleteReminderError; DeleteReminderResult: ResolversParentTypes['DeleteReminderError'] | ResolversParentTypes['DeleteReminderSuccess']; DeleteReminderSuccess: DeleteReminderSuccess; + DeleteWebhookError: DeleteWebhookError; + DeleteWebhookResult: ResolversParentTypes['DeleteWebhookError'] | ResolversParentTypes['DeleteWebhookSuccess']; + DeleteWebhookSuccess: DeleteWebhookSuccess; DeviceToken: DeviceToken; FeedArticle: FeedArticle; FeedArticleEdge: FeedArticleEdge; @@ -2778,6 +2859,12 @@ export type ResolversParentTypes = { UsersSuccess: UsersSuccess; UserSuccess: UserSuccess; Webhook: Webhook; + WebhookError: WebhookError; + WebhookResult: ResolversParentTypes['WebhookError'] | ResolversParentTypes['WebhookSuccess']; + WebhooksError: WebhooksError; + WebhooksResult: ResolversParentTypes['WebhooksError'] | ResolversParentTypes['WebhooksSuccess']; + WebhooksSuccess: WebhooksSuccess; + WebhookSuccess: WebhookSuccess; }; export type SanitizeDirectiveArgs = { @@ -3121,6 +3208,20 @@ export type DeleteReminderSuccessResolvers; }; +export type DeleteWebhookErrorResolvers = { + errorCodes?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type DeleteWebhookResultResolvers = { + __resolveType: TypeResolveFn<'DeleteWebhookError' | 'DeleteWebhookSuccess', ParentType, ContextType>; +}; + +export type DeleteWebhookSuccessResolvers = { + webhook?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + export type DeviceTokenResolvers = { createdAt?: Resolver; id?: Resolver; @@ -3371,6 +3472,7 @@ export type MutationResolvers>; deleteReaction?: Resolver>; deleteReminder?: Resolver>; + deleteWebhook?: Resolver>; generateApiKey?: Resolver>; googleLogin?: Resolver>; googleSignup?: Resolver>; @@ -3481,6 +3583,8 @@ export type QueryResolvers>; users?: Resolver; validateUsername?: Resolver>; + webhook?: Resolver>; + webhooks?: Resolver; }; export type ReactionResolvers = { @@ -4025,6 +4129,34 @@ export type WebhookResolvers; }; +export type WebhookErrorResolvers = { + errorCodes?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type WebhookResultResolvers = { + __resolveType: TypeResolveFn<'WebhookError' | 'WebhookSuccess', ParentType, ContextType>; +}; + +export type WebhooksErrorResolvers = { + errorCodes?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type WebhooksResultResolvers = { + __resolveType: TypeResolveFn<'WebhooksError' | 'WebhooksSuccess', ParentType, ContextType>; +}; + +export type WebhooksSuccessResolvers = { + webhooks?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type WebhookSuccessResolvers = { + webhook?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + export type Resolvers = { AddPopularReadError?: AddPopularReadErrorResolvers; AddPopularReadResult?: AddPopularReadResultResolvers; @@ -4087,6 +4219,9 @@ export type Resolvers = { DeleteReminderError?: DeleteReminderErrorResolvers; DeleteReminderResult?: DeleteReminderResultResolvers; DeleteReminderSuccess?: DeleteReminderSuccessResolvers; + DeleteWebhookError?: DeleteWebhookErrorResolvers; + DeleteWebhookResult?: DeleteWebhookResultResolvers; + DeleteWebhookSuccess?: DeleteWebhookSuccessResolvers; DeviceToken?: DeviceTokenResolvers; FeedArticle?: FeedArticleResolvers; FeedArticleEdge?: FeedArticleEdgeResolvers; @@ -4233,6 +4368,12 @@ export type Resolvers = { UsersSuccess?: UsersSuccessResolvers; UserSuccess?: UserSuccessResolvers; Webhook?: WebhookResolvers; + WebhookError?: WebhookErrorResolvers; + WebhookResult?: WebhookResultResolvers; + WebhooksError?: WebhooksErrorResolvers; + WebhooksResult?: WebhooksResultResolvers; + WebhooksSuccess?: WebhooksSuccessResolvers; + WebhookSuccess?: WebhookSuccessResolvers; }; export type DirectiveResolvers = { diff --git a/packages/api/src/generated/schema.graphql b/packages/api/src/generated/schema.graphql index b0d25e7e8..3e228c912 100644 --- a/packages/api/src/generated/schema.graphql +++ b/packages/api/src/generated/schema.graphql @@ -440,6 +440,22 @@ type DeleteReminderSuccess { reminder: Reminder! } +type DeleteWebhookError { + errorCodes: [DeleteWebhookErrorCode!]! +} + +enum DeleteWebhookErrorCode { + BAD_REQUEST + NOT_FOUND + UNAUTHORIZED +} + +union DeleteWebhookResult = DeleteWebhookError | DeleteWebhookSuccess + +type DeleteWebhookSuccess { + webhook: Webhook! +} + type DeviceToken { createdAt: Date! id: ID! @@ -725,6 +741,7 @@ type Mutation { deleteNewsletterEmail(newsletterEmailId: ID!): DeleteNewsletterEmailResult! deleteReaction(id: ID!): DeleteReactionResult! deleteReminder(id: ID!): DeleteReminderResult! + deleteWebhook(id: ID!): DeleteWebhookResult! generateApiKey(input: GenerateApiKeyInput!): GenerateApiKeyResult! googleLogin(input: GoogleLoginInput!): LoginResult! googleSignup(input: GoogleSignupInput!): GoogleSignupResult! @@ -857,6 +874,8 @@ type Query { user(userId: ID, username: String): UserResult! users: UsersResult! validateUsername(username: String!): Boolean! + webhook(id: ID!): WebhookResult! + webhooks: WebhooksResult! } type Reaction { @@ -1646,6 +1665,16 @@ type Webhook { url: String! } +type WebhookError { + errorCodes: [WebhookErrorCode!]! +} + +enum WebhookErrorCode { + BAD_REQUEST + NOT_FOUND + UNAUTHORIZED +} + enum WebhookEvent { HIGHLIGHT_CREATED HIGHLIGHT_DELETED @@ -1657,3 +1686,24 @@ enum WebhookEvent { PAGE_DELETED PAGE_UPDATED } + +union WebhookResult = WebhookError | WebhookSuccess + +type WebhooksError { + errorCodes: [WebhooksErrorCode!]! +} + +enum WebhooksErrorCode { + BAD_REQUEST + UNAUTHORIZED +} + +union WebhooksResult = WebhooksError | WebhooksSuccess + +type WebhooksSuccess { + webhooks: [Webhook!]! +} + +type WebhookSuccess { + webhook: Webhook! +} diff --git a/packages/api/src/schema.ts b/packages/api/src/schema.ts index ab21dc2fe..5b634277e 100755 --- a/packages/api/src/schema.ts +++ b/packages/api/src/schema.ts @@ -1620,6 +1620,53 @@ const schema = gql` NOT_FOUND } + union DeleteWebhookResult = DeleteWebhookSuccess | DeleteWebhookError + + type DeleteWebhookSuccess { + webhook: Webhook! + } + + type DeleteWebhookError { + errorCodes: [DeleteWebhookErrorCode!]! + } + + enum DeleteWebhookErrorCode { + UNAUTHORIZED + BAD_REQUEST + NOT_FOUND + } + + union WebhookResult = WebhookSuccess | WebhookError + + type WebhookSuccess { + webhook: Webhook! + } + + type WebhookError { + errorCodes: [WebhookErrorCode!]! + } + + enum WebhookErrorCode { + UNAUTHORIZED + BAD_REQUEST + NOT_FOUND + } + + union WebhooksResult = WebhooksSuccess | WebhooksError + + type WebhooksSuccess { + webhooks: [Webhook!]! + } + + type WebhooksError { + errorCodes: [WebhooksErrorCode!]! + } + + enum WebhooksErrorCode { + UNAUTHORIZED + BAD_REQUEST + } + # Mutations type Mutation { googleLogin(input: GoogleLoginInput!): LoginResult! @@ -1686,6 +1733,7 @@ const schema = gql` subscribe(name: String!): SubscribeResult! addPopularRead(name: String!): AddPopularReadResult! setWebhook(input: SetWebhookInput!): SetWebhookResult! + deleteWebhook(id: ID!): DeleteWebhookResult! } # FIXME: remove sort from feedArticles after all cached tabs are closed @@ -1725,6 +1773,8 @@ const schema = gql` labels: LabelsResult! search(after: String, first: Int, query: String): SearchResult! subscriptions(sort: SortParams): SubscriptionsResult! + webhooks: WebhooksResult! + webhook(id: ID!): WebhookResult! } ` diff --git a/packages/api/test/routers/webhooks.test.ts b/packages/api/test/routers/webhooks.test.ts index b44beb201..a2e942e4b 100644 --- a/packages/api/test/routers/webhooks.test.ts +++ b/packages/api/test/routers/webhooks.test.ts @@ -4,6 +4,7 @@ import { User } from '../../src/entity/user' import 'mocha' import { getRepository } from '../../src/entity/utils' import { Webhook } from '../../src/entity/webhook' +import { expect } from 'chai' describe('Webhooks Router', () => { const username = 'fakeUser' @@ -42,10 +43,11 @@ describe('Webhooks Router', () => { }, } - await request + const res = await request .post('/svc/pubsub/webhooks/trigger/created?token=' + token) .send(data) .expect(200) + expect(res.body.data).to.eql('OK') }) }) })