redmine_remotes 0.5.1 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/project_remote_issues_controller.rb +1 -1
  3. data/app/models/redmine_remotes/tableless/remote_issue_fetch/base.rb +42 -0
  4. data/app/models/redmine_remotes/tableless/remote_issue_fetch/base/_local_issue.rb +47 -0
  5. data/app/models/redmine_remotes/tableless/remote_issue_fetch/base/_provider_issue.rb +22 -0
  6. data/app/models/redmine_remotes/tableless/remote_issue_fetch/create.rb +56 -0
  7. data/app/models/redmine_remotes/tableless/remote_issue_fetch/create/_local_issue.rb +31 -0
  8. data/app/models/redmine_remotes/tableless/remote_issue_fetch/create/_remote_issue.rb +32 -0
  9. data/app/models/redmine_remotes/tableless/remote_issue_fetch/update.rb +30 -0
  10. data/app/models/redmine_remotes/tableless/remote_issue_fetch/update/_local_issue.rb +26 -0
  11. data/app/models/redmine_remotes/tableless/remote_issue_fetch/update/_provider_issue.rb +20 -0
  12. data/app/models/redmine_remotes/tableless/remote_issue_fetch/update/_remote_issue.rb +19 -0
  13. data/app/models/remote_issue.rb +1 -0
  14. data/app/models/remote_tracker.rb +1 -2
  15. data/app/models/remote_tracker/jira.rb +13 -0
  16. data/lib/redmine_remotes/jira/entities/issue.rb +4 -2
  17. data/lib/redmine_remotes/rest_provider/instance.rb +5 -30
  18. data/lib/redmine_remotes/version.rb +1 -1
  19. data/lib/tasks/redmine_remotes.rake +1 -1
  20. metadata +32 -7
  21. data/app/models/redmine_remotes/tableless/add_remote_issue.rb +0 -65
  22. data/app/models/redmine_remotes/tableless/add_remote_issue/_local_issue.rb +0 -57
  23. data/app/models/redmine_remotes/tableless/add_remote_issue/_provider_issue.rb +0 -19
  24. data/app/models/redmine_remotes/tableless/add_remote_issue/_remote_issue.rb +0 -27
  25. data/app/models/remote_tracker/_jira.rb +0 -11
  26. data/lib/redmine_remotes/rest_provider/entity.rb +0 -18
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 343286f5fb54a04c33b59308664f1fb19d5960ab77f19c80aa9c2a8b3da94e85
4
- data.tar.gz: 78a45e88394bac180ff0de242d6f17e880e484d392a53fcac3a4838bb80f974f
3
+ metadata.gz: 42af9429138fa8a7103fc657a191d650230968969c88bef3e04d1e2b36e368e4
4
+ data.tar.gz: d3576ad7482261ab795fdf99f8cc6509e39fc0dd8bb8cf1668f06b66475e198d
5
5
  SHA512:
6
- metadata.gz: 379381cf398f91adca7b21799ec5241a2eec84c8fce062669cc807ffe0ffd9a9d3d16b2116f5c1df645d6889fa16a3d5c09fee8cd7ddb5fd282a413456a5bf2d
7
- data.tar.gz: 334e5e633e085a2324b974801ca79a64c9ce7778fcc7a5f31f9387e8a3923136e39d6060305ff3974001ef625a14db8e7b6f8f0f44d51792f8f5d2841075a8b1
6
+ metadata.gz: 82a1a63732ae40837ab40697d0d7bf2fa0355bc458dc8bd38867f4846dcfabc23a6e8fff562d6c48d4aac3b14609c8f1b803c2eb1487e4b5bf016011f15350b5
7
+ data.tar.gz: e48108913a5d3296db90d7c6a9dcfb5c89539e12c84736ef69abb62b0484b3f6f5d5ee8ee800e4a39cef5c1ef52c4705198dc41bbabac3700d196edc47865e21
@@ -25,7 +25,7 @@ class ProjectRemoteIssuesController < ApplicationController
25
25
  private
