diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-09-23 12:10:07 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-09-23 12:10:07 +0300 |
commit | 8f2b51af416f4f4451632f6b3c2ada52c52eb44f (patch) | |
tree | 5e134df670cf056f300b887c3999f4aa84ec6f24 /app | |
parent | 86fa823611b3ab5701d144aca1c57c51b4af25d5 (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app')
-rw-r--r-- | app/serializers/feature_flag_entity.rb | 48 | ||||
-rw-r--r-- | app/serializers/feature_flag_scope_entity.rb | 12 | ||||
-rw-r--r-- | app/serializers/feature_flag_serializer.rb | 10 | ||||
-rw-r--r-- | app/serializers/feature_flag_summary_entity.rb | 19 | ||||
-rw-r--r-- | app/serializers/feature_flag_summary_serializer.rb | 5 | ||||
-rw-r--r-- | app/serializers/feature_flags/scope_entity.rb | 8 | ||||
-rw-r--r-- | app/serializers/feature_flags/strategy_entity.rb | 11 | ||||
-rw-r--r-- | app/serializers/feature_flags/user_list_entity.rb | 10 | ||||
-rw-r--r-- | app/serializers/feature_flags_client_entity.rb | 7 | ||||
-rw-r--r-- | app/serializers/feature_flags_client_serializer.rb | 9 | ||||
-rw-r--r-- | app/services/snippets/base_service.rb | 18 | ||||
-rw-r--r-- | app/services/snippets/create_service.rb | 9 | ||||
-rw-r--r-- | app/services/snippets/update_service.rb | 39 |
13 files changed, 185 insertions, 20 deletions
diff --git a/app/serializers/feature_flag_entity.rb b/app/serializers/feature_flag_entity.rb new file mode 100644 index 00000000000..80cf869a389 --- /dev/null +++ b/app/serializers/feature_flag_entity.rb @@ -0,0 +1,48 @@ +# frozen_string_literal: true + +class FeatureFlagEntity < Grape::Entity + include RequestAwareEntity + + expose :id + expose :iid + expose :active + expose :created_at + expose :updated_at + expose :name + expose :description + expose :version + + expose :edit_path, if: -> (feature_flag, _) { can_update?(feature_flag) } do |feature_flag| + edit_project_feature_flag_path(feature_flag.project, feature_flag) + end + + expose :update_path, if: -> (feature_flag, _) { can_update?(feature_flag) } do |feature_flag| + project_feature_flag_path(feature_flag.project, feature_flag) + end + + expose :destroy_path, if: -> (feature_flag, _) { can_destroy?(feature_flag) } do |feature_flag| + project_feature_flag_path(feature_flag.project, feature_flag) + end + + expose :scopes, with: FeatureFlagScopeEntity do |feature_flag| + feature_flag.scopes.sort_by(&:id) + end + + expose :strategies, with: FeatureFlags::StrategyEntity do |feature_flag| + feature_flag.strategies.sort_by(&:id) + end + + private + + def can_update?(feature_flag) + can?(current_user, :update_feature_flag, feature_flag) + end + + def can_destroy?(feature_flag) + can?(current_user, :destroy_feature_flag, feature_flag) + end + + def current_user + request.current_user + end +end diff --git a/app/serializers/feature_flag_scope_entity.rb b/app/serializers/feature_flag_scope_entity.rb new file mode 100644 index 00000000000..0450797a545 --- /dev/null +++ b/app/serializers/feature_flag_scope_entity.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true + +class FeatureFlagScopeEntity < Grape::Entity + include RequestAwareEntity + + expose :id + expose :active + expose :environment_scope + expose :created_at + expose :updated_at + expose :strategies +end diff --git a/app/serializers/feature_flag_serializer.rb b/app/serializers/feature_flag_serializer.rb new file mode 100644 index 00000000000..e0ff33cc61a --- /dev/null +++ b/app/serializers/feature_flag_serializer.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true + +class FeatureFlagSerializer < BaseSerializer + include WithPagination + entity FeatureFlagEntity + + def represent(resource, opts = {}) + super(resource, opts) + end +end diff --git a/app/serializers/feature_flag_summary_entity.rb b/app/serializers/feature_flag_summary_entity.rb new file mode 100644 index 00000000000..be4f02dabca --- /dev/null +++ b/app/serializers/feature_flag_summary_entity.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +class FeatureFlagSummaryEntity < Grape::Entity + include RequestAwareEntity + + expose :count do + expose :all do |project| + project.operations_feature_flags.count + end + + expose :enabled do |project| + project.operations_feature_flags.enabled.count + end + + expose :disabled do |project| + project.operations_feature_flags.disabled.count + end + end +end diff --git a/app/serializers/feature_flag_summary_serializer.rb b/app/serializers/feature_flag_summary_serializer.rb new file mode 100644 index 00000000000..46f70666e40 --- /dev/null +++ b/app/serializers/feature_flag_summary_serializer.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +class FeatureFlagSummarySerializer < BaseSerializer + entity FeatureFlagSummaryEntity +end diff --git a/app/serializers/feature_flags/scope_entity.rb b/app/serializers/feature_flags/scope_entity.rb new file mode 100644 index 00000000000..1c9dd491652 --- /dev/null +++ b/app/serializers/feature_flags/scope_entity.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +module FeatureFlags + class ScopeEntity < Grape::Entity + expose :id + expose :environment_scope + end +end diff --git a/app/serializers/feature_flags/strategy_entity.rb b/app/serializers/feature_flags/strategy_entity.rb new file mode 100644 index 00000000000..73450476869 --- /dev/null +++ b/app/serializers/feature_flags/strategy_entity.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +module FeatureFlags + class StrategyEntity < Grape::Entity + expose :id + expose :name + expose :parameters + expose :scopes, with: FeatureFlags::ScopeEntity + expose :user_list, with: FeatureFlags::UserListEntity, expose_nil: false + end +end diff --git a/app/serializers/feature_flags/user_list_entity.rb b/app/serializers/feature_flags/user_list_entity.rb new file mode 100644 index 00000000000..d3fddb4fa7a --- /dev/null +++ b/app/serializers/feature_flags/user_list_entity.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true + +module FeatureFlags + class UserListEntity < Grape::Entity + expose :id + expose :iid + expose :name + expose :user_xids + end +end diff --git a/app/serializers/feature_flags_client_entity.rb b/app/serializers/feature_flags_client_entity.rb new file mode 100644 index 00000000000..4a195c7d759 --- /dev/null +++ b/app/serializers/feature_flags_client_entity.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class FeatureFlagsClientEntity < Grape::Entity + include RequestAwareEntity + + expose :token +end diff --git a/app/serializers/feature_flags_client_serializer.rb b/app/serializers/feature_flags_client_serializer.rb new file mode 100644 index 00000000000..104729b6668 --- /dev/null +++ b/app/serializers/feature_flags_client_serializer.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class FeatureFlagsClientSerializer < BaseSerializer + entity FeatureFlagsClientEntity + + def represent_token(resource, opts = {}) + represent(resource, only: [:token]) + end +end diff --git a/app/services/snippets/base_service.rb b/app/services/snippets/base_service.rb index 53a04e5a398..278857b7933 100644 --- a/app/services/snippets/base_service.rb +++ b/app/services/snippets/base_service.rb @@ -4,6 +4,9 @@ module Snippets class BaseService < ::BaseService include SpamCheckMethods + UPDATE_COMMIT_MSG = 'Update snippet' + INITIAL_COMMIT_MSG = 'Initial commit' + CreateRepositoryError = Class.new(StandardError) attr_reader :uploaded_assets, :snippet_actions @@ -85,5 +88,20 @@ module Snippets def restricted_files_actions nil end + + def commit_attrs(snippet, msg) + { + branch_name: snippet.default_branch, + message: msg + } + end + + def delete_repository(snippet) + snippet.repository.remove + snippet.snippet_repository&.delete + + # Purge any existing value for repository_exists? + snippet.repository.expire_exists_cache + end end end diff --git a/app/services/snippets/create_service.rb b/app/services/snippets/create_service.rb index 5c9b2eb1aea..142bd44cf2b 100644 --- a/app/services/snippets/create_service.rb +++ b/app/services/snippets/create_service.rb @@ -59,7 +59,7 @@ module Snippets log_error(e.message) # If the commit action failed we need to remove the repository if exists - @snippet.repository.remove if @snippet.repository_exists? + delete_repository(@snippet) if @snippet.repository_exists? # If the snippet was created, we need to remove it as we # would do like if it had had any validation error @@ -81,12 +81,9 @@ module Snippets end def create_commit - commit_attrs = { - branch_name: @snippet.default_branch, - message: 'Initial commit' - } + attrs = commit_attrs(@snippet, INITIAL_COMMIT_MSG) - @snippet.snippet_repository.multi_files_action(current_user, files_to_commit(@snippet), commit_attrs) + @snippet.snippet_repository.multi_files_action(current_user, files_to_commit(@snippet), attrs) end def move_temporary_files diff --git a/app/services/snippets/update_service.rb b/app/services/snippets/update_service.rb index a0e9ab6ffda..fb2304b1f3e 100644 --- a/app/services/snippets/update_service.rb +++ b/app/services/snippets/update_service.rb @@ -37,7 +37,10 @@ module Snippets # is implemented. # Once we can perform different operations through this service # we won't need to keep track of the `content` and `file_name` fields - if snippet_actions.any? + # + # If the repository does not exist we don't need to update `params` + # because we need to commit the information from the database + if snippet_actions.any? && snippet.repository_exists? params[:content] = snippet_actions[0].content if snippet_actions[0].content params[:file_name] = snippet_actions[0].file_path end @@ -52,7 +55,11 @@ module Snippets # the repository we can just return return true unless committable_attributes? - create_repository_for(snippet) + unless snippet.repository_exists? + create_repository_for(snippet) + create_first_commit_using_db_data(snippet) + end + create_commit(snippet) true @@ -72,13 +79,7 @@ module Snippets # If the commit action failed we remove it because # we don't want to leave empty repositories # around, to allow cloning them. - if repository_empty?(snippet) - snippet.repository.remove - snippet.snippet_repository&.delete - end - - # Purge any existing value for repository_exists? - snippet.repository.expire_exists_cache + delete_repository(snippet) if repository_empty?(snippet) false end @@ -89,15 +90,25 @@ module Snippets raise CreateRepositoryError, 'Repository could not be created' unless snippet.repository_exists? end + # If the user provides `snippet_actions` and the repository + # does not exist, we need to commit first the snippet info stored + # in the database. Mostly because the content inside `snippet_actions` + # would assume that the file is already in the repository. + def create_first_commit_using_db_data(snippet) + return if snippet_actions.empty? + + attrs = commit_attrs(snippet, INITIAL_COMMIT_MSG) + actions = [{ file_path: snippet.file_name, content: snippet.content }] + + snippet.snippet_repository.multi_files_action(current_user, actions, attrs) + end + def create_commit(snippet) raise UpdateError unless snippet.snippet_repository - commit_attrs = { - branch_name: snippet.default_branch, - message: 'Update snippet' - } + attrs = commit_attrs(snippet, UPDATE_COMMIT_MSG) - snippet.snippet_repository.multi_files_action(current_user, files_to_commit(snippet), commit_attrs) + snippet.snippet_repository.multi_files_action(current_user, files_to_commit(snippet), attrs) end # Because we are removing repositories we don't want to remove |