A set of tools for building reliable services of any complexity.
Servactory is a standardization of a unified approach to the development of reliable services of any complexity.
With Servactory you can do something simple, just like that:
class MinimalService < ApplicationService::Base
And then call with:
MinimalService.call! # or MinimalService.call
Or create something more complex:
class NotificationService::Send < ApplicationService::Base
input :comment, type: Comment
input :provider, type: NotificationProvider
internal :user, type: User
internal :status, type: String
internal :response, type: NotificatorApi::Models::Notification
output :notification, type: Notification
internals.user = inputs.comment.user
internals.status = StatusEnum::NOTIFIED
outputs.notification = Notification.create!(user:, comment: inputs.comment, provider: inputs.provider)
service_result = NotificatorService::API::Send.call(notification:)
return fail!(message: service_result.error.message) if service_result.failure?
internals.response = service_result.response
With a call like this:
# comment = Comment.first
# provider = NotificationProvider.first
# NotificationService::Send.call(comment:, provider:)
Reasons to use Servactory
The Ruby language is flexible and versatile. This fact indicates that the services in the applications begin to vary greatly, implementing a different development approach. Over time, this case complicates the development in the project and can make it difficult to understand the services.
Servactory standardizes the approach to development by offering the implementation of services only through the proposed API, describing the logic within classes uniformly.
Services written under Servactory are tested like standard Ruby classes. As a result of the unified approach to the development of services, their testing also becomes uniform.