Definir Resources
Os Resources são uma coleção de methods (métodos) para um determinado data model (modelo de dados).
Entities e Schemas definem de forma declarativa o modelo de dados. Os Endpoints são os métodos sobre esses dados.
- REST
- GraphQL
- Async/Promise
npm install --save @data-client/rest
resource() constrói um namespace de RestEndpoints
TodoResource
import { Entity, resource } from '@data-client/rest'; export class Todo extends Entity { id = 0; userId = 0; title = ''; completed = false; static key = 'Todo'; } export const TodoResource = resource({ urlPrefix: 'https://jsonplaceholder.typicode.com', path: '/todos/:id', schema: Todo, searchParams: {} as { userId?: string | number } | undefined, paginationField: 'page', }); /** Methods can be called as functions or used in hooks */ // GET https://jsonplaceholder.typicode.com/todos/5 TodoResource.get({ id: 5 }); // GET https://jsonplaceholder.typicode.com/todos TodoResource.getList(); // GET https://jsonplaceholder.typicode.com/todos?userId=1 TodoResource.getList({ userId: 1 }); // POST https://jsonplaceholder.typicode.com/todos TodoResource.getList.push({ title: 'my todo' }); // POST https://jsonplaceholder.typicode.com/todos?userId=1 TodoResource.getList.push({ userId: 1 }, { title: 'my todo' }); // GET https://jsonplaceholder.typicode.com/todos?userId=1&page=2 TodoResource.getList.getPage({ userId: 1, page: 2 }); // PUT https://jsonplaceholder.typicode.com/todos/5 TodoResource.update({ id: 5 }, { title: 'my todo' }); // PATCH https://jsonplaceholder.typicode.com/todos/5 TodoResource.partialUpdate({ id: 5 }, { title: 'my todo' }); // PATCH https://jsonplaceholder.typicode.com/todos/5 TodoResource.getList.move({ id: 5 }, { completed: true }); // DELETE https://jsonplaceholder.typicode.com/todos/5 TodoResource.delete({ id: 5 });
npm install --save @data-client/graphql
GQLEndpoint ajuda a definir rapidamente queries e mutações
TodoResource
import { GQLEndpoint, GQLEntity } from '@data-client/graphql'; const gql = new GQLEndpoint('/'); export class Todo extends GQLEntity { title = ''; completed = false; static key = 'Todo'; } export const TodoResource = { getList: gql.query( ` query GetTodos { todo { id title completed } } `, { todos: new Collection([Todo]) }, ), update: gql.mutation( `mutation UpdateTodo($todo: Todo!) { updateTodo(todo: $todo) { id title completed } }`, { updateTodo: Todo }, ), };
npm install --save @data-client/endpoint
Definições TypeScript pré-existentes podem ser usadas no Data Client com Endpoint e EntityMixin.
▶existing/Todo
▶TodoResource
import { Collection, Endpoint, EntityMixin, Invalidate } from '@data-client/endpoint'; import { Todo, getTodo, getTodoList, updateTodo, partialUpdateTodo, createTodo, deleteTodo, } from './existing/Todo'; export const TodoEntity = EntityMixin(Todo, { key: 'Todo' }); export const TodoResource = { get: new Endpoint(getTodo, { schema: TodoEntity }), getList: new Endpoint(getTodoList, { schema: new Collection([TodoEntity]), }), update: new Endpoint(updateTodo, { schema: TodoEntity, sideEffect: true, }), partialUpdate: new Endpoint(partialUpdateTodo, { schema: TodoEntity, sideEffect: true, }), create: new Endpoint(createTodo, { schema: new Collection([TodoEntity]).push, sideEffect: true, }), delete: new Endpoint(deleteTodo, { schema: new Invalidate(TodoEntity), sideEffect: true, }), };
Para ajudar a definir Resources, são fornecidos helpers componíveis e extensíveis específicos de protocolo para REST, GraphQL,
Websockets+SSE.
Para usar definições de API existentes, ou definir seus próprios helpers específicos de protocolo, use
Endpoint e EntityMixin de @data-client/endpoint.
[Veja a aba Async/Promise acima]