Class: Railsmith::BaseService

Inherits:
Object
  • Object
show all
Includes:
AssociationDsl, BulkActions, ContextPropagation, CrudActions, CrudErrorMapping, CrudModelResolution, CrudRecordHelpers, CrudTransactions, DupHelpers, EagerLoading, InputDsl, NestedWriter, Validation, Hooks::Dsl
Defined in:
lib/railsmith/base_service.rb,
lib/railsmith/base_service/input_dsl.rb,
lib/railsmith/base_service/validation.rb,
lib/railsmith/base_service/bulk_params.rb,
lib/railsmith/base_service/dup_helpers.rb,
lib/railsmith/base_service/bulk_actions.rb,
lib/railsmith/base_service/crud_actions.rb,
lib/railsmith/base_service/bulk_contract.rb,
lib/railsmith/base_service/eager_loading.rb,
lib/railsmith/base_service/nested_writer.rb,
lib/railsmith/base_service/type_coercion.rb,
lib/railsmith/base_service/bulk_execution.rb,
lib/railsmith/base_service/input_registry.rb,
lib/railsmith/base_service/input_resolver.rb,
lib/railsmith/base_service/association_dsl.rb,
lib/railsmith/base_service/input_definition.rb,
lib/railsmith/base_service/crud_transactions.rb,
lib/railsmith/base_service/crud_error_mapping.rb,
lib/railsmith/base_service/context_propagation.rb,
lib/railsmith/base_service/crud_record_helpers.rb,
lib/railsmith/base_service/association_registry.rb,
lib/railsmith/base_service/crud_model_resolution.rb,
lib/railsmith/base_service/association_definition.rb,
lib/railsmith/base_service/domain_context_propagation.rb,
lib/railsmith/base_service/nested_writer/nested_write.rb,
lib/railsmith/base_service/nested_writer/cascading_destroy.rb,
lib/railsmith/base_service/nested_writer/nested_write/write_nested.rb,
lib/railsmith/base_service/nested_writer/nested_write/async_enqueueing.rb,
lib/railsmith/base_service/nested_writer/nested_write/write_nested_item.rb

Overview

Base service entrypoint with lifecycle hook support.

Defined Under Namespace

Modules: AssociationDsl, BulkActions, BulkContract, BulkExecution, BulkParams, ContextPropagation, CrudActions, CrudErrorMapping, CrudModelResolution, CrudRecordHelpers, CrudTransactions, DomainContextPropagation, DupHelpers, EagerLoading, InputDsl, InputResolverHelpers, NestedWriter, TypeCoercion, Validation Classes: AssociationDefinition, AssociationRegistry, InputDefinition, InputRegistry, InputResolver

Constant Summary

Constants included from BulkParams

BulkParams::DEFAULT_BATCH_SIZE, BulkParams::DEFAULT_BULK_LIMIT, BulkParams::TRANSACTION_MODE_ALL_OR_NOTHING, BulkParams::TRANSACTION_MODE_BEST_EFFORT

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Hooks::Dsl

included, #run_lifecycle_hooks

Methods included from BulkActions

#bulk_create, #bulk_destroy, #bulk_update

Methods included from CrudActions

#create, #destroy, #find, #list, #update

Methods included from EagerLoading

included

Methods included from AssociationDsl

included

Methods included from InputDsl

included, #resolve_inputs

Methods included from Validation

#validate

Methods included from ContextPropagation

#current_domain

Constructor Details

#initialize(params:, context:) ⇒ BaseService

Returns a new instance of BaseService.



96
97
98
99
# File 'lib/railsmith/base_service.rb', line 96

def initialize(params:, context:)
  @params = deep_dup(params || {})
  @context = context.is_a?(Context) ? context : Context.build(context)
end

Instance Attribute Details

#contextObject (readonly)

Returns the value of attribute context.



94
95
96
# File 'lib/railsmith/base_service.rb', line 94

def context
  @context
end

#paramsObject (readonly)

Returns the value of attribute params.



94
95
96
# File 'lib/railsmith/base_service.rb', line 94

def params
  @params
end

Class Method Details

.call(action:, params: {}, context: UNSET_CONTEXT) ⇒ Object



51
52
53
54
55
56
57
58
59
# File 'lib/railsmith/base_service.rb', line 51

def call(action:, params: {}, context: UNSET_CONTEXT)
  resolved =
    if context.equal?(UNSET_CONTEXT)
      Context.current || Context.build(nil)
    else
      Context.build(context)
    end
  new(params:, context: resolved).call(action:)
end

.call!(action:, params: {}, context: UNSET_CONTEXT) ⇒ Object

Raises:



61
62
63
64
65
66
# File 'lib/railsmith/base_service.rb', line 61

def call!(action:, params: {}, context: UNSET_CONTEXT)
  result = call(action: action, params: params, context: context)
  raise Railsmith::Failure, result if result.failure?

  result
end

.domain(domain_key = nil) ⇒ Object

Bounded-context key for this service (optional). When set, mismatches against context[:current_domain] emit warn-only instrumentation unless the pair is listed in Railsmith.configuration.cross_domain_allowlist.



77
78
79
80
81
# File 'lib/railsmith/base_service.rb', line 77

def domain(domain_key = nil)
  return @service_domain if domain_key.nil?

  @service_domain = Context.normalize_current_domain(domain_key)
end

.model(model_class = nil) ⇒ Object



68
69
70
71
72
# File 'lib/railsmith/base_service.rb', line 68

def model(model_class = nil)
  return @model_class if model_class.nil?

  @model_class = model_class
end

.service_domain(domain_key = nil) ⇒ Object

Deprecated.

Use domain instead.



84
85
86
87
88
89
90
91
# File 'lib/railsmith/base_service.rb', line 84

def service_domain(domain_key = nil)
  if domain_key.nil?
    warn "[DEPRECATION] `service_domain` reader is deprecated. Use `domain` instead."
  else
    warn "[DEPRECATION] `service_domain :#{domain_key}` is deprecated. Use `domain :#{domain_key}` instead."
  end
  domain(domain_key)
end

Instance Method Details

#call(action:) ⇒ Object



101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/railsmith/base_service.rb', line 101

def call(action:)
  normalized_action = normalize_action(action)
  return invalid_action_result(action: normalized_action) unless valid_action?(normalized_action)

  if self.class.input_registry.any?
    input_result = resolve_inputs
    return input_result if input_result.failure?
  end

  result = execute_action(action: normalized_action)
  normalize_result(result)
end