26
26
 
27
27
  def model_class
28
- ::RedmineRemotes::Tableless::AddRemoteIssue
28
+ ::RedmineRemotes::Tableless::RemoteIssueFetch::Create
29
29
  end
30
30
 
31
31
  def context_params
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac/model'
4
+ require 'eac_ruby_utils/core_ext'
5
+
6
+ module RedmineRemotes
7
+ module Tableless
8
+ module RemoteIssueFetch
9
+ class Base < ::EacRailsUtils::TablelessModel
10
+ enable_simple_cache
11
+ require_sub __FILE__
12
+ include ::Eac::Model
13
+
14
+ validate :author_present
15
+ validate :provider_issue_present
16
+
17
+ def tracker_in_project
18
+ return unless local_tracker.present? && project.present?
19
+ return if project.trackers.include?(local_tracker)
20
+
21
+ errors.add(:local_tracker, 'is not a tracker of project')
22
+ end
23
+
24
+ def author_present
25
+ return if provider_issue.blank?
26
+ return if local_issue_author.present?
27
+
28
+ errors.add(:remote_code,
29
+ "Usuário local não encontrado para \"#{provider_issue.author_login}\"")
30
+ end
31
+
32
+ def provider_issue_present
33
+ return if issue_remote_code.blank?
34
+ return if provider_issue.present?
35
+
36
+ errors.add(:remote_code,
37
+ "Demanda remota não encontrada com o código \"#{issue_remote_code}\"")
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RedmineRemotes
4
+ module Tableless
5
+ module RemoteIssueFetch
6
+ class Base < ::EacRailsUtils::TablelessModel
7
+ private
8
+
9
+ def local_issue_provider_attributes
10
+ {
11
+ subject: local_issue_subject, author: local_issue_author, status: local_issue_status,
12
+ created_on: provider_issue.created_on, updated_on: provider_issue.updated_on
13
+ }
14
+ end
15
+
16
+ def local_issue_subject
17
+ "[#{provider_issue.code}] #{provider_issue.subject}"
18
+ end
19
+
20
+ def local_issue_author_uncached
21
+ return nil if provider_issue.blank?
22
+
23
+ ::RemoteUser.find_local_user(
24
+ provider_issue.author_login,
25
+ remote_tracker
26
+ )
27
+ end
28
+
29
+ def local_issue_status
30
+ local_issue_status_from_remote_tracker || local_issue_status_from_local_tracker
31
+ end
32
+
33
+ def local_issue_status_from_remote_tracker
34
+ ::RemoteIssueStatus.find_local_issue_status(
35
+ provider_issue.status_name,
36
+ remote_tracker,
37
+ local_tracker
38
+ )
39
+ end
40
+
41
+ def local_issue_status_from_local_tracker
42
+ local_tracker.default_status
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RedmineRemotes
4
+ module Tableless
5
+ module RemoteIssueFetch
6
+ class Base < ::EacRailsUtils::TablelessModel
7
+ private
8
+
9
+ def provider_issue_uncached
10
+ return nil if [remote_tracker, issue_remote_code].any?(&:blank?)
11
+
12
+ remote_tracker.find_remote_issue(issue_remote_code)
13
+ rescue ::RedmineRemotes::RestProvider::HttpResponse => e
14
+ errors.add(default_error_column,
15
+ "Requisição a \"#{e.url}\" retornou com status #{e.status}")
16
+ ::Rails.logger.warn(e.body)
17
+ nil
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RedmineRemotes
4
+ module Tableless
5
+ module RemoteIssueFetch
6
+ class Create < ::RedmineRemotes::Tableless::RemoteIssueFetch::Base
7
+ require_sub __FILE__
8
+
9
+ attribute :issue_remote_code, ::String
10
+ attribute :local_tracker_id, ::Integer
11
+ attribute :project_id, ::Integer
12
+ attribute :remote_tracker_id, ::Integer
13
+
14
+ belongs_to :local_tracker, class_name: 'Tracker'
15
+ belongs_to :project, class_name: 'Project'
16
+ belongs_to :remote_tracker, class_name: 'RemoteTracker'
17
+
18
+ validates :local_tracker, presence: true
19
+ validates :remote_tracker, presence: true
20
+ validates :project, presence: true
21
+ validates :issue_remote_code, presence: true
22
+
23
+ validate :tracker_in_project
24
+
25
+ def create
26
+ ::Issue.transaction do
27
+ return false unless valid?
28
+ return false unless create_local_issue
29
+ return false unless create_remote_issue
30
+ end
31
+ true
32
+ end
33
+
34
+ def default_error_column
35
+ :issue_remote_code
36
+ end
37
+
38
+ def save
39
+ remote_issue_by_remote_code.present? ? update : create
40
+ end
41
+
42
+ def tracker_in_project
43
+ return unless local_tracker.present? && project.present?
44
+ return if project.trackers.include?(local_tracker)
45
+
46
+ errors.add(:local_tracker, 'is not a tracker of project')
47
+ end
48
+
49
+ def update
50
+ ::RedmineRemotes::Tableless::RemoteIssueFetch::Update
51
+ .new(remote_issue: remote_issue_by_remote_code).save
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RedmineRemotes
4
+ module Tableless
5
+ module RemoteIssueFetch
6
+ class Create < ::RedmineRemotes::Tableless::RemoteIssueFetch::Base
7
+ private
8
+
9
+ def create_local_issue
10
+ return true if local_issue.save
11
+
12
+ fetch_record_errors(local_issue, default_column: :issue_remote_code)
13
+ false
14
+ end
15
+
16
+ def local_issue_uncached
17
+ remote_issue_by_remote_code.if_present { |v| return v.local_issue }
18
+ ::Issue.new(
19
+ local_issue_provider_attributes.merge(
20
+ project: project, tracker: local_tracker, priority: local_issue_priority
21
+ )
22
+ )
23
+ end
24
+
25
+ def local_issue_priority
26
+ ::IssuePriority.default
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RedmineRemotes
4
+ module Tableless
5
+ module RemoteIssueFetch
6
+ class Create < ::RedmineRemotes::Tableless::RemoteIssueFetch::Base
7
+ private
8
+
9
+ def create_remote_issue
10
+ return true if remote_issue.save
11
+
12
+ fetch_record_errors(remote_issue, default_column: default_error_column)
13
+ false
14
+ end
15
+
16
+ def remote_issue_uncached
17
+ remote_issue_by_remote_code.if_blank do
18
+ ::RemoteIssue.new(remote_tracker: remote_tracker, remote_code: issue_remote_code,
19
+ local_issue: local_issue)
20
+ end
21
+ end
22
+
23
+ def remote_issue_by_remote_code_uncached
24
+ ::RemoteIssue.where(
25
+ remote_tracker: remote_tracker,
26
+ remote_code: ::RemoteIssue.remote_code_sanitize(issue_remote_code)
27
+ ).first
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+ require 'eac/model'
5
+
6
+ module RedmineRemotes
7
+ module Tableless
8
+ module RemoteIssueFetch
9
+ class Update < ::RedmineRemotes::Tableless::RemoteIssueFetch::Base
10
+ require_sub __FILE__
11
+
12
+ attribute :remote_issue_id, ::Integer
13
+ belongs_to :remote_issue
14
+
15
+ validates :remote_issue, presence: true
16
+
17
+ def default_error_column
18
+ :remote_issue_id
19
+ end
20
+
21
+ def save
22
+ return false unless valid?
23
+ return false unless update_local_issue_with_remote_data
24
+
25
+ true
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RedmineRemotes
4
+ module Tableless
5
+ module RemoteIssueFetch
6
+ class Update < ::RedmineRemotes::Tableless::RemoteIssueFetch::Base
7
+ private
8
+
9
+ def local_issue
10
+ remote_issue.local_issue
11
+ end
12
+
13
+ def local_tracker
14
+ local_issue.tracker
15
+ end
16
+
17
+ def update_local_issue_with_remote_data
18
+ return true if local_issue.update(local_issue_provider_attributes)
19
+
20
+ fetch_record_errors(local_issue, default_column: :issue_remote_code)
21
+ false
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RedmineRemotes
4
+ module Tableless
5
+ module RemoteIssueFetch
6
+ class Update < ::RedmineRemotes::Tableless::RemoteIssueFetch::Base
7
+ private
8
+
9
+ def provider_issue_uncached
10
+ remote_issue.remote_tracker.find_remote_issue(remote_issue.remote_code)
11
+ rescue ::RedmineRemotes::RestProvider::HttpResponse => e
12
+ errors.add(:remote_issue_id,
13
+ "Requisição a \"#{e.url}\" retornou com status #{e.status}")
14
+ puts "====> #{e.body}"
15
+ nil
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RedmineRemotes
4
+ module Tableless
5
+ module RemoteIssueFetch
6
+ class Update < ::RedmineRemotes::Tableless::RemoteIssueFetch::Base
7
+ private
8
+
9
+ def issue_remote_code
10
+ remote_issue.remote_code
11
+ end
12
+
13
+ def remote_tracker
14
+ remote_issue.remote_tracker
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -8,6 +8,7 @@ class RemoteIssue < ActiveRecord::Base
8
8
  belongs_to :remote_tracker, class_name: 'RemoteTracker', inverse_of: :issues
