Я использовал AWS Appsyn c, и мне удалось получить автоматически сгенерированный код для angular (для меня был создан сервис angular с запросами CRUD плюс типы машинописи) на основе graphql файл схемы.
https://aws-amplify.github.io/docs/js/api#angular
Я также нашел здесь (спасибо @Daniel Rearden), как вы можете генерировать angular сервисы из существующие графические запросы. Это хорошо, но на самом деле это следующая часть, которая отнимает много времени: написание запросов в формате graphql каждый раз, когда вы меняете схему. Как удалось AWS, можно генерировать грубые запросы на основе схемы. Конечно, они обычно возвращают все поля и запрашивают все поля в качестве входного параметра, но это нормально.
Мой вопрос: есть ли какой-нибудь инструмент, доступный для генерации angular сервисов с запросами crud graphql и типами машинописного текста, такими как тот? AWS использует? Кто-нибудь использовал это за пределами AWS Appsyn c?
Пример того, как это работает с AWS Appsyn c:
на основе схемы, подобной этой:
type Todo @model { id: ID! name: String! description: String }
Будет сгенерирован angular сервис, подобный следующему:
import { Injectable } from "@angular/core";
import API, { graphqlOperation } from "@aws-amplify/api";
import { GraphQLResult } from "@aws-amplify/api/lib/types";
import * as Observable from "zen-observable";
export type CreateTodoInput = {
id?: string | null;
name: string;
description?: string | null;
};
export type UpdateTodoInput = {
id: string;
name?: string | null;
description?: string | null;
};
export type DeleteTodoInput = {
id?: string | null;
};
export type ModelTodoFilterInput = {
id?: ModelIDFilterInput | null;
name?: ModelStringFilterInput | null;
description?: ModelStringFilterInput | null;
and?: Array<ModelTodoFilterInput | null> | null;
or?: Array<ModelTodoFilterInput | null> | null;
not?: ModelTodoFilterInput | null;
};
export type ModelIDFilterInput = {
ne?: string | null;
eq?: string | null;
le?: string | null;
lt?: string | null;
ge?: string | null;
gt?: string | null;
contains?: string | null;
notContains?: string | null;
between?: Array<string | null> | null;
beginsWith?: string | null;
};
export type ModelStringFilterInput = {
ne?: string | null;
eq?: string | null;
le?: string | null;
lt?: string | null;
ge?: string | null;
gt?: string | null;
contains?: string | null;
notContains?: string | null;
between?: Array<string | null> | null;
beginsWith?: string | null;
};
export type CreateTodoMutation = {
__typename: "Todo";
id: string;
name: string;
description: string | null;
};
export type UpdateTodoMutation = {
__typename: "Todo";
id: string;
name: string;
description: string | null;
};
export type DeleteTodoMutation = {
__typename: "Todo";
id: string;
name: string;
description: string | null;
};
export type GetTodoQuery = {
__typename: "Todo";
id: string;
name: string;
description: string | null;
};
export type ListTodosQuery = {
__typename: "ModelTodoConnection";
items: Array<{
__typename: "Todo";
id: string;
name: string;
description: string | null;
} | null> | null;
nextToken: string | null;
};
export type OnCreateTodoSubscription = {
__typename: "Todo";
id: string;
name: string;
description: string | null;
};
export type OnUpdateTodoSubscription = {
__typename: "Todo";
id: string;
name: string;
description: string | null;
};
export type OnDeleteTodoSubscription = {
__typename: "Todo";
id: string;
name: string;
description: string | null;
};
@Injectable({
providedIn: "root"
})
export class APIService {
async CreateTodo(input: CreateTodoInput): Promise<CreateTodoMutation> {
const statement = `mutation CreateTodo($input: CreateTodoInput!) {
createTodo(input: $input) {
__typename
id
name
description
}
}`;
const gqlAPIServiceArguments: any = {
input
};
const response = (await API.graphql(
graphqlOperation(statement, gqlAPIServiceArguments)
)) as any;
return <CreateTodoMutation>response.data.createTodo;
}
async UpdateTodo(input: UpdateTodoInput): Promise<UpdateTodoMutation> {
const statement = `mutation UpdateTodo($input: UpdateTodoInput!) {
updateTodo(input: $input) {
__typename
id
name
description
}
}`;
const gqlAPIServiceArguments: any = {
input
};
const response = (await API.graphql(
graphqlOperation(statement, gqlAPIServiceArguments)
)) as any;
return <UpdateTodoMutation>response.data.updateTodo;
}
async DeleteTodo(input: DeleteTodoInput): Promise<DeleteTodoMutation> {
const statement = `mutation DeleteTodo($input: DeleteTodoInput!) {
deleteTodo(input: $input) {
__typename
id
name
description
}
}`;
const gqlAPIServiceArguments: any = {
input
};
const response = (await API.graphql(
graphqlOperation(statement, gqlAPIServiceArguments)
)) as any;
return <DeleteTodoMutation>response.data.deleteTodo;
}
async GetTodo(id: string): Promise<GetTodoQuery> {
const statement = `query GetTodo($id: ID!) {
getTodo(id: $id) {
__typename
id
name
description
}
}`;
const gqlAPIServiceArguments: any = {
id
};
const response = (await API.graphql(
graphqlOperation(statement, gqlAPIServiceArguments)
)) as any;
return <GetTodoQuery>response.data.getTodo;
}
async ListTodos(
filter?: ModelTodoFilterInput,
limit?: number,
nextToken?: string
): Promise<ListTodosQuery> {
const statement = `query ListTodos($filter: ModelTodoFilterInput, $limit: Int, $nextToken: String) {
listTodos(filter: $filter, limit: $limit, nextToken: $nextToken) {
__typename
items {
__typename
id
name
description
}
nextToken
}
}`;
const gqlAPIServiceArguments: any = {};
if (filter) {
gqlAPIServiceArguments.filter = filter;
}
if (limit) {
gqlAPIServiceArguments.limit = limit;
}
if (nextToken) {
gqlAPIServiceArguments.nextToken = nextToken;
}
const response = (await API.graphql(
graphqlOperation(statement, gqlAPIServiceArguments)
)) as any;
return <ListTodosQuery>response.data.listTodos;
}
OnCreateTodoListener: Observable<OnCreateTodoSubscription> = API.graphql(
graphqlOperation(
`subscription OnCreateTodo {
onCreateTodo {
__typename
id
name
description
}
}`
)
) as Observable<OnCreateTodoSubscription>;
OnUpdateTodoListener: Observable<OnUpdateTodoSubscription> = API.graphql(
graphqlOperation(
`subscription OnUpdateTodo {
onUpdateTodo {
__typename
id
name
description
}
}`
)
) as Observable<OnUpdateTodoSubscription>;
OnDeleteTodoListener: Observable<OnDeleteTodoSubscription> = API.graphql(
graphqlOperation(
`subscription OnDeleteTodo {
onDeleteTodo {
__typename
id
name
description
}
}`
)
) as Observable<OnDeleteTodoSubscription>;
}
Я использую neo4j, apollo и angular со стартером на трибуне .
Я видел способы написания собственных шаблонов для генерации кода такого типа здесь . Я надеюсь, что кто-то создал один из этих шаблонов для angular, аналогичный тому, который есть у AWS.