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
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 --versionCriando 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’.
commandsstack new minha-aplicacao yesod-simple
cd minha-aplicacaoConfiguraçã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.ymldatabase: sqlite: path: "minha-aplicacao.db"
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 |]
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.
commandsstack exec -- yesod migrate
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.hsmkYesod "App" [parseRoutes| /produtos ProdutosR GET |]
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.hsmodule 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)}|]
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.hsmodule Handler.ProdutoSpec (spec) where import TestImport spec :: Spec spec = describe "Handler.Produto" $ do it "working getProdutosR" $ do get ProdutosR statusIs 200
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.