bonanza 1.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +15 -0
- data/.rspec +2 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +188 -0
- data/Gemfile +5 -0
- data/LICENSE.txt +22 -0
- data/README.md +95 -0
- data/Rakefile +9 -0
- data/VERSION +1 -0
- data/bonanza.gemspec +27 -0
- data/config/locales/de.yml +7 -0
- data/config/locales/en.yml +7 -0
- data/lib/bonanza.rb +5 -0
- data/lib/bonanza/call_link_helpers.rb +24 -0
- data/lib/bonanza/engine.rb +15 -0
- data/lib/bonanza/link_helpers.rb +65 -0
- data/lib/bonanza/link_strategies.rb +14 -0
- data/lib/bonanza/link_strategies/base.rb +45 -0
- data/lib/bonanza/link_strategies/billing.rb +24 -0
- data/lib/bonanza/link_strategies/kuba.rb +11 -0
- data/lib/bonanza/link_strategies/mojito.rb +11 -0
- data/lib/bonanza/link_strategies/ninevirt.rb +11 -0
- data/lib/bonanza/link_strategies/openshift.rb +29 -0
- data/lib/bonanza/link_strategies/otrs.rb +25 -0
- data/lib/bonanza/link_strategies/redmine.rb +11 -0
- data/lib/bonanza/link_strategies/stats.rb +17 -0
- data/lib/bonanza/link_strategies/wiki.rb +15 -0
- data/lib/bonanza/link_strategies/yimin.rb +15 -0
- data/lib/bonanza/urn_link_helpers.rb +40 -0
- data/lib/bonanza/validators.rb +3 -0
- data/lib/bonanza/validators/domain_name_validator.rb +16 -0
- data/lib/bonanza/validators/otrs_number_validator.rb +13 -0
- data/lib/bonanza/validators/urn_validator.rb +14 -0
- data/spec/bonanza/call_link_helpers_spec.rb +50 -0
- data/spec/bonanza/link_helpers_spec.rb +126 -0
- data/spec/bonanza/link_strategies/base_spec.rb +50 -0
- data/spec/bonanza/link_strategies/billing_spec.rb +35 -0
- data/spec/bonanza/link_strategies/openshift_spec.rb +26 -0
- data/spec/bonanza/urn_link_helpers_spec.rb +80 -0
- data/spec/bonanza/validators/domain_name_validator_spec.rb +59 -0
- data/spec/bonanza/validators/otrs_number_validator_spec.rb +53 -0
- data/spec/bonanza/validators/urn_validator_spec.rb +64 -0
- data/spec/spec_helper.rb +90 -0
- metadata +182 -0
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'active_support/core_ext'
|
2
|
+
require 'action_view/helpers'
|
3
|
+
require 'bonanza/link_strategies'
|
4
|
+
|
5
|
+
module Bonanza
|
6
|
+
module LinkHelpers
|
7
|
+
include ActionView::Helpers
|
8
|
+
|
9
|
+
class InvalidAppError < StandardError; end
|
10
|
+
|
11
|
+
def nine_app_url(app, entity, reference = nil)
|
12
|
+
strategy = strategy_from_app_name(app, entity)
|
13
|
+
strategy.url_to entity, reference
|
14
|
+
end
|
15
|
+
|
16
|
+
def link_to_otrs_ticket(name, ticket_number, options = {})
|
17
|
+
link_to_application :otrs, :ticket, name, ticket_number, options
|
18
|
+
end
|
19
|
+
|
20
|
+
def link_to_otrs_customer(name, account_number, options = {})
|
21
|
+
link_to_application :otrs, :customer, name, account_number, options
|
22
|
+
end
|
23
|
+
|
24
|
+
def link_to_billing(name, account_number, options = {})
|
25
|
+
link_to_application :billing, :debtor, name, account_number, options
|
26
|
+
end
|
27
|
+
|
28
|
+
def link_to_stats(name, account_number, options = {})
|
29
|
+
link_to_application :stats, :customer, name, account_number, options
|
30
|
+
end
|
31
|
+
|
32
|
+
def link_to_redmine(name, redmine_issue, options = {})
|
33
|
+
link_to_application :redmine, :issue, name, redmine_issue, options
|
34
|
+
end
|
35
|
+
|
36
|
+
def link_to_kuba_account(name, account_number, options = {})
|
37
|
+
link_to_application :kuba, :account, name, account_number, options
|
38
|
+
end
|
39
|
+
|
40
|
+
def link_to_wiki_customer(name, login_name, options = {})
|
41
|
+
link_to_application :wiki, :customer, name, login_name, options
|
42
|
+
end
|
43
|
+
|
44
|
+
def link_to_migration_item(name, item_id, options = {})
|
45
|
+
link_to_application :yimin, :item, name, item_id, options
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
def link_to_application(app, entity, name, reference, options = {})
|
51
|
+
options.reverse_merge! target: '_blank'
|
52
|
+
link_to name, nine_app_url(app, entity, reference), options
|
53
|
+
end
|
54
|
+
|
55
|
+
def strategy_from_app_name(app_name, entity)
|
56
|
+
raise(InvalidAppError, "Invalid app #{app_name}") unless valid_app?(app_name)
|
57
|
+
Bonanza::LinkStrategies.const_get(app_name.capitalize).new(entity)
|
58
|
+
end
|
59
|
+
|
60
|
+
def valid_app?(app_name)
|
61
|
+
return false if app_name.nil?
|
62
|
+
Bonanza::LinkStrategies.constants.include?(app_name.capitalize)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module LinkStrategies
|
2
|
+
end
|
3
|
+
|
4
|
+
require 'bonanza/link_strategies/base'
|
5
|
+
require 'bonanza/link_strategies/stats'
|
6
|
+
require 'bonanza/link_strategies/otrs'
|
7
|
+
require 'bonanza/link_strategies/kuba'
|
8
|
+
require 'bonanza/link_strategies/ninevirt'
|
9
|
+
require 'bonanza/link_strategies/openshift'
|
10
|
+
require 'bonanza/link_strategies/billing'
|
11
|
+
require 'bonanza/link_strategies/redmine'
|
12
|
+
require 'bonanza/link_strategies/wiki'
|
13
|
+
require 'bonanza/link_strategies/yimin'
|
14
|
+
require 'bonanza/link_strategies/mojito'
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'active_support/inflector'
|
2
|
+
require 'action_view/helpers/output_safety_helper'
|
3
|
+
|
4
|
+
module Bonanza
|
5
|
+
module LinkStrategies
|
6
|
+
class Base
|
7
|
+
include ActionView::Helpers::OutputSafetyHelper
|
8
|
+
|
9
|
+
attr_reader :entity
|
10
|
+
|
11
|
+
def initialize(entity = nil)
|
12
|
+
@entity = entity.to_s
|
13
|
+
end
|
14
|
+
|
15
|
+
def app
|
16
|
+
self.class.name.demodulize.downcase
|
17
|
+
end
|
18
|
+
|
19
|
+
def paths
|
20
|
+
{}
|
21
|
+
end
|
22
|
+
|
23
|
+
def domain
|
24
|
+
case environment.to_s
|
25
|
+
when 'development'
|
26
|
+
"http://#{app}.dev"
|
27
|
+
when 'test'
|
28
|
+
"http://#{app}.test"
|
29
|
+
when 'staging'
|
30
|
+
"https://#{app}-staging.nine.ch"
|
31
|
+
when 'production'
|
32
|
+
"https://#{app}.nine.ch"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def url_to(entity, reference = nil)
|
37
|
+
raw [domain, paths[entity]].join % { reference: reference }
|
38
|
+
end
|
39
|
+
|
40
|
+
def environment
|
41
|
+
ENV.fetch('RAILS_ENV', 'production')
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Bonanza
|
2
|
+
module LinkStrategies
|
3
|
+
class Billing < Base
|
4
|
+
def paths
|
5
|
+
{
|
6
|
+
debtor: "/DebitorEdit.aspx?DebiNbr=%{reference}",
|
7
|
+
}
|
8
|
+
end
|
9
|
+
|
10
|
+
def domain
|
11
|
+
case environment.to_s
|
12
|
+
when 'development'
|
13
|
+
"http://billing.dev"
|
14
|
+
when 'test'
|
15
|
+
"http://billing.test"
|
16
|
+
when 'staging'
|
17
|
+
'http://billing.dev'
|
18
|
+
when 'production'
|
19
|
+
'https://billingfw.nine.ch'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Bonanza
|
2
|
+
module LinkStrategies
|
3
|
+
class Openshift < Base
|
4
|
+
def paths
|
5
|
+
{
|
6
|
+
:'openshift:project:es34' => '/console/project/%{reference}'
|
7
|
+
}
|
8
|
+
end
|
9
|
+
|
10
|
+
def domain
|
11
|
+
case environment.to_s
|
12
|
+
when 'development'
|
13
|
+
'http://openshift.dev'
|
14
|
+
when 'test'
|
15
|
+
'https://openshift.test'
|
16
|
+
when 'staging'
|
17
|
+
'https://openshift-staging.nine.ch:8443'
|
18
|
+
when 'production'
|
19
|
+
case entity
|
20
|
+
when 'openshift:project:es34'
|
21
|
+
'https://openshift.nine.ch:8443'
|
22
|
+
else
|
23
|
+
'https://aws-openshift.nine.ch:8443'
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Bonanza
|
2
|
+
module LinkStrategies
|
3
|
+
class Otrs < Base
|
4
|
+
def paths
|
5
|
+
{
|
6
|
+
customer: "/index.pl?Action=AgentCustomerInformationCenter;CustomerID=%{reference}",
|
7
|
+
ticket: "/index.pl?Action=AgentTicketZoom;TicketNumber=%{reference}",
|
8
|
+
}
|
9
|
+
end
|
10
|
+
|
11
|
+
def domain
|
12
|
+
case environment.to_s
|
13
|
+
when 'development'
|
14
|
+
'http://otrs.nine.ch/otrs'
|
15
|
+
when 'test'
|
16
|
+
'http://otrs.test'
|
17
|
+
when 'staging'
|
18
|
+
'https://otrs-staging.nine.ch/otrs'
|
19
|
+
when 'production'
|
20
|
+
'https://otrs.nine.ch/otrs'
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Bonanza
|
2
|
+
module LinkStrategies
|
3
|
+
class Stats < Base
|
4
|
+
def paths
|
5
|
+
{
|
6
|
+
customer: '/admin/customerdetail.php?id=%{reference}',
|
7
|
+
server: '/admin/changeserver.php?id=%{reference}',
|
8
|
+
vserver: '/admin/vserverdetail.php?id=%{reference}',
|
9
|
+
rack: '/admin/changerack.php?id=%{reference}',
|
10
|
+
port: '/admin/changeport.php?id=%{reference}',
|
11
|
+
:'ip:v4:subnet' => '/admin/changesubnet.php?version=4&id=%{reference}',
|
12
|
+
:'ip:v6:subnet' => '/admin/changesubnet.php?version=6&id=%{reference}',
|
13
|
+
}
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'active_support/core_ext'
|
4
|
+
require 'action_view/helpers'
|
5
|
+
|
6
|
+
require 'bonanza/link_helpers'
|
7
|
+
|
8
|
+
module Bonanza
|
9
|
+
module UrnLinkHelpers
|
10
|
+
include Bonanza::LinkHelpers
|
11
|
+
|
12
|
+
URN_APPS = {
|
13
|
+
server: :stats,
|
14
|
+
vserver: :stats,
|
15
|
+
virtdomain: :ninevirt,
|
16
|
+
rack: :stats,
|
17
|
+
port: :stats,
|
18
|
+
:'ip:v4:subnet' => :stats,
|
19
|
+
:'ip:v6:subnet' => :stats,
|
20
|
+
:'aws:account' => :mojito,
|
21
|
+
:'openshift:project:es34' => :openshift
|
22
|
+
}.freeze
|
23
|
+
|
24
|
+
def link_to_urn(name, urn, options = {})
|
25
|
+
urn = ::InfrastructureClient::Urn.new(urn) unless urn.is_a?(::InfrastructureClient::Urn)
|
26
|
+
name = urn.short if name.blank?
|
27
|
+
|
28
|
+
url = urn.valid? ? url_for_urn(urn) : ''
|
29
|
+
|
30
|
+
options.reverse_merge! target: '_blank'
|
31
|
+
link_to name, url, options
|
32
|
+
end
|
33
|
+
|
34
|
+
def url_for_urn(urn)
|
35
|
+
nine_app_url URN_APPS[urn.type.to_sym], urn.type.to_sym, urn.id
|
36
|
+
rescue Bonanza::LinkHelpers::InvalidAppError
|
37
|
+
''
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'active_model'
|
2
|
+
require 'simpleidn'
|
3
|
+
|
4
|
+
module Bonanza
|
5
|
+
module Validators
|
6
|
+
class DomainNameValidator < ActiveModel::EachValidator
|
7
|
+
DOMAIN_REGEX = /^((?=[a-z0-9-]{1,63}\.)(xn--(--)?)?[a-z0-9]+(-[a-z0-9]+)*\.)+((xn--)?[a-z0-9]{2,63})$/
|
8
|
+
|
9
|
+
def validate_each(record, attribute, value)
|
10
|
+
punycode = SimpleIDN.to_ascii(value.to_s)
|
11
|
+
return true if punycode =~ DOMAIN_REGEX
|
12
|
+
record.errors.add attribute, :not_a_valid_domain_name
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'active_model'
|
2
|
+
|
3
|
+
module Bonanza
|
4
|
+
module Validators
|
5
|
+
class OtrsNumberValidator < ActiveModel::EachValidator
|
6
|
+
def validate_each(record, attribute, value)
|
7
|
+
unless value.to_s =~ /^\d{16}$/i
|
8
|
+
record.errors.add attribute, :not_an_otrs_ticket
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'active_model'
|
2
|
+
|
3
|
+
module Bonanza
|
4
|
+
module Validators
|
5
|
+
class UrnValidator < ActiveModel::EachValidator
|
6
|
+
def validate_each(record, attribute, value)
|
7
|
+
return unless value.present? if options[:allow_empty]
|
8
|
+
unless InfrastructureClient::Urn.new(value.to_s).valid?
|
9
|
+
record.errors.add attribute, :invalid_urn
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'bonanza/call_link_helpers'
|
3
|
+
|
4
|
+
class FakeCallLinkHelpersClass
|
5
|
+
include Bonanza::CallLinkHelpers
|
6
|
+
end
|
7
|
+
|
8
|
+
RSpec.describe FakeCallLinkHelpersClass do
|
9
|
+
subject { described_class.new }
|
10
|
+
|
11
|
+
describe '#call_to' do
|
12
|
+
subject { super().call_to(phone_number) }
|
13
|
+
|
14
|
+
context 'valid phone number' do
|
15
|
+
let(:phone_number) { '+41123456789' }
|
16
|
+
|
17
|
+
it 'generates a link to the phone call service' do
|
18
|
+
expect(subject).to eq(
|
19
|
+
'<a href="http://pbx.nine.ch/call.php?ext=0041123456789">+41123456789</a>'
|
20
|
+
)
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'replaces the + sign with 00' do
|
24
|
+
expect(subject).to include '0041123456789'
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context 'phone number with unnecessary spaces' do
|
29
|
+
let(:phone_number) { '+41 12 34 56 78 91' }
|
30
|
+
|
31
|
+
it 'removes the unnecessary spaces' do
|
32
|
+
expect(subject.to_s).to include '0041123456789'
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe 'invalid phone numbers' do
|
37
|
+
context 'empty phone number' do
|
38
|
+
let(:phone_number) { '' }
|
39
|
+
|
40
|
+
specify { expect(subject).to eq '' }
|
41
|
+
end
|
42
|
+
|
43
|
+
context 'nil phone number' do
|
44
|
+
let(:phone_number) { nil }
|
45
|
+
|
46
|
+
specify { expect(subject).to eq '' }
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|