Ir para o conteúdo

Primeiro projeto (em Node.js)

Servidor

Vamos criar nosso primeiro projeto utilizando o sdkgen! Antes de qualquer coisa vamos inicializar nosso projeto e instalar dependências:

npm init -y
npm i --save-dev typescript @sdkgen/cli
npm i @sdkgen/node-runtime
npx tsc --init -t esnext

O próximo passo será criar um arquivo de descrição da API. Nele você irá escrever todos os tipos customizados e as funções de sua API. Vamos nomear de api.sdkgen:

type Post {
  id: uuid
  title: string
  body: string
  createdAt: datetime
  author: {
    name: string
  }
}

fn getPost(id: uuid): Post?

Se você usa o Visual Studio Code, esta pode ser uma boa hora para instalar a extensão do sdkgen para sintaxe: Ver no Marketplace.

A partir deste arquivo de descrição devemos gerar um arquivo de código TypeScript para ser a base da nossa aplicação chamado api.ts. Esse arquivo deve ser gerado novamente sempre que o api.sdkgen for modificado:

npx sdkgen api.sdkgen -o api.ts -t typescript_nodeserver

O arquivo gerado é legível, mas não deve ser alterado por você, visto que as alterações serão perdidas na próxima vez que for gerado novamente. Agora você pode escrever o arquivo principal da sua aplicação, vamos chamar de index.ts:

import { SdkgenHttpServer } from "@sdkgen/node-runtime";
import { api } from "./api";

api.fn.getPost = async (ctx, { id }) => {
  return {
    id,
    title: "Primeira postagem",
    author: {
      name: "John Doe",
    },
    body: "Lorem ipsum",
    createdAt: new Date(),
  };
};

const server = new SdkgenHttpServer(api, {});
server.listen(8000);

Neste exemplo temos a importação do runtime específico de node e do arquivo gerado, em seguida a implementação das funções e por fim a criação do servidor HTTP. Por ser TypeScript, tudo está apropriadamente tipado e é checado pelo transpilador.

Ao fim, construa e execute a aplicação:

npx tsc
node index.js

Com a aplicação rodando você pode abrir o playground no seu browser em: http://localhost:8000/playground. Experimente chamar a função lá.

Para projetos pequenos essa estrutura é suficiente, mas em outros casos é interessante estruturar o projeto de forma a comportar uma API mais complexa, dividindo em múltiplos controllers, separando responsabilidades e facilitando injeção de dependências.