summaryrefslogtreecommitdiff
path: root/lib/api/entities/todo.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/api/entities/todo.rb')
-rw-r--r--lib/api/entities/todo.rb46
1 files changed, 46 insertions, 0 deletions
diff --git a/lib/api/entities/todo.rb b/lib/api/entities/todo.rb
new file mode 100644
index 00000000000..820d1ceaadd
--- /dev/null
+++ b/lib/api/entities/todo.rb
@@ -0,0 +1,46 @@
+# frozen_string_literal: true
+
+module API
+ module Entities
+ class Todo < Grape::Entity
+ expose :id
+ expose :project, using: Entities::ProjectIdentity, if: -> (todo, _) { todo.project_id }
+ expose :group, using: 'API::Entities::NamespaceBasic', if: -> (todo, _) { todo.group_id }
+ expose :author, using: Entities::UserBasic
+ expose :action_name
+ expose :target_type
+
+ expose :target do |todo, options|
+ todo_options = options.fetch(todo.target_type, {})
+ todo_target_class(todo.target_type).represent(todo.target, todo_options)
+ end
+
+ expose :target_url do |todo, options|
+ todo_target_url(todo)
+ end
+
+ expose :body
+ expose :state
+ expose :created_at
+
+ def todo_target_class(target_type)
+ # false as second argument prevents looking up in module hierarchy
+ # see also https://gitlab.com/gitlab-org/gitlab-foss/issues/59719
+ ::API::Entities.const_get(target_type, false)
+ end
+
+ def todo_target_url(todo)
+ target_type = todo.target_type.underscore
+ target_url = "#{todo.resource_parent.class.to_s.underscore}_#{target_type}_url"
+
+ Gitlab::Routing
+ .url_helpers
+ .public_send(target_url, todo.resource_parent, todo.target, anchor: todo_target_anchor(todo)) # rubocop:disable GitlabSecurity/PublicSend
+ end
+
+ def todo_target_anchor(todo)
+ "note_#{todo.note_id}" if todo.note_id?
+ end
+ end
+ end
+end