0
0
Fork 1
Spiegel von https://github.com/paviliondev/discourse-custom-wizard.git synchronisiert 2024-11-27 03:20:27 +01:00
discourse-custom-wizard/lib/custom_wizard/subscription.rb

229 Zeilen
5,3 KiB
Ruby

2022-03-25 12:22:27 +01:00
# frozen_string_literal: true
2023-09-25 18:00:39 +02:00
require "discourse_subscription_client"
2021-09-24 11:58:42 +02:00
class CustomWizard::Subscription
PRODUCT_HIERARCHY = %w[
community
standard
business
]
def self.attributes
{
wizard: {
required: {
none: [],
standard: ['*'],
business: ['*'],
community: ['*']
},
permitted: {
none: [],
standard: ['*'],
business: ['*'],
community: ['*', "!#{CustomWizard::Wizard::GUEST_GROUP_ID}"]
},
restart_on_revisit: {
none: [],
standard: ['*'],
business: ['*'],
community: ['*']
}
},
step: {
condition: {
none: [],
standard: ['*'],
business: ['*'],
community: ['*']
},
required_data: {
none: [],
standard: ['*'],
business: ['*'],
community: ['*']
},
permitted_params: {
none: [],
standard: ['*'],
business: ['*'],
community: ['*']
}
},
field: {
condition: {
none: [],
standard: ['*'],
business: ['*'],
community: ['*']
},
type: {
2022-03-25 17:08:24 +01:00
none: ['text', 'textarea', 'text_only', 'date', 'time', 'date_time', 'number', 'checkbox', 'dropdown', 'upload'],
standard: ['*'],
business: ['*'],
community: ['*']
},
realtime_validations: {
none: [],
standard: ['*'],
business: ['*'],
community: ['*']
}
},
action: {
type: {
2022-03-25 17:08:24 +01:00
none: ['create_topic', 'update_profile', 'open_composer', 'route_to'],
2022-12-23 17:28:09 +01:00
standard: ['create_topic', 'update_profile', 'open_composer', 'route_to', 'send_message', 'watch_categories', 'watch_tags', 'add_to_group'],
business: ['*'],
community: ['*']
}
},
custom_field: {
klass: {
none: ['topic', 'post'],
standard: ['topic', 'post'],
business: ['*'],
community: ['*']
},
type: {
none: ['string', 'boolean', 'integer'],
standard: ['string', 'boolean', 'integer'],
business: ['*'],
community: ['*']
}
},
api: {
all: {
none: [],
standard: [],
business: ['*'],
community: ['*']
}
}
}
end
attr_accessor :product_id,
:product_slug
def initialize(update = false)
if update
::DiscourseSubscriptionClient::Subscriptions.update
end
2023-09-25 18:00:39 +02:00
result = ::DiscourseSubscriptionClient.find_subscriptions("discourse-custom-wizard")
2023-09-24 11:03:38 +02:00
if result&.any?
ids_and_slugs = result.subscriptions.map do |subscription|
{
id: subscription.product_id,
slug: result.products[subscription.product_id]
}
end
2023-09-24 11:03:38 +02:00
id_and_slug = ids_and_slugs.sort do |a, b|
PRODUCT_HIERARCHY.index(b[:slug]) - PRODUCT_HIERARCHY.index(a[:slug])
end.first
@product_id = id_and_slug[:id]
@product_slug = id_and_slug[:slug]
end
2023-06-29 10:26:39 +02:00
@product_slug ||= ENV["CUSTOM_WIZARD_PRODUCT_SLUG"]
end
def includes?(feature, attribute, value = nil)
attributes = self.class.attributes[feature]
## Attribute is not part of a subscription
return true unless attributes.present? && attributes.key?(attribute)
values = attributes[attribute][type]
## Subscription type does not support the attribute.
return false if values.blank?
## Value is an exception for the subscription type
if (exceptions = get_exceptions(values)).any?
value = mapped_output(value) if CustomWizard::Mapper.mapped_value?(value)
value = [*value].map(&:to_s)
return false if (exceptions & value).length > 0
end
## Subscription type supports all values of the attribute.
return true if values.include?("*")
## Subscription type supports some values of the attributes.
values.include?(value)
end
def type
return :none unless subscribed?
return :business if business?
2023-06-29 10:26:39 +02:00
return :standard if standard?
2023-09-24 13:20:57 +02:00
:community if community?
end
def subscribed?
standard? || business? || community?
end
def standard?
product_slug === "standard"
end
def business?
product_slug === "business"
end
def community?
product_slug === "community"
end
2023-11-17 10:10:46 +01:00
# TODO candidate for removal once code that depends on it externally is no longer used.
def self.client_installed?
defined?(DiscourseSubscriptionClient) == 'constant' && DiscourseSubscriptionClient.class == Module
end
2021-08-10 11:00:42 +02:00
def self.subscribed?
new.subscribed?
2021-08-10 11:00:42 +02:00
end
2021-08-18 08:59:43 +02:00
def self.business?
new.business?
end
def self.community?
new.community?
end
def self.standard?
new.standard?
end
2021-09-01 04:19:00 +02:00
def self.type
new.type
2021-09-01 04:19:00 +02:00
end
2022-03-25 17:08:24 +01:00
def self.includes?(feature, attribute, value)
new.includes?(feature, attribute, value)
end
protected
def get_exceptions(values)
values.reduce([]) do |result, value|
result << value.split("!").last if value.start_with?("!")
result
end
end
def mapped_output(value)
value.reduce([]) do |result, v|
## We can only validate mapped assignment values at the moment
result << v["output"] if v.is_a?(Hash) && v["type"] === "assignment"
result
end.flatten
end
2021-09-07 14:11:50 +02:00
end