9
9
  belongs_to :local_issue, class_name: 'Issue', inverse_of: :remote_issue
10
10
 
11
+ validates :local_issue, presence: true, uniqueness: true
11
12
  validates :remote_tracker, presence: true
12
13
  validates :remote_code, presence: true, uniqueness: { scope: [:remote_tracker] }
13
14
 
@@ -4,9 +4,8 @@ require 'eac_ruby_utils/listable'
4
4
  require 'validate_url'
5
5
 
6
6
  class RemoteTracker < ActiveRecord::Base
7
- require_relative 'remote_tracker/_jira'
8
-
9
7
  include ::EacRubyUtils::Listable
8
+ include ::RemoteTracker::Jira
10
9
 
11
10
  has_many :issues, class_name: 'RemoteIssue', inverse_of: :remote_tracker,
12
11
  dependent: :restrict_with_error
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ class RemoteTracker < ActiveRecord::Base
4
+ module Jira
5
+ def jira_find_remote_issue(issue_id)
6
+ jira_create_instance.find_issue(issue_id)
7
+ end
8
+
9
+ def jira_create_instance
10
+ ::RedmineRemotes::Jira::Instance.new(root_url, username, password)
11
+ end
12
+ end
13
+ end
@@ -1,9 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'avmtrf1/rest_provider/entity'
4
+
3
5
  module RedmineRemotes
