SDK

O SDK é o que utilizamos para fazermos nossa comunicação com as APIs REST do nosso backend, é como se nossas requisições ao backend ficassem mockados no SDK e ele faz todo o trabalho para nós.

Como criar um módulo no SDK

O SDK fica dentro das pastas pkgs/@itflex/sdk, e as requisições referentes aos módulos dentro de modules

Então, você irá criar seu módulo novo: pkgs/itflex/sdk/modules/[módulo]

Você precisa de um arquivo especificando o SDK referente a API que ele será responsável, e também um index.js, então, por exemplo, eu estou criando um módulo no SDK para a API '/api/products', seria algo como:

sdk/modules/products/Products.js
sdk/modules/products/index.js

No arquivo Products.js ficam todas as requisições necessárias para essa API, nesse exemplo, estaremos fazendo um CRUD básico.

import { METHODS } from "../../core/Request"; //Importamos os métodos HTTP daqui

const BASE_URI = "/api/products";

// Classe que fica responsável por "montar" a resposta, o backend e o frontend na hora das análises de regra
// de negócios deixam bem claro como vai ser a API, que campos elas vão ter e como vão retorná-las, então
// montamos essa classe de acordo com o que é discutido.
export class Product {
  constructor(props = {}) {
    this.id = props.id;
    this.name = props.name;
    this.description = props.description || "";
    this.quantity = props.quantity || null;
    this.price = props.price;
  }
}

// Onde estaram todas as requisições
export const ProductMethods = (config) => ({
  getProducts() {
    return config.request
      .withUri(BASE_URI)
      .withAuth(config.accessToken)
      .withMethod(METHODS.get)
      .withPayloadParser((payload) => {
        return payload.products.map((product) => new Product(product));
      })
      .execute(config);
  },

  getProduct({ id }) {
    return config.request
      .withUri(`${BASE_URI}/${id}`)
      .withAuth(config.accessToken)
      .withMethod(METHODS.get)
      .withPayloadParser((payload) => new Product(payload))
      .execute(config);
  },

  createProduct(props = {}) {
    const product = new Product(props);
    const data = Object.assign({}, product);

    delete data.id;
    return config.request
      .withAuth(config.accessToken)
      .withUri(`${BASE_URI}`)
      .withData(data)
      .withMethod(METHODS.post)
      .withPayloadParser((payload) => new Product(payload))
      .execute(config);
  },

  updateProduct(props = {}) {
    const product = new Product(props);
    const data = Object.assign({}, product);

    delete data.id;
    return config.request
      .withAuth(config.accessToken)
      .withUri(`${BASE_URI}/${product.id}`)
      .withData(data)
      .withMethod(METHODS.put)
      .withPayloadParser((payload) => new Product(payload))
      .execute(config);
  },

  deleteProduct({ id }) {
    return config.request
      .withAuth(config.accessToken)
      .withUri(`${BASE_URI}/${id}`)
      .withMethod(METHODS.delete)
      .execute(config);
  },
});

// Exportamos mais uma vez
export default {
  Product,
  ProductMethods,
};

No arquivo index.js é onde agrupamos todos os SDK’s do módulo para podermos passar as informações necessárias

import Product from "./Products";

export const ProductsTypes = () => ({
  Product: (props) => new Product.Product(props),
});

export const Products = (config) => {
  const types = ProductsTypes;

  return Object.assign(
    {
      types: types,
    },
    Product.ProductMethods(config)
  );
};

Padrões SDK

SDK

A sdk segue o padrão de uso sdk.modulo.metodo. Por exemplo:

  • sdk.auth.postUser
  • sdk.dhcp.getOptions

Nomes de métodos

Para listagens, paginadas e não paginadas respectivamente:

  • getEntitiesPages
  • getEntities

Para os métodos que envolvem somente uma entidade segue-se o padrão:

  • getEntity
  • postEntity
  • putEntity
  • deleteEntity

Para métodos mais específicos, é utilizado o nome do que se está fazendo. Por exemplo:

  • applyEntity
  • importEntity