= Initializer

There are some settings that you'll need to change in the `config/initializer/decidim.rb` file.

This is where you can change the behaviour defined on the diferent components (most notably from `decidim-core`).

After making changes to this file you'll need to also restart your application server.

== Application name

The name of the application.

[source,ruby]
....
  config.application_name = "My Application Name"
....

== Default mailer sender

The email that will be used as sender in all emails from Decidim.

[source,ruby]
....
  config.mailer_sender = "change-me@domain.org"
....

== Available locales

Sets the list of available locales for the whole application.

When an organization is created through the System area, system admins will
be able to choose the available languages for that organization. That list
of languages will be equal or a subset of the list in this file.

[source,ruby]
....
  config.available_locales = [:en, :ca, :es]
....

== Restrict system access

For extra security, restrict access to the system part with an authorized ip list.
You can use a single ip like ("1.2.3.4"), or an ip subnet like ("1.2.3.4/24")
You may specify multiple ip in an array ["1.2.3.4", "1.2.3.4/24"]

[source,ruby]
....
  config.system_accesslist_ips = ["127.0.0.1"]
....

== Default locale

Sets the default locale for new organizations. When creating a new
organization from the System area, system admins will be able to overwrite
this value for that specific organization.

[source,ruby]
....
  config.default_locale = :en
....

== Content Processors

Defines a list of custom content processors. They are used to parse and
render specific tags inside some user-provided content. Check the Content Processor
docs for more info.

[source,ruby]
....
  config.content_processors = []
....

== Force SSL

Whether SSL should be enabled or not. Recommended for extra security.

[source,ruby]
....
  config.force_ssl = true
....

== CORS enabled

The SVG do not support CORS. When using custom asset host different than root url, set this value to `true`, in order to activate the available workaround.

Please refer to:

- https://github.com/w3c/svgwg/issues/707
- https://stackoverflow.com/questions/65811142/how-to-allow-external-images-referenced-within-embedded-svg
- https://groups.google.com/a/chromium.org/g/blink-dev/c/qemQwRpe2so/m/THi81oodSDgJ.
- https://www.w3.org/Graphics/SVG/WG/track/actions/3781

[source,ruby]
....
  config.cors_enabled = true
....

== Geocoder configuration

Allows to make geographical mapping in some components, like Proposals or Meetings. It must be configured against a OpenStreetMap provider.

[source,ruby]
....
  config.geocoder = {
    static_map_url: "https://image.maps.ls.hereapi.com/mia/1.6/mapview",
    here_api_key: Rails.application.secrets.geocoder[:here_api_key]
  }
....

== Custom resource reference

Custom resource reference generator method.

[source,ruby]
....
  config.reference_generator = lambda do |resource, component|
    # Implement your custom method to generate resources references
    "1234-#{resource.id}"
  end
....

== Currency unit

Allows to change the currency unit, for instance to `$`. By default is `€`.

[source,ruby]
....
  config.currency_unit = "€"
....


== Image uploader settings

=== Quality

Defines the quality of image uploads after processing. Image uploads are
processed by Decidim, this value helps reduce the size of the files.

[source,ruby]
....

  config.image_uploader_quality = 80
....

=== Attachment file size

The maximum file size of an attachment

Mind that this depends on your environment, for instance you could also need to change your web server configuration (nginx, apache, etc).

[source,ruby]
....
  config.maximum_attachment_size = 10.megabytes
....

=== User avatar file size

  # The maximum file size for a user avatar

Mind that this depends on your environment, for instance you could also need to change your web server configuration (nginx, apache, etc).

[source,ruby]
....
  config.maximum_avatar_size = 10.megabytes
....

== Reports

The number of reports which a resource can receive before hiding it.

[source,ruby]
....
  config.max_reports_before_hiding = 3
....

== Custom HTML Header snippets

The most common use is to integrate third-party services that require some
extra JavaScript or CSS. Also, you can use it to add extra meta tags to the
HTML. Note that this will only be rendered in public pages, not in the admin
section.

Before enabling this you should ensure that any tracking that might be done
is in accordance with the rules and regulations that apply to your
environment and usage scenarios. This component also comes with the risk
that an organization's administrator injects malicious scripts to spy on or
take over user accounts.

[source,ruby]
....
  config.enable_html_header_snippets = false
....

== Track newsletter links

Allow organizations admins to track newsletter links, trough UTMs. See https://en.wikipedia.org/wiki/UTM_parameters[UTM parameters in Wikipedia].