4
6
  module Jira
5
7
  module Entities
6
- class Issue < ::RedmineRemotes::RestProvider::Entity
8
+ class Issue < ::Avmtrf1::RestProvider::Entity
7
9
  def code
8
10
  data.fetch('key')
9
11
  end
@@ -29,7 +31,7 @@ module RedmineRemotes
29
31
  end
30
32
 
31
33
  def author_login
32
- fields.fetch('reporter').fetch('key')
34
+ fields.try(:fetch, 'reporter').try(:fetch, 'key')
33
35
  end
34
36
  end
35
37
  end
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'avmtrf1/rest_provider/instance'
3
4
  require 'curb'
4
5
  require 'json'
5
6
 
@@ -9,42 +10,16 @@ module RedmineRemotes
9
10
  # * parse_issue_id(global_issue_id)
10
11
  # * self.build_service_url(service_url_suffix)
11
12
  # * self.issue_get_url_suffix(provider_issue_id)
12
- class Instance
13
- attr_reader :root_url, :username, :password
14
-
15
- def initialize(root_url, username, password)
16
- @root_url = root_url
17
- @username = username
18
- @password = password
19
- end
20
-
21
- def find_issue(global_issue_id)
22
- parsed = self.class.parse_issue_id(global_issue_id)
23
- parsed.present? ? issue(parsed.provider_issue_id) : nil
24
- end
25
-
26
- def issue(provider_issue_id)
27
- issue_class.new(self, request(issue_get_url_suffix(provider_issue_id)))
28
- end
29
-
13
+ class Instance < ::Avmtrf1::RestProvider::Instance
30
14
  def request(service_url_suffix)
