Sinatra.rb

Protocolo HTTP

Frontend e Backend

REST e roteamento

notas em GraphQL

notas em MVC

notas em Microsserviços

Internet, Web... ?

click

Sinatra.rb

No seu contexto¹, tenha instalado:

  • ruby
  • sqlite3 [versão desenvolvimento]
  • HTTPie

Instalação

¹: "contexto" pode ser tanto sua máquina de trabalho, quanto um contêiner Docker (opção smart)

Sinatra.rb

Instalação

Para começar, utilizaremos algumas libs de ruby, chamadas gems:

  • sinatra
  • sinatra-contrib
  • thin
source 'https://rubygems.org'

gem 'sinatra'
gem 'sinatra-contrib'
gem 'thin'

microframework web

extensões do sinatra

mini servidor web

Gemfile - arquivo manifesto de dependências

bundle install

Em um terminal, rode:

Sinatra.rb

Hello, Sinatra!

require 'sinatra'
require 'sinatra/json'

set :bind, '0.0.0.0'  # acesso externo
set :port, 3000       # porta de acesso

get '/' do
  json message: 'Hello, Sinatra'
end

server.rb - código do nosso servidor

http GET http://localhost:3000

Em outro terminal, rode:

rota

dado

bundle exec ruby server.rb

Em um terminal, rode:

Sinatra.rb

Usando REST

require 'sinatra'
require 'sinatra/json'


set :bind, '0.0.0.0'  # acesso externo
set :port, 3000       # porta de acesso

all_users = []

get '/users' do
  json users: all_users
end

post '/users' do
  data = JSON.parse(request.body.read)
  id = all_users.size + 1
  data['user'][:id] = id
  all_users << data['user']

  json user: data['user']
end

server.rb

dado vindo no corpo da requisição

require 'sinatra'
require 'sinatra/json'


set :bind, '0.0.0.0'
set :port, 3000

all_users = []

get '/users' do
  json users: all_users
end

resposta de acordo com REST

Sinatra.rb

Usando REST

require 'sinatra'
require 'sinatra/json'


set :bind, '0.0.0.0'
set :port, 3000

all_users = []

get '/users' do
  json users: all_users
end

post '/users' do
  data = JSON.parse(request.body.read)
  id = all_users.size + 1
  data['user'][:id] = id
  all_users << data['user']

  json user: data['user']
end

server.rb

http POST :3000 < data.json

Em outro terminal, rode:

bundle exec ruby server.rb

Em um terminal, rode:

{
  "user": {
    "fname": "Joao",
    "lname": "Daniel",
    "email": "joao@mail.com"
  }
}

data.json

Sinatra.rb

Limitações de persistência

O que acontece com os dados quando é necessário reiniciar o servidor?

O que é necessário que aconteça com os dados ao reiniciar o servidor?

Sinatra.rb

Persistência, representação e desacoplamento

# ...

gem 'activerecord'
gem 'sinatra-activerecord'
gem 'sqlite3'
gem 'rake'

Gemfile - linhas a adicionar

bundle install

Em um terminal, rode:

Mais umas gems:

  • activerecord
  • sinatra-activerecord
  • sqlite3
  • rake

ORM

adaptador Sinatra

adaptador para banco

utilitário de scripts

Sinatra.rb

ORM - Object Relational Mapping

ORM

Objetos Ruby

Representação do BD

tabela | chave-valor

documento | grafo

O activerecords é a ORM e provê desacoplamento entre o servidor e a escolha de banco de dados

Criação de models

Sinatra.rb

activerecords

O activerecords suporta migrations, que são operações ordenadas cronologicamente para determinar a estrutura do banco

Sinatra.rb

Rake

O Rake é um utilitário para a criação de scripts de automação

Inspira-se no Make e contém sua versão do Makefile, o Rakefile

Sinatra.rb

Setup

require 'sinatra/activerecord'
require 'sinatra/activerecord/rake'
require './server'

Rakefile

class User < ActiveRecord::Base
end

models.rb

require 'sinatra'
require 'sinatra/json'
require 'sinatra/activerecord'

require './models'

set :database, 'sqlite3:project-name.sqlite3'

# ...

server.rb

bundle exec rake db:create_migration NAME=create_users_table

Em um terminal, rode:

Sinatra.rb

Setup

db/migrations/<TS>_create_users_table

É preciso preencher o arquivo novo

class CreateUsersTable < ActiveRecord::Migration[5.2]
  def change
    create_table :users do |t|
      t.string :fname
      t.string :lname
      t.string :email

      t.datetime :created_at
      t.datetime :updated_at
    end
  end
end
bundle exec rake db:migrate

Em depois, rode:

bundle exec rake db:create

Em um terminal, rode:

Sinatra.rb

Atualizando o Servidor

server.rb

set :database, 'sqlite3:project-name.sqlite3'
# substitua o restante pelo que segue abaixo

get '/users' do
  users = User.all
  json users: users
end

get '/users/:id' do
  user = User.find(params[:id])
  json user: user
end

post '/users' do
  user_data = JSON.parse(request.body.read)['user']
  user = User.create(user_data)
  json user: user
end

delete '/users/:id' do
  user = User.find(params[:id])
  user.destroy
  json user: user
end

devolve todos os registros do banco da entidade User

encontra um registro de User com o id

cria e salva um novo User 

deleta do banco aquele registro dado 

Made with Slides.com