2013-05-14 08:33:31 -04:00
|
|
|
module API
|
2012-10-21 07:00:27 -04:00
|
|
|
class MergeRequests < Grape::API
|
2016-12-04 12:11:19 -05:00
|
|
|
include PaginationParams
|
|
|
|
|
2017-09-18 13:29:17 -04:00
|
|
|
before { authenticate_non_get! }
|
2012-10-21 07:00:27 -04:00
|
|
|
|
2017-07-24 16:07:37 -04:00
|
|
|
helpers ::Gitlab::IssuableMetadata
|
|
|
|
|
|
|
|
helpers do
|
|
|
|
def find_merge_requests(args = {})
|
2017-12-19 16:57:46 -05:00
|
|
|
args = declared_params.merge(args)
|
2017-07-24 16:07:37 -04:00
|
|
|
|
|
|
|
args[:milestone_title] = args.delete(:milestone)
|
|
|
|
args[:label_name] = args.delete(:labels)
|
|
|
|
|
|
|
|
merge_requests = MergeRequestsFinder.new(current_user, args).execute
|
|
|
|
.reorder(args[:order_by] => args[:sort])
|
|
|
|
merge_requests = paginate(merge_requests)
|
|
|
|
.preload(:target_project)
|
|
|
|
|
|
|
|
return merge_requests if args[:view] == 'simple'
|
|
|
|
|
|
|
|
merge_requests
|
Use latest_merge_request_diff association
Compared to the merge_request_diff association:
1. It's simpler to query. The query uses a foreign key to the
merge_request_diffs table, so no ordering is necessary.
2. It's faster for preloading. The merge_request_diff association has to load
every diff for the MRs in the set, then discard all but the most recent for
each. This association means that Rails can just query for N diffs from N
MRs.
3. It's more complicated to update. This is a bidirectional foreign key, so we
need to update two tables when adding a diff record. This also means we need
to handle this as a special case when importing a GitLab project.
There is some juggling with this association in the merge request model:
* `MergeRequest#latest_merge_request_diff` is _always_ the latest diff.
* `MergeRequest#merge_request_diff` reuses
`MergeRequest#latest_merge_request_diff` unless:
* Arguments are passed. These are typically to force-reload the association.
* It doesn't exist. That means we might be trying to implicitly create a
diff. This only seems to happen in specs.
* The association is already loaded. This is important for the reasons
explained in the comment, which I'll reiterate here: if we a) load a
non-latest diff, then b) get its `merge_request`, then c) get that MR's
`merge_request_diff`, we should get the diff we loaded in c), even though
that's not the latest diff.
Basically, `MergeRequest#merge_request_diff` is the latest diff in most cases,
but not quite all.
2017-11-15 12:22:18 -05:00
|
|
|
.preload(:notes, :author, :assignee, :milestone, :latest_merge_request_diff, :labels, :timelogs)
|
2017-07-24 16:07:37 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
params :merge_requests_params do
|
|
|
|
optional :state, type: String, values: %w[opened closed merged all], default: 'all',
|
|
|
|
desc: 'Return opened, closed, merged, or all merge requests'
|
|
|
|
optional :order_by, type: String, values: %w[created_at updated_at], default: 'created_at',
|
|
|
|
desc: 'Return merge requests ordered by `created_at` or `updated_at` fields.'
|
|
|
|
optional :sort, type: String, values: %w[asc desc], default: 'desc',
|
|
|
|
desc: 'Return merge requests sorted in `asc` or `desc` order.'
|
|
|
|
optional :milestone, type: String, desc: 'Return merge requests for a specific milestone'
|
|
|
|
optional :labels, type: String, desc: 'Comma-separated list of label names'
|
|
|
|
optional :created_after, type: DateTime, desc: 'Return merge requests created after the specified time'
|
|
|
|
optional :created_before, type: DateTime, desc: 'Return merge requests created before the specified time'
|
|
|
|
optional :view, type: String, values: %w[simple], desc: 'If simple, returns the `iid`, URL, title, description, and basic state of merge request'
|
|
|
|
optional :author_id, type: Integer, desc: 'Return merge requests which are authored by the user with the given ID'
|
|
|
|
optional :assignee_id, type: Integer, desc: 'Return merge requests which are assigned to the user with the given ID'
|
2017-07-27 18:07:28 -04:00
|
|
|
optional :scope, type: String, values: %w[created-by-me assigned-to-me all],
|
2017-07-24 16:07:37 -04:00
|
|
|
desc: 'Return merge requests for the given scope: `created-by-me`, `assigned-to-me` or `all`'
|
2017-09-03 21:43:14 -04:00
|
|
|
optional :my_reaction_emoji, type: String, desc: 'Return issues reacted by the authenticated user by the given emoji'
|
2017-07-24 16:07:37 -04:00
|
|
|
use :pagination
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
resource :merge_requests do
|
|
|
|
desc 'List merge requests' do
|
|
|
|
success Entities::MergeRequestBasic
|
|
|
|
end
|
|
|
|
params do
|
|
|
|
use :merge_requests_params
|
2017-07-27 18:07:28 -04:00
|
|
|
optional :scope, type: String, values: %w[created-by-me assigned-to-me all], default: 'created-by-me',
|
|
|
|
desc: 'Return merge requests for the given scope: `created-by-me`, `assigned-to-me` or `all`'
|
2017-07-24 16:07:37 -04:00
|
|
|
end
|
|
|
|
get do
|
2017-09-18 13:29:17 -04:00
|
|
|
authenticate! unless params[:scope] == 'all'
|
2017-07-24 16:07:37 -04:00
|
|
|
merge_requests = find_merge_requests
|
|
|
|
|
|
|
|
options = { with: Entities::MergeRequestBasic,
|
|
|
|
current_user: current_user }
|
|
|
|
|
|
|
|
if params[:view] == 'simple'
|
|
|
|
options[:with] = Entities::MergeRequestSimple
|
|
|
|
else
|
|
|
|
options[:issuable_metadata] = issuable_meta_data(merge_requests, 'MergeRequest')
|
|
|
|
end
|
|
|
|
|
|
|
|
present merge_requests, options
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2016-11-08 03:28:52 -05:00
|
|
|
params do
|
|
|
|
requires :id, type: String, desc: 'The ID of a project'
|
|
|
|
end
|
2017-08-31 07:44:49 -04:00
|
|
|
resource :projects, requirements: API::PROJECT_ENDPOINT_REQUIREMENTS do
|
2017-01-18 11:48:16 -05:00
|
|
|
include TimeTrackingEndpoints
|
|
|
|
|
2013-02-05 12:36:36 -05:00
|
|
|
helpers do
|
2013-03-05 17:43:05 -05:00
|
|
|
def handle_merge_request_errors!(errors)
|
|
|
|
if errors[:project_access].any?
|
|
|
|
error!(errors[:project_access], 422)
|
2013-03-07 08:51:56 -05:00
|
|
|
elsif errors[:branch_conflict].any?
|
|
|
|
error!(errors[:branch_conflict], 422)
|
2014-08-18 14:09:09 -04:00
|
|
|
elsif errors[:validate_fork].any?
|
|
|
|
error!(errors[:validate_fork], 422)
|
|
|
|
elsif errors[:validate_branches].any?
|
|
|
|
conflict!(errors[:validate_branches])
|
2017-04-26 18:04:07 -04:00
|
|
|
elsif errors[:base].any?
|
|
|
|
error!(errors[:base], 422)
|
2013-02-05 12:36:36 -05:00
|
|
|
end
|
2014-08-18 14:09:09 -04:00
|
|
|
|
|
|
|
render_api_error!(errors, 400)
|
2013-02-05 12:36:36 -05:00
|
|
|
end
|
2016-11-08 03:28:52 -05:00
|
|
|
|
2017-04-05 12:31:15 -04:00
|
|
|
params :optional_params_ce do
|
2016-11-08 03:28:52 -05:00
|
|
|
optional :description, type: String, desc: 'The description of the merge request'
|
|
|
|
optional :assignee_id, type: Integer, desc: 'The ID of a user to assign the merge request'
|
|
|
|
optional :milestone_id, type: Integer, desc: 'The ID of a milestone to assign the merge request'
|
|
|
|
optional :labels, type: String, desc: 'Comma-separated list of label names'
|
2016-11-28 15:33:12 -05:00
|
|
|
optional :remove_source_branch, type: Boolean, desc: 'Remove source branch when merging'
|
2016-11-08 03:28:52 -05:00
|
|
|
end
|
2017-04-05 12:31:15 -04:00
|
|
|
|
|
|
|
params :optional_params do
|
|
|
|
use :optional_params_ce
|
|
|
|
end
|
2013-02-05 12:36:36 -05:00
|
|
|
end
|
|
|
|
|
2016-11-08 03:28:52 -05:00
|
|
|
desc 'List merge requests' do
|
2017-03-06 06:48:10 -05:00
|
|
|
success Entities::MergeRequestBasic
|
2016-11-08 03:28:52 -05:00
|
|
|
end
|
|
|
|
params do
|
2017-07-24 16:07:37 -04:00
|
|
|
use :merge_requests_params
|
2017-01-25 16:35:27 -05:00
|
|
|
optional :iids, type: Array[Integer], desc: 'The IID array of merge requests'
|
2016-11-08 03:28:52 -05:00
|
|
|
end
|
2012-10-21 07:00:27 -04:00
|
|
|
get ":id/merge_requests" do
|
2012-10-21 09:13:39 -04:00
|
|
|
authorize! :read_merge_request, user_project
|
2012-11-29 15:10:07 -05:00
|
|
|
|
2017-04-25 10:56:32 -04:00
|
|
|
merge_requests = find_merge_requests(project_id: user_project.id)
|
2014-09-09 11:39:53 -04:00
|
|
|
|
2017-07-10 17:58:23 -04:00
|
|
|
options = { with: Entities::MergeRequestBasic,
|
|
|
|
current_user: current_user,
|
|
|
|
project: user_project }
|
|
|
|
|
2017-07-11 11:01:10 -04:00
|
|
|
if params[:view] == 'simple'
|
2017-07-10 17:58:23 -04:00
|
|
|
options[:with] = Entities::MergeRequestSimple
|
|
|
|
else
|
|
|
|
options[:issuable_metadata] = issuable_meta_data(merge_requests, 'MergeRequest')
|
|
|
|
end
|
|
|
|
|
|
|
|
present merge_requests, options
|
2012-10-21 07:00:27 -04:00
|
|
|
end
|
2012-11-29 15:10:07 -05:00
|
|
|
|
2016-11-08 03:28:52 -05:00
|
|
|
desc 'Create a merge request' do
|
|
|
|
success Entities::MergeRequest
|
|
|
|
end
|
|
|
|
params do
|
|
|
|
requires :title, type: String, desc: 'The title of the merge request'
|
|
|
|
requires :source_branch, type: String, desc: 'The source branch'
|
|
|
|
requires :target_branch, type: String, desc: 'The target branch'
|
|
|
|
optional :target_project_id, type: Integer,
|
|
|
|
desc: 'The target project of the merge request defaults to the :id of the project'
|
|
|
|
use :optional_params
|
|
|
|
end
|
2012-10-21 07:00:27 -04:00
|
|
|
post ":id/merge_requests" do
|
2015-06-26 09:55:56 -04:00
|
|
|
authorize! :create_merge_request, user_project
|
2016-11-08 03:28:52 -05:00
|
|
|
|
2016-11-28 15:33:12 -05:00
|
|
|
mr_params = declared_params(include_missing: false)
|
2017-06-14 16:38:27 -04:00
|
|
|
mr_params[:force_remove_source_branch] = mr_params.delete(:remove_source_branch)
|
2014-08-14 04:17:52 -04:00
|
|
|
|
2016-11-08 03:28:52 -05:00
|
|
|
merge_request = ::MergeRequests::CreateService.new(user_project, current_user, mr_params).execute
|
2013-07-17 11:23:36 -04:00
|
|
|
|
2014-04-02 14:51:53 -04:00
|
|
|
if merge_request.valid?
|
2016-11-04 14:19:08 -04:00
|
|
|
present merge_request, with: Entities::MergeRequest, current_user: current_user, project: user_project
|
2014-04-02 14:51:53 -04:00
|
|
|
else
|
|
|
|
handle_merge_request_errors! merge_request.errors
|
2012-10-21 07:41:06 -04:00
|
|
|
end
|
2012-10-21 07:00:27 -04:00
|
|
|
end
|
|
|
|
|
2016-11-08 03:28:52 -05:00
|
|
|
desc 'Delete a merge request'
|
|
|
|
params do
|
2017-02-25 07:25:32 -05:00
|
|
|
requires :merge_request_iid, type: Integer, desc: 'The IID of a merge request'
|
2016-11-08 03:28:52 -05:00
|
|
|
end
|
2017-02-25 07:25:32 -05:00
|
|
|
delete ":id/merge_requests/:merge_request_iid" do
|
|
|
|
merge_request = find_project_merge_request(params[:merge_request_iid])
|
2016-03-18 14:11:25 -04:00
|
|
|
|
2016-03-21 09:12:52 -04:00
|
|
|
authorize!(:destroy_merge_request, merge_request)
|
2017-03-01 08:35:48 -05:00
|
|
|
|
2017-11-25 10:04:45 -05:00
|
|
|
destroy_conditionally!(merge_request) do |merge_request|
|
|
|
|
Issuable::DestroyService.new(user_project, current_user).execute(merge_request)
|
|
|
|
end
|
2016-02-26 03:55:43 -05:00
|
|
|
end
|
|
|
|
|
2016-11-08 03:28:52 -05:00
|
|
|
params do
|
2017-02-25 07:25:32 -05:00
|
|
|
requires :merge_request_iid, type: Integer, desc: 'The IID of a merge request'
|
2016-11-08 03:28:52 -05:00
|
|
|
end
|
2017-01-25 16:35:27 -05:00
|
|
|
desc 'Get a single merge request' do
|
|
|
|
success Entities::MergeRequest
|
|
|
|
end
|
2017-02-25 07:25:32 -05:00
|
|
|
get ':id/merge_requests/:merge_request_iid' do
|
|
|
|
merge_request = find_merge_request_with_access(params[:merge_request_iid])
|
2017-01-03 13:03:13 -05:00
|
|
|
|
2017-01-25 16:35:27 -05:00
|
|
|
present merge_request, with: Entities::MergeRequest, current_user: current_user, project: user_project
|
|
|
|
end
|
2014-05-12 09:34:41 -04:00
|
|
|
|
2017-01-25 16:35:27 -05:00
|
|
|
desc 'Get the commits of a merge request' do
|
2017-10-05 04:48:05 -04:00
|
|
|
success Entities::Commit
|
2017-01-25 16:35:27 -05:00
|
|
|
end
|
2017-02-25 07:25:32 -05:00
|
|
|
get ':id/merge_requests/:merge_request_iid/commits' do
|
|
|
|
merge_request = find_merge_request_with_access(params[:merge_request_iid])
|
2017-01-16 23:45:07 -05:00
|
|
|
commits = ::Kaminari.paginate_array(merge_request.commits)
|
2017-01-03 13:03:13 -05:00
|
|
|
|
2017-10-05 04:48:05 -04:00
|
|
|
present paginate(commits), with: Entities::Commit
|
2017-01-25 16:35:27 -05:00
|
|
|
end
|
2015-11-18 05:17:41 -05:00
|
|
|
|
2017-01-25 16:35:27 -05:00
|
|
|
desc 'Show the merge request changes' do
|
|
|
|
success Entities::MergeRequestChanges
|
|
|
|
end
|
2017-02-25 07:25:32 -05:00
|
|
|
get ':id/merge_requests/:merge_request_iid/changes' do
|
|
|
|
merge_request = find_merge_request_with_access(params[:merge_request_iid])
|
2017-01-03 13:03:13 -05:00
|
|
|
|
2017-01-25 16:35:27 -05:00
|
|
|
present merge_request, with: Entities::MergeRequestChanges, current_user: current_user
|
|
|
|
end
|
2014-05-12 09:34:41 -04:00
|
|
|
|
2017-01-25 16:35:27 -05:00
|
|
|
desc 'Update a merge request' do
|
|
|
|
success Entities::MergeRequest
|
|
|
|
end
|
|
|
|
params do
|
2017-04-05 12:31:15 -04:00
|
|
|
# CE
|
|
|
|
at_least_one_of_ce = [
|
|
|
|
:assignee_id,
|
|
|
|
:description,
|
|
|
|
:labels,
|
|
|
|
:milestone_id,
|
|
|
|
:remove_source_branch,
|
|
|
|
:state_event,
|
|
|
|
:target_branch,
|
2017-08-31 06:38:32 -04:00
|
|
|
:title,
|
|
|
|
:discussion_locked
|
2017-04-05 12:31:15 -04:00
|
|
|
]
|
2017-01-25 16:35:27 -05:00
|
|
|
optional :title, type: String, allow_blank: false, desc: 'The title of the merge request'
|
|
|
|
optional :target_branch, type: String, allow_blank: false, desc: 'The target branch'
|
2016-12-13 16:45:09 -05:00
|
|
|
optional :state_event, type: String, values: %w[close reopen],
|
2017-01-25 16:35:27 -05:00
|
|
|
desc: 'Status of the merge request'
|
2017-08-31 06:38:32 -04:00
|
|
|
optional :discussion_locked, type: Boolean, desc: 'Whether the MR discussion is locked'
|
2017-04-05 12:31:15 -04:00
|
|
|
|
2017-01-25 16:35:27 -05:00
|
|
|
use :optional_params
|
2017-04-05 12:31:15 -04:00
|
|
|
at_least_one_of(*at_least_one_of_ce)
|
2017-01-25 16:35:27 -05:00
|
|
|
end
|
2017-02-25 07:25:32 -05:00
|
|
|
put ':id/merge_requests/:merge_request_iid' do
|
|
|
|
merge_request = find_merge_request_with_access(params.delete(:merge_request_iid), :update_merge_request)
|
2016-01-28 08:26:02 -05:00
|
|
|
|
2017-01-25 16:35:27 -05:00
|
|
|
mr_params = declared_params(include_missing: false)
|
|
|
|
mr_params[:force_remove_source_branch] = mr_params.delete(:remove_source_branch) if mr_params[:remove_source_branch].present?
|
2015-11-18 05:17:41 -05:00
|
|
|
|
2017-01-25 16:35:27 -05:00
|
|
|
merge_request = ::MergeRequests::UpdateService.new(user_project, current_user, mr_params).execute(merge_request)
|
2014-05-12 09:34:41 -04:00
|
|
|
|
2017-01-25 16:35:27 -05:00
|
|
|
if merge_request.valid?
|
|
|
|
present merge_request, with: Entities::MergeRequest, current_user: current_user, project: user_project
|
|
|
|
else
|
|
|
|
handle_merge_request_errors! merge_request.errors
|
2016-01-28 08:26:02 -05:00
|
|
|
end
|
2017-01-25 16:35:27 -05:00
|
|
|
end
|
2014-03-19 14:07:51 -04:00
|
|
|
|
2017-01-25 16:35:27 -05:00
|
|
|
desc 'Merge a merge request' do
|
|
|
|
success Entities::MergeRequest
|
|
|
|
end
|
|
|
|
params do
|
2017-04-05 12:31:15 -04:00
|
|
|
# CE
|
2017-01-25 16:35:27 -05:00
|
|
|
optional :merge_commit_message, type: String, desc: 'Custom merge commit message'
|
|
|
|
optional :should_remove_source_branch, type: Boolean,
|
|
|
|
desc: 'When true, the source branch will be deleted if possible'
|
2017-02-17 08:56:13 -05:00
|
|
|
optional :merge_when_pipeline_succeeds, type: Boolean,
|
|
|
|
desc: 'When true, this merge request will be merged when the pipeline succeeds'
|
2017-01-25 16:35:27 -05:00
|
|
|
optional :sha, type: String, desc: 'When present, must have the HEAD SHA of the source branch'
|
|
|
|
end
|
2017-02-25 07:25:32 -05:00
|
|
|
put ':id/merge_requests/:merge_request_iid/merge' do
|
|
|
|
merge_request = find_project_merge_request(params[:merge_request_iid])
|
2017-04-24 02:53:43 -04:00
|
|
|
merge_when_pipeline_succeeds = to_boolean(params[:merge_when_pipeline_succeeds])
|
2016-01-28 08:26:02 -05:00
|
|
|
|
2017-01-25 16:35:27 -05:00
|
|
|
# Merge request can not be merged
|
|
|
|
# because user dont have permissions to push into target branch
|
|
|
|
unauthorized! unless merge_request.can_be_merged_by?(current_user)
|
2016-01-28 08:26:02 -05:00
|
|
|
|
2017-04-24 02:53:43 -04:00
|
|
|
not_allowed! unless merge_request.mergeable_state?(skip_ci_check: merge_when_pipeline_succeeds)
|
2016-01-28 08:26:02 -05:00
|
|
|
|
2017-04-24 02:53:43 -04:00
|
|
|
render_api_error!('Branch cannot be merged', 406) unless merge_request.mergeable?(skip_ci_check: merge_when_pipeline_succeeds)
|
2016-01-28 08:26:02 -05:00
|
|
|
|
2017-01-25 16:35:27 -05:00
|
|
|
if params[:sha] && merge_request.diff_head_sha != params[:sha]
|
|
|
|
render_api_error!("SHA does not match HEAD of source branch: #{merge_request.diff_head_sha}", 409)
|
|
|
|
end
|
2016-06-01 05:21:22 -04:00
|
|
|
|
2017-01-25 16:35:27 -05:00
|
|
|
merge_params = {
|
|
|
|
commit_message: params[:merge_commit_message],
|
|
|
|
should_remove_source_branch: params[:should_remove_source_branch]
|
|
|
|
}
|
2014-03-19 14:07:51 -04:00
|
|
|
|
2017-04-24 02:53:43 -04:00
|
|
|
if merge_when_pipeline_succeeds && merge_request.head_pipeline && merge_request.head_pipeline.active?
|
2017-01-25 16:35:27 -05:00
|
|
|
::MergeRequests::MergeWhenPipelineSucceedsService
|
|
|
|
.new(merge_request.target_project, current_user, merge_params)
|
|
|
|
.execute(merge_request)
|
|
|
|
else
|
|
|
|
::MergeRequests::MergeService
|
|
|
|
.new(merge_request.target_project, current_user, merge_params)
|
|
|
|
.execute(merge_request)
|
2016-01-28 08:26:02 -05:00
|
|
|
end
|
2013-02-27 09:07:42 -05:00
|
|
|
|
2017-01-25 16:35:27 -05:00
|
|
|
present merge_request, with: Entities::MergeRequest, current_user: current_user, project: user_project
|
|
|
|
end
|
2015-10-09 12:14:35 -04:00
|
|
|
|
2017-01-25 16:35:27 -05:00
|
|
|
desc 'Cancel merge if "Merge When Pipeline Succeeds" is enabled' do
|
|
|
|
success Entities::MergeRequest
|
|
|
|
end
|
2017-02-25 07:25:32 -05:00
|
|
|
post ':id/merge_requests/:merge_request_iid/cancel_merge_when_pipeline_succeeds' do
|
|
|
|
merge_request = find_project_merge_request(params[:merge_request_iid])
|
2015-10-09 12:14:35 -04:00
|
|
|
|
2017-02-17 08:56:13 -05:00
|
|
|
unauthorized! unless merge_request.can_cancel_merge_when_pipeline_succeeds?(current_user)
|
2015-10-09 12:14:35 -04:00
|
|
|
|
2017-10-30 13:19:51 -04:00
|
|
|
::MergeRequests::MergeWhenPipelineSucceedsService
|
2017-01-25 16:35:27 -05:00
|
|
|
.new(merge_request.target_project, current_user)
|
|
|
|
.cancel(merge_request)
|
|
|
|
end
|
2012-10-25 06:38:55 -04:00
|
|
|
|
2017-01-25 16:35:27 -05:00
|
|
|
desc 'List issues that will be closed on merge' do
|
|
|
|
success Entities::MRNote
|
|
|
|
end
|
|
|
|
params do
|
|
|
|
use :pagination
|
|
|
|
end
|
2017-02-25 07:25:32 -05:00
|
|
|
get ':id/merge_requests/:merge_request_iid/closes_issues' do
|
|
|
|
merge_request = find_merge_request_with_access(params[:merge_request_iid])
|
2017-01-25 16:35:27 -05:00
|
|
|
issues = ::Kaminari.paginate_array(merge_request.closes_issues(current_user))
|
2017-07-10 03:38:42 -04:00
|
|
|
issues = paginate(issues)
|
|
|
|
|
|
|
|
external_issues, internal_issues = issues.partition { |issue| issue.is_a?(ExternalIssue) }
|
|
|
|
|
|
|
|
data = Entities::IssueBasic.represent(internal_issues, current_user: current_user)
|
|
|
|
data += Entities::ExternalIssue.represent(external_issues, current_user: current_user)
|
|
|
|
|
|
|
|
data.as_json
|
2017-01-25 16:35:27 -05:00
|
|
|
end
|
2012-10-21 07:00:27 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|