31
- JSON.parse(curl_perform(service_url_suffix).body_or_raise)
32
- end
33
-
34
- def issue_class
35
- "#{self.class.name.deconstantize}::Entities::Issue".constantize
15
+ JSON.parse(super(service_url_suffix).body_or_raise)
36
16
  end
37
17
 
38
18
  private
39
19
 
40
20
  # @return [RedmineRemotes::RestProvider::HttpResponse]
41
- def curl_perform(service_url_suffix)
42
- c = ::Curl::Easy.new(build_service_url(service_url_suffix))
43
- c.http_auth_types = :basic
44
- c.username = username
45
- c.password = password
46
- c.headers['Accept'] = 'application/json'
47
- return ::RedmineRemotes::RestProvider::HttpResponse.new_from_curl_easy(c) if c.perform
21
+ def curl_perform(curl)
22
+ return ::RedmineRemotes::RestProvider::HttpResponse.new_from_curl_easy(curl) if curl.perform
48
23
 
49
24
  raise 'Curl failed'
50
25
  end
@@ -3,7 +3,7 @@
3
3
  module RedmineRemotes
4
4
  SLUG = 'redmine_remotes'
5
5
  NAME = 'Redmine Remotes'
6
- VERSION = '0.5.1'
6
+ VERSION = '0.6.0'
7
7
  AUTHOR = 'Eduardo Henrique Bogoni'
8
8
  SUMMARY = 'Integração do Redmine com trackers diversos.'
9
9
  end
@@ -28,7 +28,7 @@ namespace :redmine_remotes do
28
28
  end
29
29
  ::Rails.logger.info("Local tracker: #{local_tracker}")
30
30
 