[source,ruby]
....
  config.track_newsletter_links = true
....

== Data portability expiry time

Amount of time that the data portability files will be available in the server.

[source,ruby]
....
  config.data_portability_expiry_time = 7.days
....

== Throttling settings

Security settings for blocking possible attacks.

=== Max requests

Max requests in a time period to prevent DoS attacks. Only applied on production.

[source,ruby]
....
  config.throttling_max_requests = 100
....

=== Period

Time window in which the throttling is applied.

[source,ruby]
....
  config.throttling_period = 1.minute
....

== Unconfirmed access for users

Time window were users can access the website even if their email is not confirmed.

[source,ruby]
....
  config.unconfirmed_access_for = 2.days
....

== Base path for uploads

A base path for the uploads. If set, make sure it ends in a slash.
Uploads will be set to `<base_path>/uploads/`. This can be useful if you
want to use the same uploads place for both staging and production
environments, but in different folders.

If not set, it will be ignored.

[source,ruby]
....
  config.base_uploads_path = nil
....

== SMS gateway configuration

If you want to verify your users by sending a verification code via
SMS you need to provide a SMS gateway service class.

An example class would be something like:

[source,ruby]
....
class MySMSGatewayService
  attr_reader :mobile_phone_number, :code
  def initialize(mobile_phone_number, code)
    @mobile_phone_number = mobile_phone_number
    @code = code
  end
  def deliver_code
    # Actual code to deliver the code
    true
  end
end
....

Then you'll need to configure it in the Decidim initializer:

[source,ruby]
....
  config.sms_gateway_service = "MySMSGatewayService"
....

== Timestamp service configuration

Used by `decidim-initiatives`.

Provide a class to generate a timestamp for a document. The instances of
this class are initialized with a hash containing the :document key with
the document to be timestamped as value. The istances respond to a
timestamp public method with the timestamp.

An example class would be something like:

[source,ruby]
....
class MyTimestampService
  attr_accessor :document
  def initialize(args = {})
    @document = args.fetch(:document)
  end
  def timestamp
    # Code to generate timestamp
    "My timestamp"
  end
end
....

Then you'll need to configure it in the Decidim initializer:

[source,ruby]
....
  config.timestamp_service = "MyTimestampService"
....

== PDF signature service

Used by `decidim-initiatives`.

Provide a class to process a pdf and return the document including a
digital signature. The instances of this class are initialized with a hash
containing the :pdf key with the pdf file content as value. The instances
respond to a signed_pdf method containing the pdf with the signature.

An example class would be something like:

[source,ruby]
....
  class MyPDFSignatureService
    attr_accessor :pdf

    def initialize(args = {})
      @pdf = args.fetch(:pdf)
    end

    def signed_pdf
      # Code to return the pdf signed
    end
  end

  config.pdf_signature_service = "MyPDFSignatureService"
....

==  Etherpad configuration


Only needed if you want to have Etherpad integration with Decidim. See
xref:services:etherpad.adoc[Etherpad's Decidim docs] in order to set it up.

[source,ruby]
....
  config.etherpad = {
    server: Rails.application.secrets.etherpad[:server],
    api_key: Rails.application.secrets.etherpad[:api_key],
    api_version: Rails.application.secrets.etherpad[:api_version]
  }
....

== Default CSV column separator

Sets Decidim::Exporters::CSV's default column separator

[source,ruby]
....
  config.default_csv_col_sep = ";"
....

== User Roles

The list of roles a user can have, not considering the space-specific roles.

[source,ruby]
....
  config.user_roles = %w(admin user_manager)
....

== Visibility for Amendments

The list of visibility options for amendments. An Array of Strings that
serve both as locale keys and values to construct the input collection in Decidim::Amendment::VisibilityStepSetting::options.

This collection is used in Decidim::Admin::SettingsHelper to generate a
radio buttons collection input field form for a Decidim::Component
step setting :amendments_visibility.


[source,ruby]
....
  config.amendments_visibility_options = %w(all participants)
....

== Export fields

To customize export fields, you can subscribe to any serialize event. Every serializer event has unique event name in format: decidim.serialize.module_here.class_here

[source,ruby]
....
  initializer "decidim_budgets.serializer_listener" do
    ActiveSupport::Notifications.subscribe("decidim.serialize.budgets.project_serializer") do |_event_name, data|
      # Implement your custom code for new or existing fields.
      data[:serialized_data][:column_title] = "Row data #{data[:resource].class}"
    end
  end
....