Class: SpamCheck

Inherits:
BaseService show all
Defined in:
app/services/spam_check.rb

Overview

Service class for checking if a submission is from a known fraudulent customer
Uses contact point validation to detect repeat fraud attempts.

Note: Akismet integration was removed - Cloudflare Turnstile now handles bot protection.
This service focuses on detecting submissions from previously-flagged fraudulent customers.

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods inherited from BaseService

#initialize, #log_debug, #log_error, #log_info, #log_warning, #logger, #options, #tagged_logger

Constructor Details

This class inherits a constructor from BaseService

Instance Attribute Details

#spam_resultsObject (readonly)

Returns the value of attribute spam_results.



7
8
9
# File 'app/services/spam_check.rb', line 7

def spam_results
  @spam_results
end

Instance Method Details

#process(author_email: nil, phone_number: nil, current_user: nil, request_id: nil, request: nil, **_ignored) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'app/services/spam_check.rb', line 9

def process(author_email: nil,
            phone_number: nil,
            current_user: nil,
            request_id: nil,
            request: nil,
            **_ignored) # Accept but ignore legacy params (remote_ip, user_agent, text, etc.)
  current_user ||= CurrentScope.user
  request_id ||= request&.request_id

  is_spam = false
  decision_reason = nil

  existing_customer = current_user&.customer&.customer?

  phone_number = PhoneNumber.parse_and_format(phone_number) if phone_number.present?
  author_email = nil unless author_email.present? && Truemail.valid?(author_email)

  # Known spam email domain
  if author_email&.ends_with?('@storebotmail.joonix.net')
    is_spam = true
    decision_reason = 'Known spam email domain'
  end

  # Check if contact points match a known fraudulent customer
  _existing_customer, is_spam, decision_reason = check_contact_points(phone_number, author_email) unless existing_customer || is_spam

  @spam_results = {
    is_spam: is_spam,
    author_email: author_email,
    phone_number: phone_number,
    current_user_id: current_user&.id,
    request_id: request_id,
    decision_reason: decision_reason
  }

  log_spam_result(is_spam, request_id)
  is_spam
end

#spam_results_to_sObject



48
49
50
# File 'app/services/spam_check.rb', line 48

def spam_results_to_s
  (@spam_results || {}).map { |k, v| "#{k}: #{v}" }.join("\n")
end