uffizzi_core 0.1.3 → 0.1.5

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 (103) hide show
  1. checksums.yaml +4 -4
  2. data/app/clients/uffizzi_core/docker_hub_client.rb +2 -0
  3. data/app/clients/uffizzi_core/github_container_registry_client/request_result.rb +7 -0
  4. data/app/clients/uffizzi_core/github_container_registry_client.rb +52 -0
  5. data/app/controllers/concerns/uffizzi_core/dependency_injection_concern.rb +2 -2
  6. data/app/controllers/uffizzi_core/api/cli/v1/account/credentials_controller.rb +45 -9
  7. data/app/controllers/uffizzi_core/api/cli/v1/projects/compose_files_controller.rb +2 -2
  8. data/app/controllers/uffizzi_core/api/cli/v1/projects/deployments/application_controller.rb +1 -1
  9. data/app/controllers/uffizzi_core/api/cli/v1/projects/deployments_controller.rb +41 -10
  10. data/app/controllers/uffizzi_core/api/cli/v1/projects/secrets_controller.rb +18 -26
  11. data/app/controllers/uffizzi_core/application_controller.rb +9 -3
  12. data/app/errors/uffizzi_core/deployment/image_pull_error.rb +10 -0
  13. data/app/forms/uffizzi_core/api/cli/v1/account/credential/check_credential_form.rb +16 -0
  14. data/app/forms/uffizzi_core/api/cli/v1/account/credential/create_form.rb +1 -1
  15. data/app/forms/uffizzi_core/api/cli/v1/compose_file/check_credentials_form.rb +2 -2
  16. data/app/forms/uffizzi_core/api/cli/v1/compose_file/cli_form.rb +1 -18
  17. data/app/forms/uffizzi_core/api/cli/v1/compose_file/template_form.rb +1 -1
  18. data/app/forms/uffizzi_core/api/cli/v1/deployment/update_form.rb +90 -0
  19. data/app/forms/uffizzi_core/api/cli/v1/project/update_form.rb +1 -31
  20. data/app/forms/uffizzi_core/api/cli/v1/secret/bulk_assign_form.rb +39 -0
  21. data/app/jobs/uffizzi_core/deployment/manage_deploy_activity_item_job.rb +22 -3
  22. data/app/lib/uffizzi_core/rbac/user_access_service.rb +12 -14
  23. data/app/models/uffizzi_core/account.rb +1 -19
  24. data/app/models/uffizzi_core/activity_item.rb +1 -6
  25. data/app/models/uffizzi_core/build.rb +1 -1
  26. data/app/models/uffizzi_core/comment.rb +1 -1
  27. data/app/models/uffizzi_core/compose_file.rb +1 -1
  28. data/app/models/uffizzi_core/config_file.rb +1 -1
  29. data/app/models/uffizzi_core/container.rb +1 -1
  30. data/app/models/uffizzi_core/container_config_file.rb +1 -1
  31. data/app/models/uffizzi_core/coupon.rb +1 -1
  32. data/app/models/uffizzi_core/credential/github_container_registry.rb +4 -0
  33. data/app/models/uffizzi_core/credential.rb +3 -6
  34. data/app/models/uffizzi_core/deployment.rb +11 -2
  35. data/app/models/uffizzi_core/event.rb +1 -1
  36. data/app/models/uffizzi_core/invitation.rb +1 -1
  37. data/app/models/uffizzi_core/membership.rb +1 -1
  38. data/app/models/uffizzi_core/payment.rb +1 -1
  39. data/app/models/uffizzi_core/price.rb +1 -1
  40. data/app/models/uffizzi_core/product.rb +1 -1
  41. data/app/models/uffizzi_core/project.rb +5 -11
  42. data/app/models/uffizzi_core/rating.rb +1 -1
  43. data/app/models/uffizzi_core/repo/github_container_registry.rb +4 -0
  44. data/app/models/uffizzi_core/repo.rb +1 -11
  45. data/app/models/uffizzi_core/role.rb +2 -2
  46. data/app/models/uffizzi_core/secret.rb +9 -0
  47. data/app/models/uffizzi_core/template.rb +1 -1
  48. data/app/models/uffizzi_core/user.rb +1 -1
  49. data/app/models/uffizzi_core/user_project.rb +1 -1
  50. data/app/policies/uffizzi_core/api/cli/v1/account/credentials_policy.rb +8 -0
  51. data/app/policies/uffizzi_core/api/cli/v1/projects/deployments_policy.rb +4 -0
  52. data/app/repositories/uffizzi_core/credential_repo.rb +17 -22
  53. data/app/repositories/uffizzi_core/deployment_repo.rb +1 -0
  54. data/app/serializers/uffizzi_core/api/cli/v1/projects/deployment_serializer/container_serializer.rb +8 -0
  55. data/app/serializers/uffizzi_core/api/cli/v1/projects/secret_serializer.rb +5 -0
  56. data/app/serializers/uffizzi_core/controller/apply_config_file/config_file_serializer.rb +5 -0
  57. data/app/serializers/uffizzi_core/controller/create_credential/credential_serializer.rb +7 -3
  58. data/app/serializers/uffizzi_core/controller/deploy_containers/container_serializer/container_config_file_serializer/config_file_serializer.rb +8 -0
  59. data/app/serializers/uffizzi_core/controller/deploy_containers/container_serializer/container_config_file_serializer.rb +7 -0
  60. data/app/serializers/uffizzi_core/controller/deploy_containers/container_serializer.rb +4 -3
  61. data/app/services/uffizzi_core/activity_item_service.rb +16 -26
  62. data/app/services/uffizzi_core/compose_file/builders/container_builder_service.rb +11 -18
  63. data/app/services/uffizzi_core/compose_file/container_service.rb +13 -9
  64. data/app/services/uffizzi_core/compose_file/dependencies_service.rb +1 -0
  65. data/app/services/uffizzi_core/compose_file/services_options_service.rb +2 -2
  66. data/app/services/uffizzi_core/compose_file_service.rb +148 -0
  67. data/app/services/uffizzi_core/container_service.rb +1 -16
  68. data/app/services/uffizzi_core/controller_service.rb +7 -1
  69. data/app/services/uffizzi_core/credential_service.rb +2 -2
  70. data/app/services/uffizzi_core/deployment_service.rb +28 -7
  71. data/app/services/uffizzi_core/github_container_registry/credential_service.rb +24 -0
  72. data/app/services/uffizzi_core/manage_activity_items_service.rb +4 -19
  73. data/app/services/uffizzi_core/repo_service.rb +2 -137
  74. data/app/services/uffizzi_core/user_generator_service.rb +78 -0
  75. data/config/locales/en.activerecord.yml +5 -0
  76. data/config/locales/en.yml +4 -1
  77. data/config/routes.rb +6 -2
  78. data/db/migrate/20220309110201_remove_secrets_from_projects.rb +7 -0
  79. data/db/migrate/20220310110150_create_project_secrets.rb +14 -0
  80. data/db/migrate/20220329123323_rename_project_secrets_to_secrets.rb +7 -0
  81. data/db/migrate/20220329124542_add_resource_to_secrets.rb +7 -0
  82. data/db/migrate/20220329143241_remove_project_ref_from_secrets.rb +7 -0
  83. data/lib/tasks/uffizzi_core_tasks.rake +5 -0
  84. data/lib/uffizzi_core/engine.rb +35 -0
  85. data/lib/uffizzi_core/version.rb +1 -1
  86. data/lib/uffizzi_core.rb +1 -30
  87. data/swagger/v1/swagger.json +220 -11
  88. metadata +45 -25
  89. data/app/clients/uffizzi_core/github/app_client.rb +0 -19
  90. data/app/clients/uffizzi_core/github/installation_client.rb +0 -11
  91. data/app/clients/uffizzi_core/github/user_client.rb +0 -51
  92. data/app/errors/uffizzi_core/compose_file/not_found_error.rb +0 -4
  93. data/app/forms/uffizzi_core/api/cli/v1/project/delete_secret_form.rb +0 -27
  94. data/app/jobs/uffizzi_core/deployment/send_github_preview_message_job.rb +0 -13
  95. data/app/services/uffizzi_core/cli/compose_file_service.rb +0 -203
  96. data/app/services/uffizzi_core/compose_file/builders/github_repo_builder_service.rb +0 -59
  97. data/app/services/uffizzi_core/compose_file/services_options/build_service.rb +0 -93
  98. data/app/services/uffizzi_core/compose_file/update_service.rb +0 -29
  99. data/app/services/uffizzi_core/github/app_service.rb +0 -51
  100. data/app/services/uffizzi_core/github/credential_service.rb +0 -124
  101. data/app/services/uffizzi_core/github/message_service.rb +0 -20
  102. data/app/services/uffizzi_core/github_service.rb +0 -28
  103. data/app/services/uffizzi_core/user_access_service.rb +0 -14