31
- add = ::RedmineRemotes::Tableless::AddRemoteIssue.new(
31
+ add = ::RedmineRemotes::Tableless::RemoteIssueFetch::Create.new(
32
32
  remote_tracker: remote_tracker, project: project, local_tracker: local_tracker,
33
33
  issue_remote_code: args.issue_remote_code
34
34
  )
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redmine_remotes
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.1
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eduardo Henrique Bogoni
@@ -24,6 +24,26 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0.4'
27
+ - !ruby/object:Gem::Dependency
28
+ name: avmtrf1-tools
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.27'
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: 0.27.1
37
+ type: :runtime
38
+ prerelease: false
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - "~>"
42
+ - !ruby/object:Gem::Version
43
+ version: '0.27'
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 0.27.1
27
47
  - !ruby/object:Gem::Dependency
28
48
  name: curb
29
49
  requirement: !ruby/object:Gem::Requirement
@@ -109,14 +129,20 @@ files:
109
129
  - app/controllers/remote_issues_controller.rb
110
130
  - app/controllers/remote_trackers_controller.rb
111
131
  - app/controllers/remote_users_controller.rb
112
- - app/models/redmine_remotes/tableless/add_remote_issue.rb
113
- - app/models/redmine_remotes/tableless/add_remote_issue/_local_issue.rb
114
- - app/models/redmine_remotes/tableless/add_remote_issue/_provider_issue.rb
115
- - app/models/redmine_remotes/tableless/add_remote_issue/_remote_issue.rb
132
+ - app/models/redmine_remotes/tableless/remote_issue_fetch/base.rb
133
+ - app/models/redmine_remotes/tableless/remote_issue_fetch/base/_local_issue.rb
134
+ - app/models/redmine_remotes/tableless/remote_issue_fetch/base/_provider_issue.rb
135
+ - app/models/redmine_remotes/tableless/remote_issue_fetch/create.rb
136
+ - app/models/redmine_remotes/tableless/remote_issue_fetch/create/_local_issue.rb
137
+ - app/models/redmine_remotes/tableless/remote_issue_fetch/create/_remote_issue.rb
138
+ - app/models/redmine_remotes/tableless/remote_issue_fetch/update.rb
139
+ - app/models/redmine_remotes/tableless/remote_issue_fetch/update/_local_issue.rb
140
+ - app/models/redmine_remotes/tableless/remote_issue_fetch/update/_provider_issue.rb
141
+ - app/models/redmine_remotes/tableless/remote_issue_fetch/update/_remote_issue.rb
116
142
  - app/models/remote_issue.rb
117
143
  - app/models/remote_issue_status.rb
118
144
  - app/models/remote_tracker.rb
119
- - app/models/remote_tracker/_jira.rb
145
+ - app/models/remote_tracker/jira.rb
120
146
  - app/models/remote_user.rb
121
147
  - app/views/project_remote_issues/_trackers.html.erb
122
148
  - app/views/project_remote_issues/index.html.erb
@@ -141,7 +167,6 @@ files:
141
167
  - lib/redmine_remotes/patches/issue_status.rb
142
168
  - lib/redmine_remotes/patches/tracker.rb
143
169
  - lib/redmine_remotes/patches/user.rb
144
- - lib/redmine_remotes/rest_provider/entity.rb
145
170
  - lib/redmine_remotes/rest_provider/http_response.rb
146
171
  - lib/redmine_remotes/rest_provider/instance.rb
147
172
  - lib/redmine_remotes/sanitizer.rb
@@ -1,65 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'eac_ruby_utils/require_sub'
4
- require 'eac_ruby_utils/simple_cache'
5
- require 'eac/model'
6
-
7
- module RedmineRemotes
8
- module Tableless
9
- class AddRemoteIssue < ::EacRailsUtils::TablelessModel
10
- include ::EacRubyUtils::SimpleCache
11
- include ::Eac::Model
12
- ::EacRubyUtils.require_sub(__FILE__)
13
-
14
- attribute :issue_remote_code, ::String
15
- attribute :local_tracker_id, ::Integer
16
- attribute :project_id, ::Integer
17
- attribute :remote_tracker_id, ::Integer
18
-
19
- belongs_to :local_tracker, class_name: 'Tracker'
20
- belongs_to :project, class_name: 'Project'
21
- belongs_to :remote_tracker, class_name: 'RemoteTracker'
22
-
23
- validates :local_tracker, presence: true
24
- validates :remote_tracker, presence: true
25
- validates :project, presence: true
26
- validates :issue_remote_code, presence: true
27
-
28
- validate :tracker_in_project
29
- validate :author_present
30
- validate :provider_issue_present
31
-
32
- def save
33
- return false unless valid?
34
- return false unless create_remote_issue
35
- return false unless create_local_issue
36
- return false unless update_remote_issue_with_issue
37
-
38
- true
39
- end
40
-
41
- def tracker_in_project
42
- return unless local_tracker.present? && project.present?
43
- return if project.trackers.include?(local_tracker)
44
-
45
- errors.add(:local_tracker, 'is not a tracker of project')
46
- end
47
-
48
- def author_present
49
- return if provider_issue.blank?
50
- return if local_issue_author.present?
51
-
52
- errors.add(:remote_code,
53
- "Usuário local não encontrado para \"#{provider_issue.author_login}\"")
54
- end
55
-
56
- def provider_issue_present
57
- return if issue_remote_code.blank?
58
- return if provider_issue.present?
59
-
60
- errors.add(:remote_code,
61
- "Demanda remota não encontrada com o código \"#{issue_remote_code}\"")
62
- end
63
- end
64
- end
65
- end
@@ -1,57 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RedmineRemotes
4
- module Tableless
5
- class AddRemoteIssue < ::EacRailsUtils::TablelessModel
6
- private
7
-
8
- def create_local_issue
9
- return true if local_issue.save
10
-
11
- fetch_record_errors(local_issue, default_column: :issue_remote_code)
12
- false
13
- end
14
-
15
- def local_issue_uncached
16
- ::Issue.new(
17
- subject: local_issue_subject, project: project, tracker: local_tracker,
18
- priority: local_issue_priority, author: local_issue_author, status: local_issue_status,
19
- created_on: provider_issue.created_on, updated_on: provider_issue.updated_on
20
- )
21
- end
22
-
23
- def local_issue_priority
24
- ::IssuePriority.default
25
- end
26
-
27
- def local_issue_subject
28
- "[#{provider_issue.code}] #{provider_issue.subject}"
29
- end
30
-
31
- def local_issue_author_uncached
32
- return nil if provider_issue.blank?
33
-
34
- ::RemoteUser.find_local_user(
35
- provider_issue.author_login,
36
- remote_tracker
37
- )
38
- end
39
-
40
- def local_issue_status
41
- local_issue_status_from_remote_tracker || local_issue_status_from_local_tracker
42
- end
43
-
44
- def local_issue_status_from_remote_tracker
45
- ::RemoteIssueStatus.find_local_issue_status(
46
- provider_issue.status_name,
47
- remote_tracker,
48
- local_tracker
49
- )
50
- end
51
-
52
- def local_issue_status_from_local_tracker
53
- local_tracker.default_status
54
- end
55
- end
56
- end
57
- end
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RedmineRemotes
4
- module Tableless
5
- class AddRemoteIssue < ::EacRailsUtils::TablelessModel
6
- private
7
-
8
- def provider_issue_uncached
9
- return nil unless remote_tracker.present? && issue_remote_code.present?
10
-
11
- remote_tracker.find_remote_issue(issue_remote_code)
12
- rescue ::RedmineRemotes::RestProvider::HttpResponse => e
13
- errors.add(:issue_remote_code, "Requisição a \"#{e.url}\" retornou com status #{e.status}")
14
- puts "====> #{e.body}"
15
- nil
16
- end
17
- end
18
- end
19
- end
@@ -1,27 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RedmineRemotes
4
- module Tableless
5
- class AddRemoteIssue < ::EacRailsUtils::TablelessModel
6
- private
7
-
8
- def create_remote_issue
9
- return true if remote_issue.save
10
-
11
- fetch_record_errors(remote_issue, default_column: :issue_remote_code)
12
- false
13
- end
14
-
15
- def update_remote_issue_with_issue
16
- return true if remote_issue.update(local_issue: local_issue)
17
-
18
- fetch_record_errors(remote_issue, default_column: :issue_remote_code)
19
- false
20
- end
21
-
22
- def remote_issue_uncached
23
- ::RemoteIssue.new(remote_tracker: remote_tracker, remote_code: issue_remote_code)
24
- end
25
- end
26
- end
27
- end
@@ -1,11 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class RemoteTracker < ActiveRecord::Base
4
- def jira_find_remote_issue(issue_id)
5
- jira_create_instance.find_issue(issue_id)
6
- end
7
-
8
- def jira_create_instance
9
- ::RedmineRemotes::Jira::Instance.new(root_url, username, password)
10
- end
11
- end
@@ -1,18 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'eac_ruby_utils/simple_cache'
4
-
5
- module RedmineRemotes
6
- module RestProvider
7
- class Entity
8
- include ::EacRubyUtils::SimpleCache
9
-
10
- attr_reader :instance, :data
11
-
12
- def initialize(instance, data)
13
- @instance = instance
14
- @data = data
15
- end
16
- end
17
- end
18
- end