July 5, 2023

Мощный и гибкий подход к разработке API с использованием dry-rb

Егор Щербаков - dry-rb

При разработке современных API-приложений на Ruby разработчики сталкиваются с необходимостью обеспечить гибкость, надежность и хорошую структуру кода. В этой статье мы рассмотрим dry-rb, мощный и гибкий инструментарий Ruby-библиотек, который позволяет создавать элегантные и поддерживаемые решения для API. Мы рассмотрим основные компоненты dry-rb и научимся создавать API-приложения, следуя чистому и модульному подходу.

Установка dry-rb: Перед тем как приступить к разработке API с использованием dry-rb, необходимо установить библиотеку. Для этого выполните следующую команду в терминале:

gem install dry-rb

Валидация данных с помощью dry-validation: dry-validation предоставляет мощные возможности для валидации данных. Рассмотрим пример валидации параметров запроса API:

require 'dry-validation'

schema = Dry::Validation.Form do
  required(:name).filled(:string)
  required(:age).filled(:integer, gteq?: 18)
end

params = { name: 'John', age: 25 }

result = schema.call(params)

if result.success?
  # Продолжаем обработку запроса
else
  # Обрабатываем ошибки валидации
  puts result.errors.to_h
end

Контроллеры и маршрутизация с dry-web-roda: dry-web-roda предоставляет удобный способ определения контроллеров и маршрутов в API-приложении. Рассмотрим пример определения маршрутов и контроллера:

require 'dry-web-roda'

class API < Dry::Web::Roda::Application
  route do |r|
    r.get 'users' do
      # Получаем список пользователей из базы данных
      users = UserRepository.new.all

      # Преобразуем данные в JSON и отправляем клиенту
      users.to_json
    end
  end
end

run API.freeze.app

Работа с базой данных с dry-transaction: dry-transaction помогает организовать работу с базой данных в API-приложениях. Рассмотрим пример использования dry-transaction для выполнения операций с базой данных:

require 'dry-transaction'

class CreateUser
  include Dry::Transaction(container: Container)

  step :validate
  step :persist

  def validate(input)
    # Валидация данных пользователя
    validation = UserValidation.new.call(input)
    validation.success? ? Success(validation) : Failure(validation.errors)
  end

  def persist(input)
    # Сохранение данных пользователя в базе данных
    user = UserRepository.new.create(input)
    Success(user)
  end
end

# Использование транзакции для создания пользователя
result = CreateUser.new.call(name: 'John', age: 25)

if result.success?
  user = result.value
  # Обрабатываем успешное создание пользователя
else
  errors = result.failure
  # Обрабатываем ошибки создания пользователя
end

Тестирование с помощью dry-rb: dry-rb предоставляет инструменты для модульного тестирования API-приложений. Рассмотрим пример модульного теста для валидации данных:

require 'dry/validation'

RSpec.describe UserValidation do
  subject(:validation) { described_class.new }

  it 'validates presence of name' do
    result = validation.call(name: '')

    expect(result.success?).to be(false)
    expect(result.errors[:name]).to include('must be filled')
  end

  it 'validates age to be greater than or equal to 18' do
    result = validation.call(name: 'John', age: 17)

    expect(result.success?).to be(false)
    expect(result.errors[:age]).to include('must be greater than or equal to 18')
  end
end

Развитие и поддержка с dry-rb: dry-rb предоставляет набор инструментов для разработки и поддержки API-приложений. Используйте официальную документацию dry-rb и сообщество для получения дополнительной информации, советов и поддержки.

dry-rb представляет собой мощный и гибкий инструментарий для разработки API-приложений на Ruby. Он позволяет создавать надежные и хорошо структурированные решения, которые легко поддерживать и расширять. Используйте dry-rb для разработки API, которые соответствуют лучшим практикам и обеспечивают эффективную разработку.