@@ -1,203 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class UffizziCore::Cli::ComposeFileService
4
- class << self
5
- def create(params, kind)
6
- compose_file_form = create_compose_form(params, kind)
7
-
8
- process_compose_file(compose_file_form, params)
9
- end
10
-
11
- def update(compose_file, params)
12
- compose_file_form = create_update_compose_form(compose_file, params)
13
-
14
- process_compose_file(compose_file_form, params)
15
- end
16
-
17
- def parse(compose_content, compose_payload = {})
18
- compose_data = load_compose_data(compose_content)
19
- check_config_options_format(compose_data)
20
- configs_data = UffizziCore::ComposeFile::ConfigsOptionsService.parse(compose_data['configs'])
21
- secrets_data = UffizziCore::ComposeFile::SecretsOptionsService.parse(compose_data['secrets'])
22
- containers_data = UffizziCore::ComposeFile::ServicesOptionsService.parse(compose_data['services'], configs_data, secrets_data,
23
- compose_payload)
24
-
25
- continuous_preview_option = UffizziCore::ComposeFile::ConfigOptionService.continuous_preview_option(compose_data)
26
- continuous_preview_data = UffizziCore::ComposeFile::ContinuousPreviewOptionsService.parse(continuous_preview_option)
27
-
28
- ingress_option = UffizziCore::ComposeFile::ConfigOptionService.ingress_option(compose_data)
29
- ingress_data = UffizziCore::ComposeFile::IngressOptionsService.parse(ingress_option, compose_data['services'])
30
-
31
- {
32
- containers: containers_data,
33
- ingress: ingress_data,
34
- continuous_preview: continuous_preview_data,
35
- }
36
- end
37
-
38
- def load_repositories(compose_data, credential)
39
- containers = github_containers(compose_data)
40
- return [] if containers.empty?
41
-
42
- search_query = 'fork:true '
43
- search_query += containers.reduce('') do |query, container|
44
- query += "repo:#{credential.username}/#{container[:build][:repository_name]} "
45
- query
46
- end
47
-
48
- UffizziCore::Github::CredentialService.search_repositories(credential, search_query)
49
- end
50
-
51
- def check_github_branches(compose_data, repositories, credential)
52
- containers = github_containers_with_branches(compose_data)
53
- return [] if containers.empty?
54
-
55
- containers.map do |container|
56
- repository = repositories.detect { |item| item[:clone_url].to_s.start_with?(container[:build][:repository_url]) }
57
- error_message = I18n.t('compose.repository_not_found', repository_url: container[:build][:repository_url])
58
- raise UffizziCore::ComposeFile::NotFoundError, error_message if repository.nil?
59
-
60
- branch = begin
61
- UffizziCore::Github::CredentialService.branch(credential, repository[:id], container[:build][:branch])
62
- rescue Octokit::NotFound
63
- nil
64
- end
65
-
66
- error_message = I18n.t('compose.invalid_branch', branch: container[:build][:branch],
67
- repository_url: container[:build][:repository_url])
68
- raise UffizziCore::ComposeFile::NotFoundError, error_message if branch.nil?
69
- end
70
- end
71
-
72
- def build_template_attributes(compose_data, source, credentials, project, compose_dependencies = [], compose_repositories = [])
73
- builder = UffizziCore::ComposeFile::Builders::TemplateBuilderService.new(credentials, project, compose_repositories)
74
-
75
- builder.build_attributes(compose_data, compose_dependencies, source)
76
- end
77
-
78
- def containers_credentials(compose_data, credentials)
79
- containers = compose_data[:containers]
80
- detected_credentials = containers.map do |container|
81
- UffizziCore::ComposeFile::ContainerService.credential_for_container(container, credentials)
82
- end
83
-
84
- result = []
85
- detected_credentials.compact
86
- .group_by { |credential| credential[:id] }
87
- .each_pair { |_id, value| result << value.first }
88
- result
89
- end
90
-
91
- private
92
-
93
- def process_compose_file(compose_file_form, params)
94
- credential = compose_file_form.project.account.credentials.github.last
95
- cli_form = create_cli_form(compose_file_form.content, credential)
96
- return [compose_file_form, cli_form.errors] if cli_form.invalid?
97
-
98
- dependencies = params[:dependencies].to_a
99
- compose_data = cli_form.compose_data
100
- compose_dependencies = build_compose_dependecies(compose_data, compose_file_form.path, dependencies)
101
- cli_form.compose_dependencies = compose_dependencies
102
-
103
- persist!(compose_file_form, cli_form)
104
- end
105
-
106
- def create_compose_form(params, kind)
107
- compose_file_params = params[:compose_file_params]
108
- compose_file_form = UffizziCore::Api::Cli::V1::ComposeFile::CreateForm.new(compose_file_params)
109
- compose_file_form.project = params[:project]
110
- compose_file_form.added_by = params[:user]
111
- compose_file_form.content = compose_file_params[:content]
112
- compose_file_form.kind = kind
113
- payload_dependencies = prepare_compose_file_dependencies(params[:dependencies])
114
- compose_file_form.payload['dependencies'] = payload_dependencies
115
-
116
- compose_file_form
117
- end
118
-
119
- def create_update_compose_form(compose_file, params)
120
- compose_file_form = compose_file.becomes(UffizziCore::Api::Cli::V1::ComposeFile::UpdateForm)
121
- compose_file_params = params[:compose_file_params]
122
- compose_file_form.assign_attributes(compose_file_params)
123
- payload_dependencies = prepare_compose_file_dependencies(params[:dependencies])
124
- compose_file_form.payload['dependencies'] = payload_dependencies
125
-
126
- compose_file_form
127
- end
128
-
129
- def create_cli_form(content, credential)
130
- cli_form = UffizziCore::Api::Cli::V1::ComposeFile::CliForm.new
131
- cli_form.content = content
132
- cli_form.credential = credential
133
-
134
- cli_form
135
- end
136
-
137
- def build_compose_dependecies(compose_data, compose_path, dependencies)
138
- return [] if dependencies.empty?
139
-
140
- UffizziCore::ComposeFile::DependenciesService.build_dependencies(compose_data, compose_path, dependencies)
141
- end
142
-
143
- def prepare_compose_file_dependencies(compose_dependencies)
144
- compose_dependencies.map do |dependency|
145
- {
146
- path: dependency[:path],
147
- }
148
- end
149
- end
150
-
151
- def persist!(compose_file_form, cli_form)
152
- errors = []
153
- ActiveRecord::Base.transaction do
154
- if !compose_file_form.save
155
- errors = compose_file_form.errors
156
- raise ActiveRecord::Rollback
157
- end
158
-
159
- config_files_service = UffizziCore::ComposeFile::ConfigFilesService.new(compose_file_form)
160
- errors = config_files_service.create_config_files(cli_form.compose_dependencies)
161
- raise ActiveRecord::Rollback if errors.present?
162
-
163
- project = compose_file_form.project
164
- user = compose_file_form.added_by
165
- template_service = UffizziCore::ComposeFile::TemplateService.new(cli_form, project, user)
166
- errors = template_service.create_template(compose_file_form)
167
-
168
- raise ActiveRecord::Rollback if errors.present?
169
- end
170
- [compose_file_form, errors]
171
- end
172
-
173
- def load_compose_data(compose_content)
174
- begin
175
- compose_data = YAML.safe_load(compose_content)
176
- rescue Psych::SyntaxError
177
- raise UffizziCore::ComposeFile::ParseError, 'Invalid compose file'
178
- end
179
-
180
- raise UffizziCore::ComposeFile::ParseError, I18n.t('compose.unsupported_file') if compose_data.nil?
181
-
182
- compose_data
183
- end
184
-
185
- def check_config_options_format(compose_data)
186
- options = UffizziCore::ComposeFile::ConfigOptionService.config_options(compose_data)
187
-
188
- options.each do |option|
189
- next if UffizziCore::ComposeFile::ConfigOptionService.valid_option_format?(option)
190
-
191
- raise UffizziCore::ComposeFile::ParseError, I18n.t('compose.invalid_config_option', value: option)
192
- end
193
- end
194
-
195
- def github_containers(compose_data)
196
- compose_data[:containers].select { |container| UffizziCore::ComposeFile::ContainerService.github?(container) }
197
- end
198
-
199
- def github_containers_with_branches(compose_data)
200
- github_containers(compose_data).reject { |container| container[:build][:branch].nil? }
201
- end
202
- end
203
- end
@@ -1,59 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class UffizziCore::ComposeFile::Builders::GithubRepoBuilderService
4
- attr_accessor :repositories
5
-
6
- def initialize(repositories)
7
- @repositories = repositories
8
- end
9
-
10
- def build_attributes(build_data)
11
- repository_data = repository(build_data[:repository_name])
12
-
13
- {
14
- kind: repository_kind(build_data),
15
- name: build_data[:repository_name],
16
- slug: build_data[:repository_name],
17
- type: UffizziCore::Repo::Github.name,
18
- branch: branch(build_data, repository_data),
19
- namespace: build_data[:account_name],
20
- is_private: nil,
21
- description: repository_data[:description],
22
- repository_id: repository_data[:id],
23
- dockerfile_path: build_data[:dockerfile],
24
- dockerfile_context_path: build_data[:dockerfile_context_path],
25
- args: args(build_data),
26
- }
27
- end
28
-
29
- private
30
-
31
- def branch(build_data, repository_data)
32
- build_data[:branch] || repository_data[:default_branch]
33
- end
34
-
35
- def repository(name)
36
- repo = repositories.detect { |repository| repository.name.downcase == name.downcase }
37
-
38
- raise UffizziCore::ComposeFile::BuildError, I18n.t('compose.repo_not_found', name: name) if repo.nil?
39
-
40
- repo
41
- end
42
-
43
- def repository_kind(build_data)
44
- if build_data[:dockerfile].present?
45
- UffizziCore::Repo.kind.dockerfile
46
- else
47
- UffizziCore::Repo.kind.barestatic
48
- end
49
- end
50
-
51
- def args(build_data)
52
- build_data[:args].map do |arg|
53
- {
54
- name: arg[:name],
55
- value: arg[:value],
56
- }
57
- end
58
- end
59
- end
@@ -1,93 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class UffizziCore::ComposeFile::ServicesOptions::BuildService
4
- extend UffizziCore::ComposeFile::VariablesService
5
-
6
- class << self
7
- def parse(build_data, compose_payload)
8
- return {} if build_data.blank?
9
-
10
- args = parse_args(build_data)
11
-
12
- repository_url, branch, dockerfile_context_path = parse_context(build_data, compose_payload)
13
- repository_parts = repository_url.split('/').last(2)
14
- account_name = repository_parts.first
15
- repository_name = repository_parts.last
16
- dockerfile = build_data['dockerfile'].blank? ? ::Settings.compose.dockerfile_default_path : build_data['dockerfile']
17
-
18
- {
19
- repository_url: repository_url,
20
- account_name: account_name,
21
- repository_name: repository_name,
22
- branch: branch,
23
- dockerfile: dockerfile,
24
- dockerfile_context_path: dockerfile_context_path,
25
- args: args,
26
- }
27
- end
28
-
29
- private
30
-
31
- def parse_args(build_data)
32
- args = build_data['args']
33
- return [] if args.nil?
34
-
35
- case args
36
- when Array
37
- args.map { |arg| parse_variable_from_string(arg) }
38
- when Hash
39
- args.to_a.map { |arg| parse_variable_from_array(arg) }
40
- else
41
- raise UffizziCore::ComposeFile::ParseError, I18n.t('compose.invalid_type', option: :args)
42
- end
43
- end
44
-
45
- def parse_context(build_data, compose_payload)
46
- if build_data.is_a?(String)
47
- parse_context_from_inline_syntax(build_data, compose_payload)
48
- else
49
- parse_context_from_long_syntax(build_data, compose_payload)
50
- end
51
- end
52
-
53
- def parse_repository_url_fragment(fragment)
54
- branch, dockerfile_context_path = fragment.split(':')
55
-
56
- [branch, dockerfile_context_path]
57
- end
58
-
59
- def valid_url?(url)
60
- URI(url).host.present? && URI(url).host =~ /\w+\.\w+/ && URI(url).path.present?
61
- end
62
-
63
- def parse_context_from_inline_syntax(context, compose_payload)
64
- if compose_payload[:repository_url].blank?
65
- raise UffizziCore::ComposeFile::ParseError,
66
- I18n.t('compose.build_context_unknown_repository')
67
- end
68
-
69
- repository_url = compose_payload[:repository_url]
70
- branch = compose_payload[:branch]
71
- dockerfile_context_path = UffizziCore::ComposeFile::ConfigOptionService.prepare_file_path_value(context)
72
-
73
- [repository_url, branch, dockerfile_context_path]
74
- end
75
-
76
- def parse_context_from_long_syntax(build_data, compose_payload)
77
- context = build_data['context']
78
- raise UffizziCore::ComposeFile::ParseError, I18n.t('compose.build_context_no_specified') if context.blank?
79
-
80
- if valid_url?(context)
81
- uri = URI(context)
82
- repository_url = "#{uri.scheme}://#{uri.host}#{uri.path}"
83
- branch, dockerfile_context_path = parse_repository_url_fragment(uri.fragment.to_s)
84
- else
85
- repository_url, branch, dockerfile_context_path = parse_context_from_inline_syntax(context, compose_payload)
86
- end
87
-
88
- raise UffizziCore::ComposeFile::ParseError, I18n.t('compose.invalid_context', value: context) if repository_url.blank?
89
-
90
- [repository_url, branch, dockerfile_context_path]
91
- end
92
- end
93
- end
@@ -1,29 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class UffizziCore::ComposeFile::UpdateService
4
- def initialize(user, project)
5
- @user = user
6
- @project = project
7
- end
8
-
9
- def update(compose_file, params)
10
- compose_file_form = compose_file.becomes(ComposeFile::UpdateForm)
11
- compose_file_form.assign_attributes(params)
12
- credential = compose_file_form.project.account.credentials.github.last
13
- compose_file_github_form = ComposeFileService.create_compose_file_github_form(compose_file_form, credential)
14
-
15
- if compose_file_github_form.invalid?
16
- if compose_file_github_form.compose_content_data.present?
17
- compose_file_form.content = compose_file_github_form.compose_content_data[:content]
18
- end
19
-
20
- return [compose_file_form, compose_file_github_form.errors]
21
- end
22
-
23
- compose_file_depedencies = compose_file_github_form.compose_dependencies
24
- compose_file_form.payload['dependencies'] = ComposeFileService.prepare_compose_file_dependencies(compose_file_depedencies)
25
- compose_file_form.content = compose_file_github_form.compose_content_data[:content]
26
-
27
- ComposeFileService.persist!(compose_file_form, compose_file_github_form)
28
- end
29
- end
@@ -1,51 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class UffizziCore::Github::AppService
4
- class << self
5
- def create_preview_message_into_pull_request(deployment)
6
- project = deployment.project
7
- credential = project.credentials.github.last
8
- return if credential.nil?
9
-
10
- pull_request_payload = deployment.continuous_preview_payload['pull_request']
11
- installation_id = credential.provider_ref
12
- message = UffizziCore::Github::MessageService.build_preview_message(deployment)
13
-
14
- create_comment(installation_id, pull_request_payload['repository_full_name'], pull_request_payload['id'], message)
15
- end
16
-
17
- private
18
-
19
- def create_comment(installation_id, repository, issue_id, message)
20
- access_token = create_installation_access_token(installation_id)
21
-
22
- installation_client = UffizziCore::Github::InstallationClient.new(access_token)
23
-
24
- installation_client.add_comment(repository, issue_id, message)
25
- end
26
-
27
- def create_installation_access_token(installation_id)
28
- access_token_response = app_client.create_app_installation_access_token(installation_id)
29
- access_token_response[:token]
30
- end
31
-
32
- def app_client
33
- UffizziCore::Github::AppClient.new(generate_jwt_token)
34
- end
35
-
36
- def generate_jwt_token
37
- rsa_armor = '-----'
38
- parts = Settings.github.private_key.split(rsa_armor)
39
- parts[2].gsub!(/\s/, "\n")
40
- private_key = OpenSSL::PKey::RSA.new(parts.join(rsa_armor))
41
-
42
- payload = {}.tap do |opts|
43
- opts[:iat] = Time.now.to_i
44
- opts[:exp] = opts[:iat] + 60
45
- opts[:iss] = Settings.github.app_id
46
- end
47
-
48
- JWT.encode(payload, private_key, 'RS256')
49
- end
50
- end
51
- end
@@ -1,124 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class UffizziCore::Github::CredentialService
4
- class << self
5
- def repository_contains_file?(credential, repository_id, branch, path)
6
- client(credential).contents?(repository_id, ref: branch, path: path)
7
- rescue Octokit::Unauthorized
8
- Rails.logger.warn("broken credentials, repository_contains_file? credential_id=#{credential.id}")
9
- credential.unauthorize! unless credential.unauthorized?
10
- raise
11
- end
12
-
13
- def credential_correct?(credential)
14
- valid_installation?(credential)
15
- rescue Octokit::Unauthorized
16
- false
17
- end
18
-
19
- def search_repositories(credential, search_query)
20
- result = client(credential).search_repositories(search_query)
21
-
22
- result[:items]
23
- rescue Octokit::UnprocessableEntity
24
- []
25
- end
26
-
27
- def repositories(credential, query = '', page = 1)
28
- repo_attributes = {
29
- sort: :updated,
30
- page: page,
31
- }
32
-
33
- repos = client(credential).installation_repositories(credential.provider_ref, repo_attributes)
34
- filter_repos(repos, query)
35
- rescue Octokit::Unauthorized
36
- Rails.logger.warn("broken credentials, repositories credential_id=#{credential.id}")
37
- credential.unauthorize! unless credential.unauthorized?
38
- raise
39
- end
40
-
41
- def branches(credential, repository_id)
42
- client(credential).branches(repository_id)
43
- rescue Octokit::Unauthorized
44
- Rails.logger.warn("broken credentials, branches credential_id=#{credential.id}")
45
- credential.unauthorize! unless credential.unauthorized?
46
- raise
47
- end
48
-
49
- def branch(credential, repository_id, branch)
50
- client(credential).branch(repository_id, branch)
51
- rescue Octokit::Unauthorized
52
- Rails.logger.warn("broken credentials, branch credential_id=#{credential.id}")
53
- credential.unauthorize! unless credential.unauthorized?
54
- raise
55
- end
56
-
57
- def commit(credential, repository_id, commit_sha)
58
- commit = client(credential).commit(repository_id, commit_sha)
59
-
60
- {
61
- message: commit[:message],
62
- committer: commit[:committer][:name],
63
- commit: commit_sha,
64
- }
65
- rescue Octokit::Unauthorized
66
- Rails.logger.warn("broken credentials, commit credential_id=#{credential.id}")
67
- credential.unauthorize! unless credential.unauthorized?
68
- raise
69
- end
70
-
71
- def contents(credential, repository_id, options)
72
- client(credential).contents(repository_id, options)
73
- rescue Octokit::Unauthorized
74
- Rails.logger.warn("broken credentials, contents credential_id=#{credential.id}")
75
- credential.unauthorize! unless credential.unauthorized?
76
- raise
77
- end
78
-
79
- def repo(credential, repository_id)
80
- client(credential).repo(repository_id)
81
- rescue Octokit::Unauthorized
82
- Rails.logger.warn("broken credentials, repo credential_id=#{credential.id}")
83
- credential.unauthorize! unless credential.unauthorized?
84
- raise
85
- end
86
-
87
- def repo_url(credential, repository_id)
88
- repo = repo(credential, repository_id)
89
- repo[:clone_url].split(%r{https://}).last
90
- end
91
-
92
- def file_content(credential, repository_id, branch, file_path)
93
- file = contents(credential, repository_id, ref: branch, path: file_path)
94
- Base64.decode64(file[:content])
95
- rescue Octokit::Unauthorized
96
- Rails.logger.warn("broken credentials, file_content credential_id=#{credential.id}")
97
- credential.unauthorize! unless credential.unauthorized?
98
- raise
99
- end
100
-
101
- private
102
-
103
- def client(credential)
104
- UffizziCore::Github::UserClient.new(credential.password)
105
- end
106
-
107
- def valid_installation?(credential)
108
- user_installations = client(credential).user_installations
109
-
110
- installation = user_installations.detect do |user_installation|
111
- user_installation[:id].to_s == credential.provider_ref
112
- end
113
-
114
- installation.present?
115
- end
116
-
117
- def filter_repos(repos, query)
118
- return repos if query.blank?
119
-
120
- prepared_query = query.downcase
121
- repos.select { |repo| repo.full_name.downcase.include?(prepared_query) || repo.description&.downcase&.include?(prepared_query) }
122
- end
123
- end
124
- end
@@ -1,20 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class UffizziCore::Github::MessageService
4
- class << self
5
- def build_preview_message(deployment)
6
- preview_url = UffizziCore::DeploymentService.build_preview_url(deployment)
7
- deployment_url = UffizziCore::DeploymentService.build_deployment_url(deployment)
8
-
9
- "**This branch has been deployed using Uffizzi.**
10
-
11
- Preview URL:
12
- https://#{preview_url}
13
-
14
- View deployment details here:
15
- https://#{deployment_url}
16
-
17
- This is an automated comment. To turn off commenting, visit uffizzi.com."
18
- end
19
- end
20
- end
@@ -1,28 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class UffizziCore::GithubService
4
- class << self
5
- def send_preview_message(deployment)
6
- image = deployment.continuous_preview_payload['pull_request']['repository_full_name']
7
- containers = deployment.containers.where(image: image)
8
- repo = UffizziCore::Repo.find_by(id: containers.select(:repo_id))
9
-
10
- preview_message_is_enabled = !!repo.share_to_github
11
-
12
- return if !preview_message_is_enabled
13
-
14
- continuous_preview_payload = deployment.continuous_preview_payload
15
- pull_request_payload = continuous_preview_payload['pull_request']
16
- new_preview_message = UffizziCore::Github::MessageService.build_preview_message(deployment)
17
-
18
- return if new_preview_message == pull_request_payload['message']
19
-
20
- pull_request_payload['message'] = new_preview_message
21
- continuous_preview_payload['pull_request'] = pull_request_payload
22
-
23
- deployment.update(continuous_preview_payload: continuous_preview_payload)
24
-
25
- UffizziCore::Github::AppService.create_preview_message_into_pull_request(deployment)
26
- end
27
- end
28
- end
@@ -1,14 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class UffizziCore::UserAccessService
4
- attr_accessor :user_access_module
5
-
6
- delegate :admin_access_to_account?, :developer_access_to_account?, :viewer_access_to_account?,
7
- :admin_or_developer_access_to_account?, :any_access_to_account?, :admin_access_to_project?,
8
- :developer_access_to_project?, :viewer_access_to_project?, :admin_or_developer_access_to_project?,
9
- :any_access_to_project?, :global_admin?, to: :@user_access_module
10
-
11
- def initialize(user_access_module)
12
- @user_access_module = user_access_module
13
- end
14
- end