ServerPod – O BackEnd em Dart completo

Tempo de leitura: 6 minutes

O Serverpod é uma fantástica ferramenta de backend escrita em Dart. Isso permite que um desenvolvedor do Flutter inicie rapidamente o desenvolvimento de back-end e o inclua em sua pilha de tecnologia. Essa estrutura está atualmente em desenvolvimento e serve principalmente como um servidor de aplicativos escalável de código aberto. Como resultado, é possível se tornar um desenvolvedor Full Stack Dart utilizando o Flutter para a interface do usuário e o Serverpod para o backend.

Podemos usá-lo para criar EndPoints (APIs)Job SchedulersAuthentication Systems e muito mais. O código padrão que aparece quando você cria o projeto é um ótimo lugar para começar. O pacote também inclui scripts de implantação do AWS pré-criados.

Instalação e primeiros passos

Pré-requisito : Docker Desktop e Flutter

Para começar a usar o Serverpod, execute o seguinte comando para ativar a CLI:

dart pub global activate serverpod_cli

O comando acima habilita a CLI do Serverpod, e agora estamos prontos para criar nosso primeiro projeto.

serverpod create nome_do_projeto

Agora, três pastas serão criadas para nós.

project_name_flutter: Esse tem um aplicativo padrão do flutter gerado com o cliente serverpod para demonstrar como podemos chamar os pontos de extremidade criados diretamente no servidor sem usar nenhum cliente HTTP externo.

project_name_client: Esse é um cliente gerado automaticamente que permite que você se comunique com os pontos de extremidade do servidor. Esse cliente é usado para chamar os pontos de extremidade no aplicativo flutter.

project_name_server: Esse é o servidor backend criado pelo serverpod. Ele é composto de pontos de extremidade de exemplo e retornos de chamada futuros (réplica de trabalhos cron ou agendadores de tarefas).

Para executar o projeto criado, execute os seguintes comandos:

COPY

cd project_name/project_name_server
docker-compose up --build --detach
dart bin/main.dart

 

O Serverpod é equipado com várias ferramentas e funções. Vou examinar algumas delas:

1. Suporte a banco de dados: O Serverpod incorpora a integração do PostgreSQL e do Relic. O Docker Desktop é usado para pré-configurar o banco de dados. Podemos desativar o Relic DB seguindo os métodos descritos abaixo. As consultas SQL são produzidas automaticamente quando as classes de modelo são criadas usando ORM. Como resultado, a criação de tabelas no banco de dados fica mais fácil.

2. ORM e serialização: Contém a funcionalidade do ORM. Só precisamos produzir arquivos YAML adequados que forneçam os nomes de tabelas e linhas, juntamente com um índice, se necessário. Ele cria o SQL para a criação da tabela, que pode então ser executada manualmente no servidor pgSQL criado pelo Docker. Todas as funcionalidades do banco de dados necessárias para realizar atividades CRUD estão incluídas na classe serializada gerada automaticamente. Também podemos criar classes modais sem usar um banco de dados; basta comentar a chave da tabela no arquivo YAML. Como resultado, a classe resultante não terá nenhuma função SQL.

Classe Products que representa a tabela de produtos no banco de dados

# Nome da class para ser gerado
class: Products
# adiciona a tabela key
table: products

fields: 
  productName: String
  productImage: String
  productUnit: String
  inventoryAvailable: int
  mrpPrice: double
  sellingPrice: double

Exemplo de classe sem interação com o banco de dados

# Nome da classe pra ser gerado
Class: Store

fields: 
  products: List<Products>

3. Cache: o Serverpod também tem a capacidade de armazenar dados em cache. Às vezes, os dados estáticos são solicitados repetidamente pelo cliente e, portanto, precisamos mantê-los no cache para economizar consultas e carga do banco de dados. Como resultado, o serverpod tem a funcionalidade de armazenar em cache o banco de dados usando uma abordagem de valor-chave. Também podemos incluir a data de expiração. Há dois tipos de cache: Regular e Priority.

4. Autenticação: Essa funcionalidade destina-se principalmente ao uso em um aplicativo Flutter. Por enquanto, ela é compatível com Google, Apple e Email SignIn. O código do cliente pode transmitir a instância de login diretamente para o servidor, e o servidor pode acessar imediatamente as credenciais do usuário a partir daí.

5. Registro em log: Como isso envolve o registro de sessão, podemos registrar os dados usando a função session.log. Os registros são imediatamente colocados no banco de dados serverpod logs, que é gerado automaticamente quando um novo projeto é estabelecido. Na próxima versão, também teremos uma interface do usuário para verificar os registros, tornando-a mais rápida do que as formas antigas de procurar diretamente no banco de dados.

6. Chamadas futuras: O recurso mais surpreendente é a capacidade de agendar qualquer trabalho no futuro. As chamadas são salvas no banco de dados, portanto, permanecem mesmo que o servidor seja reiniciado. Por exemplo, se quisermos enviar uma mensagem push a todos os novos usuários sete dias após o registro, poderemos executar facilmente a função e programá-la.

