Introdução

Este tutorial tem como objetivo apresentar aos desenvolvedores a linguagem Haskell e o framework Yesod, focando em como construir aplicações web utilizando os princípios da arquitetura RESTful. Haskell, uma linguagem funcional pura, oferece benefícios como tipagem forte e coerente, imutabilidade e uma semântica clara. Yesod é um framework web que aproveita esses recursos, permitindo criar aplicações de forma robusta e segura. Neste guia, vamos detalhar desde a configuração do ambiente de desenvolvimento, passando pela criação de um projeto básico em Yesod, até a implementação de uma API RESTful funcional, completa com testes. Ao final, você terá uma compreensão sólida de como trabalhar com Haskell e Yesod em um contexto real, incluindo as melhores práticas de desenvolvimento e otimização de aplicações.

Etapas

  1. Configuração do Ambiente de Desenvolvimento

    Antes de tudo, é necessário instalar o GHC (Glasgow Haskell Compiler) e o Stack, que é um gerenciador de pacotes e um ambiente de construção (build) para Haskell. Você pode instalar o GHC and Stack seguindo as instruções no site oficial do Haskell. Após a instalação, verifique se tudo está funcionando corretamente.

    commands
    # Verificar se o GHC está instalado
    ghc --version
    # Verificar se o Stack está instalado
    stack --version

  2. Criando um Novo Projeto Yesod

    Utilize o comando do Stack para criar um novo projeto Yesod. Ele irá configurar uma estrutura básica de pastas e arquivos necessários para o seu projeto. O comando abaixo irá criar o projeto chamado ‘minha-aplicacao’.

    commands
    stack new minha-aplicacao yesod-simple
    cd minha-aplicacao

  3. Configuração do Banco de Dados

    No Yesod, podemos utilizar o SQLite como nosso banco de dados para facilitar o início. Edite o arquivo `config/config.yml` para atualizar as configurações do banco de dados. O formato de configuração pode ser ajustado dependendo do seu ambiente.

    config.yml
    database:
      sqlite:
        path: "minha-aplicacao.db"

  4. Definindo o Modelo de Dados

    Agora, vamos definir um modelo de dados no Haskell para representar um produto. Crie um novo arquivo chamado `Produto.hs` dentro da pasta `src/Model` com a estrutura do modelo.

    Produto.hs
    {-# LANGUAGE GADTs, TypeFamilies, QuasiQuotes, TemplateHaskell, MultiParamTypeClasses, OverloadedStrings #-}
    module Model.Produto where
    
    import Database.Persist
    import Database.Persist.Sqlite
    import Data.Text (Text)
    
    share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|  Produto
        nome Text
        preco Double
        deriving Show
    |]

  5. Realizando as Migrações do Banco de Dados

    Use o Stack para realizar as migrações necessárias para criar as tabelas no banco de dados SQLite. Isto irá gerar as tabelas de acordo com o seu modelo.

    commands
    stack exec -- yesod migrate

  6. Criando a Rota para a API RESTful

    No arquivo `Foundation.hs`, adicione uma rota para o endpoint que irá manipular as requisições. Vamos definir uma rota básica para obter todos os produtos.

    Foundation.hs
    mkYesod "App" [parseRoutes|
      /produtos ProdutosR GET
    |]

  7. Implementando o Controlador de Produtos

    Agora vamos implementar a lógica que responde a requisições para o endpoint de produtos. Crie o arquivo `Produto.hs` no diretório `src/Handler` e adicione o código para o controlador de produtos.

    Produto.hs
    module Handler.Produto where
    
    import Import
    
    getProdutosR :: Handler Html
    getProdutosR = do
        produtos <- runDB $ selectList [] []
        defaultLayout [whamlet|<h1>Lista de Produtos
            <ul>
                $forall (Entity _ produto) <- produtos:
                    <li> #{produtoNome produto} - #{show (produtoPreco produto)}|]

  8. Testes Unitários

    Crie testes para validar o funcionamento do seu controlador de produtos. Crie um arquivo `ProdutoSpec.hs` no diretório `test/Handler` com o seguinte conteúdo.

    ProdutoSpec.hs
    module Handler.ProdutoSpec (spec) where
    
    import TestImport
    
    spec :: Spec
    spec = describe "Handler.Produto" $ do
        it "working getProdutosR" $ do
            get ProdutosR
            statusIs 200

  9. Executando a Aplicação e os Testes

    Por fim, vamos compilar e executar a aplicação. Use o seguinte comando para rodar a aplicação e em seguida, execute os testes para validar suas funcionalidades.

    commands
    # Executar a aplicação
    stack run
    # Executar os testes
    stack test

Conclusão

Neste tutorial, você teve uma introdução completa ao desenvolvimento web usando Haskell e o framework Yesod. Aprendeu a configurar um projeto, definir modelos de dados, implementar rotas de API RESTful e garantir a qualidade do seu código por meio de testes unitários. Os princípios da programação funcional que Haskell oferece, combinados com a robustez de Yesod, fornecem uma base sólida para o desenvolvimento de aplicações web escaláveis e seguras. Agora, você pode continuar explorando as potencialidades dessa linguagem e framework em projetos mais complexos.

Hashtags

#Haskell #Yesod #DesenvolvimentoWeb #APIs #RESTful #ProgramaçãoFuncional