Skip to content
Snippets Groups Projects
Commit 7519d7ab authored by George Koltsov's avatar George Koltsov
Browse files

Add Bulk Imports API to view user initiated imports

parent f4c12321
No related branches found
No related tags found
No related merge requests found
# frozen_string_literal: true
module BulkImports
class EntitiesFinder
def initialize(user:, bulk_import: nil, status: nil)
@user = user
@bulk_import = bulk_import
@status = ::BulkImports::Entity.machine_status(status)
end
def execute
::BulkImports::Entity
.by_user_id(user.id)
.then { |entities| filter_by_bulk_import(entities) }
.then { |entities| filter_by_status(entities) }
end
private
attr_reader :user, :bulk_import, :status
def filter_by_bulk_import(entities)
return entities unless bulk_import
entities.where(bulk_import_id: bulk_import.id) # rubocop: disable CodeReuse/ActiveRecord
end
def filter_by_status(entities)
return entities unless status
entities.with_status(status)
end
end
end
# frozen_string_literal: true
module BulkImports
class ImportsFinder
def initialize(user:, status: nil)
@user = user
@status = ::BulkImport.machine_status(status)
end
def execute
filter_by_status(user.bulk_imports)
end
private
attr_reader :user, :status
def filter_by_status(imports)
if status
imports.with_status(status)
else
imports
end
end
end
end
Loading
Loading
@@ -13,6 +13,8 @@ class BulkImport < ApplicationRecord
 
enum source_type: { gitlab: 0 }
 
scope :with_status, ->(status) { where(status: status) }
state_machine :status, initial: :created do
state :created, value: 0
state :started, value: 1
Loading
Loading
@@ -31,4 +33,12 @@ class BulkImport < ApplicationRecord
transition any => :failed
end
end
def self.all_human_statuses
state_machine.states.map(&:human_name)
end
def self.machine_status(human_status)
state_machine.states.find { |st| st.human_name == human_status }&.value
end
end
Loading
Loading
@@ -48,6 +48,9 @@ class BulkImports::Entity < ApplicationRecord
 
enum source_type: { group_entity: 0, project_entity: 1 }
 
scope :with_status, ->(status) { where(status: status) }
scope :by_user_id, ->(user_id) { joins(:bulk_import).where('bulk_imports.user_id = ?', user_id) }
state_machine :status, initial: :created do
state :created, value: 0
state :started, value: 1
Loading
Loading
@@ -68,6 +71,14 @@ class BulkImports::Entity < ApplicationRecord
end
end
 
def self.all_human_statuses
state_machine.states.map(&:human_name)
end
def self.machine_status(human_status)
state_machine.states.find { |st| st.human_name == human_status }&.value
end
def encoded_source_full_path
ERB::Util.url_encode(source_full_path)
end
Loading
Loading
Loading
Loading
@@ -152,6 +152,7 @@ class API < ::API::Base
mount ::API::Boards
mount ::API::Branches
mount ::API::BroadcastMessages
mount ::API::BulkImports
mount ::API::Ci::Pipelines
mount ::API::Ci::PipelineSchedules
mount ::API::Ci::Runner
Loading
Loading
# frozen_string_literal: true
module API
class BulkImports < ::API::Base
include PaginationParams
feature_category :importers
helpers do
def bulk_imports
@bulk_imports ||= ::BulkImports::ImportsFinder.new(user: current_user, status: params[:status]).execute
end
def bulk_import
@bulk_import ||= bulk_imports.find(params[:import_id])
end
def bulk_import_entities
@bulk_import_entities ||= ::BulkImports::EntitiesFinder.new(user: current_user, bulk_import: bulk_import, status: params[:status]).execute
end
def bulk_import_entity
@bulk_import_entity ||= bulk_import_entities.find(params[:entity_id])
end
end
before { authenticate! }
resource :bulk_imports do
desc 'List all bulk imports' do
detail 'This feature was introduced in GitLab 14.1.'
end
params do
use :pagination
optional :status, type: String, values: BulkImport.all_human_statuses,
desc: 'Return bulk imports with specified status'
end
get do
present paginate(bulk_imports), with: Entities::BulkImports::Import
end
desc "List all bulk imports' entities" do
detail 'This feature was introduced in GitLab 14.1.'
end
params do
use :pagination
optional :status, type: String, values: ::BulkImports::Entity.all_human_statuses,
desc: "Return all bulk imports' entities with specified status"
end
get :entities do
entities = ::BulkImports::EntitiesFinder.new(user: current_user, status: params[:status]).execute
present paginate(entities), with: Entities::BulkImports::Entity
end
desc 'Get bulk import details' do
detail 'This feature was introduced in GitLab 14.1.'
end
params do
requires :import_id, type: Integer, desc: "The ID of user's bulk import"
end
get ':import_id' do
present bulk_import, with: Entities::BulkImports::Import
end
desc "List bulk import entities" do
detail 'This feature was introduced in GitLab 14.1.'
end
params do
requires :import_id, type: Integer, desc: "The ID of user's bulk import"
optional :status, type: String, values: ::BulkImports::Entity.all_human_statuses,
desc: 'Return import entities with specified status'
use :pagination
end
get ':import_id/entities' do
present paginate(bulk_import_entities), with: Entities::BulkImports::Entity
end
desc 'Get bulk import entity details' do
detail 'This feature was introduced in GitLab 14.1.'
end
params do
requires :import_id, type: Integer, desc: "The ID of user's bulk import"
requires :entity_id, type: Integer, desc: "The ID of bulk import entity"
end
get ':import_id/entities/:entity_id' do
present bulk_import_entity, with: Entities::BulkImports::Entity
end
end
end
end
# frozen_string_literal: true
module API
module Entities
module BulkImports
class Entity < Grape::Entity
expose :id
expose :bulk_import_id
expose :status_name, as: :status
expose :source_full_path
expose :destination_name
expose :destination_namespace
expose :parent_id
expose :namespace_id
expose :project_id
expose :created_at
expose :updated_at
expose :failures, using: EntityFailure
end
end
end
end
# frozen_string_literal: true
module API
module Entities
module BulkImports
class EntityFailure < Grape::Entity
expose :pipeline_class
expose :pipeline_step
expose :exception_class
expose :correlation_id_value
expose :created_at
end
end
end
end
# frozen_string_literal: true
module API
module Entities
module BulkImports
class Import < Grape::Entity
expose :id
expose :status_name, as: :status
expose :source_type
expose :created_at
expose :updated_at
end
end
end
end
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment