Senin, 28 Oktober 2024

Membuat Rails Service Object dengan Gem Light Service

 Service Object pada Ruby on Rails

Tutorial service object ini akan memisahkan bisnis logic dan logic aplikasi agar mudah di maintenance dan agar bisa scalabel

Apa itu  service object?

pola yang memungkinkan Anda memisahkan logika bisnis dan elemen lain dari kontroler dan model, yang memungkinkan model menjadi lapisan data dan kontroler menjadi titik masuk API.
Service object,disini kita akan membuat class yang akan bertanggung jawab terhadap logic bisnis saja  dan hanya akan ada 1 method public untuk satu task yang dikerjakan

kapan kita harus pake service object?

1. ada proses data yang kompleks atau butuh terhubung dulu ke external API, dengan ini kamu dapat encapsulasi komplex proses agar bisa di manage
2. bisnis rules yang komplex
3. butuh integrasi dengan third-party integrations

Langkah : 

Pertama kita akan buat folder di app/services

buat app/services/user_registration.rb  
class UserRegistration
  extend LightService::Organizer

  def self.call(params)
    with(params: params).reduce(
      ValidateUserInput,
      CreateUser
 )
  end

end

code ini akan handle membuat satu public method utk call calss UserRegistration dan akan menjalankan action ValidateUserInput, CreateUser

selanjutnya kita buat model User
rails g model User

selanjutnya buat class CreateUser.rb di app/services/user_registration/create_user.rb seperti ini 

class UserRegistration::CreateUser
  extend LightService::Action

  expects :validated_params
  promises :user

  executed do |context|
    user = User.new(context.validated_params)
   
    if user.save
    context.user = user
    else
    context.fail!(user.errors.full_messages.to_sentence)
    end
  end

end

class UserRegistration akan eksekusi pembuatan user 

lalu buat app/services/user_registration/validate_user_input.rb seperti dibawah ini : 

class UserRegistration::ValidateUserInput
  extend LightService::Action

  expects :params
  promises :validated_params

  executed do |context|
    if context.params[:email].blank?
      context.fail("Please Fill Email !! ")
    end

  context.validated_params = context.params
  end

end

class ValidateUserInput, akan melakukan validasi input jika email kosong

langkah terakhir kita bisa eksekusi service object nya seperti ini di rails console


result = UserRegistration.call(email: 'jaka@testdoterb.com', name: 'Jaka Pratama')









Tidak ada komentar:

Posting Komentar