7. Implementação: Obtemos o código padrão do AWS. Os scripts de implantação são gerados automaticamente pelo projeto. O GitHub com a configuração do Terraform torna isso extremamente simples. Mais informações sobre a implantação podem ser encontradas aqui.

Como criar um novo endpoint e chamá-lo?

Siga as etapas para criar um novo EndPoint / API:

  1. Crie um novo arquivo dart dentro de lib/src/endpoints/ . Tente seguir a convenção de nomenclatura como name_endpoint.dart.
  2. Crie uma nova classe que estenda a classe EndPoint.
  3. Crie diferentes métodos que precisamos como endpoints. Os métodos devem retornar um Future. A lista de argumentos deve conter um argumento de sessão e você pode adicionar quantos argumentos quiser na API. Ainda não há suporte para parâmetros nomeados.
  4. Execute o comando serverpod generate para gerar os protocolos e a classe do cliente.
  5. Agora podemos acessar as APIs diretamente usando o cliente em aplicativos flutter.
  6. Para acessar as APIs em qualquer outro aplicativo que não tenha sido criado no flutter, precisamos fazer uma solicitação POST no formato fornecido abaixo:

 

POST Request para access ao endpoint

Samples Endpoint

import 'package:demopod server/src/generated/protocol.dart';
import 'package:serverpod/serverpod.dart;

class ProductEndpoint extends Endpoint {
  @override
  bool get requirelogin => true;

  Future<bool> add(
    Session session,
    String? productiame,
    String? productInage,
    String? productUnit,
    int? inventory,
    double? mrpPrice,
    double? sellingPrice,
  ) async {
    try {
      await Products. insert(
        session,
        Products (
          productName: productName ?? "",
          productInage: productInage ?? "",
          productUnit: productUnit ?? "",
          inventoryAvailable: inventory ?? 0,
          nmrpPrice: mrpPrice ?? 0,
          sellingPrice: sellingPrice ?? 0,
        ),
      );
      return true;
    } catch (e) {
      print(e.toString());
      return false;
    }
  }
}

PS – Para verificar o nome do endpoint, que talvez precise ser acessado por meio de uma solicitação POST, verifique o arquivo project_name_server/lib/src/generated/endpoints.dart para obter o arquivo de endpoint gerado automaticamente.

Como criar um novo Future Event e chamá-lo?

Temos a capacidade de criar Cron Jobs ou Schedule a task para eventos futuros no Serverpod.

Siga as etapas para criar uma Future call:

  1. Crie um novo arquivo dart dentro de lib/src/future_calls/ . Tente seguir a convenção de nomenclatura como name_future_call.dart.
  2. Crie uma nova classe que estenda a classe FutureCall.
  3. Substitua o método invocado com dois parâmetros:
    • Session – Pode ser usado para acessar o banco de dados (obrigatório)
    • Objeto serializável – Objeto de qualquer classe de modelo (opcional)

4. Escreva o corpo do método invoke e execute todas as ações necessárias.
Por exemplo, enviar e-mails, enviar notificações ou qualquer operação de banco de dados etc.

5. Agora, precisamos registrar essa chamada futura no arquivo server.dart, que está localizado dentro da pasta lib, usando a sintaxe fornecida:

pod.registerFutureCall(ExampleFutureCall(), 'exampleFutureCall');

6. Agora podemos chamar a chamada Future de volta em qualquer lugar, usando o parâmetro de sessão nos pontos de extremidade. A sintaxe para chamá-la é fornecida abaixo:

 

Sintaxe para chamar uma chamada futura

Future<Store> get(
    Session session,
  ) async {
    var products = await Products.find(session);
    final store = Store(products: products);
    
    await session.Serverpod
         .futureCallAlTime('exemploFutureCall', null, DateTime.now());

    await session.Serverpod
         .futureCallWithDelay('exemploFutureCall', store, Duration(seconds: 1));

    return store;
  }

É assim que podemos criar um Task Scheduler no Serverpod.

 

Como desativar o servidor Web da Relic?

Se você quiser executar apenas o servidor de endpoint e não o servidor Web, basta remover todas as rotas adicionadas ao servidor Web no arquivo server.dart.

Como desativar o serviço Redis Db?

De acordo com a documentação oficial, precisamos ter tanto o Redis quanto o PostgreSQL na imagem da janela de encaixe, mas há uma maneira de desativar o uso do Redis se não for necessário. Só precisamos remover a parte da configuração do Redis do arquivo docker-compose.yaml e, em seguida, executar o comando.

Exemplo de docker-compose.yaml com o Redis removido

docker-compose up – build – detach dart bin/main.dart

Conclusão

É assim que podemos utilizar o ServerPod para aproveitar o Dart como suporte de backend. Ainda há certas restrições em relação aos tipos de argumentos e outros problemas menores nos quais as pessoas estão trabalhando