Add createIntegration API to the GQL schema

This commit is contained in:
Hongbo Wu 2022-08-01 21:53:39 +08:00
parent db27ac7d59
commit e66d047d51
6 changed files with 168 additions and 5 deletions

View file

@ -9,6 +9,10 @@ import {
} from 'typeorm'
import { User } from './user'
export enum IntegrationType {
Readwise = 'READWISE',
}
@Entity({ name: 'integrations' })
export class Integration {
@PrimaryGeneratedColumn('uuid')
@ -18,8 +22,8 @@ export class Integration {
@JoinColumn({ name: 'user_id' })
user!: User
@Column('varchar')
name!: string
@Column('enum', { enum: IntegrationType })
type!: IntegrationType
@Column('varchar')
token!: string

View file

@ -331,6 +331,30 @@ export type CreateHighlightSuccess = {
highlight: Highlight;
};
export type CreateIntegrationError = {
__typename?: 'CreateIntegrationError';
errorCodes: Array<CreateIntegrationErrorCode>;
};
export enum CreateIntegrationErrorCode {
BadRequest = 'BAD_REQUEST',
InvalidToken = 'INVALID_TOKEN',
NotFound = 'NOT_FOUND',
Unauthorized = 'UNAUTHORIZED'
}
export type CreateIntegrationInput = {
token: Scalars['String'];
type: IntegrationType;
};
export type CreateIntegrationResult = CreateIntegrationError | CreateIntegrationSuccess;
export type CreateIntegrationSuccess = {
__typename?: 'CreateIntegrationSuccess';
integration: Integration;
};
export type CreateLabelError = {
__typename?: 'CreateLabelError';
errorCodes: Array<CreateLabelErrorCode>;
@ -745,6 +769,19 @@ export type HighlightStats = {
highlightCount: Scalars['Int'];
};
export type Integration = {
__typename?: 'Integration';
createdAt: Scalars['Date'];
enabled: Scalars['Boolean'];
id: Scalars['ID'];
type: IntegrationType;
updatedAt: Scalars['Date'];
};
export enum IntegrationType {
Readwise = 'READWISE'
}
export type Label = {
__typename?: 'Label';
color: Scalars['String'];
@ -897,6 +934,7 @@ export type Mutation = {
createArticleSavingRequest: CreateArticleSavingRequestResult;
createHighlight: CreateHighlightResult;
createHighlightReply: CreateHighlightReplyResult;
createIntegration: CreateIntegrationResult;
createLabel: CreateLabelResult;
createNewsletterEmail: CreateNewsletterEmailResult;
createReaction: CreateReactionResult;
@ -971,6 +1009,11 @@ export type MutationCreateHighlightReplyArgs = {
};
export type MutationCreateIntegrationArgs = {
input: CreateIntegrationInput;
};
export type MutationCreateLabelArgs = {
input: CreateLabelInput;
};
@ -2505,6 +2548,11 @@ export type ResolversTypes = {
CreateHighlightReplySuccess: ResolverTypeWrapper<CreateHighlightReplySuccess>;
CreateHighlightResult: ResolversTypes['CreateHighlightError'] | ResolversTypes['CreateHighlightSuccess'];
CreateHighlightSuccess: ResolverTypeWrapper<CreateHighlightSuccess>;
CreateIntegrationError: ResolverTypeWrapper<CreateIntegrationError>;
CreateIntegrationErrorCode: CreateIntegrationErrorCode;
CreateIntegrationInput: CreateIntegrationInput;
CreateIntegrationResult: ResolversTypes['CreateIntegrationError'] | ResolversTypes['CreateIntegrationSuccess'];
CreateIntegrationSuccess: ResolverTypeWrapper<CreateIntegrationSuccess>;
CreateLabelError: ResolverTypeWrapper<CreateLabelError>;
CreateLabelErrorCode: CreateLabelErrorCode;
CreateLabelInput: CreateLabelInput;
@ -2592,6 +2640,8 @@ export type ResolversTypes = {
HighlightStats: ResolverTypeWrapper<HighlightStats>;
ID: ResolverTypeWrapper<Scalars['ID']>;
Int: ResolverTypeWrapper<Scalars['Int']>;
Integration: ResolverTypeWrapper<Integration>;
IntegrationType: IntegrationType;
Label: ResolverTypeWrapper<Label>;
LabelsError: ResolverTypeWrapper<LabelsError>;
LabelsErrorCode: LabelsErrorCode;
@ -2859,6 +2909,10 @@ export type ResolversParentTypes = {
CreateHighlightReplySuccess: CreateHighlightReplySuccess;
CreateHighlightResult: ResolversParentTypes['CreateHighlightError'] | ResolversParentTypes['CreateHighlightSuccess'];
CreateHighlightSuccess: CreateHighlightSuccess;
CreateIntegrationError: CreateIntegrationError;
CreateIntegrationInput: CreateIntegrationInput;
CreateIntegrationResult: ResolversParentTypes['CreateIntegrationError'] | ResolversParentTypes['CreateIntegrationSuccess'];
CreateIntegrationSuccess: CreateIntegrationSuccess;
CreateLabelError: CreateLabelError;
CreateLabelInput: CreateLabelInput;
CreateLabelResult: ResolversParentTypes['CreateLabelError'] | ResolversParentTypes['CreateLabelSuccess'];
@ -2929,6 +2983,7 @@ export type ResolversParentTypes = {
HighlightStats: HighlightStats;
ID: Scalars['ID'];
Int: Scalars['Int'];
Integration: Integration;
Label: Label;
LabelsError: LabelsError;
LabelsResult: ResolversParentTypes['LabelsError'] | ResolversParentTypes['LabelsSuccess'];
@ -3327,6 +3382,20 @@ export type CreateHighlightSuccessResolvers<ContextType = ResolverContext, Paren
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
};
export type CreateIntegrationErrorResolvers<ContextType = ResolverContext, ParentType extends ResolversParentTypes['CreateIntegrationError'] = ResolversParentTypes['CreateIntegrationError']> = {
errorCodes?: Resolver<Array<ResolversTypes['CreateIntegrationErrorCode']>, ParentType, ContextType>;
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
};
export type CreateIntegrationResultResolvers<ContextType = ResolverContext, ParentType extends ResolversParentTypes['CreateIntegrationResult'] = ResolversParentTypes['CreateIntegrationResult']> = {
__resolveType: TypeResolveFn<'CreateIntegrationError' | 'CreateIntegrationSuccess', ParentType, ContextType>;
};
export type CreateIntegrationSuccessResolvers<ContextType = ResolverContext, ParentType extends ResolversParentTypes['CreateIntegrationSuccess'] = ResolversParentTypes['CreateIntegrationSuccess']> = {
integration?: Resolver<ResolversTypes['Integration'], ParentType, ContextType>;
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
};
export type CreateLabelErrorResolvers<ContextType = ResolverContext, ParentType extends ResolversParentTypes['CreateLabelError'] = ResolversParentTypes['CreateLabelError']> = {
errorCodes?: Resolver<Array<ResolversTypes['CreateLabelErrorCode']>, ParentType, ContextType>;
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
@ -3644,6 +3713,15 @@ export type HighlightStatsResolvers<ContextType = ResolverContext, ParentType ex
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
};
export type IntegrationResolvers<ContextType = ResolverContext, ParentType extends ResolversParentTypes['Integration'] = ResolversParentTypes['Integration']> = {
createdAt?: Resolver<ResolversTypes['Date'], ParentType, ContextType>;
enabled?: Resolver<ResolversTypes['Boolean'], ParentType, ContextType>;
id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;
type?: Resolver<ResolversTypes['IntegrationType'], ParentType, ContextType>;
updatedAt?: Resolver<ResolversTypes['Date'], ParentType, ContextType>;
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
};
export type LabelResolvers<ContextType = ResolverContext, ParentType extends ResolversParentTypes['Label'] = ResolversParentTypes['Label']> = {
color?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
createdAt?: Resolver<Maybe<ResolversTypes['Date']>, ParentType, ContextType>;
@ -3755,6 +3833,7 @@ export type MutationResolvers<ContextType = ResolverContext, ParentType extends
createArticleSavingRequest?: Resolver<ResolversTypes['CreateArticleSavingRequestResult'], ParentType, ContextType, RequireFields<MutationCreateArticleSavingRequestArgs, 'input'>>;
createHighlight?: Resolver<ResolversTypes['CreateHighlightResult'], ParentType, ContextType, RequireFields<MutationCreateHighlightArgs, 'input'>>;
createHighlightReply?: Resolver<ResolversTypes['CreateHighlightReplyResult'], ParentType, ContextType, RequireFields<MutationCreateHighlightReplyArgs, 'input'>>;
createIntegration?: Resolver<ResolversTypes['CreateIntegrationResult'], ParentType, ContextType, RequireFields<MutationCreateIntegrationArgs, 'input'>>;
createLabel?: Resolver<ResolversTypes['CreateLabelResult'], ParentType, ContextType, RequireFields<MutationCreateLabelArgs, 'input'>>;
createNewsletterEmail?: Resolver<ResolversTypes['CreateNewsletterEmailResult'], ParentType, ContextType>;
createReaction?: Resolver<ResolversTypes['CreateReactionResult'], ParentType, ContextType, RequireFields<MutationCreateReactionArgs, 'input'>>;
@ -4556,6 +4635,9 @@ export type Resolvers<ContextType = ResolverContext> = {
CreateHighlightReplySuccess?: CreateHighlightReplySuccessResolvers<ContextType>;
CreateHighlightResult?: CreateHighlightResultResolvers<ContextType>;
CreateHighlightSuccess?: CreateHighlightSuccessResolvers<ContextType>;
CreateIntegrationError?: CreateIntegrationErrorResolvers<ContextType>;
CreateIntegrationResult?: CreateIntegrationResultResolvers<ContextType>;
CreateIntegrationSuccess?: CreateIntegrationSuccessResolvers<ContextType>;
CreateLabelError?: CreateLabelErrorResolvers<ContextType>;
CreateLabelResult?: CreateLabelResultResolvers<ContextType>;
CreateLabelSuccess?: CreateLabelSuccessResolvers<ContextType>;
@ -4617,6 +4699,7 @@ export type Resolvers<ContextType = ResolverContext> = {
Highlight?: HighlightResolvers<ContextType>;
HighlightReply?: HighlightReplyResolvers<ContextType>;
HighlightStats?: HighlightStatsResolvers<ContextType>;
Integration?: IntegrationResolvers<ContextType>;
Label?: LabelResolvers<ContextType>;
LabelsError?: LabelsErrorResolvers<ContextType>;
LabelsResult?: LabelsResultResolvers<ContextType>;

View file

@ -284,6 +284,28 @@ type CreateHighlightSuccess {
highlight: Highlight!
}
type CreateIntegrationError {
errorCodes: [CreateIntegrationErrorCode!]!
}
enum CreateIntegrationErrorCode {
BAD_REQUEST
INVALID_TOKEN
NOT_FOUND
UNAUTHORIZED
}
input CreateIntegrationInput {
token: String!
type: IntegrationType!
}
union CreateIntegrationResult = CreateIntegrationError | CreateIntegrationSuccess
type CreateIntegrationSuccess {
integration: Integration!
}
type CreateLabelError {
errorCodes: [CreateLabelErrorCode!]!
}
@ -658,6 +680,18 @@ type HighlightStats {
highlightCount: Int!
}
type Integration {
createdAt: Date!
enabled: Boolean!
id: ID!
type: IntegrationType!
updatedAt: Date!
}
enum IntegrationType {
READWISE
}
type Label {
color: String!
createdAt: Date
@ -796,6 +830,7 @@ type Mutation {
createArticleSavingRequest(input: CreateArticleSavingRequestInput!): CreateArticleSavingRequestResult!
createHighlight(input: CreateHighlightInput!): CreateHighlightResult!
createHighlightReply(input: CreateHighlightReplyInput!): CreateHighlightReplyResult!
createIntegration(input: CreateIntegrationInput!): CreateIntegrationResult!
createLabel(input: CreateLabelInput!): CreateLabelResult!
createNewsletterEmail: CreateNewsletterEmailResult!
createReaction(input: CreateReactionInput!): CreateReactionResult!

View file

@ -1812,6 +1812,42 @@ const schema = gql`
NOT_FOUND
}
union CreateIntegrationResult =
CreateIntegrationSuccess
| CreateIntegrationError
type CreateIntegrationSuccess {
integration: Integration!
}
type Integration {
id: ID!
type: IntegrationType!
enabled: Boolean!
createdAt: Date!
updatedAt: Date!
}
enum IntegrationType {
READWISE
}
type CreateIntegrationError {
errorCodes: [CreateIntegrationErrorCode!]!
}
enum CreateIntegrationErrorCode {
UNAUTHORIZED
BAD_REQUEST
NOT_FOUND
INVALID_TOKEN
}
input CreateIntegrationInput {
type: IntegrationType!
token: String!
}
# Mutations
type Mutation {
googleLogin(input: GoogleLoginInput!): LoginResult!
@ -1881,6 +1917,7 @@ const schema = gql`
revokeApiKey(id: ID!): RevokeApiKeyResult!
setLabelsForHighlight(input: SetLabelsForHighlightInput!): SetLabelsResult!
moveLabel(input: MoveLabelInput!): MoveLabelResult!
createIntegration(input: CreateIntegrationInput!): CreateIntegrationResult!
}
# FIXME: remove sort from feedArticles after all cached tabs are closed

View file

@ -4,15 +4,17 @@
BEGIN;
CREATE TYPE omnivore.integration_type AS ENUM ('READWISE');
CREATE TABLE omnivore.integrations (
id uuid PRIMARY KEY DEFAULT uuid_generate_v1mc(),
user_id uuid NOT NULL REFERENCES omnivore.user ON DELETE CASCADE,
name varchar(50) NOT NULL,
"type" integration_type NOT NULL,
token varchar(255) NOT NULL,
enabled boolean NOT NULL DEFAULT true,
"enabled" boolean NOT NULL DEFAULT true,
created_at timestamptz NOT NULL DEFAULT current_timestamp,
updated_at timestamptz NOT NULL DEFAULT current_timestamp,
UNIQUE (user_id, name)
UNIQUE (user_id, "type")
);
CREATE TRIGGER update_integration_modtime BEFORE UPDATE ON omnivore.integrations

View file

@ -6,4 +6,6 @@ BEGIN;
DROP TABLE IF EXISTS omnivore.integrations;
DROP TYPE IF EXISTS omnivore.integration_type CASCADE;
COMMIT;