Add get/list/delete webhook gql schema

This commit is contained in:
Hongbo Wu 2022-05-26 11:05:12 +08:00
parent c9c6f83e65
commit cc07c00a83
4 changed files with 244 additions and 1 deletions

View file

@ -502,6 +502,24 @@ export type DeleteReminderSuccess = {
reminder: Reminder;
};
export type DeleteWebhookError = {
__typename?: 'DeleteWebhookError';
errorCodes: Array<DeleteWebhookErrorCode>;
};
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<WebhookErrorCode>;
};
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<WebhooksErrorCode>;
};
export enum WebhooksErrorCode {
BadRequest = 'BAD_REQUEST',
Unauthorized = 'UNAUTHORIZED'
}
export type WebhooksResult = WebhooksError | WebhooksSuccess;
export type WebhooksSuccess = {
__typename?: 'WebhooksSuccess';
webhooks: Array<Webhook>;
};
export type WebhookSuccess = {
__typename?: 'WebhookSuccess';
webhook: Webhook;
};
export type ResolverTypeWrapper<T> = Promise<T> | T;
@ -2292,6 +2358,10 @@ export type ResolversTypes = {
DeleteReminderErrorCode: DeleteReminderErrorCode;
DeleteReminderResult: ResolversTypes['DeleteReminderError'] | ResolversTypes['DeleteReminderSuccess'];
DeleteReminderSuccess: ResolverTypeWrapper<DeleteReminderSuccess>;
DeleteWebhookError: ResolverTypeWrapper<DeleteWebhookError>;
DeleteWebhookErrorCode: DeleteWebhookErrorCode;
DeleteWebhookResult: ResolversTypes['DeleteWebhookError'] | ResolversTypes['DeleteWebhookSuccess'];
DeleteWebhookSuccess: ResolverTypeWrapper<DeleteWebhookSuccess>;
DeviceToken: ResolverTypeWrapper<DeviceToken>;
FeedArticle: ResolverTypeWrapper<FeedArticle>;
FeedArticleEdge: ResolverTypeWrapper<FeedArticleEdge>;
@ -2520,7 +2590,15 @@ export type ResolversTypes = {
UsersSuccess: ResolverTypeWrapper<UsersSuccess>;
UserSuccess: ResolverTypeWrapper<UserSuccess>;
Webhook: ResolverTypeWrapper<Webhook>;
WebhookError: ResolverTypeWrapper<WebhookError>;
WebhookErrorCode: WebhookErrorCode;
WebhookEvent: WebhookEvent;
WebhookResult: ResolversTypes['WebhookError'] | ResolversTypes['WebhookSuccess'];
WebhooksError: ResolverTypeWrapper<WebhooksError>;
WebhooksErrorCode: WebhooksErrorCode;
WebhooksResult: ResolversTypes['WebhooksError'] | ResolversTypes['WebhooksSuccess'];
WebhooksSuccess: ResolverTypeWrapper<WebhooksSuccess>;
WebhookSuccess: ResolverTypeWrapper<WebhookSuccess>;
};
/** 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<ContextType = ResolverContext, Parent
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
};
export type DeleteWebhookErrorResolvers<ContextType = ResolverContext, ParentType extends ResolversParentTypes['DeleteWebhookError'] = ResolversParentTypes['DeleteWebhookError']> = {
errorCodes?: Resolver<Array<ResolversTypes['DeleteWebhookErrorCode']>, ParentType, ContextType>;
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
};
export type DeleteWebhookResultResolvers<ContextType = ResolverContext, ParentType extends ResolversParentTypes['DeleteWebhookResult'] = ResolversParentTypes['DeleteWebhookResult']> = {
__resolveType: TypeResolveFn<'DeleteWebhookError' | 'DeleteWebhookSuccess', ParentType, ContextType>;
};
export type DeleteWebhookSuccessResolvers<ContextType = ResolverContext, ParentType extends ResolversParentTypes['DeleteWebhookSuccess'] = ResolversParentTypes['DeleteWebhookSuccess']> = {
webhook?: Resolver<ResolversTypes['Webhook'], ParentType, ContextType>;
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
};
export type DeviceTokenResolvers<ContextType = ResolverContext, ParentType extends ResolversParentTypes['DeviceToken'] = ResolversParentTypes['DeviceToken']> = {
createdAt?: Resolver<ResolversTypes['Date'], ParentType, ContextType>;
id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;
@ -3371,6 +3472,7 @@ export type MutationResolvers<ContextType = ResolverContext, ParentType extends
deleteNewsletterEmail?: Resolver<ResolversTypes['DeleteNewsletterEmailResult'], ParentType, ContextType, RequireFields<MutationDeleteNewsletterEmailArgs, 'newsletterEmailId'>>;
deleteReaction?: Resolver<ResolversTypes['DeleteReactionResult'], ParentType, ContextType, RequireFields<MutationDeleteReactionArgs, 'id'>>;
deleteReminder?: Resolver<ResolversTypes['DeleteReminderResult'], ParentType, ContextType, RequireFields<MutationDeleteReminderArgs, 'id'>>;
deleteWebhook?: Resolver<ResolversTypes['DeleteWebhookResult'], ParentType, ContextType, RequireFields<MutationDeleteWebhookArgs, 'id'>>;
generateApiKey?: Resolver<ResolversTypes['GenerateApiKeyResult'], ParentType, ContextType, RequireFields<MutationGenerateApiKeyArgs, 'input'>>;
googleLogin?: Resolver<ResolversTypes['LoginResult'], ParentType, ContextType, RequireFields<MutationGoogleLoginArgs, 'input'>>;
googleSignup?: Resolver<ResolversTypes['GoogleSignupResult'], ParentType, ContextType, RequireFields<MutationGoogleSignupArgs, 'input'>>;
@ -3481,6 +3583,8 @@ export type QueryResolvers<ContextType = ResolverContext, ParentType extends Res
user?: Resolver<ResolversTypes['UserResult'], ParentType, ContextType, Partial<QueryUserArgs>>;
users?: Resolver<ResolversTypes['UsersResult'], ParentType, ContextType>;
validateUsername?: Resolver<ResolversTypes['Boolean'], ParentType, ContextType, RequireFields<QueryValidateUsernameArgs, 'username'>>;
webhook?: Resolver<ResolversTypes['WebhookResult'], ParentType, ContextType, RequireFields<QueryWebhookArgs, 'id'>>;
webhooks?: Resolver<ResolversTypes['WebhooksResult'], ParentType, ContextType>;
};
export type ReactionResolvers<ContextType = ResolverContext, ParentType extends ResolversParentTypes['Reaction'] = ResolversParentTypes['Reaction']> = {
@ -4025,6 +4129,34 @@ export type WebhookResolvers<ContextType = ResolverContext, ParentType extends R
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
};
export type WebhookErrorResolvers<ContextType = ResolverContext, ParentType extends ResolversParentTypes['WebhookError'] = ResolversParentTypes['WebhookError']> = {
errorCodes?: Resolver<Array<ResolversTypes['WebhookErrorCode']>, ParentType, ContextType>;
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
};
export type WebhookResultResolvers<ContextType = ResolverContext, ParentType extends ResolversParentTypes['WebhookResult'] = ResolversParentTypes['WebhookResult']> = {
__resolveType: TypeResolveFn<'WebhookError' | 'WebhookSuccess', ParentType, ContextType>;
};
export type WebhooksErrorResolvers<ContextType = ResolverContext, ParentType extends ResolversParentTypes['WebhooksError'] = ResolversParentTypes['WebhooksError']> = {
errorCodes?: Resolver<Array<ResolversTypes['WebhooksErrorCode']>, ParentType, ContextType>;
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
};
export type WebhooksResultResolvers<ContextType = ResolverContext, ParentType extends ResolversParentTypes['WebhooksResult'] = ResolversParentTypes['WebhooksResult']> = {
__resolveType: TypeResolveFn<'WebhooksError' | 'WebhooksSuccess', ParentType, ContextType>;
};
export type WebhooksSuccessResolvers<ContextType = ResolverContext, ParentType extends ResolversParentTypes['WebhooksSuccess'] = ResolversParentTypes['WebhooksSuccess']> = {
webhooks?: Resolver<Array<ResolversTypes['Webhook']>, ParentType, ContextType>;
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
};
export type WebhookSuccessResolvers<ContextType = ResolverContext, ParentType extends ResolversParentTypes['WebhookSuccess'] = ResolversParentTypes['WebhookSuccess']> = {
webhook?: Resolver<ResolversTypes['Webhook'], ParentType, ContextType>;
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
};
export type Resolvers<ContextType = ResolverContext> = {
AddPopularReadError?: AddPopularReadErrorResolvers<ContextType>;
AddPopularReadResult?: AddPopularReadResultResolvers<ContextType>;
@ -4087,6 +4219,9 @@ export type Resolvers<ContextType = ResolverContext> = {
DeleteReminderError?: DeleteReminderErrorResolvers<ContextType>;
DeleteReminderResult?: DeleteReminderResultResolvers<ContextType>;
DeleteReminderSuccess?: DeleteReminderSuccessResolvers<ContextType>;
DeleteWebhookError?: DeleteWebhookErrorResolvers<ContextType>;
DeleteWebhookResult?: DeleteWebhookResultResolvers<ContextType>;
DeleteWebhookSuccess?: DeleteWebhookSuccessResolvers<ContextType>;
DeviceToken?: DeviceTokenResolvers<ContextType>;
FeedArticle?: FeedArticleResolvers<ContextType>;
FeedArticleEdge?: FeedArticleEdgeResolvers<ContextType>;
@ -4233,6 +4368,12 @@ export type Resolvers<ContextType = ResolverContext> = {
UsersSuccess?: UsersSuccessResolvers<ContextType>;
UserSuccess?: UserSuccessResolvers<ContextType>;
Webhook?: WebhookResolvers<ContextType>;
WebhookError?: WebhookErrorResolvers<ContextType>;
WebhookResult?: WebhookResultResolvers<ContextType>;
WebhooksError?: WebhooksErrorResolvers<ContextType>;
WebhooksResult?: WebhooksResultResolvers<ContextType>;
WebhooksSuccess?: WebhooksSuccessResolvers<ContextType>;
WebhookSuccess?: WebhookSuccessResolvers<ContextType>;
};
export type DirectiveResolvers<ContextType = ResolverContext> = {

View file

@ -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!
}

View file

@ -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!
}
`

View file

@ -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')
})
})
})