Merge pull request #2825 from internetee/2823-send-poll-messages-when-admin-adds-or-removed-statuses-on-a-domain

feat(admin): notify registrar about domain status changes
This commit is contained in:
Timo Võhmar 2025-07-31 17:03:32 +03:00 committed by GitHub
commit 7f33fd386e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 63 additions and 20 deletions

View file

@ -1,4 +1,4 @@
FROM --platform=linux/amd64 ruby:3.0.3-slim-buster FROM --platform=linux/amd64 ruby:3.0.3-bullseye
SHELL ["/bin/bash", "-o", "pipefail", "-c"] SHELL ["/bin/bash", "-o", "pipefail", "-c"]
RUN apt-get update > /dev/null && apt-get install -y --no-install-recommends > /dev/null \ RUN apt-get update > /dev/null && apt-get install -y --no-install-recommends > /dev/null \
@ -29,27 +29,27 @@ RUN apt-get update > /dev/null && apt-get install -y --no-install-recommends > /
&& rm -rf /var/lib/apt/lists/* && rm -rf /var/lib/apt/lists/*
# add repository for Node.js in the LTS version # add repository for Node.js in the LTS version
RUN curl -sL https://deb.nodesource.com/setup_10.x | bash - RUN curl -sL https://deb.nodesource.com/setup_20.x | bash -
RUN apt-get install -y --no-install-recommends > /dev/null \ RUN apt-get install -y --no-install-recommends > /dev/null \
nodejs=* \ nodejs \
qt5-default=* \ qtbase5-dev \
libqt5webkit5-dev=* \ libqt5webkit5-dev \
gstreamer1.0-plugins-base=* \ gstreamer1.0-plugins-base \
libappindicator3-1=* \ libappindicator3-1 \
gstreamer1.0-tools=* \ gstreamer1.0-tools \
qtdeclarative5-dev=* \ qtdeclarative5-dev \
fonts-liberation=* \ fonts-liberation \
gstreamer1.0-x=* \ gstreamer1.0-x \
libasound2=* \ libasound2 \
libnspr4=* \ libnspr4 \
libnss3=* \ libnss3 \
libxss1=* \ libxss1 \
libxtst6=* \ libxtst6 \
xdg-utils=* \ xdg-utils \
qtdeclarative5-dev=* \ qtdeclarative5-dev \
fonts-liberation=* \ fonts-liberation \
gstreamer1.0-x=* \ gstreamer1.0-x \
wkhtmltopdf \ wkhtmltopdf \
libxslt1-dev \ libxslt1-dev \
libxml2-dev \ libxml2-dev \

View file

@ -31,6 +31,7 @@ module Admin
if @domain.update(dp) if @domain.update(dp)
flash[:notice] = I18n.t('domain_updated') flash[:notice] = I18n.t('domain_updated')
inform_registrar_about_status_changes
redirect_to [:admin, @domain] redirect_to [:admin, @domain]
else else
@domain.reload @domain.reload
@ -111,6 +112,22 @@ module Admin
end end
end end
def inform_registrar_about_status_changes
return unless @domain.saved_change_to_statuses?
old_statuses, new_statuses = @domain.saved_change_to_statuses
removed = old_statuses - new_statuses
added = new_statuses - old_statuses
added.each do |status|
@domain.registrar.notifications.create!(text: "#{status} set on domain #{@domain.name}")
end
removed.each do |status|
@domain.registrar.notifications.create!(text: "#{status} is cancelled on domain #{@domain.name}")
end
end
def build_associations def build_associations
@server_statuses = @domain.statuses.select { |x| DomainStatus::SERVER_STATUSES.include?(x) } @server_statuses = @domain.statuses.select { |x| DomainStatus::SERVER_STATUSES.include?(x) }
@server_statuses = [nil] if @server_statuses.empty? @server_statuses = [nil] if @server_statuses.empty?

View file

@ -0,0 +1,26 @@
require 'test_helper'
class DomainsControllerTest < ApplicationIntegrationTest
def setup
@domain = domains(:shop)
@admin = users(:admin)
sign_in @admin
end
def test_inform_registrar_about_status_changes
patch admin_domain_path(domains(:shop)), params: { domain: { statuses: [DomainStatus::PENDING_UPDATE,] } }
# Status OK is removed because, if:
# (statuses.length > 1) || !valid?
# then status OK is removed by manage_automatic_statuses method in domain.rb
notifications = domains(:shop).registrar.notifications.last(2)
assert_equal "#{DomainStatus::PENDING_UPDATE} set on domain #{domains(:shop).name}", notifications.first.text
assert_equal "#{DomainStatus::OK} is cancelled on domain #{domains(:shop).name}", notifications.last.text
patch admin_domain_path(domains(:shop)), params: { domain: { statuses: [DomainStatus::PENDING_DELETE_CONFIRMATION] } }
notifications = domains(:shop).registrar.notifications.last(2)
assert_equal "#{DomainStatus::PENDING_DELETE_CONFIRMATION} set on domain #{domains(:shop).name}", notifications.first.text
assert_equal "#{DomainStatus::PENDING_UPDATE} is cancelled on domain #{domains(:shop).name}", notifications.last.text
end
end